+ struct dns_header *h;
+ uint8_t *b = buffer;
+ int rlen = len;
+
+ h = dns_consume_header(&b, &rlen);
+ if (!h) {
+ fprintf(stderr, "dropping: bad header\n");
+ return;
+ }
+
+ while (h->questions-- > 0) {
+ char *name = dns_consume_name(buffer, len, &b, &rlen);
+ struct dns_question *q;
+
+ if (!name) {
+ fprintf(stderr, "dropping: bad name\n");
+ return;
+ }
+
+ q = dns_consume_question(&b, &rlen);
+ if (!q) {
+ fprintf(stderr, "dropping: bad question\n");
+ return;
+ }
+
+ if (!(h->flags & FLAG_RESPONSE))
+ parse_question(iface, name, q);
+ }
+
+ if (!(h->flags & FLAG_RESPONSE))
+ return;
+
+ while (h->answers-- > 0)
+ parse_answer(iface, buffer, len, &b, &rlen, 1);
+
+ while (h->authority-- > 0)
+ parse_answer(iface, buffer, len, &b, &rlen, 0);
+
+ while (h->additional-- > 0)
+ parse_answer(iface, buffer, len, &b, &rlen, 1);