lwdclient.c revision 9a6bbb206efa528373c31928ebd0b7216c747a13
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington/*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Copyright (C) 2000 Internet Software Consortium.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington *
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Permission to use, copy, modify, and distribute this software for any
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * purpose with or without fee is hereby granted, provided that the above
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * copyright notice and this permission notice appear in all copies.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington *
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * SOFTWARE.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington/* $Id: lwdclient.c,v 1.4 2000/06/26 20:49:56 bwelling Exp $ */
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
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <dns/view.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <dns/log.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <named/types.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <named/lwdclient.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
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
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonstatic void
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonclientmgr_can_die(ns_lwdclientmgr_t *cm) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if ((cm->flags & NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN) == 0)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (ISC_LIST_HEAD(cm->running) != NULL)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington lwres_context_destroy(&cm->lwctx);
bb54e57a8e24d70e640def95da3142b9b742adfeBrian Wellington isc_socket_detach(&cm->sock);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_view_detach(&cm->view);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_task_detach(&cm->task);
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;
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) {
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
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST((cm->flags & NS_LWDCLIENTMGR_FLAGRECVPENDING) != 0);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington cm->flags &= ~NS_LWDCLIENTMGR_FLAGRECVPENDING;
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 /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * XXXMLG If we wanted to run on ipv6 as well, we'd need the pktinfo
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * bits. Right now we don't, so don't remember them.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->recvlength = dev->n;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington client->address = dev->address;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_event_free(&ev);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dev = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_startrecv(cm);
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;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if ((cm->flags & NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN) != 0)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return (ISC_R_SUCCESS);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * If a recv is already running, don't bother.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if ((cm->flags & NS_LWDCLIENTMGR_FLAGRECVPENDING) != 0)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return (ISC_R_SUCCESS);
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);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (client == NULL)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return (ISC_R_SUCCESS);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(NS_LWDCLIENT_ISIDLE(client));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
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);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (result != ISC_R_SUCCESS)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return (result);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Set the flag to say we've issued a recv() call.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington cm->flags |= NS_LWDCLIENTMGR_FLAGRECVPENDING;
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
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington return (ISC_R_SUCCESS);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonvoid
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_shutdown(isc_task_t *task, isc_event_t *ev) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclientmgr_t *cm = ev->ev_arg;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington REQUIRE((cm->flags & NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN) == 0);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "got shutdown event, task %p", task);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Cancel any pending I/O.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if ((cm->flags & NS_LWDCLIENTMGR_FLAGRECVPENDING) != 0)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington 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 */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /* XXXMLG */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington cm->flags |= NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
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;
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
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LIST_UNLINK(cm->running, client, link);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LIST_PREPEND(cm->idle, client, link);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington NS_LWDCLIENT_SETIDLE(client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington clientmgr_can_die(cm);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ns_lwdclient_startrecv(cm);
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);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
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
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 client->addrinfo = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LIST_APPEND(cmgr->idle, client, link);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}