minix/external/bsd/bind/dist/bin/named/include/named/lwdclient.h
David van Moolenbroek 00b67f09dd Import NetBSD named(8)
Also known as ISC bind.  This import adds utilities such as host(1),
dig(1), and nslookup(1), as well as many other tools and libraries.

Change-Id: I035ca46e64f1965d57019e773f4ff0ef035e4aa3
2017-03-21 22:00:06 +00:00

237 lines
6.9 KiB
C

/* $NetBSD: lwdclient.h,v 1.4 2014/12/10 04:37:52 christos Exp $ */
/*
* Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/* Id: lwdclient.h,v 1.20 2009/01/17 23:47:42 tbox Exp */
#ifndef NAMED_LWDCLIENT_H
#define NAMED_LWDCLIENT_H 1
/*! \file */
#include <isc/event.h>
#include <isc/eventclass.h>
#include <isc/netaddr.h>
#include <isc/sockaddr.h>
#include <isc/types.h>
#include <dns/fixedname.h>
#include <dns/types.h>
#include <lwres/lwres.h>
#include <named/lwsearch.h>
#define LWRD_EVENTCLASS ISC_EVENTCLASS(4242)
#define LWRD_SHUTDOWN (LWRD_EVENTCLASS + 0x0001)
/*% Lightweight Resolver Daemon Client */
struct ns_lwdclient {
isc_sockaddr_t address; /*%< where to reply */
struct in6_pktinfo pktinfo;
isc_boolean_t pktinfo_valid;
ns_lwdclientmgr_t *clientmgr; /*%< our parent */
ISC_LINK(ns_lwdclient_t) link;
unsigned int state;
void *arg; /*%< packet processing state */
/*
* Received data info.
*/
unsigned char buffer[LWRES_RECVLENGTH]; /*%< receive buffer */
isc_uint32_t recvlength; /*%< length recv'd */
lwres_lwpacket_t pkt;
/*%
* Send data state. If sendbuf != buffer (that is, the send buffer
* isn't our receive buffer) it will be freed to the lwres_context_t.
*/
unsigned char *sendbuf;
isc_uint32_t sendlength;
isc_buffer_t recv_buffer;
/*%
* gabn (get address by name) state info.
*/
dns_adbfind_t *find;
dns_adbfind_t *v4find;
dns_adbfind_t *v6find;
unsigned int find_wanted; /*%< Addresses we want */
dns_fixedname_t query_name;
dns_fixedname_t target_name;
ns_lwsearchctx_t searchctx;
lwres_gabnresponse_t gabn;
/*%
* gnba (get name by address) state info.
*/
lwres_gnbaresponse_t gnba;
dns_byaddr_t *byaddr;
unsigned int options;
isc_netaddr_t na;
/*%
* grbn (get rrset by name) state info.
*
* Note: this also uses target_name and searchctx.
*/
lwres_grbnresponse_t grbn;
dns_lookup_t *lookup;
dns_rdatatype_t rdtype;
/*%
* Alias and address info. This is copied up to the gabn/gnba
* structures eventually.
*
* XXXMLG We can keep all of this in a client since we only service
* three packet types right now. If we started handling more,
* we'd need to use "arg" above and allocate/destroy things.
*/
char *aliases[LWRES_MAX_ALIASES];
isc_uint16_t aliaslen[LWRES_MAX_ALIASES];
lwres_addr_t addrs[LWRES_MAX_ADDRS];
};
/*%
* Client states.
*
* _IDLE The client is not doing anything at all.
*
* _RECV The client is waiting for data after issuing a socket recv().
*
* _RECVDONE Data has been received, and is being processed.
*
* _FINDWAIT An adb (or other) request was made that cannot be satisfied
* immediately. An event will wake the client up.
*
* _SEND All data for a response has completed, and a reply was
* sent via a socket send() call.
*
* Badly formatted state table:
*
* IDLE -> RECV when client has a recv() queued.
*
* RECV -> RECVDONE when recvdone event received.
*
* RECVDONE -> SEND if the data for a reply is at hand.
* RECVDONE -> FINDWAIT if more searching is needed, and events will
* eventually wake us up again.
*
* FINDWAIT -> SEND when enough data was received to reply.
*
* SEND -> IDLE when a senddone event was received.
*
* At any time -> IDLE on error. Sometimes this will be -> SEND
* instead, if enough data is on hand to reply with a meaningful
* error.
*
* Packets which are badly formatted may or may not get error returns.
*/
#define NS_LWDCLIENT_STATEIDLE 1
#define NS_LWDCLIENT_STATERECV 2
#define NS_LWDCLIENT_STATERECVDONE 3
#define NS_LWDCLIENT_STATEFINDWAIT 4
#define NS_LWDCLIENT_STATESEND 5
#define NS_LWDCLIENT_STATESENDDONE 6
#define NS_LWDCLIENT_ISIDLE(c) \
((c)->state == NS_LWDCLIENT_STATEIDLE)
#define NS_LWDCLIENT_ISRECV(c) \
((c)->state == NS_LWDCLIENT_STATERECV)
#define NS_LWDCLIENT_ISRECVDONE(c) \
((c)->state == NS_LWDCLIENT_STATERECVDONE)
#define NS_LWDCLIENT_ISFINDWAIT(c) \
((c)->state == NS_LWDCLIENT_STATEFINDWAIT)
#define NS_LWDCLIENT_ISSEND(c) \
((c)->state == NS_LWDCLIENT_STATESEND)
/*%
* Overall magic test that means we're not idle.
*/
#define NS_LWDCLIENT_ISRUNNING(c) (!NS_LWDCLIENT_ISIDLE(c))
#define NS_LWDCLIENT_SETIDLE(c) \
((c)->state = NS_LWDCLIENT_STATEIDLE)
#define NS_LWDCLIENT_SETRECV(c) \
((c)->state = NS_LWDCLIENT_STATERECV)
#define NS_LWDCLIENT_SETRECVDONE(c) \
((c)->state = NS_LWDCLIENT_STATERECVDONE)
#define NS_LWDCLIENT_SETFINDWAIT(c) \
((c)->state = NS_LWDCLIENT_STATEFINDWAIT)
#define NS_LWDCLIENT_SETSEND(c) \
((c)->state = NS_LWDCLIENT_STATESEND)
#define NS_LWDCLIENT_SETSENDDONE(c) \
((c)->state = NS_LWDCLIENT_STATESENDDONE)
/*% lightweight daemon client manager */
struct ns_lwdclientmgr {
ns_lwreslistener_t *listener;
isc_mem_t *mctx;
isc_socket_t *sock; /*%< socket to use */
dns_view_t *view;
lwres_context_t *lwctx; /*%< lightweight proto context */
isc_task_t *task; /*%< owning task */
unsigned int flags;
ISC_LINK(ns_lwdclientmgr_t) link;
ISC_LIST(ns_lwdclient_t) idle; /*%< idle client slots */
ISC_LIST(ns_lwdclient_t) running; /*%< running clients */
};
#define NS_LWDCLIENTMGR_FLAGRECVPENDING 0x00000001
#define NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN 0x00000002
isc_result_t
ns_lwdclientmgr_create(ns_lwreslistener_t *, unsigned int, isc_taskmgr_t *);
void
ns_lwdclient_initialize(ns_lwdclient_t *, ns_lwdclientmgr_t *);
isc_result_t
ns_lwdclient_startrecv(ns_lwdclientmgr_t *);
void
ns_lwdclient_stateidle(ns_lwdclient_t *);
void
ns_lwdclient_recv(isc_task_t *, isc_event_t *);
void
ns_lwdclient_shutdown(isc_task_t *, isc_event_t *);
void
ns_lwdclient_send(isc_task_t *, isc_event_t *);
isc_result_t
ns_lwdclient_sendreply(ns_lwdclient_t *client, isc_region_t *r);
/*
* Processing functions of various types.
*/
void ns_lwdclient_processgabn(ns_lwdclient_t *, lwres_buffer_t *);
void ns_lwdclient_processgnba(ns_lwdclient_t *, lwres_buffer_t *);
void ns_lwdclient_processgrbn(ns_lwdclient_t *, lwres_buffer_t *);
void ns_lwdclient_processnoop(ns_lwdclient_t *, lwres_buffer_t *);
void ns_lwdclient_errorpktsend(ns_lwdclient_t *, isc_uint32_t);
void ns_lwdclient_log(int level, const char *format, ...)
ISC_FORMAT_PRINTF(2, 3);
#endif /* NAMED_LWDCLIENT_H */