|
@@ -48,15 +48,25 @@ enum nf_br_hook_priorities {
|
|
|
|
|
|
/* Only used in br_forward.c */
|
|
|
static inline
|
|
|
-void nf_bridge_maybe_copy_header(struct sk_buff *skb)
|
|
|
+int nf_bridge_maybe_copy_header(struct sk_buff *skb)
|
|
|
{
|
|
|
+ int err;
|
|
|
+
|
|
|
if (skb->nf_bridge) {
|
|
|
if (skb->protocol == __constant_htons(ETH_P_8021Q)) {
|
|
|
+ err = skb_cow(skb, 18);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
memcpy(skb->data - 18, skb->nf_bridge->data, 18);
|
|
|
skb_push(skb, 4);
|
|
|
- } else
|
|
|
+ } else {
|
|
|
+ err = skb_cow(skb, 16);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
memcpy(skb->data - 16, skb->nf_bridge->data, 16);
|
|
|
+ }
|
|
|
}
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/* This is called by the IP fragmenting code and it ensures there is
|