lwdclient.c revision 9a6bbb206efa528373c31928ebd0b7216c747a13
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Copyright (C) 2000 Internet Software Consortium.
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 * 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
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington/* $Id: lwdclient.c,v 1.4 2000/06/26 20:49:56 bwelling Exp $ */
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellingtonns_lwdclient_log(int level, const char *format, ...) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_ADB,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if ((cm->flags & NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN) == 0)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington lwres_buffer_init(&b, client->buffer, client->recvlength);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = lwres_lwpacket_parseheader(&b, &client->pkt);
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "invalid packet header received");
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "opcode %08x", client->pkt.opcode);
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "unknown opcode %08x", client->pkt.opcode);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Drop the packet.
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "restarting client %p...", client);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_recv(isc_task_t *task, isc_event_t *ev) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_socketevent_t *dev = (isc_socketevent_t *)ev;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(dev->region.base == client->buffer);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST((cm->flags & NS_LWDCLIENTMGR_FLAGRECVPENDING) != 0);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington cm->flags &= ~NS_LWDCLIENTMGR_FLAGRECVPENDING;
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington "event received: task %p, length %u, result %u (%s)",
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 * This function will start a new recv() on a socket for this client manager.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_startrecv(ns_lwdclientmgr_t *cm) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if ((cm->flags & NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN) != 0)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * If a recv is already running, don't bother.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if ((cm->flags & NS_LWDCLIENTMGR_FLAGRECVPENDING) != 0)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * If we have no idle slots, just return success.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Issue the recv. If it fails, return that it did.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = isc_socket_recv(cm->sock, &r, 0, cm->task, ns_lwdclient_recv,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Set the flag to say we've issued a recv() call.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington cm->flags |= NS_LWDCLIENTMGR_FLAGRECVPENDING;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Remove the client from the idle list, and put it on the running
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LIST_APPEND(cm->running, client, link);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_shutdown(isc_task_t *task, isc_event_t *ev) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington REQUIRE((cm->flags & NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN) == 0);
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "got shutdown event, task %p", task);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Cancel any pending I/O.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if ((cm->flags & NS_LWDCLIENTMGR_FLAGRECVPENDING) != 0)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_socket_cancel(cm->sock, task, ISC_SOCKCANCEL_ALL);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Run through the running client list and kill off any finds
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * in progress.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington cm->flags |= NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Do all the crap needed to move a client from the run queue to the idle
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_stateidle(ns_lwdclient_t *client) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington ISC_LIST_UNLINK(cm->running, client, link);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonns_lwdclient_send(isc_task_t *task, isc_event_t *ev) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_socketevent_t *dev = (isc_socketevent_t *)ev;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington INSIST(client->sendbuf == dev->region.base);
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington ns_lwdclient_log(50, "task %p for client %p got send-done event",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington lwres_context_freemem(cm->lwctx, client->sendbuf,