]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ndb/dns.h
ndb/dns: various changes
[plan9front.git] / sys / src / cmd / ndb / dns.h
1 #define NS2MS(ns) ((ns) / 1000000L)
2 #define S2MS(s)   ((s)  * 1000LL)
3
4 #define timems()        NS2MS(nsec())
5
6 typedef struct Ndbtuple Ndbtuple;
7
8 enum
9 {
10         /* RR types; see: http://www.iana.org/assignments/dns-parameters */
11         Ta=             1,
12         Tns=            2,
13         Tmd=            3,
14         Tmf=            4,
15         Tcname=         5,
16         Tsoa=           6,
17         Tmb=            7,
18         Tmg=            8,
19         Tmr=            9,
20         Tnull=          10,
21         Twks=           11,
22         Tptr=           12,
23         Thinfo=         13,
24         Tminfo=         14,
25         Tmx=            15,
26         Ttxt=           16,
27         Trp=            17,
28         Tafsdb=         18,
29         Tx25=           19,
30         Tisdn=          20,
31         Trt=            21,
32         Tnsap=          22,
33         Tnsapptr=       23,
34         Tsig=           24,
35         Tkey=           25,
36         Tpx=            26,
37         Tgpos=          27,
38         Taaaa=          28,
39         Tloc=           29,
40         Tnxt=           30,
41         Teid=           31,
42         Tnimloc=        32,
43         Tsrv=           33,
44         Tatma=          34,
45         Tnaptr=         35,
46         Tkx=            36,
47         Tcert=          37,
48         Ta6=            38,
49         Tdname=         39,
50         Tsink=          40,
51         Topt=           41,
52         Tapl=           42,
53         Tds=            43,
54         Tsshfp=         44,
55         Tipseckey=      45,
56         Trrsig=         46,
57         Tnsec=          47,
58         Tdnskey=        48,
59
60         Tspf=           99,
61         Tuinfo=         100,
62         Tuid=           101,
63         Tgid=           102,
64         Tunspec=        103,
65
66         /* query types (all RR types are also queries) */
67         Ttkey=  249,    /* transaction key */
68         Ttsig=  250,    /* transaction signature */
69         Tixfr=  251,    /* incremental zone transfer */
70         Taxfr=  252,    /* zone transfer */
71         Tmailb= 253,    /* { Tmb, Tmg, Tmr } */
72         Tmaila= 254,    /* obsolete */
73         Tall=   255,    /* all records */
74
75         /* classes */
76         Csym=   0,      /* internal symbols */
77         Cin=    1,      /* internet */
78         Ccs,            /* CSNET (obsolete) */
79         Cch,            /* Chaos net */
80         Chs,            /* Hesiod (?) */
81
82         /* class queries (all class types are also queries) */
83         Call=   255,    /* all classes */
84
85         /* opcodes */
86         Oquery=         0<<11,          /* normal query */
87         Oinverse=       1<<11,          /* inverse query (retired) */
88         Ostatus=        2<<11,          /* status request */
89         Onotify=        4<<11,          /* notify slaves of updates */
90         Oupdate=        5<<11,
91         Omask=          0xf<<11,        /* mask for opcode */
92
93         /* response codes */
94         Rok=            0,
95         Rformat=        1,      /* format error */
96         Rserver=        2,      /* server failure (e.g. no answer from something) */
97         Rname=          3,      /* bad name */
98         Runimplimented= 4,      /* unimplemented */
99         Rrefused=       5,      /* we don't like you */
100         Ryxdomain=      6,      /* name exists when it should not */
101         Ryxrrset=       7,      /* rr set exists when it should not */
102         Rnxrrset=       8,      /* rr set that should exist does not */
103         Rnotauth=       9,      /* not authoritative */
104         Rnotzone=       10,     /* name not in zone */
105         Rbadvers=       16,     /* bad opt version */
106 /*      Rbadsig=        16, */  /* also tsig signature failure */
107         Rbadkey=        17,             /* key not recognized */
108         Rbadtime=       18,             /* signature out of time window */
109         Rbadmode=       19,             /* bad tkey mode */
110         Rbadname=       20,             /* duplicate key name */
111         Rbadalg=        21,             /* algorithm not supported */
112         Rmask=          0x1f,   /* mask for response */
113         Rtimeout=       1<<5,   /* timeout sending (for internal use only) */
114
115         /* bits in flag word (other than opcode and response) */
116         Fresp=          1<<15,  /* message is a response */
117         Fauth=          1<<10,  /* true if an authoritative response */
118         Ftrunc=         1<<9,   /* truncated message */
119         Frecurse=       1<<8,   /* request recursion */
120         Fcanrec=        1<<7,   /* server can recurse */
121
122         Domlen=         256,    /* max domain name length (with NULL) */
123         Labellen=       64,     /* max domain label length (with NULL) */
124         Strlen=         256,    /* max string length (with NULL) */
125
126         /* time to live values (in seconds) */
127         Min=            60,
128         Hour=           60*Min,         /* */
129         Day=            24*Hour,        /* Ta, Tmx */
130         Week=           7*Day,          /* Tsoa, Tns */
131         Year=           52*Week,
132         DEFTTL=         Day,
133
134         /* reserved time (can't be timed out earlier) */
135         Reserved=       5*Min,
136
137         /* packet sizes */
138         Maxudp=         512,    /* maximum bytes per udp message sent */
139         Maxudpin=       2048,   /* maximum bytes per udp message rcv'd */
140
141         /* length of domain name hash table */
142         HTLEN=          4*1024,
143
144         Maxpath=        128,    /* size of mntpt */
145         Maxlcks=        10,     /* max. query-type locks per domain name */
146
147         RRmagic=        0xdeadbabe,
148         DNmagic=        0xa110a110,
149
150         /* parallelism: tune; was 32; allow lots */
151         Maxactive=      250,
152
153         /* tune; was 60*1000; keep it short */
154         Maxreqtm=       8*1000, /* max. ms to process a request */
155
156         Notauthoritative = 0,
157         Authoritative,
158 };
159
160 typedef struct Area     Area;
161 typedef struct Block    Block;
162 typedef struct Cert     Cert;
163 typedef struct DN       DN;
164 typedef struct DNSmsg   DNSmsg;
165 typedef struct Key      Key;
166 typedef struct Null     Null;
167 typedef struct RR       RR;
168 typedef struct Request  Request;
169 typedef struct SOA      SOA;
170 typedef struct Server   Server;
171 typedef struct Sig      Sig;
172 typedef struct Srv      Srv;
173 typedef struct Txt      Txt;
174
175 /*
176  *  a structure to track a request and any slave process handling it
177  */
178 struct Request
179 {
180         int     isslave;        /* pid of slave */
181         uvlong  aborttime;      /* time in ms at which we give up */
182         jmp_buf mret;           /* where master jumps to after starting a slave */
183         int     id;
184         char    *from;          /* who asked us? */
185 };
186
187 /*
188  *  a domain name
189  */
190 struct DN
191 {
192         DN      *next;          /* hash collision list */
193         ulong   magic;
194         char    *name;          /* owner */
195         RR      *rr;            /* resource records off this name */
196         ulong   referenced;     /* time last referenced */
197         ulong   ordinal;
198         ushort  class;          /* RR class */
199         uchar   respcode;       /* response code */
200         uchar   mark;           /* for mark and sweep */
201 };
202
203 /*
204  *  security info
205  */
206 struct Block
207 {
208         int     dlen;
209         uchar   *data;
210 };
211 struct Key
212 {
213         int     flags;
214         int     proto;
215         int     alg;
216         Block;
217 };
218 struct Cert
219 {
220         int     type;
221         int     tag;
222         int     alg;
223         Block;
224 };
225 struct Sig
226 {
227         Cert;
228         int     labels;
229         ulong   ttl;
230         ulong   exp;
231         ulong   incep;
232         DN      *signer;
233 };
234 struct Null
235 {
236         Block;
237 };
238
239 /*
240  *  text strings
241  */
242 struct Txt
243 {
244         Txt     *next;
245         char    *p;
246 };
247
248 /*
249  *  an unpacked resource record
250  */
251 struct RR
252 {
253         RR      *next;
254         ulong   magic;
255         DN      *owner;         /* domain that owns this resource record */
256         uintptr pc;             /* for tracking memory allocation */
257         ulong   ttl;            /* time to live to be passed on */
258         ulong   expire;         /* time this entry expires locally */
259         ulong   marker;         /* used locally when scanning rrlists */
260         ushort  type;           /* RR type */
261         ushort  query;          /* query type is in response to */
262         uchar   auth;           /* flag: authoritative */
263         uchar   db;             /* flag: from database */
264         uchar   cached;         /* flag: rr in cache */
265         uchar   negative;       /* flag: this is a cached negative response */
266
267         union {                 /* discriminated by negative & type */
268                 DN      *negsoaowner;   /* soa for cached negative response */
269                 DN      *host;  /* hostname - soa, cname, mb, md, mf, mx, ns, srv */
270                 DN      *cpu;   /* cpu type - hinfo */
271                 DN      *mb;    /* mailbox - mg, minfo */
272                 DN      *ip;    /* ip address - a, aaaa */
273                 DN      *rp;    /* rp arg - rp */
274                 uintptr arg0;   /* arg[01] are compared to find dups in dn.c */
275         };
276         union {                 /* discriminated by negative & type */
277                 int     negrcode; /* response code for cached negative resp. */
278                 DN      *rmb;   /* responsible maibox - minfo, soa, rp */
279                 DN      *ptr;   /* pointer to domain name - ptr */
280                 DN      *os;    /* operating system - hinfo */
281                 ulong   pref;   /* preference value - mx */
282                 ulong   local;  /* ns served from local database - ns */
283                 ushort  port;   /* - srv */
284                 uintptr arg1;   /* arg[01] are compared to find dups in dn.c */
285         };
286         union {                 /* discriminated by type */
287                 SOA     *soa;   /* soa timers - soa */
288                 Srv     *srv;
289                 Key     *key;
290                 Cert    *cert;
291                 Sig     *sig;
292                 Null    *null;
293                 Txt     *txt;
294         };
295 };
296
297 /*
298  *  list of servers
299  */
300 struct Server
301 {
302         Server  *next;
303         char    *name;
304 };
305
306 /*
307  *  timers for a start-of-authority record.  all ulongs are in seconds.
308  */
309 struct SOA
310 {
311         ulong   serial;         /* zone serial # */
312         ulong   refresh;        /* zone refresh interval */
313         ulong   retry;          /* zone retry interval */
314         ulong   expire;         /* time to expiration */
315         ulong   minttl;         /* min. time to live for any entry */
316
317         Server  *slaves;        /* slave servers */
318 };
319
320 /*
321  * srv (service location) record (rfc2782):
322  * _service._proto.name ttl class(IN) 'SRV' priority weight port target
323  */
324 struct Srv
325 {
326         ushort  pri;
327         ushort  weight;
328 };
329
330 typedef struct Rrlist Rrlist;
331 struct Rrlist
332 {
333         int     count;
334         RR      *rrs;
335 };
336
337 /*
338  *  domain messages
339  */
340 struct DNSmsg
341 {
342         ushort  id;
343         int     flags;
344         int     qdcount;        /* questions */
345         RR      *qd;
346         int     ancount;        /* answers */
347         RR      *an;
348         int     nscount;        /* name servers */
349         RR      *ns;
350         int     arcount;        /* hints */
351         RR      *ar;
352 };
353
354 /*
355  *  definition of local area for dblookup
356  */
357 struct Area
358 {
359         Area    *next;
360
361         int     len;            /* strlen(area->soarr->owner->name) */
362         RR      *soarr;         /* soa defining this area */
363         int     neednotify;
364         int     needrefresh;
365 };
366
367 typedef struct Cfg Cfg;
368 struct Cfg {
369         int     cachedb;
370         int     resolver;
371         int     justforw;       /* flag: pure resolver, just forward queries */
372         int     serve;          /* flag: serve udp queries */
373         int     inside;
374         int     straddle;
375 };
376
377 /* (udp) query stats */
378 typedef struct {
379         QLock;
380         ulong   slavehiwat;     /* procs */
381         ulong   qrecvd9p;       /* query counts */
382         ulong   qrecvdudp;
383         ulong   qsent;
384         ulong   qrecvd9prpc;    /* packet count */
385         ulong   alarms;
386         /* reply times by count */
387         ulong   under10ths[3*10+2];     /* under n*0.1 seconds, n is index */
388         ulong   tmout;
389         ulong   tmoutcname;
390         ulong   tmoutv6;
391
392         ulong   answinmem;      /* answers in memory */
393         ulong   negans;         /* negative answers received */
394         ulong   negserver;      /* neg ans with Rserver set */
395         ulong   negbaddeleg;    /* neg ans with bad delegations */
396         ulong   negbdnoans;     /* ⋯ and no answers */
397         ulong   negnorname;     /* neg ans with no Rname set */
398         ulong   negcached;      /* neg ans cached */
399 } Stats;
400
401 Stats stats;
402
403 enum
404 {
405         Recurse,
406         Dontrecurse,
407         NOneg,
408         OKneg,
409 };
410
411 extern Cfg      cfg;
412 extern char     *dbfile;
413 extern int      debug;
414 extern Area     *delegated;
415 extern char     *logfile;
416 extern int      maxage;         /* age of oldest entry in cache (secs) */
417 extern char     mntpt[];
418 extern int      needrefresh;
419 extern int      norecursion;
420 extern ulong    now;            /* time base */
421 extern vlong    nowns;
422 extern Area     *owned;
423 extern int      sendnotifies;
424 extern ulong    target;
425 extern int      testing;        /* test cache whenever removing a DN */
426 extern char     *trace;
427 extern int      traceactivity;
428 extern char     *zonerefreshprogram;
429
430 #pragma varargck        type    "R"     RR*
431 #pragma varargck        type    "Q"     RR*
432
433
434 /* dn.c */
435 extern char     *rrtname[];
436 extern char     *rname[];
437 extern unsigned nrname;
438 extern char     *opname[];
439 extern Lock     dnlock;
440
441 void    abort(); /* char*, ... */;
442 void    addserver(Server**, char*);
443 Server* copyserverlist(Server*);
444 void    db2cache(int);
445 void    dnage(DN*);
446 void    dnageall(int);
447 void    dnagedb(void);
448 void    dnagenever(DN *);
449 void    dnauthdb(void);
450 void    dncheck(void);
451 void    dndump(char*);
452 void    dnget(void);
453 void    dninit(void);
454 DN*     dnlookup(char*, int, int);
455 void    dnptr(uchar*, uchar*, char*, int, int, int);
456 void    dnpurge(void);
457 void    dnput(void);
458 void    dnslog(char*, ...);
459 void    dnstats(char *file);
460 void*   emalloc(int);
461 char*   estrdup(char*);
462 void    freeanswers(DNSmsg *mp);
463 void    freeserverlist(Server*);
464 int     getactivity(Request*, int);
465 Area*   inmyarea(char*);
466 void    putactivity(int);
467 RR*     randomize(RR*);
468 RR*     rralloc(int);
469 void    rrattach(RR*, int);
470 int     rravfmt(Fmt*);
471 RR*     rrcat(RR**, RR*);
472 RR**    rrcopy(RR*, RR**);
473 int     rrfmt(Fmt*);
474 void    rrfree(RR*);
475 void    rrfreelist(RR*);
476 RR*     rrlookup(DN*, int, int);
477 char*   rrname(int, char*, int);
478 RR*     rrremneg(RR**);
479 RR*     rrremtype(RR**, int);
480 int     rrsupported(int);
481 int     rrtype(char*);
482 void    slave(Request*);
483 int     subsume(char*, char*);
484 int     tsame(int, int);
485 void    unique(RR*);
486 void    warning(char*, ...);
487
488 /* dnarea.c */
489 void    refresh_areas(Area*);
490 void    freearea(Area**);
491 void    addarea(DN *dp, RR *rp, Ndbtuple *t);
492
493 /* dblookup.c */
494 int     baddelegation(RR*, RR*, uchar*);
495 RR*     dbinaddr(DN*, int);
496 RR*     dblookup(char*, int, int, int, int);
497 RR*     dnsservers(int);
498 RR*     domainlist(int);
499 int     insideaddr(char *dom);
500 int     insidens(uchar *ip);
501 int     myaddr(char *addr);
502 int     opendatabase(void);
503 int     outsidensip(int, uchar *ip);
504
505 /* dns.c */
506 char*   walkup(char*);
507 RR*     getdnsservers(int);
508 void    logreply(int, uchar*, DNSmsg*);
509 void    logsend(int, int, uchar*, char*, char*, int);
510 void    procsetname(char *fmt, ...);
511
512 /* dnresolve.c */
513 RR*     dnresolve(char*, int, int, Request*, RR**, int, int, int, int*);
514 int     udpport(char *);
515 int     mkreq(DN *dp, int type, uchar *buf, int flags, ushort reqno);
516 int     seerootns(void);
517 void    initdnsmsg(DNSmsg *mp, RR *rp, int flags, ushort reqno);
518
519 /* dnserver.c */
520 void    dnserver(DNSmsg*, DNSmsg*, Request*, uchar *, int);
521 void    dnudpserver(char*);
522 void    dntcpserver(char*);
523
524 /* dnnotify.c */
525 void    dnnotify(DNSmsg*, DNSmsg*, Request*);
526 void    notifyproc(void);
527
528 /* convDNS2M.c */
529 int     convDNS2M(DNSmsg*, uchar*, int);
530
531 /* convM2DNS.c */
532 char*   convM2DNS(uchar*, int, DNSmsg*, int*);
533
534 #pragma varargck argpos dnslog 1