|
@@ -684,8 +684,8 @@ static void prepare_frag(struct vport *vport, struct sk_buff *skb)
|
|
|
skb_pull(skb, hlen);
|
|
|
}
|
|
|
|
|
|
-static void ovs_fragment(struct vport *vport, struct sk_buff *skb, u16 mru,
|
|
|
- __be16 ethertype)
|
|
|
+static void ovs_fragment(struct net *net, struct vport *vport,
|
|
|
+ struct sk_buff *skb, u16 mru, __be16 ethertype)
|
|
|
{
|
|
|
if (skb_network_offset(skb) > MAX_L2_LEN) {
|
|
|
OVS_NLERR(1, "L2 header too long to fragment");
|
|
@@ -748,6 +748,7 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,
|
|
|
if (likely(!mru || (skb->len <= mru + ETH_HLEN))) {
|
|
|
ovs_vport_send(vport, skb);
|
|
|
} else if (mru <= vport->dev->mtu) {
|
|
|
+ struct net *net = read_pnet(&dp->net);
|
|
|
__be16 ethertype = key->eth.type;
|
|
|
|
|
|
if (!is_flow_key_valid(key)) {
|
|
@@ -757,7 +758,7 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,
|
|
|
ethertype = vlan_get_protocol(skb);
|
|
|
}
|
|
|
|
|
|
- ovs_fragment(vport, skb, mru, ethertype);
|
|
|
+ ovs_fragment(net, vport, skb, mru, ethertype);
|
|
|
} else {
|
|
|
kfree_skb(skb);
|
|
|
}
|