Home | History | Annotate | Line # | Download | only in dist
edns.h revision 1.1.1.1.4.2
      1 /*
      2  * edns.h -- EDNS definitions (RFC 2671).
      3  *
      4  * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
      5  *
      6  * See LICENSE for the license.
      7  *
      8  */
      9 
     10 #ifndef _EDNS_H_
     11 #define _EDNS_H_
     12 
     13 #include "buffer.h"
     14 struct nsd;
     15 struct query;
     16 
     17 #define OPT_LEN 9U                      /* Length of the NSD EDNS response record minus 2 */
     18 #define OPT_RDATA 2                     /* holds the rdata length comes after OPT_LEN */
     19 #define OPT_HDR 4U                      /* NSID opt header length */
     20 #define NSID_CODE       3               /* nsid option code */
     21 #define DNSSEC_OK_MASK  0x8000U         /* do bit mask */
     22 
     23 struct edns_data
     24 {
     25 	char ok[OPT_LEN];
     26 	char error[OPT_LEN];
     27 	char rdata_none[OPT_RDATA];
     28 	char rdata_nsid[OPT_RDATA];
     29 	char nsid[OPT_HDR];
     30 };
     31 typedef struct edns_data edns_data_type;
     32 
     33 enum edns_status
     34 {
     35 	EDNS_NOT_PRESENT,
     36 	EDNS_OK,
     37 	/* EDNS states may be extended in the future */
     38 	EDNS_ERROR
     39 };
     40 typedef enum edns_status edns_status_type;
     41 
     42 struct edns_record
     43 {
     44 	edns_status_type status;
     45 	size_t           position;
     46 	size_t           maxlen;
     47 	size_t		 opt_reserved_space;
     48 	int              dnssec_ok;
     49 	int              nsid;
     50 };
     51 typedef struct edns_record edns_record_type;
     52 
     53 void edns_init_data(edns_data_type *data, uint16_t max_length);
     54 void edns_init_record(edns_record_type *data);
     55 int edns_parse_record(edns_record_type *data, buffer_type *packet,
     56 	struct query* q, struct nsd* nsd);
     57 
     58 /*
     59  * The amount of space to reserve in the response for the EDNS data
     60  * (if required).
     61  */
     62 size_t edns_reserved_space(edns_record_type *data);
     63 
     64 void edns_init_nsid(edns_data_type *data, uint16_t nsid_len);
     65 
     66 #endif /* _EDNS_H_ */
     67