[ovs-dev] [PATCH v2 4/7] nsh: datapath support for network service index

Pritesh Kothari pritesh.kothari at cisco.com
Tue Feb 25 23:44:17 UTC 2014


Here, datapath support for setting nsh service index (nsi) is added.
nsi can now be set on outgoing packet depending on port settings or
set_nsi action.

Signed-off-by: Pritesh Kothari <pritesh.kothari at cisco.com>

diff --git a/datapath/datapath.c b/datapath/datapath.c
index b96ad1e..46a4f28 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -362,6 +362,7 @@ static size_t key_attr_size(void)
 		  + nla_total_size(0)   /* OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT */
 		  + nla_total_size(0)   /* OVS_TUNNEL_KEY_ATTR_CSUM */
 		  + nla_total_size(4)   /* OVS_TUNNEL_KEY_ATTR_NSP */
+		  + nla_total_size(1)   /* OVS_TUNNEL_KEY_ATTR_NSI */
 		+ nla_total_size(4)   /* OVS_KEY_ATTR_IN_PORT */
 		+ nla_total_size(4)   /* OVS_KEY_ATTR_SKB_MARK */
 		+ nla_total_size(12)  /* OVS_KEY_ATTR_ETHERNET */
diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c
index a2bc1e9..8001aee 100644
--- a/datapath/flow_netlink.c
+++ b/datapath/flow_netlink.c
@@ -48,6 +48,8 @@
 
 #include "flow_netlink.h"
 
+#define NSH_M_NSI 0x000000FF
+
 static void update_range__(struct sw_flow_match *match,
 			   size_t offset, size_t size, bool is_mask)
 {
@@ -346,6 +348,7 @@ static int ipv4_tun_from_nlattr(const struct nlattr *attr,
 			[OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT] = 0,
 			[OVS_TUNNEL_KEY_ATTR_CSUM] = 0,
 			[OVS_TUNNEL_KEY_ATTR_NSP] = sizeof(u32),
+			[OVS_TUNNEL_KEY_ATTR_NSI] = 1,
 		};
 
 		if (type > OVS_TUNNEL_KEY_ATTR_MAX) {
@@ -391,9 +394,13 @@ static int ipv4_tun_from_nlattr(const struct nlattr *attr,
 			tun_flags |= TUNNEL_CSUM;
 			break;
 		case OVS_TUNNEL_KEY_ATTR_NSP:
-			nsp = htonl(be32_to_cpu(nla_get_be32(a)) << 8);
+			nsp |= htonl(be32_to_cpu(nla_get_be32(a)) << 8);
 			tun_flags |= TUNNEL_NSP;
 			break;
+		case OVS_TUNNEL_KEY_ATTR_NSI:
+			nsp |= htonl(nla_get_u8(a));
+			tun_flags |= TUNNEL_NSI;
+			break;
 		default:
 			return -EINVAL;
 		}
@@ -428,6 +435,7 @@ static int ipv4_tun_to_nlattr(struct sk_buff *skb,
 {
 	struct nlattr *nla;
 	__be32 nsp = cpu_to_be32(ntohl(output->nsp) >> 8);
+	u8 nsi = ntohl(output->nsp) & NSH_M_NSI;
 
 	nla = nla_nest_start(skb, OVS_KEY_ATTR_TUNNEL);
 	if (!nla)
@@ -456,6 +464,9 @@ static int ipv4_tun_to_nlattr(struct sk_buff *skb,
 	if (output->tun_flags & TUNNEL_NSP &&
 	    nla_put_be32(skb, OVS_TUNNEL_KEY_ATTR_NSP, nsp))
 		return -EMSGSIZE;
+	if (output->tun_flags & TUNNEL_NSI &&
+	    nla_put_u8(skb, OVS_TUNNEL_KEY_ATTR_NSI, nsi))
+		return -EMSGSIZE;
 
 	nla_nest_end(skb, nla);
 	return 0;
diff --git a/datapath/linux/compat/include/net/ip_tunnels.h b/datapath/linux/compat/include/net/ip_tunnels.h
index a4aec4d..dfc1b59 100644
--- a/datapath/linux/compat/include/net/ip_tunnels.h
+++ b/datapath/linux/compat/include/net/ip_tunnels.h
@@ -21,6 +21,7 @@
 #define TUNNEL_NO_KEY	__cpu_to_be16(0x80)
 #define TUNNEL_DONT_FRAGMENT	__cpu_to_be16(0x0100)
 #define TUNNEL_NSP	__cpu_to_be16(0x0200)
+#define TUNNEL_NSI	__cpu_to_be16(0x0400)
 
 struct tnl_ptk_info {
 	__be16 flags;
diff --git a/datapath/vport-vxlan.c b/datapath/vport-vxlan.c
index 999fdff..320e825 100644
--- a/datapath/vport-vxlan.c
+++ b/datapath/vport-vxlan.c
@@ -70,7 +70,7 @@ static void vxlan_rcv(struct vxlan_sock *vs, struct sk_buff *skb,
 	iph = ip_hdr(skb);
 	key = cpu_to_be64(ntohl(vx_vni) >> 8);
 	ovs_flow_tun_key_init(&tun_key, iph, key, nsp,
-			      TUNNEL_KEY | TUNNEL_NSP);
+			      TUNNEL_KEY | TUNNEL_NSP | TUNNEL_NSI);
 
 	ovs_vport_receive(vport, skb, &tun_key);
 }
diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h
index 194acfe..bf95ce7 100644
--- a/include/linux/openvswitch.h
+++ b/include/linux/openvswitch.h
@@ -318,6 +318,12 @@ enum ovs_key_attr {
 	__OVS_KEY_ATTR_MAX
 };
 
+/**
+ * OVS_TUNNEL_KEY_ATTR_NSI below can never be zero, because
+ * if it is zero the packet gets dropped, thus all outgoing
+ * packets have this defaulted to 1 if no outgoing value is
+ * explicitly set.
+ */
 #define OVS_KEY_ATTR_MAX (__OVS_KEY_ATTR_MAX - 1)
 
 enum ovs_tunnel_key_attr {
@@ -329,6 +335,7 @@ enum ovs_tunnel_key_attr {
 	OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT,	/* No argument, set DF. */
 	OVS_TUNNEL_KEY_ATTR_CSUM,		/* No argument. CSUM packet. */
 	OVS_TUNNEL_KEY_ATTR_NSP,		/* be32 NSH svc path (lower 24 bits) */
+	OVS_TUNNEL_KEY_ATTR_NSI,		/* u8 NSH service index */
 	__OVS_TUNNEL_KEY_ATTR_MAX
 };
 
-- 
1.7.9.5




More information about the dev mailing list