|
@@ -261,7 +261,7 @@ static void nf_bridge_update_protocol(struct sk_buff *skb)
|
|
|
/* PF_BRIDGE/PRE_ROUTING *********************************************/
|
|
|
/* Undo the changes made for ip6tables PREROUTING and continue the
|
|
|
* bridge PRE_ROUTING hook. */
|
|
|
-static int br_nf_pre_routing_finish_ipv6(struct sk_buff *skb)
|
|
|
+static int br_nf_pre_routing_finish_ipv6(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
struct nf_bridge_info *nf_bridge = skb->nf_bridge;
|
|
|
struct rtable *rt;
|
|
@@ -282,7 +282,8 @@ static int br_nf_pre_routing_finish_ipv6(struct sk_buff *skb)
|
|
|
skb->dev = nf_bridge->physindev;
|
|
|
nf_bridge_update_protocol(skb);
|
|
|
nf_bridge_push_encap_header(skb);
|
|
|
- NF_HOOK_THRESH(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
|
|
|
+ NF_HOOK_THRESH(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, sk, skb,
|
|
|
+ skb->dev, NULL,
|
|
|
br_handle_frame_finish, 1);
|
|
|
|
|
|
return 0;
|
|
@@ -293,7 +294,7 @@ static int br_nf_pre_routing_finish_ipv6(struct sk_buff *skb)
|
|
|
* don't, we use the neighbour framework to find out. In both cases, we make
|
|
|
* sure that br_handle_frame_finish() is called afterwards.
|
|
|
*/
|
|
|
-static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb)
|
|
|
+static int br_nf_pre_routing_finish_bridge(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
struct nf_bridge_info *nf_bridge = skb->nf_bridge;
|
|
|
struct neighbour *neigh;
|
|
@@ -310,7 +311,7 @@ static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb)
|
|
|
if (neigh->hh.hh_len) {
|
|
|
neigh_hh_bridge(&neigh->hh, skb);
|
|
|
skb->dev = nf_bridge->physindev;
|
|
|
- ret = br_handle_frame_finish(skb);
|
|
|
+ ret = br_handle_frame_finish(sk, skb);
|
|
|
} else {
|
|
|
/* the neighbour function below overwrites the complete
|
|
|
* MAC header, so we save the Ethernet source address and
|
|
@@ -387,7 +388,7 @@ static bool dnat_took_place(const struct sk_buff *skb)
|
|
|
* device, we proceed as if ip_route_input() succeeded. If it differs from the
|
|
|
* logical bridge port or if ip_route_output_key() fails we drop the packet.
|
|
|
*/
|
|
|
-static int br_nf_pre_routing_finish(struct sk_buff *skb)
|
|
|
+static int br_nf_pre_routing_finish(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
struct net_device *dev = skb->dev;
|
|
|
struct iphdr *iph = ip_hdr(skb);
|
|
@@ -440,7 +441,7 @@ bridged_dnat:
|
|
|
nf_bridge_push_encap_header(skb);
|
|
|
NF_HOOK_THRESH(NFPROTO_BRIDGE,
|
|
|
NF_BR_PRE_ROUTING,
|
|
|
- skb, skb->dev, NULL,
|
|
|
+ sk, skb, skb->dev, NULL,
|
|
|
br_nf_pre_routing_finish_bridge,
|
|
|
1);
|
|
|
return 0;
|
|
@@ -460,7 +461,8 @@ bridged_dnat:
|
|
|
skb->dev = nf_bridge->physindev;
|
|
|
nf_bridge_update_protocol(skb);
|
|
|
nf_bridge_push_encap_header(skb);
|
|
|
- NF_HOOK_THRESH(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
|
|
|
+ NF_HOOK_THRESH(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, sk, skb,
|
|
|
+ skb->dev, NULL,
|
|
|
br_handle_frame_finish, 1);
|
|
|
|
|
|
return 0;
|
|
@@ -596,7 +598,8 @@ static unsigned int br_nf_pre_routing_ipv6(const struct nf_hook_ops *ops,
|
|
|
return NF_DROP;
|
|
|
|
|
|
skb->protocol = htons(ETH_P_IPV6);
|
|
|
- NF_HOOK(NFPROTO_IPV6, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
|
|
|
+ NF_HOOK(NFPROTO_IPV6, NF_INET_PRE_ROUTING, state->sk, skb,
|
|
|
+ skb->dev, NULL,
|
|
|
br_nf_pre_routing_finish_ipv6);
|
|
|
|
|
|
return NF_STOLEN;
|
|
@@ -651,7 +654,8 @@ static unsigned int br_nf_pre_routing(const struct nf_hook_ops *ops,
|
|
|
|
|
|
skb->protocol = htons(ETH_P_IP);
|
|
|
|
|
|
- NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
|
|
|
+ NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, state->sk, skb,
|
|
|
+ skb->dev, NULL,
|
|
|
br_nf_pre_routing_finish);
|
|
|
|
|
|
return NF_STOLEN;
|
|
@@ -674,7 +678,7 @@ static unsigned int br_nf_local_in(const struct nf_hook_ops *ops,
|
|
|
}
|
|
|
|
|
|
/* PF_BRIDGE/FORWARD *************************************************/
|
|
|
-static int br_nf_forward_finish(struct sk_buff *skb)
|
|
|
+static int br_nf_forward_finish(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
struct nf_bridge_info *nf_bridge = skb->nf_bridge;
|
|
|
struct net_device *in;
|
|
@@ -691,8 +695,8 @@ static int br_nf_forward_finish(struct sk_buff *skb)
|
|
|
}
|
|
|
nf_bridge_push_encap_header(skb);
|
|
|
|
|
|
- NF_HOOK_THRESH(NFPROTO_BRIDGE, NF_BR_FORWARD, skb, in,
|
|
|
- skb->dev, br_forward_finish, 1);
|
|
|
+ NF_HOOK_THRESH(NFPROTO_BRIDGE, NF_BR_FORWARD, sk, skb,
|
|
|
+ in, skb->dev, br_forward_finish, 1);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -746,7 +750,8 @@ static unsigned int br_nf_forward_ip(const struct nf_hook_ops *ops,
|
|
|
else
|
|
|
skb->protocol = htons(ETH_P_IPV6);
|
|
|
|
|
|
- NF_HOOK(pf, NF_INET_FORWARD, skb, brnf_get_logical_dev(skb, state->in),
|
|
|
+ NF_HOOK(pf, NF_INET_FORWARD, NULL, skb,
|
|
|
+ brnf_get_logical_dev(skb, state->in),
|
|
|
parent, br_nf_forward_finish);
|
|
|
|
|
|
return NF_STOLEN;
|
|
@@ -780,8 +785,8 @@ static unsigned int br_nf_forward_arp(const struct nf_hook_ops *ops,
|
|
|
return NF_ACCEPT;
|
|
|
}
|
|
|
*d = state->in;
|
|
|
- NF_HOOK(NFPROTO_ARP, NF_ARP_FORWARD, skb, state->in,
|
|
|
- state->out, br_nf_forward_finish);
|
|
|
+ NF_HOOK(NFPROTO_ARP, NF_ARP_FORWARD, state->sk, skb,
|
|
|
+ state->in, state->out, br_nf_forward_finish);
|
|
|
|
|
|
return NF_STOLEN;
|
|
|
}
|
|
@@ -804,24 +809,24 @@ static bool nf_bridge_copy_header(struct sk_buff *skb)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-static int br_nf_push_frag_xmit(struct sk_buff *skb)
|
|
|
+static int br_nf_push_frag_xmit(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
if (!nf_bridge_copy_header(skb)) {
|
|
|
kfree_skb(skb);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- return br_dev_queue_push_xmit(skb);
|
|
|
+ return br_dev_queue_push_xmit(sk, skb);
|
|
|
}
|
|
|
|
|
|
-static int br_nf_dev_queue_xmit(struct sk_buff *skb)
|
|
|
+static int br_nf_dev_queue_xmit(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
int ret;
|
|
|
int frag_max_size;
|
|
|
unsigned int mtu_reserved;
|
|
|
|
|
|
if (skb_is_gso(skb) || skb->protocol != htons(ETH_P_IP))
|
|
|
- return br_dev_queue_push_xmit(skb);
|
|
|
+ return br_dev_queue_push_xmit(sk, skb);
|
|
|
|
|
|
mtu_reserved = nf_bridge_mtu_reduction(skb);
|
|
|
/* This is wrong! We should preserve the original fragment
|
|
@@ -833,16 +838,16 @@ static int br_nf_dev_queue_xmit(struct sk_buff *skb)
|
|
|
/* Drop invalid packet */
|
|
|
return NF_DROP;
|
|
|
IPCB(skb)->frag_max_size = frag_max_size;
|
|
|
- ret = ip_fragment(skb, br_nf_push_frag_xmit);
|
|
|
+ ret = ip_fragment(sk, skb, br_nf_push_frag_xmit);
|
|
|
} else
|
|
|
- ret = br_dev_queue_push_xmit(skb);
|
|
|
+ ret = br_dev_queue_push_xmit(sk, skb);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
#else
|
|
|
-static int br_nf_dev_queue_xmit(struct sk_buff *skb)
|
|
|
+static int br_nf_dev_queue_xmit(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
- return br_dev_queue_push_xmit(skb);
|
|
|
+ return br_dev_queue_push_xmit(sk, skb);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -887,7 +892,8 @@ static unsigned int br_nf_post_routing(const struct nf_hook_ops *ops,
|
|
|
else
|
|
|
skb->protocol = htons(ETH_P_IPV6);
|
|
|
|
|
|
- NF_HOOK(pf, NF_INET_POST_ROUTING, skb, NULL, realoutdev,
|
|
|
+ NF_HOOK(pf, NF_INET_POST_ROUTING, state->sk, skb,
|
|
|
+ NULL, realoutdev,
|
|
|
br_nf_dev_queue_xmit);
|
|
|
|
|
|
return NF_STOLEN;
|
|
@@ -927,7 +933,7 @@ static void br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb)
|
|
|
skb_copy_to_linear_data_offset(skb, -(ETH_HLEN-ETH_ALEN),
|
|
|
skb->nf_bridge->data, ETH_HLEN-ETH_ALEN);
|
|
|
skb->dev = nf_bridge->physindev;
|
|
|
- br_handle_frame_finish(skb);
|
|
|
+ br_handle_frame_finish(NULL, skb);
|
|
|
}
|
|
|
|
|
|
static int br_nf_dev_xmit(struct sk_buff *skb)
|