Skip to content

Commit

Permalink
[BRIDGE] netfilter: vlan + hw checksum = bug?
Browse files Browse the repository at this point in the history
It looks like the bridge netfilter code does not correctly update
the hardware checksum after popping off the VLAN header.

This is by inspection, I have *not* tested this.
To test you would need to set up a filtering bridge with vlans
and a device the does hardware receive checksum (skge, or sungem)

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Stephen Hemminger authored and David S. Miller committed Jan 6, 2006
1 parent a20a855 commit ee02b3a
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions net/bridge/br_netfilter.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,8 +394,9 @@ static unsigned int br_nf_pre_routing_ipv6(unsigned int hook,
* target in particular. Save the original destination IP
* address to be able to detect DNAT afterwards. */
static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb,
const struct net_device *in, const struct net_device *out,
int (*okfn)(struct sk_buff *))
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
struct iphdr *iph;
__u32 len;
Expand All @@ -412,8 +413,10 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb,
goto out;

if (skb->protocol == __constant_htons(ETH_P_8021Q)) {
u8 *vhdr = skb->data;
skb_pull(skb, VLAN_HLEN);
(skb)->nh.raw += VLAN_HLEN;
skb_postpull_rcsum(skb, vhdr, VLAN_HLEN);
skb->nh.raw += VLAN_HLEN;
}
return br_nf_pre_routing_ipv6(hook, skb, in, out, okfn);
}
Expand All @@ -429,8 +432,10 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb,
goto out;

if (skb->protocol == __constant_htons(ETH_P_8021Q)) {
u8 *vhdr = skb->data;
skb_pull(skb, VLAN_HLEN);
(skb)->nh.raw += VLAN_HLEN;
skb_postpull_rcsum(skb, vhdr, VLAN_HLEN);
skb->nh.raw += VLAN_HLEN;
}

if (!pskb_may_pull(skb, sizeof(struct iphdr)))
Expand Down

0 comments on commit ee02b3a

Please sign in to comment.