X-Git-Url: http://git.cascardo.info/?a=blobdiff_plain;f=datapath%2Fvport-gre.c;h=93869ffa4e03910e282821f567d33e784feb503e;hb=14e89a8d277e2d02762a087938443fda50418ecb;hp=8737b63d75baf50c15a5080f286a26a033c529c5;hpb=9b0008b516664d6e73cff907c1f6f0e077806c55;p=cascardo%2Fovs.git diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c index 8737b63d7..93869ffa4 100644 --- a/datapath/vport-gre.c +++ b/datapath/vport-gre.c @@ -116,6 +116,25 @@ 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); + if ((tpi->flags & TUNNEL_KEY) && (tpi->flags & TUNNEL_SEQ)) + vport = rcu_dereference(ovs_net->vport_net.gre64_vport); + else + vport = rcu_dereference(ovs_net->vport_net.gre_vport); + + if (unlikely(!vport)) + return PACKET_REJECT; + else + return PACKET_RCVD; +} + static int __send(struct vport *vport, struct sk_buff *skb, int tunnel_hlen, __be32 seq, __be16 gre64_flag) @@ -187,6 +206,7 @@ error: static struct gre_cisco_protocol gre_protocol = { .handler = gre_rcv, + .err_handler = gre_err, .priority = 1, };