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