This patch plumbs set-field action into ofp-actions and ofp-parse.

Signed-off-by: Isaku Yamahata <yamah...@valinux.co.jp>
---
 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
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to