|
|
1.1 root 1: /*
2: * Copyright (c) 1985 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: *
17: * @(#)ns.h 4.22 (Berkeley) 6/18/88
18: */
19:
20: /*
21: * Global definitions and variables for the name server.
22: */
23:
24: #include <strings.h>
25: #include <arpa/inet.h>
26:
27: /*
28: * Timeout time should be around 1 minute or so. Using the
29: * the current simplistic backoff strategy, the sequence
30: * retrys after 4, 8, and 16 seconds. With 3 servers, this
31: * dies out in a little more than a minute.
32: * (sequence RETRYBASE, 2*RETRYBASE, 4*RETRYBASE... for MAXRETRY)
33: */
34: #define MAXZONES 128 /* max number of zones supported */
35: #define MINROOTS 2 /* min number of root hints */
36: #define NSMAX 10 /* max number of NS's to try */
37: #define RETRYBASE 4 /* base time between retries */
38: #define MAXRETRY 3 /* max number of retries per addr */
39: #define MAXCNAMES 8 /* max # of CNAMES tried per addr */
40: #define MAXQUERIES 20 /* max # of queries to be made */
41: /* (prevent "recursive" loops) */
42: #define INIT_REFRESH 600 /* retry time for initial secondary */
43: /* contact (10 minutes) */
44:
45: #define ALPHA 0.7 /* How much to preserver of old response time */
46: #define BETA 1.2 /* How much to penalize response time on failure */
47: #define GAMMA 0.98 /* How much to decay unused response times */
48:
49: struct zoneinfo {
50: int z_type; /* type of zone */
51: int z_auth; /* zone is authoritative */
52: char *z_origin; /* root domain name of zone */
53: time_t z_time; /* time for next refresh */
54: time_t z_lastupdate; /* time of last refresh */
55: u_long z_refresh; /* refresh interval */
56: u_long z_retry; /* refresh retry interval */
57: u_long z_expire; /* expiration time for cached info */
58: u_long z_minimum; /* minimum TTL value */
59: u_long z_serial; /* changes if zone modified */
60: char *z_source; /* source location of data */
61: time_t z_ftime; /* modification time of source file */
62: int z_addrcnt; /* address count */
63: struct in_addr z_addr[NSMAX]; /* list of master servers for zone */
64: int z_sysloged; /* has fail to transfer been sysloged */
65: #ifdef ALLOW_UPDATES
66: int hasChanged; /* non-zero if zone has been updated
67: * since last checkpoint
68: */
69: #endif ALLOW_UPDATES
70: };
71:
72: /* zone types (z_type) */
73: #define Z_PRIMARY 1
74: #define Z_SECONDARY 2
75: #define Z_CACHE 3
76:
77: /*
78: * Structure for recording info on forwarded queries.
79: */
80: struct qinfo {
81: u_short q_id; /* id of query */
82: u_short q_nsid; /* id of forwarded query */
83: int q_dfd; /* UDP file descriptor */
84: struct sockaddr_in q_from; /* requestor's address */
85: char *q_msg; /* the message */
86: int q_msglen; /* len of message */
87: int q_naddr; /* number of addr's in q_addr */
88: int q_curaddr; /* last addr sent to */
89: struct fwdinfo *q_fwd; /* last forwarder used */
90: time_t q_time; /* time to retry */
91: struct qinfo *q_next; /* rexmit list (sorted by time) */
92: struct qinfo *q_link; /* storage list (random order) */
93: struct qserv {
94: struct sockaddr_in ns_addr; /* addresses of NS's */
95: struct databuf *ns; /* databuf for NS record */
96: struct databuf *nsdata; /* databuf for server address */
97: struct timeval stime; /* time first query started */
98: int nretry; /* # of times addr retried */
99: } q_addr[NSMAX]; /* addresses of NS's */
100: struct databuf *q_usedns[NSMAX]; /* databuf for NS that we've tried */
101: int q_nusedns;
102: int q_cname; /* # of cnames found */
103: int q_nqueries; /* # of queries required */
104: char *q_cmsg; /* the cname message */
105: int q_cmsglen; /* len of cname message */
106: struct qstream *q_stream; /* TCP stream, null if UDP */
107: int q_system; /* boolean, system query */
108: };
109:
110: #define Q_NEXTADDR(qp,n) \
111: (((qp)->q_fwd == (struct fwdinfo *)0) ? \
112: &(qp)->q_addr[n].ns_addr : &(qp)->q_fwd->fwdaddr)
113:
114: #define PRIMING_CACHE 42
115: #define QINFO_NULL ((struct qinfo *)0)
116: extern struct qinfo *qfindid();
117: extern struct qinfo *qnew();
118: extern struct qinfo *retryqp; /* next query to retry */
119: /*
120: * Return codes from ns_forw:
121: */
122: #define FW_OK 0
123: #define FW_DUP 1
124: #define FW_NOSERVER 2
125: #define FW_SERVFAIL 3
126:
127: struct qstream {
128: int s_rfd; /* stream file descriptor */
129: int s_size; /* expected amount of data to recive */
130: int s_bufsize; /* amount of data recived in s_buf */
131: char *s_buf; /* buffer of recived data */
132: char *s_bufp; /* pointer into s_buf of recived data */
133: struct qstream *s_next; /* next stream */
134: struct sockaddr_in s_from; /* address query came from */
135: u_long s_time; /* time stamp of last transaction */
136: int s_refcnt; /* number of outstanding queries */
137: u_short s_tempsize; /* temporary for size from net */
138: };
139:
140: #define QSTREAM_NULL ((struct qstream *)0)
141: extern struct qstream *streamq; /* stream queue */
142:
143: struct qdatagram {
144: int dq_dfd; /* datagram file descriptor */
145: struct qdatagram *dq_next; /* next datagram */
146: struct in_addr dq_addr; /* address of interface */
147: };
148:
149: #define QDATAGRAM_NULL ((struct qdatagram *)0)
150: extern struct qdatagram *datagramq; /* datagram queue */
151:
152: struct netinfo {
153: struct netinfo *next;
154: u_long net;
155: u_long mask;
156: struct in_addr my_addr;
157: };
158:
159: struct fwdinfo {
160: struct fwdinfo *next;
161: struct sockaddr_in fwdaddr;
162: };
163:
164: struct nets {
165: char *name;
166: long net;
167: struct nets *next;
168: };
169:
170: /*
171: * Statistics Defines
172: */
173: struct stats {
174: unsigned long cnt;
175: char *description;
176: };
177:
178: /* gross count of UDP packets in and out */
179: #define S_INPKTS 0
180: #define S_OUTPKTS 1
181: /* gross count of queries and inverse queries received */
182: #define S_QUERIES 2
183: #define S_IQUERIES 3
184: #define S_DUPQUERIES 4
185: #define S_RESPONSES 5
186: #define S_DUPRESP 6
187: #define S_RESPOK 7
188: #define S_RESPFAIL 8
189: #define S_RESPFORMERR 9
190: #define S_SYSQUERIES 10
191: #define S_PRIMECACHE 11
192: #define S_CHECKNS 12
193: #define S_BADRESPONSES 13
194: #define S_MARTIANS 14
195: #define S_NSTATS 15 /* Careful! */
196: #ifdef STATS
197: extern struct stats stats[S_NSTATS];
198: extern unsigned long typestats[T_ANY+1];
199: #endif
200:
201: #ifdef DEBUG
202: extern int debug; /* debug flag */
203: extern FILE *ddt; /* debug file discriptor */
204: #endif
205: extern int ds; /* datagram socket */
206: extern struct qdatagram *dqp;
207: extern struct timeval tt; /* place to store time */
208:
209: extern struct itimerval ival; /* maintenance interval */
210: extern struct zoneinfo zones[MAXZONES]; /* zone information */
211: extern int nzones; /* number of zones in use */
212:
213: #ifdef vax
214: extern u_short htons(), ntohs();
215: extern u_long htonl(), ntohl();
216: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.