diff options
Diffstat (limited to 'net/openvswitch/vport-gre.c')
| -rw-r--r-- | net/openvswitch/vport-gre.c | 25 | 
1 files changed, 20 insertions, 5 deletions
diff --git a/net/openvswitch/vport-gre.c b/net/openvswitch/vport-gre.c index c99dea543d6..f49148a07da 100644 --- a/net/openvswitch/vport-gre.c +++ b/net/openvswitch/vport-gre.c @@ -24,8 +24,6 @@  #include <linux/if_tunnel.h>  #include <linux/if_vlan.h>  #include <linux/in.h> -#include <linux/if_vlan.h> -#include <linux/in.h>  #include <linux/in_route.h>  #include <linux/inetdevice.h>  #include <linux/jhash.h> @@ -112,6 +110,22 @@ static int gre_rcv(struct sk_buff *skb,  	return PACKET_RCVD;  } +/* Called with rcu_read_lock and BH disabled. */ +static int gre_err(struct sk_buff *skb, u32 info, +		   const struct tnl_ptk_info *tpi) +{ +	struct ovs_net *ovs_net; +	struct vport *vport; + +	ovs_net = net_generic(dev_net(skb->dev), ovs_net_id); +	vport = rcu_dereference(ovs_net->vport_net.gre_vport); + +	if (unlikely(!vport)) +		return PACKET_REJECT; +	else +		return PACKET_RCVD; +} +  static int gre_tnl_send(struct vport *vport, struct sk_buff *skb)  {  	struct net *net = ovs_dp_get_net(vport->dp); @@ -174,9 +188,9 @@ static int gre_tnl_send(struct vport *vport, struct sk_buff *skb)  	df = OVS_CB(skb)->tun_key->tun_flags & TUNNEL_DONT_FRAGMENT ?  		htons(IP_DF) : 0; -	skb->local_df = 1; +	skb->ignore_df = 1; -	return iptunnel_xmit(rt, skb, fl.saddr, +	return iptunnel_xmit(skb->sk, rt, skb, fl.saddr,  			     OVS_CB(skb)->tun_key->ipv4_dst, IPPROTO_GRE,  			     OVS_CB(skb)->tun_key->ipv4_tos,  			     OVS_CB(skb)->tun_key->ipv4_ttl, df, false); @@ -188,6 +202,7 @@ error:  static struct gre_cisco_protocol gre_protocol = {  	.handler        = gre_rcv, +	.err_handler    = gre_err,  	.priority       = 1,  }; @@ -258,7 +273,7 @@ static void gre_tnl_destroy(struct vport *vport)  	ovs_net = net_generic(net, ovs_net_id); -	rcu_assign_pointer(ovs_net->vport_net.gre_vport, NULL); +	RCU_INIT_POINTER(ovs_net->vport_net.gre_vport, NULL);  	ovs_vport_deferred_free(vport);  	gre_exit();  }  | 
