878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 2000, 2001, 2004, 2005, 2007, 2015, 2016 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
ec5347e2c775f027573ce5648b910361aa926c01Automatic Updater/* $Id: lwdclient.c,v 1.22 2007/06/18 23:47:18 tbox Exp $ */
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*! \file */
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <config.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <isc/socket.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <isc/string.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <isc/task.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <isc/util.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff#include <dns/adb.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <dns/view.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <dns/log.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <named/types.h>
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson#include <named/log.h>
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff#include <named/lwresd.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <named/lwdclient.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff#define SHUTTINGDOWN(cm) ((cm->flags & NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN) != 0)
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graffstatic void
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Grafflwdclientmgr_shutdown_callback(isc_task_t *task, isc_event_t *ev);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonvoid
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellingtonns_lwdclient_log(int level, const char *format, ...) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington va_list args;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington va_start(args, format);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_log_vwrite(dns_lctx,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_ADB,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LOG_DEBUG(level), format, args);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington va_end(args);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellingtonisc_result_t
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellingtonns_lwdclientmgr_create(ns_lwreslistener_t *listener, unsigned int nclients,
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff isc_taskmgr_t *taskmgr)
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff{
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington ns_lwresd_t *lwresd = listener->manager;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ns_lwdclientmgr_t *cm;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ns_lwdclient_t *client;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff unsigned int i;
563878539af45d41143701a6d299e9b226937f5bMark Andrews isc_result_t result;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff cm = isc_mem_get(lwresd->mctx, sizeof(ns_lwdclientmgr_t));
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff if (cm == NULL)
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington return (ISC_R_NOMEMORY);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
563878539af45d41143701a6d299e9b226937f5bMark Andrews result = isc_mutex_init(&cm->lock);
563878539af45d41143701a6d299e9b226937f5bMark Andrews if (result != ISC_R_SUCCESS)
563878539af45d41143701a6d299e9b226937f5bMark Andrews goto freecm;
563878539af45d41143701a6d299e9b226937f5bMark Andrews
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington cm->listener = NULL;
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington ns_lwreslistener_attach(listener, &cm->listener);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff cm->mctx = lwresd->mctx;
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington cm->sock = NULL;
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington isc_socket_attach(listener->sock, &cm->sock);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff cm->view = lwresd->view;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff cm->lwctx = NULL;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff cm->task = NULL;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff cm->flags = 0;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ISC_LINK_INIT(cm, link);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ISC_LIST_INIT(cm->idle);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ISC_LIST_INIT(cm->running);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
563878539af45d41143701a6d299e9b226937f5bMark Andrews result = lwres_context_create(&cm->lwctx, cm->mctx,
563878539af45d41143701a6d299e9b226937f5bMark Andrews ns__lwresd_memalloc, ns__lwresd_memfree,
563878539af45d41143701a6d299e9b226937f5bMark Andrews LWRES_CONTEXT_SERVERMODE);
563878539af45d41143701a6d299e9b226937f5bMark Andrews if (result != ISC_R_SUCCESS)
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff goto errout;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson for (i = 0; i < nclients; i++) {
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client = isc_mem_get(lwresd->mctx, sizeof(ns_lwdclient_t));
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff if (client != NULL) {
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ns_lwdclient_log(50, "created client %p, manager %p",
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client, cm);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ns_lwdclient_initialize(client, cm);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff }
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff }
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff /*
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff * If we could create no clients, clean up and return.
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff */
563878539af45d41143701a6d299e9b226937f5bMark Andrews if (ISC_LIST_EMPTY(cm->idle)) {
563878539af45d41143701a6d299e9b226937f5bMark Andrews result = ISC_R_NOMEMORY;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff goto errout;
563878539af45d41143701a6d299e9b226937f5bMark Andrews }
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington result = isc_task_create(taskmgr, 0, &cm->task);
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington if (result != ISC_R_SUCCESS)
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff goto errout;
96ea71632887c58a9d00f47eb318bf76b35903c3Mark Andrews isc_task_setname(cm->task, "lwdclient", NULL);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff /*
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff * This MUST be last, since there is no way to cancel an onshutdown...
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff */
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington result = isc_task_onshutdown(cm->task, lwdclientmgr_shutdown_callback,
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington cm);
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington if (result != ISC_R_SUCCESS)
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff goto errout;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington ns_lwreslistener_linkcm(listener, cm);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington return (ISC_R_SUCCESS);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff errout:
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client = ISC_LIST_HEAD(cm->idle);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff while (client != NULL) {
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ISC_LIST_UNLINK(cm->idle, client, link);
2f734e0a7e518c89c2b2b179714b8885b7626b3aAndreas Gustafsson isc_mem_put(lwresd->mctx, client, sizeof(*client));
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client = ISC_LIST_HEAD(cm->idle);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff }
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff if (cm->task != NULL)
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff isc_task_detach(&cm->task);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff if (cm->lwctx != NULL)
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff lwres_context_destroy(&cm->lwctx);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
563878539af45d41143701a6d299e9b226937f5bMark Andrews DESTROYLOCK(&cm->lock);
563878539af45d41143701a6d299e9b226937f5bMark Andrews
563878539af45d41143701a6d299e9b226937f5bMark Andrews freecm:
2f734e0a7e518c89c2b2b179714b8885b7626b3aAndreas Gustafsson isc_mem_put(lwresd->mctx, cm, sizeof(*cm));
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington return (result);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff}
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonstatic void
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Grafflwdclientmgr_destroy(ns_lwdclientmgr_t *cm) {
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ns_lwdclient_t *client;
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington ns_lwreslistener_t *listener;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
563878539af45d41143701a6d299e9b226937f5bMark Andrews LOCK(&cm->lock);
563878539af45d41143701a6d299e9b226937f5bMark Andrews if (!SHUTTINGDOWN(cm)) {
563878539af45d41143701a6d299e9b226937f5bMark Andrews UNLOCK(&cm->lock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return;
563878539af45d41143701a6d299e9b226937f5bMark Andrews }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff /*
563878539af45d41143701a6d299e9b226937f5bMark Andrews * Run through the idle list and free the clients there. Idle
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff * clients do not have a recv running nor do they have any finds
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff * or similar running.
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff */
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client = ISC_LIST_HEAD(cm->idle);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff while (client != NULL) {
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ns_lwdclient_log(50, "destroying client %p, manager %p",
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client, cm);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ISC_LIST_UNLINK(cm->idle, client, link);
2f734e0a7e518c89c2b2b179714b8885b7626b3aAndreas Gustafsson isc_mem_put(cm->mctx, client, sizeof(*client));
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client = ISC_LIST_HEAD(cm->idle);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff }
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
563878539af45d41143701a6d299e9b226937f5bMark Andrews if (!ISC_LIST_EMPTY(cm->running)) {
563878539af45d41143701a6d299e9b226937f5bMark Andrews UNLOCK(&cm->lock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return;
563878539af45d41143701a6d299e9b226937f5bMark Andrews }
563878539af45d41143701a6d299e9b226937f5bMark Andrews
563878539af45d41143701a6d299e9b226937f5bMark Andrews UNLOCK(&cm->lock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington lwres_context_destroy(&cm->lwctx);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff cm->view = NULL;
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington isc_socket_detach(&cm->sock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_task_detach(&cm->task);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
563878539af45d41143701a6d299e9b226937f5bMark Andrews DESTROYLOCK(&cm->lock);
563878539af45d41143701a6d299e9b226937f5bMark Andrews
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington listener = cm->listener;
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington ns_lwreslistener_unlinkcm(listener, cm);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ns_lwdclient_log(50, "destroying manager %p", cm);
2f734e0a7e518c89c2b2b179714b8885b7626b3aAndreas Gustafsson isc_mem_put(cm->mctx, cm, sizeof(*cm));
783055c0a61eba5f3a828d1b138155bae575eb14Brian Wellington ns_lwreslistener_detach(&listener);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonstatic void
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonprocess_request(ns_lwdclient_t *client) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington lwres_buffer_t b;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_result_t result;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington lwres_buffer_init(&b, client->buffer, client->recvlength);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington lwres_buffer_add(&b, client->recvlength);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = lwres_lwpacket_parseheader(&b, &client->pkt);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (result != ISC_R_SUCCESS) {
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "invalid packet header received");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington goto restart;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "opcode %08x", client->pkt.opcode);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington switch (client->pkt.opcode) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case LWRES_OPCODE_GETADDRSBYNAME:
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_processgabn(client, &b);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case LWRES_OPCODE_GETNAMEBYADDR:
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_processgnba(client, &b);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return;
9ce9834a57b5bdc1fb27aa78d7e8010bd46db714Brian Wellington case LWRES_OPCODE_GETRDATABYNAME:
9ce9834a57b5bdc1fb27aa78d7e8010bd46db714Brian Wellington ns_lwdclient_processgrbn(client, &b);
9ce9834a57b5bdc1fb27aa78d7e8010bd46db714Brian Wellington return;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case LWRES_OPCODE_NOOP:
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_processnoop(client, &b);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington default:
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "unknown opcode %08x", client->pkt.opcode);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington goto restart;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Drop the packet.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington restart:
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "restarting client %p...", client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_stateidle(client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonvoid
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_recv(isc_task_t *task, isc_event_t *ev) {
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson isc_result_t result;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_t *client = ev->ev_arg;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclientmgr_t *cm = client->clientmgr;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_socketevent_t *dev = (isc_socketevent_t *)ev;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(dev->region.base == client->buffer);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(NS_LWDCLIENT_ISRECV(client));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington NS_LWDCLIENT_SETRECVDONE(client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
563878539af45d41143701a6d299e9b226937f5bMark Andrews LOCK(&cm->lock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST((cm->flags & NS_LWDCLIENTMGR_FLAGRECVPENDING) != 0);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington cm->flags &= ~NS_LWDCLIENTMGR_FLAGRECVPENDING;
563878539af45d41143701a6d299e9b226937f5bMark Andrews UNLOCK(&cm->lock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50,
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington "event received: task %p, length %u, result %u (%s)",
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington task, dev->n, dev->result,
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington isc_result_totext(dev->result));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (dev->result != ISC_R_SUCCESS) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_event_free(&ev);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dev = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Go idle.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_stateidle(client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->recvlength = dev->n;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->address = dev->address;
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington if ((dev->attributes & ISC_SOCKEVENTATTR_PKTINFO) != 0) {
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington client->pktinfo = dev->pktinfo;
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington client->pktinfo_valid = ISC_TRUE;
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington } else
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington client->pktinfo_valid = ISC_FALSE;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_event_free(&ev);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dev = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson result = ns_lwdclient_startrecv(cm);
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson if (result != ISC_R_SUCCESS)
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson NS_LOGMODULE_LWRESD, ISC_LOG_ERROR,
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson "could not start lwres "
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson "client handler: %s",
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson isc_result_totext(result));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington process_request(client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington/*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * This function will start a new recv() on a socket for this client manager.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonisc_result_t
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_startrecv(ns_lwdclientmgr_t *cm) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_t *client;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_result_t result;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_region_t r;
563878539af45d41143701a6d299e9b226937f5bMark Andrews isc_boolean_t destroy = ISC_FALSE;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
563878539af45d41143701a6d299e9b226937f5bMark Andrews
563878539af45d41143701a6d299e9b226937f5bMark Andrews LOCK(&cm->lock);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff if (SHUTTINGDOWN(cm)) {
563878539af45d41143701a6d299e9b226937f5bMark Andrews destroy = ISC_TRUE;
563878539af45d41143701a6d299e9b226937f5bMark Andrews result = ISC_R_SUCCESS;
563878539af45d41143701a6d299e9b226937f5bMark Andrews goto unlock;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * If a recv is already running, don't bother.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
563878539af45d41143701a6d299e9b226937f5bMark Andrews if ((cm->flags & NS_LWDCLIENTMGR_FLAGRECVPENDING) != 0) {
563878539af45d41143701a6d299e9b226937f5bMark Andrews result = ISC_R_SUCCESS;
563878539af45d41143701a6d299e9b226937f5bMark Andrews goto unlock;
563878539af45d41143701a6d299e9b226937f5bMark Andrews }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * If we have no idle slots, just return success.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client = ISC_LIST_HEAD(cm->idle);
563878539af45d41143701a6d299e9b226937f5bMark Andrews if (client == NULL) {
563878539af45d41143701a6d299e9b226937f5bMark Andrews result = ISC_R_SUCCESS;
563878539af45d41143701a6d299e9b226937f5bMark Andrews goto unlock;
563878539af45d41143701a6d299e9b226937f5bMark Andrews }
563878539af45d41143701a6d299e9b226937f5bMark Andrews
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(NS_LWDCLIENT_ISIDLE(client));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
563878539af45d41143701a6d299e9b226937f5bMark Andrews /*
563878539af45d41143701a6d299e9b226937f5bMark Andrews * Set the flag to say there is a recv pending. If isc_socket_recv
563878539af45d41143701a6d299e9b226937f5bMark Andrews * fails we will clear the flag otherwise it will be cleared by
563878539af45d41143701a6d299e9b226937f5bMark Andrews * ns_lwdclient_recv.
563878539af45d41143701a6d299e9b226937f5bMark Andrews */
563878539af45d41143701a6d299e9b226937f5bMark Andrews cm->flags |= NS_LWDCLIENTMGR_FLAGRECVPENDING;
563878539af45d41143701a6d299e9b226937f5bMark Andrews
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Issue the recv. If it fails, return that it did.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington r.base = client->buffer;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington r.length = LWRES_RECVLENGTH;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = isc_socket_recv(cm->sock, &r, 0, cm->task, ns_lwdclient_recv,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client);
563878539af45d41143701a6d299e9b226937f5bMark Andrews if (result != ISC_R_SUCCESS) {
563878539af45d41143701a6d299e9b226937f5bMark Andrews cm->flags &= ~NS_LWDCLIENTMGR_FLAGRECVPENDING;
563878539af45d41143701a6d299e9b226937f5bMark Andrews goto unlock;
563878539af45d41143701a6d299e9b226937f5bMark Andrews }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Remove the client from the idle list, and put it on the running
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * list.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington NS_LWDCLIENT_SETRECV(client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LIST_UNLINK(cm->idle, client, link);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LIST_APPEND(cm->running, client, link);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
563878539af45d41143701a6d299e9b226937f5bMark Andrews unlock:
563878539af45d41143701a6d299e9b226937f5bMark Andrews UNLOCK(&cm->lock);
563878539af45d41143701a6d299e9b226937f5bMark Andrews
563878539af45d41143701a6d299e9b226937f5bMark Andrews if (destroy)
563878539af45d41143701a6d299e9b226937f5bMark Andrews lwdclientmgr_destroy(cm);
563878539af45d41143701a6d299e9b226937f5bMark Andrews
563878539af45d41143701a6d299e9b226937f5bMark Andrews return (result);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graffstatic void
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Grafflwdclientmgr_shutdown_callback(isc_task_t *task, isc_event_t *ev) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclientmgr_t *cm = ev->ev_arg;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ns_lwdclient_t *client;
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff REQUIRE(!SHUTTINGDOWN(cm));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ns_lwdclient_log(50, "got shutdown event, task %p, lwdclientmgr %p",
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff task, cm);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff /*
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff * run through the idle list and free the clients there. Idle
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff * clients do not have a recv running nor do they have any finds
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff * or similar running.
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff */
563878539af45d41143701a6d299e9b226937f5bMark Andrews LOCK(&cm->lock);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client = ISC_LIST_HEAD(cm->idle);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff while (client != NULL) {
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ns_lwdclient_log(50, "destroying client %p, manager %p",
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client, cm);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff ISC_LIST_UNLINK(cm->idle, client, link);
2f734e0a7e518c89c2b2b179714b8885b7626b3aAndreas Gustafsson isc_mem_put(cm->mctx, client, sizeof(*client));
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client = ISC_LIST_HEAD(cm->idle);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff }
563878539af45d41143701a6d299e9b226937f5bMark Andrews UNLOCK(&cm->lock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Cancel any pending I/O.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff isc_socket_cancel(cm->sock, task, ISC_SOCKCANCEL_ALL);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Run through the running client list and kill off any finds
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * in progress.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
563878539af45d41143701a6d299e9b226937f5bMark Andrews LOCK(&cm->lock);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client = ISC_LIST_HEAD(cm->running);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff while (client != NULL) {
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff if (client->find != client->v4find
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff && client->find != client->v6find)
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff dns_adb_cancelfind(client->find);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff if (client->v4find != NULL)
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff dns_adb_cancelfind(client->v4find);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff if (client->v6find != NULL)
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff dns_adb_cancelfind(client->v6find);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff client = ISC_LIST_NEXT(client, link);
4e96d1fc0646de4d879e7a0bc1e7aba449a67596Michael Graff }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington cm->flags |= NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
563878539af45d41143701a6d299e9b226937f5bMark Andrews UNLOCK(&cm->lock);
563878539af45d41143701a6d299e9b226937f5bMark Andrews
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_event_free(&ev);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington/*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Do all the crap needed to move a client from the run queue to the idle
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * queue.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonvoid
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_stateidle(ns_lwdclient_t *client) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclientmgr_t *cm;
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson isc_result_t result;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington cm = client->clientmgr;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(client->sendbuf == NULL);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(client->sendlength == 0);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(client->arg == NULL);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(client->v4find == NULL);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(client->v6find == NULL);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
563878539af45d41143701a6d299e9b226937f5bMark Andrews LOCK(&cm->lock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LIST_UNLINK(cm->running, client, link);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LIST_PREPEND(cm->idle, client, link);
563878539af45d41143701a6d299e9b226937f5bMark Andrews UNLOCK(&cm->lock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington NS_LWDCLIENT_SETIDLE(client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson result = ns_lwdclient_startrecv(cm);
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson if (result != ISC_R_SUCCESS)
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson NS_LOGMODULE_LWRESD, ISC_LOG_ERROR,
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson "could not start lwres "
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson "client handler: %s",
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson isc_result_totext(result));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonvoid
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_send(isc_task_t *task, isc_event_t *ev) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_t *client = ev->ev_arg;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclientmgr_t *cm = client->clientmgr;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_socketevent_t *dev = (isc_socketevent_t *)ev;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington UNUSED(task);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington UNUSED(dev);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(NS_LWDCLIENT_ISSEND(client));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(client->sendbuf == dev->region.base);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "task %p for client %p got send-done event",
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington task, client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (client->sendbuf != client->buffer)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington lwres_context_freemem(cm->lwctx, client->sendbuf,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->sendlength);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->sendbuf = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->sendlength = 0;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_stateidle(client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_event_free(&ev);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
50980039820700108f1f5eef1e42aa998a44f087Brian Wellingtonisc_result_t
50980039820700108f1f5eef1e42aa998a44f087Brian Wellingtonns_lwdclient_sendreply(ns_lwdclient_t *client, isc_region_t *r) {
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington struct in6_pktinfo *pktinfo;
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington ns_lwdclientmgr_t *cm = client->clientmgr;
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington if (client->pktinfo_valid)
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington pktinfo = &client->pktinfo;
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington else
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington pktinfo = NULL;
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington return (isc_socket_sendto(cm->sock, r, cm->task, ns_lwdclient_send,
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington client, &client->address, pktinfo));
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington}
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonvoid
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_initialize(ns_lwdclient_t *client, ns_lwdclientmgr_t *cmgr) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->clientmgr = cmgr;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LINK_INIT(client, link);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington NS_LWDCLIENT_SETIDLE(client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->arg = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->recvlength = 0;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->sendbuf = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->sendlength = 0;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->find = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->v4find = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->v6find = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->find_wanted = 0;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->options = 0;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->byaddr = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
9ce9834a57b5bdc1fb27aa78d7e8010bd46db714Brian Wellington client->lookup = NULL;
9ce9834a57b5bdc1fb27aa78d7e8010bd46db714Brian Wellington
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington client->pktinfo_valid = ISC_FALSE;
50980039820700108f1f5eef1e42aa998a44f087Brian Wellington
563878539af45d41143701a6d299e9b226937f5bMark Andrews LOCK(&cmgr->lock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LIST_APPEND(cmgr->idle, client, link);
563878539af45d41143701a6d299e9b226937f5bMark Andrews UNLOCK(&cmgr->lock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}