|
@@ -342,7 +342,7 @@ static struct ipvl_addr *ipvlan_addr_lookup(struct ipvl_port *port,
|
|
|
return addr;
|
|
|
}
|
|
|
|
|
|
-static int ipvlan_process_v4_outbound(struct sk_buff *skb)
|
|
|
+static int ipvlan_process_v4_outbound(struct sk_buff *skb, bool xnet)
|
|
|
{
|
|
|
const struct iphdr *ip4h = ip_hdr(skb);
|
|
|
struct net_device *dev = skb->dev;
|
|
@@ -365,7 +365,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb)
|
|
|
ip_rt_put(rt);
|
|
|
goto err;
|
|
|
}
|
|
|
- skb_dst_drop(skb);
|
|
|
+ skb_scrub_packet(skb, xnet);
|
|
|
skb_dst_set(skb, &rt->dst);
|
|
|
err = ip_local_out(net, skb->sk, skb);
|
|
|
if (unlikely(net_xmit_eval(err)))
|
|
@@ -380,7 +380,7 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int ipvlan_process_v6_outbound(struct sk_buff *skb)
|
|
|
+static int ipvlan_process_v6_outbound(struct sk_buff *skb, bool xnet)
|
|
|
{
|
|
|
const struct ipv6hdr *ip6h = ipv6_hdr(skb);
|
|
|
struct net_device *dev = skb->dev;
|
|
@@ -403,7 +403,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb)
|
|
|
dst_release(dst);
|
|
|
goto err;
|
|
|
}
|
|
|
- skb_dst_drop(skb);
|
|
|
+ skb_scrub_packet(skb, xnet);
|
|
|
skb_dst_set(skb, dst);
|
|
|
err = ip6_local_out(net, skb->sk, skb);
|
|
|
if (unlikely(net_xmit_eval(err)))
|
|
@@ -418,8 +418,7 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int ipvlan_process_outbound(struct sk_buff *skb,
|
|
|
- const struct ipvl_dev *ipvlan)
|
|
|
+static int ipvlan_process_outbound(struct sk_buff *skb, bool xnet)
|
|
|
{
|
|
|
struct ethhdr *ethh = eth_hdr(skb);
|
|
|
int ret = NET_XMIT_DROP;
|
|
@@ -443,9 +442,9 @@ static int ipvlan_process_outbound(struct sk_buff *skb,
|
|
|
}
|
|
|
|
|
|
if (skb->protocol == htons(ETH_P_IPV6))
|
|
|
- ret = ipvlan_process_v6_outbound(skb);
|
|
|
+ ret = ipvlan_process_v6_outbound(skb, xnet);
|
|
|
else if (skb->protocol == htons(ETH_P_IP))
|
|
|
- ret = ipvlan_process_v4_outbound(skb);
|
|
|
+ ret = ipvlan_process_v4_outbound(skb, xnet);
|
|
|
else {
|
|
|
pr_warn_ratelimited("Dropped outbound packet type=%x\n",
|
|
|
ntohs(skb->protocol));
|
|
@@ -481,6 +480,7 @@ static int ipvlan_xmit_mode_l3(struct sk_buff *skb, struct net_device *dev)
|
|
|
void *lyr3h;
|
|
|
struct ipvl_addr *addr;
|
|
|
int addr_type;
|
|
|
+ bool xnet;
|
|
|
|
|
|
lyr3h = ipvlan_get_L3_hdr(skb, &addr_type);
|
|
|
if (!lyr3h)
|
|
@@ -491,8 +491,9 @@ static int ipvlan_xmit_mode_l3(struct sk_buff *skb, struct net_device *dev)
|
|
|
return ipvlan_rcv_frame(addr, &skb, true);
|
|
|
|
|
|
out:
|
|
|
+ xnet = !net_eq(dev_net(skb->dev), dev_net(ipvlan->phy_dev));
|
|
|
skb->dev = ipvlan->phy_dev;
|
|
|
- return ipvlan_process_outbound(skb, ipvlan);
|
|
|
+ return ipvlan_process_outbound(skb, xnet);
|
|
|
}
|
|
|
|
|
|
static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev)
|