/** true if replies have been sent out (at end for alignment) */
uint8_t replies_sent;
-
- /* YBS */
- int subnet_option_expect;
- uint16_t subnet_addr_fam;
- uint8_t subnet_source_mask;
- uint8_t subnet_addr[16];
};
/**
#endif
edns.subnet_scope_mask = 0;
//YBS add addr,fam,mask to mesh.
- sq->mesh_info->subnet_option_expect = 1;
- sq->mesh_info->subnet_addr_fam = edns.subnet_addr_fam;
- sq->mesh_info->subnet_source_mask = edns.subnet_source_mask;
- memcpy(sq->mesh_info->subnet_addr, (uint8_t *)sinaddr, INET6_SIZE);
+ sq->mesh_info->s.qinfo.subnet_option = 1;
+ sq->mesh_info->s.qinfo.subnet_addr_fam = edns.subnet_addr_fam;
+ sq->mesh_info->s.qinfo.subnet_source_mask = edns.subnet_source_mask;
+ memcpy(sq->mesh_info->s.qinfo.subnet_addr, (uint8_t *)sinaddr, INET6_SIZE);
+ } else {
+ sq->mesh_info->s.qinfo.subnet_option = 0;
}
if(sq->status == serviced_query_UDP_EDNS_FRAG) {
if(addr_is_ip6(&sq->addr, sq->addrlen)) {
struct query_info* msg2 = (struct query_info*)m2;
int mc;
/* from most different to least different for speed */
+ if(m1 == m2) return 0;
COMPARE_IT(msg1->qtype, msg2->qtype);
if((mc = query_dname_compare(msg1->qname, msg2->qname)) != 0)
return mc;
log_assert(msg1->qname_len == msg2->qname_len);
COMPARE_IT(msg1->qclass, msg2->qclass);
+ /* If the reply has subnet and we expect subnet, whole option must
+ * match. Otherwise be lenient.*/
+ if(msg1->subnet_option && msg2->subnet_option) {
+ COMPARE_IT(msg1->subnet_addr_fam, msg2->subnet_addr_fam);
+ COMPARE_IT(msg1->subnet_source_mask, msg2->subnet_source_mask);
+ if((mc = memcmp(msg1->subnet_addr,
+ msg2->subnet_addr, INET6_SIZE)) != 0)
+ return mc;
+ }
+
return 0;
#undef COMPARE_IT
}
#define UTIL_DATA_MSGREPLY_H
#include "util/storage/lruhash.h"
#include "util/data/packed_rrset.h"
+#include "util/net_help.h"
struct comm_reply;
struct alloc_cache;
struct iovec;
uint16_t qtype;
/** qclass, host byte order */
uint16_t qclass;
+ /* YBS */
+ int subnet_option;
+ uint16_t subnet_addr_fam;
+ uint8_t subnet_source_mask;
+ uint8_t subnet_addr[INET6_SIZE];
};
/**