Problem getting IPv6 port numbers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I'm writing a netfilter match extension (xtables-addons 1.33, kernel 2.6.35, .family=NFPROTO_UNSPEC) that needs to examine the source and destination port numbers of all packets. The following code successfully gets the port numbers for IPv4 TCP and UDP packets:

static bool xt_mymatch_mt(const struct sk_buff *skb,
                          struct xt_action_param *par)
{
        const __be16 *pptr;
        __be16 _ports[2];
        int sport = 0;
        int dport = 0;

        if (par->fragoff == 0) {
                pptr = skb_header_pointer(skb, par->thoff,
                        sizeof(_ports), _ports);
                if (pptr != NULL) {
                        sport = ntohs(pptr[0]);
                        dport = ntohs(pptr[1]);
                }
        }
        /* ...remaining code omitted... */
}

However, when I test this with "telnet ::1 1234", it does not work for IPv6 TCP packets (I have not tried with IPv6 UDP packets yet). By adding printk() statements, I've determined that par->fragoff is never 0 for my IPv6 TCP packets -- instead, it is large numbers such as 33569744, 2164528116, or 2164412871. However, par->in and par->out are both correct. par->matchinfo, ipv6_hdr(skb)->saddr, and ipv6_hdr(skb)->daddr are also all correct.

What am I doing wrong?

Thanks in advance for any help.

--
  Mark Montague
  mark@xxxxxxxxxxx

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux