[ovs-dev] [PATCH 1/2] [RFC] datapath: tunneling: Allow vlan_tci to be passed to ovs_tnl_rcv()

Simon Horman horms at verge.net.au
Thu Apr 12 07:36:43 UTC 2012


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 <horms at 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 d406dbc..cac0a35 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.5




More information about the dev mailing list