return 0;
struct ip6_ext *exthdr = (struct ip6_ext*)hdr;
+ int ext_len = 0;
switch (proto) {
/* protocols (these return) */
return -1;
if (print_fragment(le, (struct ip6_frag*)hdr, payload_len) < 0)
return -1;
+ ext_len = sizeof(struct ip6_frag);
break;
case IPPROTO_HOPOPTS:
LEPRINTF("NEXTHDR=HOPOPTS ");
/* next header: */
if (check_ip6ext(le, exthdr, payload_len) < 0)
return -1;
- hdr += exthdr->ip6e_len;
- payload_len -= exthdr->ip6e_len;
+ if(ext_len == 0) {
+ ext_len = (exthdr->ip6e_len+1) * 8;
+ }
+ hdr += ext_len;
+ payload_len -= ext_len;
+ proto = exthdr->ip6e_nxt;
}
}
{
int res;
if ((res = nfct_catch(nfcth)) < 0) {
- log_status_message(3, "error catching nfct");
- return FALSE;
+ if (errno == ENOBUFS) {
+ log_status_message(3, "nfct_catch returned ENOBUFS: conntrack information may be incomplete");
+ } else {
+ log_status_message(3, "error catching nfct: %s", strerror(errno));
+ return FALSE;
+ }
}
return TRUE;
}