lwdclient.h revision 135446
1135446Strhodes/*
2135446Strhodes * Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC")
3135446Strhodes * Copyright (C) 2000, 2001  Internet Software Consortium.
4135446Strhodes *
5135446Strhodes * Permission to use, copy, modify, and distribute this software for any
6135446Strhodes * purpose with or without fee is hereby granted, provided that the above
7135446Strhodes * copyright notice and this permission notice appear in all copies.
8135446Strhodes *
9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11135446Strhodes * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15135446Strhodes * PERFORMANCE OF THIS SOFTWARE.
16135446Strhodes */
17135446Strhodes
18135446Strhodes/* $Id: lwdclient.h,v 1.13.208.1 2004/03/06 10:21:24 marka Exp $ */
19135446Strhodes
20135446Strhodes#ifndef NAMED_LWDCLIENT_H
21135446Strhodes#define NAMED_LWDCLIENT_H 1
22135446Strhodes
23135446Strhodes#include <isc/event.h>
24135446Strhodes#include <isc/eventclass.h>
25135446Strhodes#include <isc/netaddr.h>
26135446Strhodes#include <isc/sockaddr.h>
27135446Strhodes#include <isc/types.h>
28135446Strhodes
29135446Strhodes#include <dns/fixedname.h>
30135446Strhodes#include <dns/types.h>
31135446Strhodes
32135446Strhodes#include <lwres/lwres.h>
33135446Strhodes
34135446Strhodes#include <named/lwsearch.h>
35135446Strhodes
36135446Strhodes#define LWRD_EVENTCLASS		ISC_EVENTCLASS(4242)
37135446Strhodes
38135446Strhodes#define LWRD_SHUTDOWN		(LWRD_EVENTCLASS + 0x0001)
39135446Strhodes
40135446Strhodesstruct ns_lwdclient {
41135446Strhodes	isc_sockaddr_t		address;	/* where to reply */
42135446Strhodes	struct in6_pktinfo	pktinfo;
43135446Strhodes	isc_boolean_t		pktinfo_valid;
44135446Strhodes	ns_lwdclientmgr_t	*clientmgr;	/* our parent */
45135446Strhodes	ISC_LINK(ns_lwdclient_t) link;
46135446Strhodes	unsigned int		state;
47135446Strhodes	void			*arg;		/* packet processing state */
48135446Strhodes
49135446Strhodes	/*
50135446Strhodes	 * Received data info.
51135446Strhodes	 */
52135446Strhodes	unsigned char		buffer[LWRES_RECVLENGTH]; /* receive buffer */
53135446Strhodes	isc_uint32_t		recvlength;	/* length recv'd */
54135446Strhodes	lwres_lwpacket_t	pkt;
55135446Strhodes
56135446Strhodes	/*
57135446Strhodes	 * Send data state.  If sendbuf != buffer (that is, the send buffer
58135446Strhodes	 * isn't our receive buffer) it will be freed to the lwres_context_t.
59135446Strhodes	 */
60135446Strhodes	unsigned char	       *sendbuf;
61135446Strhodes	isc_uint32_t		sendlength;
62135446Strhodes	isc_buffer_t		recv_buffer;
63135446Strhodes
64135446Strhodes	/*
65135446Strhodes	 * gabn (get address by name) state info.
66135446Strhodes	 */
67135446Strhodes	dns_adbfind_t		*find;
68135446Strhodes	dns_adbfind_t		*v4find;
69135446Strhodes	dns_adbfind_t		*v6find;
70135446Strhodes	unsigned int		find_wanted;	/* Addresses we want */
71135446Strhodes	dns_fixedname_t		query_name;
72135446Strhodes	dns_fixedname_t		target_name;
73135446Strhodes	ns_lwsearchctx_t	searchctx;
74135446Strhodes	lwres_gabnresponse_t	gabn;
75135446Strhodes
76135446Strhodes	/*
77135446Strhodes	 * gnba (get name by address) state info.
78135446Strhodes	 */
79135446Strhodes	lwres_gnbaresponse_t	gnba;
80135446Strhodes	dns_byaddr_t	       *byaddr;
81135446Strhodes	unsigned int		options;
82135446Strhodes	isc_netaddr_t		na;
83135446Strhodes
84135446Strhodes	/*
85135446Strhodes	 * grbn (get rrset by name) state info.
86135446Strhodes	 *
87135446Strhodes	 * Note: this also uses target_name and searchctx.
88135446Strhodes	 */
89135446Strhodes	lwres_grbnresponse_t	grbn;
90135446Strhodes	dns_lookup_t	       *lookup;
91135446Strhodes	dns_rdatatype_t		rdtype;
92135446Strhodes
93135446Strhodes	/*
94135446Strhodes	 * Alias and address info.  This is copied up to the gabn/gnba
95135446Strhodes	 * structures eventually.
96135446Strhodes	 *
97135446Strhodes	 * XXXMLG We can keep all of this in a client since we only service
98135446Strhodes	 * three packet types right now.  If we started handling more,
99135446Strhodes	 * we'd need to use "arg" above and allocate/destroy things.
100135446Strhodes	 */
101135446Strhodes	char		       *aliases[LWRES_MAX_ALIASES];
102135446Strhodes	isc_uint16_t		aliaslen[LWRES_MAX_ALIASES];
103135446Strhodes	lwres_addr_t		addrs[LWRES_MAX_ADDRS];
104135446Strhodes};
105135446Strhodes
106135446Strhodes/*
107135446Strhodes * Client states.
108135446Strhodes *
109135446Strhodes * _IDLE	The client is not doing anything at all.
110135446Strhodes *
111135446Strhodes * _RECV	The client is waiting for data after issuing a socket recv().
112135446Strhodes *
113135446Strhodes * _RECVDONE	Data has been received, and is being processed.
114135446Strhodes *
115135446Strhodes * _FINDWAIT	An adb (or other) request was made that cannot be satisfied
116135446Strhodes *		immediately.  An event will wake the client up.
117135446Strhodes *
118135446Strhodes * _SEND	All data for a response has completed, and a reply was
119135446Strhodes *		sent via a socket send() call.
120135446Strhodes *
121135446Strhodes * Badly formatted state table:
122135446Strhodes *
123135446Strhodes *	IDLE -> RECV when client has a recv() queued.
124135446Strhodes *
125135446Strhodes *	RECV -> RECVDONE when recvdone event received.
126135446Strhodes *
127135446Strhodes *	RECVDONE -> SEND if the data for a reply is at hand.
128135446Strhodes *	RECVDONE -> FINDWAIT if more searching is needed, and events will
129135446Strhodes *		eventually wake us up again.
130135446Strhodes *
131135446Strhodes *	FINDWAIT -> SEND when enough data was received to reply.
132135446Strhodes *
133135446Strhodes *	SEND -> IDLE when a senddone event was received.
134135446Strhodes *
135135446Strhodes *	At any time -> IDLE on error.  Sometimes this will be -> SEND
136135446Strhodes *	instead, if enough data is on hand to reply with a meaningful
137135446Strhodes *	error.
138135446Strhodes *
139135446Strhodes *	Packets which are badly formatted may or may not get error returns.
140135446Strhodes */
141135446Strhodes#define NS_LWDCLIENT_STATEIDLE		1
142135446Strhodes#define NS_LWDCLIENT_STATERECV		2
143135446Strhodes#define NS_LWDCLIENT_STATERECVDONE	3
144135446Strhodes#define NS_LWDCLIENT_STATEFINDWAIT	4
145135446Strhodes#define NS_LWDCLIENT_STATESEND		5
146135446Strhodes#define NS_LWDCLIENT_STATESENDDONE	6
147135446Strhodes
148135446Strhodes#define NS_LWDCLIENT_ISIDLE(c)		\
149135446Strhodes			((c)->state == NS_LWDCLIENT_STATEIDLE)
150135446Strhodes#define NS_LWDCLIENT_ISRECV(c)		\
151135446Strhodes			((c)->state == NS_LWDCLIENT_STATERECV)
152135446Strhodes#define NS_LWDCLIENT_ISRECVDONE(c)	\
153135446Strhodes			((c)->state == NS_LWDCLIENT_STATERECVDONE)
154135446Strhodes#define NS_LWDCLIENT_ISFINDWAIT(c)	\
155135446Strhodes			((c)->state == NS_LWDCLIENT_STATEFINDWAIT)
156135446Strhodes#define NS_LWDCLIENT_ISSEND(c)		\
157135446Strhodes			((c)->state == NS_LWDCLIENT_STATESEND)
158135446Strhodes
159135446Strhodes/*
160135446Strhodes * Overall magic test that means we're not idle.
161135446Strhodes */
162135446Strhodes#define NS_LWDCLIENT_ISRUNNING(c)	(!NS_LWDCLIENT_ISIDLE(c))
163135446Strhodes
164135446Strhodes#define NS_LWDCLIENT_SETIDLE(c)		\
165135446Strhodes			((c)->state = NS_LWDCLIENT_STATEIDLE)
166135446Strhodes#define NS_LWDCLIENT_SETRECV(c)		\
167135446Strhodes			((c)->state = NS_LWDCLIENT_STATERECV)
168135446Strhodes#define NS_LWDCLIENT_SETRECVDONE(c)	\
169135446Strhodes			((c)->state = NS_LWDCLIENT_STATERECVDONE)
170135446Strhodes#define NS_LWDCLIENT_SETFINDWAIT(c)	\
171135446Strhodes			((c)->state = NS_LWDCLIENT_STATEFINDWAIT)
172135446Strhodes#define NS_LWDCLIENT_SETSEND(c)		\
173135446Strhodes			((c)->state = NS_LWDCLIENT_STATESEND)
174135446Strhodes#define NS_LWDCLIENT_SETSENDDONE(c)	\
175135446Strhodes			((c)->state = NS_LWDCLIENT_STATESENDDONE)
176135446Strhodes
177135446Strhodesstruct ns_lwdclientmgr {
178135446Strhodes	ns_lwreslistener_t     *listener;
179135446Strhodes	isc_mem_t	       *mctx;
180135446Strhodes	isc_socket_t	       *sock;		/* socket to use */
181135446Strhodes	dns_view_t	       *view;
182135446Strhodes	lwres_context_t	       *lwctx;		/* lightweight proto context */
183135446Strhodes	isc_task_t	       *task;		/* owning task */
184135446Strhodes	unsigned int		flags;
185135446Strhodes	ISC_LINK(ns_lwdclientmgr_t)	link;
186135446Strhodes	ISC_LIST(ns_lwdclient_t)	idle;		/* idle client slots */
187135446Strhodes	ISC_LIST(ns_lwdclient_t)	running;	/* running clients */
188135446Strhodes};
189135446Strhodes
190135446Strhodes#define NS_LWDCLIENTMGR_FLAGRECVPENDING		0x00000001
191135446Strhodes#define NS_LWDCLIENTMGR_FLAGSHUTTINGDOWN	0x00000002
192135446Strhodes
193135446Strhodesisc_result_t
194135446Strhodesns_lwdclientmgr_create(ns_lwreslistener_t *, unsigned int, isc_taskmgr_t *);
195135446Strhodes
196135446Strhodesvoid
197135446Strhodesns_lwdclient_initialize(ns_lwdclient_t *, ns_lwdclientmgr_t *);
198135446Strhodes
199135446Strhodesisc_result_t
200135446Strhodesns_lwdclient_startrecv(ns_lwdclientmgr_t *);
201135446Strhodes
202135446Strhodesvoid
203135446Strhodesns_lwdclient_stateidle(ns_lwdclient_t *);
204135446Strhodes
205135446Strhodesvoid
206135446Strhodesns_lwdclient_recv(isc_task_t *, isc_event_t *);
207135446Strhodes
208135446Strhodesvoid
209135446Strhodesns_lwdclient_shutdown(isc_task_t *, isc_event_t *);
210135446Strhodes
211135446Strhodesvoid
212135446Strhodesns_lwdclient_send(isc_task_t *, isc_event_t *);
213135446Strhodes
214135446Strhodesisc_result_t
215135446Strhodesns_lwdclient_sendreply(ns_lwdclient_t *client, isc_region_t *r);
216135446Strhodes
217135446Strhodes/*
218135446Strhodes * Processing functions of various types.
219135446Strhodes */
220135446Strhodesvoid ns_lwdclient_processgabn(ns_lwdclient_t *, lwres_buffer_t *);
221135446Strhodesvoid ns_lwdclient_processgnba(ns_lwdclient_t *, lwres_buffer_t *);
222135446Strhodesvoid ns_lwdclient_processgrbn(ns_lwdclient_t *, lwres_buffer_t *);
223135446Strhodesvoid ns_lwdclient_processnoop(ns_lwdclient_t *, lwres_buffer_t *);
224135446Strhodes
225135446Strhodesvoid ns_lwdclient_errorpktsend(ns_lwdclient_t *, isc_uint32_t);
226135446Strhodes
227135446Strhodesvoid ns_lwdclient_log(int level, const char *format, ...)
228135446Strhodes     ISC_FORMAT_PRINTF(2, 3);
229135446Strhodes
230135446Strhodes#endif /* NAMED_LWDCLIENT_H */
231