/** the version of unbound-control that this software implements */
#define UNBOUND_CONTROL_VERSION 1
+/** YBS: in use by the edns subnet option code*/
+#define IANA_ADDRFAM_IP4 1
+#define IANA_ADDRFAM_IP6 2
])
AC_CONFIG_FILES([Makefile doc/example.conf doc/libunbound.3 doc/unbound.8 doc/unbound-anchor.8 doc/unbound-checkconf.8 doc/unbound.conf.5 doc/unbound-control.8])
edns.edns_present = 1;
edns.ext_rcode = 0;
edns.edns_version = EDNS_ADVERTISED_VERSION;
- edns.subnet_option_add = 0;
+ //YBS make conditional on whitelist
+ edns.subnet_option_add = 0;
+ //~ uint16_t subnet_addr_fam;
+ //~ uint8_t subnet_source_mask;
+ //~ uint8_t subnet_scope_mask;
+ //~ uint8_t subnet_addr[16];
+ //YBS
if(sq->status == serviced_query_UDP_EDNS_FRAG) {
if(addr_is_ip6(&sq->addr, sq->addrlen)) {
if(EDNS_FRAG_SIZE_IP6 < EDNS_ADVERTISED_SIZE)
ldns_buffer_write_u16(pkt, edns->bits);
/* YBS: do vandergaast hier! */
if(edns->subnet_option_add) {
- assert(edns.addr_fam == 0x01 || edns.addr_fam == 0x02);
- assert(edns.addr_fam != 0x01 || edns->subnet_source_mask <= 32);
- assert(edns.addr_fam != 0x02 || edns->subnet_source_mask <= 128); //ipv6 addr fam?
+ assert(edns.addr_fam == IANA_ADDRFAM_IP4 ||
+ edns.addr_fam == IANA_ADDRFAM_IP6);
+ assert(edns.addr_fam != IANA_ADDRFAM_IP4 ||
+ edns->subnet_source_mask <= 32);
+ assert(edns.addr_fam != IANA_ADDRFAM_IP6 ||
+ edns->subnet_source_mask <= 128); //ipv6 addr fam?
sn_octs = edns->subnet_source_mask / 8;
- sn_octs_remainder = !!(edns->subnet_source_mask % 8);
+ sn_octs_remainder = (edns->subnet_source_mask % 8)>0?1:0;
+
+ assert(ldns_buffer_available(sn_octs + sn_octs_remainder + 4 + 6));
ldns_buffer_write_u16(pkt, sn_octs + sn_octs_remainder + 4 + 4); /* rdatalen */
ldns_buffer_write_u16(pkt, EDNS_SUBNET_OPC); /* opc */
ldns_buffer_write_u8(pkt, edns->subnet_source_mask); /* source mask */
ldns_buffer_write_u8(pkt, edns->subnet_scope_mask); /* scope mask */
- for(i = 0; i<sn_octs; i++)
- ldns_buffer_write_u8(pkt, edns->subnet_addr[i]);
+ ldns_buffer_write(pkt, edns->subnet_addr, sn_octs);
+ /** If the last octed is partially masked, make sure we don't
+ * send our private bits. */
if(sn_octs_remainder)
ldns_buffer_write_u8(pkt, edns->subnet_addr[sn_octs] &
- ~(1<<(8-(edns->subnet_source_mask % 8))-1));
+ ~(0xFF >> (edns->subnet_source_mask % 8)));
} else ldns_buffer_write_u16(pkt, 0); /* rdatalen */
/* //YBS: do vandergaast hier! */
ldns_buffer_flip(pkt);