The STT protocol allows a VLAN TCI to be passed as part of the STT header. It seems appropriate to pass this TCI to ovs_tnl_rcv() and for other tunneling protocols to pass 0 to retain their existing behaviour.
Signed-off-by: Simon Horman <ho...@verge.net.au> --- datapath/tunnel.c | 5 +++-- datapath/tunnel.h | 3 ++- datapath/vport-capwap.c | 2 +- datapath/vport-gre.c | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/datapath/tunnel.c b/datapath/tunnel.c index ea97e39..5e93218 100644 --- a/datapath/tunnel.c +++ b/datapath/tunnel.c @@ -416,7 +416,8 @@ static void ecn_decapsulate(struct sk_buff *skb, u8 tos) * - skb->csum does not include the inner Ethernet header. * - The layer pointers are undefined. */ -void ovs_tnl_rcv(struct vport *vport, struct sk_buff *skb, u8 tos) +void ovs_tnl_rcv(struct vport *vport, struct sk_buff *skb, u8 tos, + u16 vlan_tci) { struct ethhdr *eh; @@ -434,7 +435,7 @@ void ovs_tnl_rcv(struct vport *vport, struct sk_buff *skb, u8 tos) secpath_reset(skb); ecn_decapsulate(skb, tos); - vlan_set_tci(skb, 0); + vlan_set_tci(skb, vlan_tci); if (unlikely(compute_ip_summed(skb, false))) { kfree_skb(skb); diff --git a/datapath/tunnel.h b/datapath/tunnel.h index 33eb63c..835c709 100644 --- a/datapath/tunnel.h +++ b/datapath/tunnel.h @@ -269,7 +269,8 @@ int ovs_tnl_set_addr(struct vport *vport, const unsigned char *addr); const char *ovs_tnl_get_name(const struct vport *vport); const unsigned char *ovs_tnl_get_addr(const struct vport *vport); int ovs_tnl_send(struct vport *vport, struct sk_buff *skb); -void ovs_tnl_rcv(struct vport *vport, struct sk_buff *skb, u8 tos); +void ovs_tnl_rcv(struct vport *vport, struct sk_buff *skb, u8 tos, + u16 vlan_tci); struct vport *ovs_tnl_find_port(struct net *net, __be32 saddr, __be32 daddr, __be64 key, int tunnel_type, diff --git a/datapath/vport-capwap.c b/datapath/vport-capwap.c index e5b7afb..896c06b 100644 --- a/datapath/vport-capwap.c +++ b/datapath/vport-capwap.c @@ -338,7 +338,7 @@ static int capwap_rcv(struct sock *sk, struct sk_buff *skb) else OVS_CB(skb)->tun_id = 0; - ovs_tnl_rcv(vport, skb, iph->tos); + ovs_tnl_rcv(vport, skb, iph->tos, 0); goto out; error: diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c index 3bb55f0..c6bb025 100644 --- a/datapath/vport-gre.c +++ b/datapath/vport-gre.c @@ -359,7 +359,7 @@ static int gre_rcv(struct sk_buff *skb) __skb_pull(skb, hdr_len); skb_postpull_rcsum(skb, skb_transport_header(skb), hdr_len + ETH_HLEN); - ovs_tnl_rcv(vport, skb, iph->tos); + ovs_tnl_rcv(vport, skb, iph->tos, 0); return 0; error: -- 1.7.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev