~ubuntu-branches/ubuntu/vivid/dnsmasq/vivid-updates

« back to all changes in this revision

Viewing changes to src/dnsmasq.h

  • Committer: Package Import Robot
  • Author(s): Simon Kelley
  • Date: 2014-04-23 15:14:42 UTC
  • mfrom: (0.5.8) (12.2.17 sid)
  • Revision ID: package-import@ubuntu.com-20140423151442-22uqxwgu9wi56gd7
Tags: 2.70-1
New upstream.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* dnsmasq is Copyright (c) 2000-2013 Simon Kelley
 
1
/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
2
2
 
3
3
   This program is free software; you can redistribute it and/or modify
4
4
   it under the terms of the GNU General Public License as published by
14
14
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
15
*/
16
16
 
17
 
#define COPYRIGHT "Copyright (c) 2000-2013 Simon Kelley" 
 
17
#define COPYRIGHT "Copyright (c) 2000-2014 Simon Kelley" 
18
18
 
19
19
#ifndef NO_LARGEFILE
20
20
/* Ensure we can use files >2GB (log files may grow this big) */
50
50
#include <getopt.h>
51
51
 
52
52
#include "config.h"
 
53
#include "ip6addr.h"
53
54
 
54
55
typedef unsigned char u8;
55
56
typedef unsigned short u16;
56
57
typedef unsigned int u32;
57
58
typedef unsigned long long u64;
58
59
 
 
60
#define countof(x)      (long)(sizeof(x) / sizeof(x[0]))
 
61
#define MIN(a,b)        ((a) < (b) ? (a) : (b))
 
62
 
59
63
#include "dns-protocol.h"
60
64
#include "dhcp-protocol.h"
61
65
#ifdef HAVE_DHCP6
160
164
#define EVENT_FORK_ERR  18
161
165
#define EVENT_LUA_ERR   19
162
166
#define EVENT_TFTP_ERR  20
 
167
#define EVENT_INIT      21
163
168
 
164
169
/* Exit codes. */
165
170
#define EC_GOOD        0
213
218
#define OPT_NO_OVERRIDE    30
214
219
#define OPT_NO_REBIND      31
215
220
#define OPT_ADD_MAC        32
216
 
#define OPT_DNSSEC         33
 
221
#define OPT_DNSSEC_PROXY   33
217
222
#define OPT_CONSEC_ADDR    34
218
223
#define OPT_CONNTRACK      35
219
224
#define OPT_FQDN_UPDATE    36
225
230
#define OPT_QUIET_DHCP     42
226
231
#define OPT_QUIET_DHCP6    43
227
232
#define OPT_QUIET_RA       44
228
 
#define OPT_LAST           45
 
233
#define OPT_DNSSEC_VALID   45
 
234
#define OPT_DNSSEC_TIME    46
 
235
#define OPT_DNSSEC_DEBUG   47
 
236
#define OPT_DNSSEC_NO_SIGN 48 
 
237
#define OPT_LOCAL_SERVICE  49
 
238
#define OPT_LAST           50
229
239
 
230
240
/* extra flags for my_syslog, we use a couple of facilities since they are known 
231
241
   not to occupy the same bits as priorities, no matter how syslog.h is set up. */
238
248
#ifdef HAVE_IPV6
239
249
    struct in6_addr addr6;
240
250
#endif
 
251
    /* for log_query */
 
252
    unsigned int keytag;
 
253
    /* for cache_insert if RRSIG, DNSKEY, DS */
 
254
    struct {
 
255
      unsigned short class, type;
 
256
    } dnssec;      
241
257
  } addr;
242
258
};
243
259
 
265
281
  struct naptr *next;
266
282
};
267
283
 
 
284
#define TXT_STAT_CACHESIZE     1
 
285
#define TXT_STAT_INSERTS       2
 
286
#define TXT_STAT_EVICTIONS     3
 
287
#define TXT_STAT_MISSES        4
 
288
#define TXT_STAT_HITS          5
 
289
#define TXT_STAT_AUTH          6
 
290
#define TXT_STAT_SERVERS       7
 
291
 
268
292
struct txt_record {
269
293
  char *name;
270
294
  unsigned char *txt;
271
295
  unsigned short class, len;
 
296
  int stat;
272
297
  struct txt_record *next;
273
298
};
274
299
 
282
307
  struct cname *next;
283
308
}; 
284
309
 
 
310
struct ds_config {
 
311
  char *name, *digest;
 
312
  int digestlen, class, algo, keytag, digest_type;
 
313
  struct ds_config *next;
 
314
};
 
315
 
285
316
#define ADDRLIST_LITERAL 1
286
317
#define ADDRLIST_IPV6    2
287
318
 
331
362
  union bigname *next; /* freelist */
332
363
};
333
364
 
334
 
struct keydata {
335
 
  struct keydata *next;
 
365
struct blockdata {
 
366
  struct blockdata *next;
336
367
  unsigned char key[KEYBLOCK_LEN];
337
368
};
338
369
 
346
377
        struct crec *cache;
347
378
        struct interface_name *int_name;
348
379
      } target;
349
 
      int uid; /* -1 if union is interface-name */
 
380
      unsigned int uid; /* 0 if union is interface-name */
350
381
    } cname;
351
382
    struct {
352
 
      struct keydata *keydata;
353
 
      unsigned char algo;
354
 
      unsigned char digest; /* DS only */
355
 
      unsigned short flags_or_keyid; /* flags for DNSKEY, keyid for DS */
356
 
    } key;
 
383
      struct blockdata *keydata;
 
384
      unsigned short keylen, flags, keytag;
 
385
      unsigned char algo;
 
386
    } key; 
 
387
    struct {
 
388
      struct blockdata *keydata;
 
389
      unsigned short keylen, keytag;
 
390
      unsigned char algo;
 
391
      unsigned char digest; 
 
392
    } ds; 
 
393
    struct {
 
394
      struct blockdata *keydata;
 
395
      unsigned short keylen, type_covered, keytag;
 
396
      char algo;
 
397
    } sig;
357
398
  } addr;
358
399
  time_t ttd; /* time to die */
359
 
  /* used as keylen if F_DS or F_DNSKEY, index to source for F_HOSTS */
360
 
  int uid; 
 
400
  /* used as class if DNSKEY/DS/RRSIG, index to source for F_HOSTS */
 
401
  unsigned int uid; 
361
402
  unsigned short flags;
362
403
  union {
363
404
    char sname[SMALLDNAME];
391
432
#define F_QUERY     (1u<<19)
392
433
#define F_NOERR     (1u<<20)
393
434
#define F_AUTH      (1u<<21)
394
 
 
395
 
/* composites */
396
 
#define F_TYPE      (F_IPV4 | F_IPV6 | F_DNSKEY | F_DS) /* Only one may be set */
397
 
 
 
435
#define F_DNSSEC    (1u<<22)
 
436
#define F_KEYTAG    (1u<<23)
 
437
#define F_SECSTAT   (1u<<24)
 
438
#define F_NO_RR     (1u<<25)
 
439
#define F_IPSET     (1u<<26)
 
440
 
 
441
/* Values of uid in crecs with F_CONFIG bit set. */
 
442
#define SRC_INTERFACE 0
 
443
#define SRC_CONFIG    1
 
444
#define SRC_HOSTS     2
 
445
#define SRC_AH        3
398
446
 
399
447
 
400
448
/* struct sockaddr is not large enough to hold any address,
427
475
#define SERV_COUNTED         512  /* workspace for log code */
428
476
#define SERV_USE_RESOLV     1024  /* forward this domain in the normal way */
429
477
#define SERV_NO_REBIND      2048  /* inhibit dns-rebind protection */
 
478
#define SERV_FROM_FILE      4096  /* read from --servers-file */
430
479
 
431
480
struct serverfd {
432
481
  int fd;
493
542
  struct hostsfile *next;
494
543
  int flags;
495
544
  char *fname;
496
 
  int index; /* matches to cache entries for logging */
 
545
  unsigned int index; /* matches to cache entries for logging */
497
546
};
498
547
 
 
548
 
 
549
/* DNSSEC status values. */
 
550
#define STAT_SECURE             1
 
551
#define STAT_INSECURE           2
 
552
#define STAT_BOGUS              3
 
553
#define STAT_NEED_DS            4
 
554
#define STAT_NEED_KEY           5
 
555
#define STAT_TRUNCATED          6
 
556
#define STAT_SECURE_WILDCARD    7
 
557
#define STAT_NO_SIG             8
 
558
#define STAT_NO_DS              9
 
559
#define STAT_NEED_DS_NEG       10
 
560
#define STAT_CHASE_CNAME       11
 
561
 
499
562
#define FREC_NOREBIND           1
500
563
#define FREC_CHECKING_DISABLED  2
501
564
#define FREC_HAS_SUBNET         4
 
565
#define FREC_DNSKEY_QUERY       8
 
566
#define FREC_DS_QUERY          16
 
567
#define FREC_AD_QUESTION       32
 
568
#define FREC_DO_QUESTION       64
 
569
#define FREC_ADDED_PHEADER    128
 
570
#define FREC_CHECK_NOSIGN     256
 
571
 
 
572
#ifdef HAVE_DNSSEC
 
573
#define HASH_SIZE 20 /* SHA-1 digest size */
 
574
#else
 
575
#define HASH_SIZE sizeof(int)
 
576
#endif
502
577
 
503
578
struct frec {
504
579
  union mysockaddr source;
511
586
  unsigned int iface;
512
587
  unsigned short orig_id, new_id;
513
588
  int fd, forwardall, flags;
514
 
  unsigned int crc;
515
589
  time_t time;
 
590
  unsigned char *hash[HASH_SIZE];
 
591
#ifdef HAVE_DNSSEC 
 
592
  int class, work_counter;
 
593
  struct blockdata *stash; /* Saved reply, whilst we validate */
 
594
  size_t stash_len;
 
595
  struct frec *dependent; /* Query awaiting internally-generated DNSKEY or DS query */
 
596
  struct frec *blocking_query; /* Query which is blocking us. */
 
597
#endif
516
598
  struct frec *next;
517
599
};
518
600
 
561
643
  struct in6_addr addr6;
562
644
  int iaid;
563
645
  struct slaac_address {
564
 
    struct in6_addr addr, local;
 
646
    struct in6_addr addr;
565
647
    time_t ping_time;
566
648
    int backoff; /* zero -> confirmed */
567
649
    struct slaac_address *next;
810
892
  unsigned int options, options2;
811
893
  struct resolvc default_resolv, *resolv_files;
812
894
  time_t last_resolv;
 
895
  char *servers_file;
813
896
  struct mx_srv_record *mxnames;
814
897
  struct naptr *naptr;
815
898
  struct txt_record *txt, *rr;
875
958
#ifdef OPTION6_PREFIX_CLASS 
876
959
  struct prefix_class *prefix_classes;
877
960
#endif
 
961
#ifdef HAVE_DNSSEC
 
962
  struct ds_config *ds;
 
963
#endif
878
964
 
879
965
  /* globally used stuff for DNS */
880
966
  char *packet; /* packet buffer */
881
967
  int packet_buff_sz; /* size of above */
882
968
  char *namebuff; /* MAXDNAME size buffer */
 
969
#ifdef HAVE_DNSSEC
 
970
  char *keyname; /* MAXDNAME size buffer */
 
971
  char *workspacename; /* ditto */
 
972
#endif
883
973
  unsigned int local_answer, queries_forwarded, auth_answer;
884
974
  struct frec *frec_list;
885
975
  struct serverfd *sfds;
894
984
  pid_t tcp_pids[MAX_PROCS];
895
985
  struct randfd randomsocks[RANDOM_SOCKS];
896
986
  int v6pktinfo; 
 
987
  struct addrlist *interface_addrs; /* list of all addresses/prefix lengths associated with all local interfaces */
897
988
 
898
989
  /* DHCP state */
899
990
  int dhcpfd, helperfd, pxefd; 
900
991
#if defined(HAVE_LINUX_NETWORK)
901
992
  int netlinkfd;
902
993
#elif defined(HAVE_BSD_NETWORK)
903
 
  int dhcp_raw_fd, dhcp_icmp_fd;
 
994
  int dhcp_raw_fd, dhcp_icmp_fd, routefd;
904
995
#endif
905
996
  struct iovec dhcp_packet;
906
997
  char *dhcp_buff, *dhcp_buff2, *dhcp_buff3;
931
1022
/* cache.c */
932
1023
void cache_init(void);
933
1024
void log_query(unsigned int flags, char *name, struct all_addr *addr, char *arg); 
934
 
char *record_source(int index);
935
 
void querystr(char *desc, char *str, unsigned short type);
 
1025
char *record_source(unsigned int index);
 
1026
char *querystr(char *desc, unsigned short type);
936
1027
struct crec *cache_find_by_addr(struct crec *crecp,
937
1028
                                struct all_addr *addr, time_t now, 
938
 
                                unsigned short prot);
 
1029
                                unsigned int prot);
939
1030
struct crec *cache_find_by_name(struct crec *crecp, 
940
 
                                char *name, time_t now, unsigned short  prot);
 
1031
                                char *name, time_t now, unsigned int prot);
941
1032
void cache_end_insert(void);
942
1033
void cache_start_insert(void);
943
1034
struct crec *cache_insert(char *name, struct all_addr *addr,
947
1038
struct in_addr a_record_from_hosts(char *name, time_t now);
948
1039
void cache_unhash_dhcp(void);
949
1040
void dump_cache(time_t now);
 
1041
int cache_make_stat(struct txt_record *t);
950
1042
char *cache_get_name(struct crec *crecp);
951
1043
char *cache_get_cname_target(struct crec *crecp);
952
1044
struct crec *cache_enumerate(int init);
 
1045
 
 
1046
/* blockdata.c */
953
1047
#ifdef HAVE_DNSSEC
954
 
struct keydata *keydata_alloc(char *data, size_t len);
955
 
void keydata_free(struct keydata *blocks);
 
1048
void blockdata_init(void);
 
1049
void blockdata_report(void);
 
1050
struct blockdata *blockdata_alloc(char *data, size_t len);
 
1051
void *blockdata_retrieve(struct blockdata *block, size_t len, void *data);
 
1052
void blockdata_free(struct blockdata *blocks);
956
1053
#endif
957
1054
 
958
1055
/* domain.c */
964
1061
int is_rev_synth(int flag, struct all_addr *addr, char *name);
965
1062
 
966
1063
/* rfc1035.c */
 
1064
int extract_name(struct dns_header *header, size_t plen, unsigned char **pp, 
 
1065
                 char *name, int isExtract, int extrabytes);
 
1066
unsigned char *skip_name(unsigned char *ansp, struct dns_header *header, size_t plen, int extrabytes);
 
1067
unsigned char *skip_questions(struct dns_header *header, size_t plen);
 
1068
unsigned char *skip_section(unsigned char *ansp, int count, struct dns_header *header, size_t plen);
967
1069
unsigned int extract_request(struct dns_header *header, size_t qlen, 
968
1070
                               char *name, unsigned short *typep);
969
1071
size_t setup_reply(struct dns_header *header, size_t  qlen,
971
1073
                   unsigned long local_ttl);
972
1074
int extract_addresses(struct dns_header *header, size_t qlen, char *namebuff, 
973
1075
                      time_t now, char **ipsets, int is_sign, int checkrebind,
974
 
                      int checking_disabled);
 
1076
                      int no_cache, int secure, int *doctored);
975
1077
size_t answer_request(struct dns_header *header, char *limit, size_t qlen,  
976
 
                   struct in_addr local_addr, struct in_addr local_netmask, time_t now);
 
1078
                      struct in_addr local_addr, struct in_addr local_netmask, 
 
1079
                      time_t now, int *ad_reqd, int *do_bit);
977
1080
int check_for_bogus_wildcard(struct dns_header *header, size_t qlen, char *name, 
978
1081
                             struct bogus_addr *addr, time_t now);
979
1082
unsigned char *find_pseudoheader(struct dns_header *header, size_t plen,
984
1087
                  unsigned char *pheader, size_t hlen);
985
1088
size_t add_mac(struct dns_header *header, size_t plen, char *limit, union mysockaddr *l3);
986
1089
size_t add_source_addr(struct dns_header *header, size_t plen, char *limit, union mysockaddr *source);
 
1090
#ifdef HAVE_DNSSEC
 
1091
size_t add_do_bit(struct dns_header *header, size_t plen, char *limit);
 
1092
#endif
987
1093
int check_source(struct dns_header *header, size_t plen, unsigned char *pseudoheader, union mysockaddr *peer);
988
1094
int add_resource_record(struct dns_header *header, char *limit, int *truncp,
989
1095
                        int nameoffset, unsigned char **pp, unsigned long ttl, 
1001
1107
int in_zone(struct auth_zone *zone, char *name, char **cut);
1002
1108
#endif
1003
1109
 
 
1110
/* dnssec.c */
 
1111
size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, int class, int type, union mysockaddr *addr);
 
1112
int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t n, char *name, char *keyname, int class);
 
1113
int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class);
 
1114
int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class, int *neganswer);
 
1115
int dnssec_chase_cname(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname);
 
1116
int dnskey_keytag(int alg, int flags, unsigned char *rdata, int rdlen);
 
1117
size_t filter_rrsigs(struct dns_header *header, size_t plen);
 
1118
unsigned char* hash_questions(struct dns_header *header, size_t plen, char *name);
 
1119
 
1004
1120
/* util.c */
1005
1121
void rand_init(void);
1006
1122
unsigned short rand16(void);
1049
1165
char *option_string(int prot, unsigned int opt, unsigned char *val, 
1050
1166
                    int opt_len, char *buf, int buf_len);
1051
1167
void reread_dhcp(void);
 
1168
void read_servers_file(void);
1052
1169
void set_option_bool(unsigned int opt);
1053
1170
void reset_option_bool(unsigned int opt);
1054
1171
struct hostsfile *expand_filelist(struct hostsfile *list);
1061
1178
unsigned char *tcp_request(int confd, time_t now,
1062
1179
                           union mysockaddr *local_addr, struct in_addr netmask, int auth_dns);
1063
1180
void server_gone(struct server *server);
1064
 
struct frec *get_new_frec(time_t now, int *wait);
 
1181
struct frec *get_new_frec(time_t now, int *wait, int force);
1065
1182
int send_from(int fd, int nowild, char *packet, size_t len, 
1066
1183
               union mysockaddr *to, struct all_addr *source,
1067
1184
               unsigned int iface);
1072
1189
int random_sock(int family);
1073
1190
void pre_allocate_sfds(void);
1074
1191
int reload_servers(char *fname);
 
1192
void mark_servers(int flag);
 
1193
void cleanup_servers(void);
 
1194
void add_update_server(int flags,
 
1195
                       union mysockaddr *addr,
 
1196
                       union mysockaddr *source_addr,
 
1197
                       const char *interface,
 
1198
                       const char *domain);
1075
1199
void check_servers(void);
1076
1200
int enumerate_interfaces(int reset);
1077
1201
void create_wildcard_listeners(void);
1090
1214
#ifdef HAVE_DHCP6
1091
1215
void join_multicast(int dienow);
1092
1216
#endif
 
1217
#if defined(HAVE_LINUX_NETWORK) || defined(HAVE_BSD_NETWORK)
 
1218
void newaddress(time_t now);
 
1219
#endif
 
1220
 
1093
1221
 
1094
1222
/* dhcp.c */
1095
1223
#ifdef HAVE_DHCP
1177
1305
void init_bpf(void);
1178
1306
void send_via_bpf(struct dhcp_packet *mess, size_t len,
1179
1307
                  struct in_addr iface_addr, struct ifreq *ifr);
 
1308
void route_init(void);
 
1309
void route_sock(time_t now);
1180
1310
#endif
1181
1311
 
1182
1312
/* bpf.c or netlink.c */
1249
1379
/* rfc3315.c */
1250
1380
#ifdef HAVE_DHCP6
1251
1381
unsigned short dhcp6_reply(struct dhcp_context *context, int interface, char *iface_name,  
1252
 
                           struct in6_addr *fallback, size_t sz, struct in6_addr *client_addr, time_t now);
 
1382
                           struct in6_addr *fallback, struct in6_addr *ll_addr, struct in6_addr *ula_addr,
 
1383
                           size_t sz, struct in6_addr *client_addr, time_t now);
1253
1384
void relay_upstream6(struct dhcp_relay *relay, ssize_t sz, struct in6_addr *peer_address, u32 scope_id);
1254
1385
 
1255
1386
unsigned short relay_reply6( struct sockaddr_in6 *peer, ssize_t sz, char *arrival_interface);