[ovs-dev] [actions 5/5] ofp-util: New function for executing simple flow-modification actions.
Ben Pfaff
blp at nicira.com
Fri Jun 24 22:02:11 UTC 2011
This simplifies ofproto-dpif somewhat and it allows for code reuse in an
upcoming commit.
---
lib/ofp-util.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++
lib/ofp-util.h | 3 ++
ofproto/ofproto-dpif.c | 62 +++--------------------------------
3 files changed, 92 insertions(+), 57 deletions(-)
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 00f9ce8..2ab6cc9 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -2565,3 +2565,87 @@ ofputil_actions_clone(const union ofp_action *actions, size_t n)
{
return n ? xmemdup(actions, n * sizeof *actions) : NULL;
}
+
+/* Executes action 'a' with the specified 'code' (which must be one of the
+ * actions that simply modifies the flow) by modifying 'flow' appropriately. */
+void
+ofputil_execute_action(const union ofp_action *a,
+ enum ofputil_action_code code, struct flow *flow)
+{
+ const struct ofp_action_dl_addr *oada;
+ const struct nx_action_set_tunnel *nast;
+
+ switch (code) {
+ case OFPUTIL_OFPAT_SET_VLAN_VID:
+ flow->vlan_tci &= ~htons(VLAN_VID_MASK);
+ flow->vlan_tci |= a->vlan_vid.vlan_vid | htons(VLAN_CFI);
+ break;
+
+ case OFPUTIL_OFPAT_SET_VLAN_PCP:
+ flow->vlan_tci &= ~htons(VLAN_PCP_MASK);
+ flow->vlan_tci |= htons(
+ (a->vlan_pcp.vlan_pcp << VLAN_PCP_SHIFT) | VLAN_CFI);
+ break;
+
+ case OFPUTIL_OFPAT_STRIP_VLAN:
+ flow->vlan_tci = htons(0);
+ break;
+
+ case OFPUTIL_OFPAT_SET_DL_SRC:
+ oada = ((struct ofp_action_dl_addr *) a);
+ memcpy(flow->dl_src, oada->dl_addr, ETH_ADDR_LEN);
+ break;
+
+ case OFPUTIL_OFPAT_SET_DL_DST:
+ oada = ((struct ofp_action_dl_addr *) a);
+ memcpy(flow->dl_dst, oada->dl_addr, ETH_ADDR_LEN);
+ break;
+
+ case OFPUTIL_OFPAT_SET_NW_SRC:
+ flow->nw_src = a->nw_addr.nw_addr;
+ break;
+
+ case OFPUTIL_OFPAT_SET_NW_DST:
+ flow->nw_dst = a->nw_addr.nw_addr;
+ break;
+
+ case OFPUTIL_OFPAT_SET_NW_TOS:
+ flow->nw_tos = a->nw_tos.nw_tos;
+ break;
+
+ case OFPUTIL_OFPAT_SET_TP_SRC:
+ flow->tp_src = a->tp_port.tp_port;
+ break;
+
+ case OFPUTIL_OFPAT_SET_TP_DST:
+ flow->tp_dst = a->tp_port.tp_port;
+ break;
+
+ case OFPUTIL_NXAST_SET_TUNNEL:
+ nast = (const struct nx_action_set_tunnel *) a;
+ flow->tun_id = htonll(ntohl(nast->tun_id));
+ break;
+
+ case OFPUTIL_NXAST_REG_MOVE:
+ nxm_execute_reg_move((const struct nx_action_reg_move *) a, flow);
+ break;
+
+ case OFPUTIL_NXAST_REG_LOAD:
+ nxm_execute_reg_load((const struct nx_action_reg_load *) a, flow);
+ break;
+
+ case OFPUTIL_NXAST_SET_TUNNEL64:
+ flow->tun_id = ((const struct nx_action_set_tunnel64 *) a)->tun_id;
+ break;
+
+ case OFPUTIL_OFPAT_OUTPUT:
+ case OFPUTIL_OFPAT_ENQUEUE:
+ case OFPUTIL_NXAST_RESUBMIT:
+ case OFPUTIL_NXAST_SET_QUEUE:
+ case OFPUTIL_NXAST_POP_QUEUE:
+ case OFPUTIL_NXAST_NOTE:
+ case OFPUTIL_NXAST_MULTIPATH:
+ case OFPUTIL_NXAST_AUTOPATH:
+ NOT_REACHED();
+ }
+}
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index 48b0a4c..5537c09 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -350,6 +350,9 @@ int ofputil_pull_actions(struct ofpbuf *, unsigned int actions_len,
bool ofputil_actions_equal(const union ofp_action *a, size_t n_a,
const union ofp_action *b, size_t n_b);
union ofp_action *ofputil_actions_clone(const union ofp_action *, size_t n);
+
+void ofputil_execute_action(const union ofp_action *,
+ enum ofputil_action_code, struct flow *);
/* OpenFlow vendors.
*
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 0696a98..2aec542 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -3063,14 +3063,11 @@ do_xlate_actions(const union ofp_action *in, size_t n_in,
}
OFPUTIL_ACTION_FOR_EACH_UNSAFE (ia, left, in, n_in) {
- const struct ofp_action_dl_addr *oada;
const struct nx_action_resubmit *nar;
- const struct nx_action_set_tunnel *nast;
const struct nx_action_set_queue *nasq;
const struct nx_action_multipath *nam;
const struct nx_action_autopath *naa;
enum ofputil_action_code code;
- ovs_be64 tun_id;
code = ofputil_decode_action_unsafe(ia);
switch (code) {
@@ -3079,48 +3076,20 @@ do_xlate_actions(const union ofp_action *in, size_t n_in,
break;
case OFPUTIL_OFPAT_SET_VLAN_VID:
- ctx->flow.vlan_tci &= ~htons(VLAN_VID_MASK);
- ctx->flow.vlan_tci |= ia->vlan_vid.vlan_vid | htons(VLAN_CFI);
- break;
-
case OFPUTIL_OFPAT_SET_VLAN_PCP:
- ctx->flow.vlan_tci &= ~htons(VLAN_PCP_MASK);
- ctx->flow.vlan_tci |= htons(
- (ia->vlan_pcp.vlan_pcp << VLAN_PCP_SHIFT) | VLAN_CFI);
- break;
-
case OFPUTIL_OFPAT_STRIP_VLAN:
- ctx->flow.vlan_tci = htons(0);
- break;
-
case OFPUTIL_OFPAT_SET_DL_SRC:
- oada = ((struct ofp_action_dl_addr *) ia);
- memcpy(ctx->flow.dl_src, oada->dl_addr, ETH_ADDR_LEN);
- break;
-
case OFPUTIL_OFPAT_SET_DL_DST:
- oada = ((struct ofp_action_dl_addr *) ia);
- memcpy(ctx->flow.dl_dst, oada->dl_addr, ETH_ADDR_LEN);
- break;
-
case OFPUTIL_OFPAT_SET_NW_SRC:
- ctx->flow.nw_src = ia->nw_addr.nw_addr;
- break;
-
case OFPUTIL_OFPAT_SET_NW_DST:
- ctx->flow.nw_dst = ia->nw_addr.nw_addr;
- break;
-
case OFPUTIL_OFPAT_SET_NW_TOS:
- ctx->flow.nw_tos = ia->nw_tos.nw_tos;
- break;
-
case OFPUTIL_OFPAT_SET_TP_SRC:
- ctx->flow.tp_src = ia->tp_port.tp_port;
- break;
-
case OFPUTIL_OFPAT_SET_TP_DST:
- ctx->flow.tp_dst = ia->tp_port.tp_port;
+ case OFPUTIL_NXAST_SET_TUNNEL:
+ case OFPUTIL_NXAST_REG_MOVE:
+ case OFPUTIL_NXAST_REG_LOAD:
+ case OFPUTIL_NXAST_SET_TUNNEL64:
+ ofputil_execute_action(ia, code, &ctx->flow);
break;
case OFPUTIL_OFPAT_ENQUEUE:
@@ -3132,12 +3101,6 @@ do_xlate_actions(const union ofp_action *in, size_t n_in,
xlate_table_action(ctx, ntohs(nar->in_port));
break;
- case OFPUTIL_NXAST_SET_TUNNEL:
- nast = (const struct nx_action_set_tunnel *) ia;
- tun_id = htonll(ntohl(nast->tun_id));
- ctx->flow.tun_id = tun_id;
- break;
-
case OFPUTIL_NXAST_SET_QUEUE:
nasq = (const struct nx_action_set_queue *) ia;
xlate_set_queue_action(ctx, nasq);
@@ -3147,25 +3110,10 @@ do_xlate_actions(const union ofp_action *in, size_t n_in,
ctx->priority = 0;
break;
- case OFPUTIL_NXAST_REG_MOVE:
- nxm_execute_reg_move((const struct nx_action_reg_move *) ia,
- &ctx->flow);
- break;
-
- case OFPUTIL_NXAST_REG_LOAD:
- nxm_execute_reg_load((const struct nx_action_reg_load *) ia,
- &ctx->flow);
- break;
-
case OFPUTIL_NXAST_NOTE:
/* Nothing to do. */
break;
- case OFPUTIL_NXAST_SET_TUNNEL64:
- tun_id = ((const struct nx_action_set_tunnel64 *) ia)->tun_id;
- ctx->flow.tun_id = tun_id;
- break;
-
case OFPUTIL_NXAST_MULTIPATH:
nam = (const struct nx_action_multipath *) ia;
multipath_execute(nam, &ctx->flow);
--
1.7.4.4
More information about the dev
mailing list