00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef NAMED_CLIENT_H
00021 #define NAMED_CLIENT_H 1
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #include <isc/buffer.h>
00066 #include <isc/magic.h>
00067 #include <isc/stdtime.h>
00068 #include <isc/quota.h>
00069 #include <isc/queue.h>
00070
00071 #include <dns/db.h>
00072 #include <dns/fixedname.h>
00073 #include <dns/name.h>
00074 #include <dns/rdataclass.h>
00075 #include <dns/rdatatype.h>
00076 #include <dns/tcpmsg.h>
00077 #include <dns/types.h>
00078
00079 #include <named/types.h>
00080 #include <named/query.h>
00081
00082
00083
00084
00085
00086
00087 struct ns_client {
00088 unsigned int magic;
00089 isc_mem_t * mctx;
00090 ns_clientmgr_t * manager;
00091 int state;
00092 int newstate;
00093 int naccepts;
00094 int nreads;
00095 int nsends;
00096 int nrecvs;
00097 int nupdates;
00098 int nctls;
00099 int references;
00100 isc_boolean_t needshutdown;
00101
00102
00103
00104
00105
00106
00107 unsigned int attributes;
00108 isc_task_t * task;
00109 dns_view_t * view;
00110 dns_dispatch_t * dispatch;
00111 isc_socket_t * udpsocket;
00112 isc_socket_t * tcplistener;
00113 isc_socket_t * tcpsocket;
00114 unsigned char * tcpbuf;
00115 dns_tcpmsg_t tcpmsg;
00116 isc_boolean_t tcpmsg_valid;
00117 isc_timer_t * timer;
00118 isc_timer_t * delaytimer;
00119 isc_boolean_t timerset;
00120 dns_message_t * message;
00121 isc_socketevent_t * sendevent;
00122 isc_socketevent_t * recvevent;
00123 unsigned char * recvbuf;
00124 dns_rdataset_t * opt;
00125 isc_uint16_t udpsize;
00126 isc_uint16_t extflags;
00127 isc_int16_t ednsversion;
00128 void (*next)(ns_client_t *);
00129 void (*shutdown)(void *arg, isc_result_t result);
00130 void *shutdown_arg;
00131 ns_query_t query;
00132 isc_stdtime_t requesttime;
00133 isc_stdtime_t now;
00134 isc_time_t tnow;
00135 dns_name_t signername;
00136 dns_name_t * signer;
00137 isc_boolean_t mortal;
00138 isc_boolean_t pipelined;
00139 isc_quota_t *tcpquota;
00140 isc_quota_t *recursionquota;
00141 ns_interface_t *interface;
00142
00143 isc_sockaddr_t peeraddr;
00144 isc_boolean_t peeraddr_valid;
00145 isc_netaddr_t destaddr;
00146
00147 isc_netaddr_t ecs_addr;
00148 isc_uint8_t ecs_addrlen;
00149 isc_uint8_t ecs_scope;
00150
00151 struct in6_pktinfo pktinfo;
00152 isc_dscp_t dscp;
00153 isc_event_t ctlevent;
00154 #ifdef ALLOW_FILTER_AAAA
00155 dns_aaaa_t filter_aaaa;
00156 #endif
00157
00158
00159
00160
00161
00162
00163 struct {
00164 isc_sockaddr_t addr;
00165 isc_stdtime_t time;
00166 dns_messageid_t id;
00167 } formerrcache;
00168
00169 ISC_LINK(ns_client_t) link;
00170 ISC_LINK(ns_client_t) rlink;
00171 ISC_QLINK(ns_client_t) ilink;
00172 unsigned char cookie[8];
00173 isc_uint32_t expire;
00174 };
00175
00176 typedef ISC_QUEUE(ns_client_t) client_queue_t;
00177 typedef ISC_LIST(ns_client_t) client_list_t;
00178
00179 #define NS_CLIENT_MAGIC ISC_MAGIC('N','S','C','c')
00180 #define NS_CLIENT_VALID(c) ISC_MAGIC_VALID(c, NS_CLIENT_MAGIC)
00181
00182 #define NS_CLIENTATTR_TCP 0x0001
00183 #define NS_CLIENTATTR_RA 0x0002
00184 #define NS_CLIENTATTR_PKTINFO 0x0004
00185 #define NS_CLIENTATTR_MULTICAST 0x0008
00186 #define NS_CLIENTATTR_WANTDNSSEC 0x0010
00187 #define NS_CLIENTATTR_WANTNSID 0x0020
00188 #ifdef ALLOW_FILTER_AAAA
00189 #define NS_CLIENTATTR_FILTER_AAAA 0x0040
00190 #define NS_CLIENTATTR_FILTER_AAAA_RC 0x0080
00191 #endif
00192 #define NS_CLIENTATTR_WANTAD 0x0100
00193 #define NS_CLIENTATTR_WANTSIT 0x0200
00194 #define NS_CLIENTATTR_HAVESIT 0x0400
00195 #define NS_CLIENTATTR_WANTEXPIRE 0x0800
00196 #define NS_CLIENTATTR_HAVEEXPIRE 0x1000
00197 #define NS_CLIENTATTR_WANTOPT 0x2000
00198 #define NS_CLIENTATTR_HAVEECS 0x4000
00199
00200 #define NS_CLIENTATTR_NOSETFC 0x8000
00201
00202
00203
00204
00205
00206 #define NS_FAILCACHE_CD 0x01
00207
00208
00209
00210 extern unsigned int ns_client_requests;
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 void
00222 ns_client_send(ns_client_t *client);
00223
00224
00225
00226
00227
00228
00229
00230
00231 void
00232 ns_client_sendraw(ns_client_t *client, dns_message_t *msg);
00233
00234
00235
00236
00237
00238 void
00239 ns_client_error(ns_client_t *client, isc_result_t result);
00240
00241
00242
00243
00244
00245
00246 void
00247 ns_client_next(ns_client_t *client, isc_result_t result);
00248
00249
00250
00251
00252
00253 isc_boolean_t
00254 ns_client_shuttingdown(ns_client_t *client);
00255
00256
00257
00258
00259 void
00260 ns_client_attach(ns_client_t *source, ns_client_t **target);
00261
00262
00263
00264
00265 void
00266 ns_client_detach(ns_client_t **clientp);
00267
00268
00269
00270
00271 isc_result_t
00272 ns_client_replace(ns_client_t *client);
00273
00274
00275
00276
00277
00278
00279 void
00280 ns_client_settimeout(ns_client_t *client, unsigned int seconds);
00281
00282
00283
00284
00285 isc_result_t
00286 ns_clientmgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
00287 isc_timermgr_t *timermgr, ns_clientmgr_t **managerp);
00288
00289
00290
00291
00292 void
00293 ns_clientmgr_destroy(ns_clientmgr_t **managerp);
00294
00295
00296
00297
00298
00299 isc_result_t
00300 ns_clientmgr_createclients(ns_clientmgr_t *manager, unsigned int n,
00301 ns_interface_t *ifp, isc_boolean_t tcp);
00302
00303
00304
00305
00306
00307
00308 isc_sockaddr_t *
00309 ns_client_getsockaddr(ns_client_t *client);
00310
00311
00312
00313
00314
00315 isc_result_t
00316 ns_client_checkaclsilent(ns_client_t *client, isc_netaddr_t *netaddr,
00317 dns_acl_t *acl, isc_boolean_t default_allow);
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345 isc_result_t
00346 ns_client_checkacl(ns_client_t *client,
00347 isc_sockaddr_t *sockaddr,
00348 const char *opname, dns_acl_t *acl,
00349 isc_boolean_t default_allow,
00350 int log_level);
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363 void
00364 ns_client_log(ns_client_t *client, isc_logcategory_t *category,
00365 isc_logmodule_t *module, int level,
00366 const char *fmt, ...) ISC_FORMAT_PRINTF(5, 6);
00367
00368 void
00369 ns_client_logv(ns_client_t *client, isc_logcategory_t *category,
00370 isc_logmodule_t *module, int level, const char *fmt, va_list ap) ISC_FORMAT_PRINTF(5, 0);
00371
00372 void
00373 ns_client_aclmsg(const char *msg, dns_name_t *name, dns_rdatatype_t type,
00374 dns_rdataclass_t rdclass, char *buf, size_t len);
00375
00376 #define NS_CLIENT_ACLMSGSIZE(x) \
00377 (DNS_NAME_FORMATSIZE + DNS_RDATATYPE_FORMATSIZE + \
00378 DNS_RDATACLASS_FORMATSIZE + sizeof(x) + sizeof("'/'"))
00379
00380 void
00381 ns_client_recursing(ns_client_t *client);
00382
00383
00384
00385
00386 void
00387 ns_client_killoldestquery(ns_client_t *client);
00388
00389
00390
00391
00392 void
00393 ns_client_dumprecursing(FILE *f, ns_clientmgr_t *manager);
00394
00395
00396
00397
00398 void
00399 ns_client_qnamereplace(ns_client_t *client, dns_name_t *name);
00400
00401
00402
00403
00404 isc_boolean_t
00405 ns_client_isself(dns_view_t *myview, dns_tsigkey_t *mykey,
00406 isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
00407 dns_rdataclass_t rdclass, void *arg);
00408
00409
00410
00411
00412 isc_result_t
00413 ns_client_sourceip(dns_clientinfo_t *ci, isc_sockaddr_t **addrp);
00414
00415 isc_result_t
00416 ns_client_addopt(ns_client_t *client, dns_message_t *message,
00417 dns_rdataset_t **opt);
00418
00419 #endif