]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ndb/dns.h
merge
[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   lookuptime;     /* last time we tried to get a better value */
198         /* refs was `char' but we've seen refs > 120, so go whole hog */
199         ulong   refs;           /* for mark and sweep */
200         ulong   ordinal;
201         ushort  class;          /* RR class */
202         uchar   keep;           /* flag: never age this name */
203         uchar   respcode;       /* response code */
204 };
205
206 /*
207  *  security info
208  */
209 struct Block
210 {
211         int     dlen;
212         uchar   *data;
213 };
214 struct Key
215 {
216         int     flags;
217         int     proto;
218         int     alg;
219         Block;
220 };
221 struct Cert
222 {
223         int     type;
224         int     tag;
225         int     alg;
226         Block;
227 };
228 struct Sig
229 {
230         Cert;
231         int     labels;
232         ulong   ttl;
233         ulong   exp;
234         ulong   incep;
235         DN      *signer;
236 };
237 struct Null
238 {
239         Block;
240 };
241
242 /*
243  *  text strings
244  */
245 struct Txt
246 {
247         Txt     *next;
248         char    *p;
249 };
250
251 /*
252  *  an unpacked resource record
253  */
254 struct RR
255 {
256         RR      *next;
257         ulong   magic;
258         DN      *owner;         /* domain that owns this resource record */
259         uintptr pc;             /* for tracking memory allocation */
260         ulong   ttl;            /* time to live to be passed on */
261         ulong   expire;         /* time this entry expires locally */
262         ulong   marker;         /* used locally when scanning rrlists */
263         ushort  type;           /* RR type */
264         ushort  query;          /* query type is in response to */
265         uchar   auth;           /* flag: authoritative */
266         uchar   db;             /* flag: from database */
267         uchar   cached;         /* flag: rr in cache */
268         uchar   negative;       /* flag: this is a cached negative response */
269
270         union {                 /* discriminated by negative & type */
271                 DN      *negsoaowner;   /* soa for cached negative response */
272                 DN      *host;  /* hostname - soa, cname, mb, md, mf, mx, ns, srv */
273                 DN      *cpu;   /* cpu type - hinfo */
274                 DN      *mb;    /* mailbox - mg, minfo */
275                 DN      *ip;    /* ip address - a, aaaa */
276                 DN      *rp;    /* rp arg - rp */
277                 uintptr arg0;   /* arg[01] are compared to find dups in dn.c */
278         };
279         union {                 /* discriminated by negative & type */
280                 int     negrcode; /* response code for cached negative resp. */
281                 DN      *rmb;   /* responsible maibox - minfo, soa, rp */
282                 DN      *ptr;   /* pointer to domain name - ptr */
283                 DN      *os;    /* operating system - hinfo */
284                 ulong   pref;   /* preference value - mx */
285                 ulong   local;  /* ns served from local database - ns */
286                 ushort  port;   /* - srv */
287                 uintptr arg1;   /* arg[01] are compared to find dups in dn.c */
288         };
289         union {                 /* discriminated by type */
290                 SOA     *soa;   /* soa timers - soa */
291                 Srv     *srv;
292                 Key     *key;
293                 Cert    *cert;
294                 Sig     *sig;
295                 Null    *null;
296                 Txt     *txt;
297         };
298 };
299
300 /*
301  *  list of servers
302  */
303 struct Server
304 {
305         Server  *next;
306         char    *name;
307 };
308
309 /*
310  *  timers for a start-of-authority record.  all ulongs are in seconds.
311  */
312 struct SOA
313 {
314         ulong   serial;         /* zone serial # */
315         ulong   refresh;        /* zone refresh interval */
316         ulong   retry;          /* zone retry interval */
317         ulong   expire;         /* time to expiration */
318         ulong   minttl;         /* min. time to live for any entry */
319
320         Server  *slaves;        /* slave servers */
321 };
322
323 /*
324  * srv (service location) record (rfc2782):
325  * _service._proto.name ttl class(IN) 'SRV' priority weight port target
326  */
327 struct Srv
328 {
329         ushort  pri;
330         ushort  weight;
331 };
332
333 typedef struct Rrlist Rrlist;
334 struct Rrlist
335 {
336         int     count;
337         RR      *rrs;
338 };
339
340 /*
341  *  domain messages
342  */
343 struct DNSmsg
344 {
345         ushort  id;
346         int     flags;
347         int     qdcount;        /* questions */
348         RR      *qd;
349         int     ancount;        /* answers */
350         RR      *an;
351         int     nscount;        /* name servers */
352         RR      *ns;
353         int     arcount;        /* hints */
354         RR      *ar;
355 };
356
357 /*
358  *  definition of local area for dblookup
359  */
360 struct Area
361 {
362         Area    *next;
363
364         int     len;            /* strlen(area->soarr->owner->name) */
365         RR      *soarr;         /* soa defining this area */
366         int     neednotify;
367         int     needrefresh;
368 };
369
370 typedef struct Cfg Cfg;
371 struct Cfg {
372         int     cachedb;
373         int     resolver;
374         int     justforw;       /* flag: pure resolver, just forward queries */
375         int     serve;          /* flag: serve udp queries */
376         int     inside;
377         int     straddle;
378 };
379
380 /* (udp) query stats */
381 typedef struct {
382         QLock;
383         ulong   slavehiwat;     /* procs */
384         ulong   qrecvd9p;       /* query counts */
385         ulong   qrecvdudp;
386         ulong   qsent;
387         ulong   qrecvd9prpc;    /* packet count */
388         ulong   alarms;
389         /* reply times by count */
390         ulong   under10ths[3*10+2];     /* under n*0.1 seconds, n is index */
391         ulong   tmout;
392         ulong   tmoutcname;
393         ulong   tmoutv6;
394
395         ulong   answinmem;      /* answers in memory */
396         ulong   negans;         /* negative answers received */
397         ulong   negserver;      /* neg ans with Rserver set */
398         ulong   negbaddeleg;    /* neg ans with bad delegations */
399         ulong   negbdnoans;     /* ⋯ and no answers */
400         ulong   negnorname;     /* neg ans with no Rname set */
401         ulong   negcached;      /* neg ans cached */
402 } Stats;
403
404 Stats stats;
405
406 enum
407 {
408         Recurse,
409         Dontrecurse,
410         NOneg,
411         OKneg,
412 };
413
414 extern Cfg      cfg;
415 extern char     *dbfile;
416 extern int      debug;
417 extern Area     *delegated;
418 extern char     *logfile;
419 extern int      maxage;         /* age of oldest entry in cache (secs) */
420 extern char     mntpt[];
421 extern int      needrefresh;
422 extern int      norecursion;
423 extern ulong    now;            /* time base */
424 extern vlong    nowns;
425 extern Area     *owned;
426 extern int      sendnotifies;
427 extern ulong    target;
428 extern int      testing;        /* test cache whenever removing a DN */
429 extern char     *trace;
430 extern int      traceactivity;
431 extern char     *zonerefreshprogram;
432
433 #pragma varargck        type    "R"     RR*
434 #pragma varargck        type    "Q"     RR*
435
436
437 /* dn.c */
438 extern char     *rrtname[];
439 extern char     *rname[];
440 extern unsigned nrname;
441 extern char     *opname[];
442 extern Lock     dnlock;
443
444 void    abort(); /* char*, ... */;
445 void    addserver(Server**, char*);
446 Server* copyserverlist(Server*);
447 void    db2cache(int);
448 void    dnage(DN*);
449 void    dnageall(int);
450 void    dnagedb(void);
451 void    dnagenever(DN *, int);
452 void    dnauthdb(void);
453 void    dncheck(void);
454 void    dndump(char*);
455 void    dnget(void);
456 void    dninit(void);
457 DN*     dnlookup(char*, int, int);
458 void    dnptr(uchar*, uchar*, char*, int, int, int);
459 void    dnpurge(void);
460 void    dnput(void);
461 void    dnslog(char*, ...);
462 void    dnstats(char *file);
463 void*   emalloc(int);
464 char*   estrdup(char*);
465 void    freeanswers(DNSmsg *mp);
466 void    freeserverlist(Server*);
467 int     getactivity(Request*, int);
468 Area*   inmyarea(char*);
469 void    putactivity(int);
470 RR*     randomize(RR*);
471 RR*     rralloc(int);
472 void    rrattach(RR*, int);
473 int     rravfmt(Fmt*);
474 RR*     rrcat(RR**, RR*);
475 RR**    rrcopy(RR*, RR**);
476 int     rrfmt(Fmt*);
477 void    rrfree(RR*);
478 void    rrfreelist(RR*);
479 RR*     rrlookup(DN*, int, int);
480 char*   rrname(int, char*, int);
481 RR*     rrremneg(RR**);
482 RR*     rrremtype(RR**, int);
483 int     rrsupported(int);
484 int     rrtype(char*);
485 void    slave(Request*);
486 int     subsume(char*, char*);
487 int     tsame(int, int);
488 void    unique(RR*);
489 void    warning(char*, ...);
490
491 /* dnarea.c */
492 void    refresh_areas(Area*);
493 void    freearea(Area**);
494 void    addarea(DN *dp, RR *rp, Ndbtuple *t);
495
496 /* dblookup.c */
497 int     baddelegation(RR*, RR*, uchar*);
498 RR*     dbinaddr(DN*, int);
499 RR*     dblookup(char*, int, int, int, int);
500 RR*     dnsservers(int);
501 RR*     domainlist(int);
502 int     insideaddr(char *dom);
503 int     insidens(uchar *ip);
504 int     myaddr(char *addr);
505 int     opendatabase(void);
506 int     outsidensip(int, uchar *ip);
507
508 /* dns.c */
509 char*   walkup(char*);
510 RR*     getdnsservers(int);
511 void    logreply(int, uchar*, DNSmsg*);
512 void    logsend(int, int, uchar*, char*, char*, int);
513 void    procsetname(char *fmt, ...);
514
515 /* dnresolve.c */
516 RR*     dnresolve(char*, int, int, Request*, RR**, int, int, int, int*);
517 int     udpport(char *);
518 int     mkreq(DN *dp, int type, uchar *buf, int flags, ushort reqno);
519 int     seerootns(void);
520 void    initdnsmsg(DNSmsg *mp, RR *rp, int flags, ushort reqno);
521
522 /* dnserver.c */
523 void    dnserver(DNSmsg*, DNSmsg*, Request*, uchar *, int);
524 void    dnudpserver(char*);
525 void    dntcpserver(char*);
526
527 /* dnnotify.c */
528 void    dnnotify(DNSmsg*, DNSmsg*, Request*);
529 void    notifyproc(void);
530
531 /* convDNS2M.c */
532 int     convDNS2M(DNSmsg*, uchar*, int);
533
534 /* convM2DNS.c */
535 char*   convM2DNS(uchar*, int, DNSmsg*, int*);
536
537 #pragma varargck argpos dnslog 1