[ovs-dev] [PATCH 6/8] nsh: support for setting nsi, action set_nsi=<value>
pritesh
pritesh.kothari at cisco.com
Fri Sep 20 08:04:23 UTC 2013
Support for setting nsi using an action namely set_nsi. It works similar to
set_tunnel in vxlan/gre tunnel and can be used to set the outgoing nsh
service index (nsi).
Signed-off-by: pritesh <pritesh.kothari at cisco.com>
diff --git a/include/openflow/nicira-ext.h b/include/openflow/nicira-ext.h
index 748ceee..3872d57 100644
--- a/include/openflow/nicira-ext.h
+++ b/include/openflow/nicira-ext.h
@@ -313,6 +313,7 @@ enum nx_action_subtype {
NXAST_STACK_POP, /* struct nx_action_stack */
NXAST_SAMPLE, /* struct nx_action_sample */
NXAST_SET_NSP, /* struct nx_action_set_nsp */
+ NXAST_SET_NSI, /* struct nx_action_set_nsi */
};
/* Header for Nicira-defined actions. */
@@ -1799,6 +1800,20 @@ OFP_ASSERT(sizeof(struct nx_action_output_reg) == 24);
#define NXM_NX_NSP NXM_HEADER (0x0001, 34, 4)
#define NXM_NX_NSP_W NXM_HEADER_W(0x0001, 34, 4)
+/* NSH Service Index.
+ *
+ * For a packet received via a VXLAN tunnel, it includes a (8-bit)
+ * network service header service index (nsi).
+ *
+ * Prereqs: None.
+ *
+ * Format: 8-bit integer.
+ *
+ * Masking: Arbitrary masks. */
+#define NXM_NX_NSI NXM_HEADER (0x0001, 35, 1)
+#define NXM_NX_NSI_W NXM_HEADER_W(0x0001, 35, 1)
+
+
/* ## --------------------- ## */
/* ## Requests and replies. ## */
/* ## --------------------- ## */
@@ -2325,4 +2340,17 @@ struct nx_action_set_nsp {
};
OFP_ASSERT(sizeof(struct nx_action_set_nsp) == 16);
+/* Action structure for NXAST_SET_NSI.
+ *
+ * Sets the encapsulating NSH service index to a 8-bit value. */
+struct nx_action_set_nsi {
+ ovs_be16 type; /* OFPAT_VENDOR. */
+ ovs_be16 len; /* Length is 16. */
+ ovs_be32 vendor; /* NX_VENDOR_ID. */
+ ovs_be16 subtype; /* NXAST_SET_NSI. */
+ uint8_t nsi; /* NSH service index. */
+ uint8_t pad[5];
+};
+OFP_ASSERT(sizeof(struct nx_action_set_nsi) == 16);
+
#endif /* openflow/nicira-ext.h */
diff --git a/lib/meta-flow.c b/lib/meta-flow.c
index 8e11de0..3c52f1f 100644
--- a/lib/meta-flow.c
+++ b/lib/meta-flow.c
@@ -718,7 +718,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
MFS_HEXADECIMAL,
MFP_NONE,
false,
- 0, NULL,
+ NXM_NX_NSI, "NXM_NX_NSI",
0, NULL,
OFPUTIL_P_OF10_NXM_ANY,
OFPUTIL_P_OF10_NXM_ANY,
diff --git a/lib/nx-match.c b/lib/nx-match.c
index f8e6223..e651624 100644
--- a/lib/nx-match.c
+++ b/lib/nx-match.c
@@ -687,6 +687,8 @@ nx_put_raw(struct ofpbuf *b, bool oxm, const struct match *match,
flow->tunnel.tun_id, match->wc.masks.tunnel.tun_id);
nxm_put_32m(b, NXM_NX_NSP, flow->tunnel.nsp, match->wc.masks.tunnel.nsp);
+ nxm_put_8m(b, NXM_NX_NSI, flow->tunnel.nsi, match->wc.masks.tunnel.nsi);
+
/* Other tunnel metadata. */
nxm_put_32m(b, NXM_NX_TUN_IPV4_SRC,
flow->tunnel.ip_src, match->wc.masks.tunnel.ip_src);
diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index b9c3f57..3719ca8 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -315,8 +315,10 @@ ofpact_from_nxast(const union ofp_action *a, enum ofputil_action_code code,
const struct nx_action_set_tunnel64 *nast64;
const struct nx_action_write_metadata *nawm;
const struct nx_action_set_nsp *nasnsp;
+ const struct nx_action_set_nsi *nasnsi;
struct ofpact_tunnel *tunnel;
struct ofpact_nsp *nsp;
+ struct ofpact_nsi *nsi;
enum ofperr error = 0;
switch (code) {
@@ -469,6 +471,13 @@ ofpact_from_nxast(const union ofp_action *a, enum ofputil_action_code code,
nsp->ofpact.compat = code;
nsp->nsp = ntohl(nasnsp->nsp);
break;
+
+ case OFPUTIL_NXAST_SET_NSI:
+ nasnsi = (const struct nx_action_set_nsi *) a;
+ nsi = ofpact_put_SET_NSI(out);
+ nsi->ofpact.compat = code;
+ nsi->nsi = nasnsi->nsi;
+ break;
}
return error;
@@ -996,6 +1005,7 @@ ovs_instruction_type_from_ofpact_type(enum ofpact_type type)
case OFPACT_EXIT:
case OFPACT_SAMPLE:
case OFPACT_SET_NSP:
+ case OFPACT_SET_NSI:
default:
return OVSINST_OFPIT11_APPLY_ACTIONS;
}
@@ -1279,6 +1289,7 @@ ofpact_check__(const struct ofpact *a, struct flow *flow, ofp_port_t max_ports,
case OFPACT_FIN_TIMEOUT:
case OFPACT_RESUBMIT:
case OFPACT_SET_NSP:
+ case OFPACT_SET_NSI:
return 0;
case OFPACT_LEARN:
@@ -1624,6 +1635,11 @@ ofpact_to_nxast(const struct ofpact *a, struct ofpbuf *out)
= htonl(ofpact_get_SET_NSP(a)->nsp);
break;
+ case OFPACT_SET_NSI:
+ ofputil_put_NXAST_SET_NSI(out)->nsi
+ = ofpact_get_SET_NSI(a)->nsi;
+ break;
+
case OFPACT_GROUP:
case OFPACT_OUTPUT:
case OFPACT_ENQUEUE:
@@ -1764,6 +1780,7 @@ ofpact_to_openflow10(const struct ofpact *a, struct ofpbuf *out)
case OFPACT_POP_MPLS:
case OFPACT_SAMPLE:
case OFPACT_SET_NSP:
+ case OFPACT_SET_NSI:
ofpact_to_nxast(a, out);
break;
}
@@ -1935,6 +1952,7 @@ ofpact_to_openflow11(const struct ofpact *a, struct ofpbuf *out)
case OFPACT_EXIT:
case OFPACT_SAMPLE:
case OFPACT_SET_NSP:
+ case OFPACT_SET_NSI:
ofpact_to_nxast(a, out);
break;
}
@@ -2090,6 +2108,7 @@ ofpact_outputs_to_port(const struct ofpact *ofpact, ofp_port_t port)
case OFPACT_METER:
case OFPACT_GROUP:
case OFPACT_SET_NSP:
+ case OFPACT_SET_NSI:
default:
return false;
}
@@ -2473,6 +2492,10 @@ ofpact_format(const struct ofpact *a, struct ds *s)
case OFPACT_SET_NSP:
ds_put_format(s, "set_nsp:%#"PRIx32, ofpact_get_SET_NSP(a)->nsp);
break;
+
+ case OFPACT_SET_NSI:
+ ds_put_format(s, "set_nsi:%"PRIu8, ofpact_get_SET_NSI(a)->nsi);
+ break;
}
}
diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h
index 443d8c3..267db25 100644
--- a/lib/ofp-actions.h
+++ b/lib/ofp-actions.h
@@ -85,6 +85,7 @@
DEFINE_OFPACT(POP_QUEUE, ofpact_null, ofpact) \
DEFINE_OFPACT(FIN_TIMEOUT, ofpact_fin_timeout, ofpact) \
DEFINE_OFPACT(SET_NSP, ofpact_nsp, ofpact) \
+ DEFINE_OFPACT(SET_NSI, ofpact_nsi, ofpact) \
\
/* Flow table interaction. */ \
DEFINE_OFPACT(RESUBMIT, ofpact_resubmit, ofpact) \
@@ -376,6 +377,14 @@ struct ofpact_nsp {
uint32_t nsp;
};
+/* OFPACT_SET_NSI.
+ *
+ * Used for NXAST_SET_NSI. */
+struct ofpact_nsi {
+ struct ofpact ofpact;
+ uint8_t nsi;
+};
+
/* OFPACT_WRITE_METADATA.
*
* Used for NXAST_WRITE_METADATA. */
diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c
index d17622c..80f4762 100644
--- a/lib/ofp-parse.c
+++ b/lib/ofp-parse.c
@@ -602,6 +602,7 @@ parse_named_action(enum ofputil_action_code code,
size_t orig_size = ofpacts->size;
struct ofpact_tunnel *tunnel;
struct ofpact_nsp *nsp;
+ struct ofpact_nsi *nsi;
char *error = NULL;
uint16_t ethertype = 0;
uint16_t vid = 0;
@@ -841,6 +842,11 @@ parse_named_action(enum ofputil_action_code code,
error = str_to_u32(arg, &nsp->nsp);
break;
+ case OFPUTIL_NXAST_SET_NSI:
+ nsi = ofpact_put_SET_NSI(ofpacts);
+ nsi->ofpact.compat = code;
+ error = str_to_u8(arg, "nsi", &nsi->nsi);
+ break;
}
if (error) {
diff --git a/lib/ofp-util.def b/lib/ofp-util.def
index dfa9f4d..59728fc 100644
--- a/lib/ofp-util.def
+++ b/lib/ofp-util.def
@@ -74,6 +74,7 @@ NXAST_ACTION(NXAST_PUSH_MPLS, nx_action_push_mpls, 0, "push_mpls")
NXAST_ACTION(NXAST_POP_MPLS, nx_action_pop_mpls, 0, "pop_mpls")
NXAST_ACTION(NXAST_SAMPLE, nx_action_sample, 0, "sample")
NXAST_ACTION(NXAST_SET_NSP, nx_action_set_nsp, 0, "set_nsp")
+NXAST_ACTION(NXAST_SET_NSI, nx_action_set_nsi, 0, "set_nsi")
#undef OFPAT10_ACTION
#undef OFPAT11_ACTION
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index c184f72..a514b63 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -2401,6 +2401,10 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
case OFPACT_SET_NSP:
flow->tunnel.nsp = htonl(ofpact_get_SET_NSP(a)->nsp);
break;
+
+ case OFPACT_SET_NSI:
+ flow->tunnel.nsi = ofpact_get_SET_NSI(a)->nsi;
+ break;
}
}
}
--
1.7.9.5
More information about the dev
mailing list