|
@@ -195,13 +195,10 @@ static void __br_handle_local_finish(struct sk_buff *skb)
|
|
|
/* note: already called with rcu_read_lock */
|
|
/* note: already called with rcu_read_lock */
|
|
|
static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
|
|
static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
{
|
|
|
- struct net_bridge_port *p = br_port_get_rcu(skb->dev);
|
|
|
|
|
-
|
|
|
|
|
__br_handle_local_finish(skb);
|
|
__br_handle_local_finish(skb);
|
|
|
|
|
|
|
|
- BR_INPUT_SKB_CB(skb)->brdev = p->br->dev;
|
|
|
|
|
- br_pass_frame_up(skb);
|
|
|
|
|
- return 0;
|
|
|
|
|
|
|
+ /* return 1 to signal the okfn() was called so it's ok to use the skb */
|
|
|
|
|
+ return 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -278,10 +275,18 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
|
|
|
goto forward;
|
|
goto forward;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /* Deliver packet to local host only */
|
|
|
|
|
- NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, dev_net(skb->dev),
|
|
|
|
|
- NULL, skb, skb->dev, NULL, br_handle_local_finish);
|
|
|
|
|
- return RX_HANDLER_CONSUMED;
|
|
|
|
|
|
|
+ /* The else clause should be hit when nf_hook():
|
|
|
|
|
+ * - returns < 0 (drop/error)
|
|
|
|
|
+ * - returns = 0 (stolen/nf_queue)
|
|
|
|
|
+ * Thus return 1 from the okfn() to signal the skb is ok to pass
|
|
|
|
|
+ */
|
|
|
|
|
+ if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN,
|
|
|
|
|
+ dev_net(skb->dev), NULL, skb, skb->dev, NULL,
|
|
|
|
|
+ br_handle_local_finish) == 1) {
|
|
|
|
|
+ return RX_HANDLER_PASS;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return RX_HANDLER_CONSUMED;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
forward:
|
|
forward:
|