This patch plumbs set-field action into ofp-actions and ofp-parse.
Signed-off-by: Isaku Yamahata <[email protected]>
---
lib/ofp-actions.c | 64 +++++++++++++++++------------------------------
lib/ofp-parse.c | 55 ++++++----------------------------------
ofproto/ofproto-dpif.c | 5 ++-
3 files changed, 35 insertions(+), 89 deletions(-)
diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index fbaa5ff..d6f1fe9 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -27,6 +27,7 @@
#include "nx-match.h"
#include "ofp-util.h"
#include "ofpbuf.h"
+#include "set-field.h"
#include "vlog.h"
VLOG_DEFINE_THIS_MODULE(ofp_actions);
@@ -352,44 +353,37 @@ ofpact_from_openflow10(const union ofp_action *a, struct
ofpbuf *out)
if (a->vlan_vid.vlan_vid & ~htons(0xfff)) {
return OFPERR_OFPBAC_BAD_ARGUMENT;
}
- ofpact_put_SET_VLAN_VID(out)->vlan_vid = ntohs(a->vlan_vid.vlan_vid);
- break;
+ return set_field_put(out, MFF_VLAN_VID, &a->vlan_vid.vlan_vid);
case OFPUTIL_OFPAT10_SET_VLAN_PCP:
if (a->vlan_pcp.vlan_pcp & ~7) {
return OFPERR_OFPBAC_BAD_ARGUMENT;
}
- ofpact_put_SET_VLAN_PCP(out)->vlan_pcp = a->vlan_pcp.vlan_pcp;
- break;
+ return set_field_put(out, MFF_VLAN_PCP, &a->vlan_pcp.vlan_pcp);
case OFPUTIL_OFPAT10_STRIP_VLAN:
ofpact_put_STRIP_VLAN(out);
break;
case OFPUTIL_OFPAT10_SET_DL_SRC:
- memcpy(ofpact_put_SET_ETH_SRC(out)->mac,
- ((const struct ofp_action_dl_addr *) a)->dl_addr, ETH_ADDR_LEN);
- break;
+ return set_field_put(out, MFF_ETH_SRC,
+ ((const struct ofp_action_dl_addr *) a)->dl_addr);
case OFPUTIL_OFPAT10_SET_DL_DST:
- memcpy(ofpact_put_SET_ETH_DST(out)->mac,
- ((const struct ofp_action_dl_addr *) a)->dl_addr, ETH_ADDR_LEN);
- break;
+ return set_field_put(out, MFF_ETH_DST,
+ ((const struct ofp_action_dl_addr *) a)->dl_addr);
case OFPUTIL_OFPAT10_SET_NW_SRC:
- ofpact_put_SET_IPV4_SRC(out)->ipv4 = a->nw_addr.nw_addr;
- break;
+ return set_field_put(out, MFF_IPV4_SRC, &a->nw_addr.nw_addr);
case OFPUTIL_OFPAT10_SET_NW_DST:
- ofpact_put_SET_IPV4_DST(out)->ipv4 = a->nw_addr.nw_addr;
- break;
+ return set_field_put(out, MFF_IPV4_DST, &a->nw_addr.nw_addr);
case OFPUTIL_OFPAT10_SET_NW_TOS:
if (a->nw_tos.nw_tos & ~IP_DSCP_MASK) {
return OFPERR_OFPBAC_BAD_ARGUMENT;
}
- ofpact_put_SET_IPV4_DSCP(out)->dscp = a->nw_tos.nw_tos;
- break;
+ return set_field_put(out, MFF_IP_DSCP, &a->nw_tos.nw_tos);
case OFPUTIL_OFPAT10_SET_TP_SRC:
ofpact_put_SET_L4_SRC_PORT(out)->port = ntohs(a->tp_port.tp_port);
@@ -581,40 +575,33 @@ ofpact_from_openflow11(const union ofp_action *a, struct
ofpbuf *out)
if (a->vlan_vid.vlan_vid & ~htons(0xfff)) {
return OFPERR_OFPBAC_BAD_ARGUMENT;
}
- ofpact_put_SET_VLAN_VID(out)->vlan_vid = ntohs(a->vlan_vid.vlan_vid);
- break;
+ return set_field_put(out, MFF_VLAN_VID, &a->vlan_vid.vlan_vid);
case OFPUTIL_OFPAT11_SET_VLAN_PCP:
if (a->vlan_pcp.vlan_pcp & ~7) {
return OFPERR_OFPBAC_BAD_ARGUMENT;
}
- ofpact_put_SET_VLAN_PCP(out)->vlan_pcp = a->vlan_pcp.vlan_pcp;
- break;
+ return set_field_put(out, MFF_VLAN_PCP, &a->vlan_pcp.vlan_pcp);
case OFPUTIL_OFPAT11_SET_DL_SRC:
- memcpy(ofpact_put_SET_ETH_SRC(out)->mac,
- ((const struct ofp_action_dl_addr *) a)->dl_addr, ETH_ADDR_LEN);
- break;
+ return set_field_put(out, MFF_ETH_SRC,
+ ((const struct ofp_action_dl_addr *) a)->dl_addr);
case OFPUTIL_OFPAT11_SET_DL_DST:
- memcpy(ofpact_put_SET_ETH_DST(out)->mac,
- ((const struct ofp_action_dl_addr *) a)->dl_addr, ETH_ADDR_LEN);
- break;
+ return set_field_put(out, MFF_ETH_DST,
+ ((const struct ofp_action_dl_addr *) a)->dl_addr);
case OFPUTIL_OFPAT11_SET_NW_SRC:
- ofpact_put_SET_IPV4_SRC(out)->ipv4 = a->nw_addr.nw_addr;
- break;
+ return set_field_put(out, MFF_IPV4_SRC, &a->nw_addr.nw_addr);
case OFPUTIL_OFPAT11_SET_NW_DST:
- ofpact_put_SET_IPV4_DST(out)->ipv4 = a->nw_addr.nw_addr;
- break;
+ return set_field_put(out, MFF_IPV4_DST, &a->nw_addr.nw_addr);
case OFPUTIL_OFPAT11_SET_NW_TOS:
if (a->nw_tos.nw_tos & ~IP_DSCP_MASK) {
return OFPERR_OFPBAC_BAD_ARGUMENT;
}
- ofpact_put_SET_IPV4_DSCP(out)->dscp = a->nw_tos.nw_tos;
- break;
+ return set_field_put(out, MFF_IP_DSCP, &a->nw_tos.nw_tos);
case OFPUTIL_OFPAT11_SET_TP_SRC:
ofpact_put_SET_L4_SRC_PORT(out)->port = ntohs(a->tp_port.tp_port);
@@ -893,9 +880,7 @@ ofpact_check__(const struct ofpact *a, const struct flow
*flow, int max_ports)
return 0;
case OFPACT_SET_FIELD:
- /* TODO This will be implemented by the later patch */
- NOT_REACHED();
- break;
+ return set_field_check(ofpact_get_SET_FIELD(a), flow);
case OFPACT_REG_MOVE:
return nxm_reg_move_check(ofpact_get_REG_MOVE(a), flow);
@@ -1211,8 +1196,7 @@ ofpact_to_openflow10(const struct ofpact *a, struct
ofpbuf *out)
break;
case OFPACT_SET_FIELD:
- /* TODO: this will be implemented by later patch */
- NOT_REACHED();
+ set_field_to_openflow10(ofpact_get_SET_FIELD(a), out);
break;
case OFPACT_CONTROLLER:
@@ -1326,8 +1310,7 @@ ofpact_to_openflow11(const struct ofpact *a, struct
ofpbuf *out)
break;
case OFPACT_SET_FIELD:
- /* TODO: this will be implemented by later patch */
- NOT_REACHED();
+ set_field_to_openflow11(ofpact_get_SET_FIELD(a), out);
break;
case OFPACT_CONTROLLER:
@@ -1608,8 +1591,7 @@ ofpact_format(const struct ofpact *a, struct ds *s)
break;
case OFPACT_SET_FIELD:
- /* TODO: this will be implemented by later patch */
- NOT_REACHED();
+ set_field_format(ofpact_get_SET_FIELD(a), s);
break;
case OFPACT_REG_MOVE:
diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c
index 09fdc4a..04b3d75 100644
--- a/lib/ofp-parse.c
+++ b/lib/ofp-parse.c
@@ -36,6 +36,7 @@
#include "ofpbuf.h"
#include "openflow/openflow.h"
#include "packets.h"
+#include "set-field.h"
#include "socket-util.h"
#include "vconn.h"
#include "vlog.h"
@@ -104,26 +105,6 @@ str_to_u64(const char *str)
}
static void
-str_to_mac(const char *str, uint8_t mac[6])
-{
- if (sscanf(str, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(mac))
- != ETH_ADDR_SCAN_COUNT) {
- ovs_fatal(0, "invalid mac address %s", str);
- }
-}
-
-static void
-str_to_ip(const char *str, ovs_be32 *ip)
-{
- struct in_addr in_addr;
-
- if (lookup_ip(str, &in_addr)) {
- ovs_fatal(0, "%s: could not convert to IP address", str);
- }
- *ip = in_addr.s_addr;
-}
-
-static void
parse_enqueue(char *arg, struct ofpbuf *ofpacts)
{
char *sp = NULL;
@@ -283,10 +264,6 @@ parse_named_action(enum ofputil_action_code code, const
struct flow *flow,
char *arg, struct ofpbuf *ofpacts)
{
struct ofpact_tunnel *tunnel;
- uint16_t vid;
- ovs_be32 ip;
- uint8_t pcp;
- uint8_t tos;
switch (code) {
case OFPUTIL_ACTION_INVALID:
@@ -299,20 +276,12 @@ parse_named_action(enum ofputil_action_code code, const
struct flow *flow,
case OFPUTIL_OFPAT10_SET_VLAN_VID:
case OFPUTIL_OFPAT11_SET_VLAN_VID:
- vid = str_to_u32(arg);
- if (vid & ~VLAN_VID_MASK) {
- ovs_fatal(0, "%s: not a valid VLAN VID", arg);
- }
- ofpact_put_SET_VLAN_VID(ofpacts)->vlan_vid = vid;
+ set_field_parse_with_id(MFF_VLAN_VID, arg, ofpacts);
break;
case OFPUTIL_OFPAT10_SET_VLAN_PCP:
case OFPUTIL_OFPAT11_SET_VLAN_PCP:
- pcp = str_to_u32(arg);
- if (pcp & ~7) {
- ovs_fatal(0, "%s: not a valid VLAN PCP", arg);
- }
- ofpact_put_SET_VLAN_PCP(ofpacts)->vlan_pcp = pcp;
+ set_field_parse_with_id(MFF_VLAN_PCP, arg, ofpacts);
break;
case OFPUTIL_OFPAT10_STRIP_VLAN:
@@ -321,33 +290,27 @@ parse_named_action(enum ofputil_action_code code, const
struct flow *flow,
case OFPUTIL_OFPAT10_SET_DL_SRC:
case OFPUTIL_OFPAT11_SET_DL_SRC:
- str_to_mac(arg, ofpact_put_SET_ETH_SRC(ofpacts)->mac);
+ set_field_parse_with_id(MFF_ETH_SRC, arg, ofpacts);
break;
case OFPUTIL_OFPAT10_SET_DL_DST:
case OFPUTIL_OFPAT11_SET_DL_DST:
- str_to_mac(arg, ofpact_put_SET_ETH_DST(ofpacts)->mac);
+ set_field_parse_with_id(MFF_ETH_DST, arg, ofpacts);
break;
case OFPUTIL_OFPAT10_SET_NW_SRC:
case OFPUTIL_OFPAT11_SET_NW_SRC:
- str_to_ip(arg, &ip);
- ofpact_put_SET_IPV4_SRC(ofpacts)->ipv4 = ip;
+ set_field_parse_with_id(MFF_IPV4_SRC, arg, ofpacts);
break;
case OFPUTIL_OFPAT10_SET_NW_DST:
case OFPUTIL_OFPAT11_SET_NW_DST:
- str_to_ip(arg, &ip);
- ofpact_put_SET_IPV4_DST(ofpacts)->ipv4 = ip;
+ set_field_parse_with_id(MFF_IPV4_DST, arg, ofpacts);
break;
case OFPUTIL_OFPAT10_SET_NW_TOS:
case OFPUTIL_OFPAT11_SET_NW_TOS:
- tos = str_to_u32(arg);
- if (tos & ~IP_DSCP_MASK) {
- ovs_fatal(0, "%s: not a valid TOS", arg);
- }
- ofpact_put_SET_IPV4_DSCP(ofpacts)->dscp = tos;
+ set_field_parse_with_id(MFF_IP_DSCP, arg, ofpacts);
break;
case OFPUTIL_OFPAT10_SET_TP_SRC:
@@ -365,7 +328,7 @@ parse_named_action(enum ofputil_action_code code, const
struct flow *flow,
break;
case OFPUTIL_OFPAT12_SET_FIELD:
- NOT_REACHED(); /* This will be implemented by later patch */
+ set_field_parse(arg, ofpacts);
break;
case OFPUTIL_NXAST_RESUBMIT:
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 8aa9f13..e484833 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -48,6 +48,7 @@
#include "ofproto-dpif-governor.h"
#include "ofproto-dpif-sflow.h"
#include "poll-loop.h"
+#include "set-field.h"
#include "simap.h"
#include "timer.h"
#include "unaligned.h"
@@ -5446,8 +5447,8 @@ do_xlate_actions(const struct ofpact *ofpacts, struct
action_xlate_ctx *ctx)
break;
case OFPACT_SET_FIELD:
- /* TODO: this will be implemented by later patch */
- NOT_REACHED();
+ set_field_execute(ofpact_get_SET_FIELD(a), &ctx->flow,
+ &ctx->base_flow, ctx->odp_actions);
break;
case OFPACT_RESUBMIT:
--
1.7.1.1
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev