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