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