Those actions correspond to instructions, Clear-Actions, Write-Actions and Goto-Table. Since Write-Metadata is addressed by other patch series, so it isn't introduced.
Signed-off-by: Isaku Yamahata <yamah...@valinux.co.jp> --- v3: - introduce OFPACT_{CLEAR_ACTIONS, WRITE_ACTIONS, GOTO_TABLE} v2 - changed for ofp_instruction Signed-off-by: Isaku Yamahata <yamah...@valinux.co.jp> --- lib/ofp-actions.c | 41 +++++++++++++++++++++++++++++++++++++++++ lib/ofp-actions.h | 30 +++++++++++++++++++++++++++--- ofproto/ofproto-dpif.c | 12 ++++++++++++ 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c index 122066c..ace51bb 100644 --- a/lib/ofp-actions.c +++ b/lib/ofp-actions.c @@ -938,6 +938,11 @@ ofpact_check__(const struct ofpact *a, const struct flow *flow, int max_ports) case OFPACT_EXIT: return 0; + case OFPACT_CLEAR_ACTIONS: + case OFPACT_WRITE_ACTIONS: + case OFPACT_GOTO_TABLE: + return 0; + default: NOT_REACHED(); } @@ -1130,6 +1135,9 @@ ofpact_to_nxast(const struct ofpact *a, struct ofpbuf *out) case OFPACT_SET_IPV4_DSCP: case OFPACT_SET_L4_SRC_PORT: case OFPACT_SET_L4_DST_PORT: + case OFPACT_CLEAR_ACTIONS: + case OFPACT_WRITE_ACTIONS: + case OFPACT_GOTO_TABLE: NOT_REACHED(); } } @@ -1219,6 +1227,12 @@ ofpact_to_openflow10(const struct ofpact *a, struct ofpbuf *out) = htons(ofpact_get_SET_L4_DST_PORT(a)->port); break; + case OFPACT_CLEAR_ACTIONS: + case OFPACT_WRITE_ACTIONS: + case OFPACT_GOTO_TABLE: + NOT_REACHED(); /* TODO:XXX return error */ + break; + case OFPACT_CONTROLLER: case OFPACT_OUTPUT_REG: case OFPACT_BUNDLE: @@ -1327,6 +1341,18 @@ ofpact_to_openflow11(const struct ofpact *a, struct ofpbuf *out) = htons(ofpact_get_SET_L4_DST_PORT(a)->port); break; + case OFPACT_CLEAR_ACTIONS: + NOT_REACHED(); /* TODO:XXX */ + break; + + case OFPACT_WRITE_ACTIONS: + NOT_REACHED(); /* TODO:XXX */ + break; + + case OFPACT_GOTO_TABLE: + NOT_REACHED(); /* TODO:XXX */ + break; + case OFPACT_CONTROLLER: case OFPACT_OUTPUT_REG: case OFPACT_BUNDLE: @@ -1421,6 +1447,9 @@ ofpact_outputs_to_port(const struct ofpact *ofpact, uint16_t port) case OFPACT_AUTOPATH: case OFPACT_NOTE: case OFPACT_EXIT: + case OFPACT_CLEAR_ACTIONS: + case OFPACT_WRITE_ACTIONS: + case OFPACT_GOTO_TABLE: default: return false; } @@ -1665,6 +1694,18 @@ ofpact_format(const struct ofpact *a, struct ds *s) case OFPACT_EXIT: ds_put_cstr(s, "exit"); break; + + case OFPACT_CLEAR_ACTIONS: + NOT_REACHED(); /* TODO:XXX */ + break; + + case OFPACT_WRITE_ACTIONS: + NOT_REACHED(); /* TODO:XXX */ + break; + + case OFPACT_GOTO_TABLE: + NOT_REACHED(); /* TODO:XXX */ + break; } } diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h index 624dba2..5734da9 100644 --- a/lib/ofp-actions.h +++ b/lib/ofp-actions.h @@ -87,7 +87,12 @@ \ /* Other. */ \ DEFINE_OFPACT(NOTE, ofpact_note, data) \ - DEFINE_OFPACT(EXIT, ofpact_null, ofpact) + DEFINE_OFPACT(EXIT, ofpact_null, ofpact) \ + \ + /* Instructions */ \ + DEFINE_OFPACT(CLEAR_ACTIONS, ofpact_null, ofpact) \ + DEFINE_OFPACT(WRITE_ACTIONS, ofpact_null, ofpact) \ + DEFINE_OFPACT(GOTO_TABLE, ofpact_goto_table, ofpact) /* enum ofpact_type, with a member OFPACT_<ENUM> for each action. */ enum OVS_PACKED_ENUM ofpact_type { @@ -145,9 +150,11 @@ ofpact_end(const struct ofpact *ofpacts, size_t ofpacts_len) /* Action structure for each OFPACT_*. */ -/* OFPACT_STRIP_VLAN, OFPACT_DEC_TTL, OFPACT_POP_QUEUE, OFPACT_EXIT. +/* OFPACT_STRIP_VLAN, OFPACT_DEC_TTL, OFPACT_POP_QUEUE, OFPACT_EXIT, + * OFPACT_CLEAR_ACTIONS, OFPACT_WRITE_ACTIONS. * - * Used for OFPAT10_STRIP_VLAN, NXAST_DEC_TTL, NXAST_POP_QUEUE, NXAST_EXIT. + * Used for OFPAT10_STRIP_VLAN, NXAST_DEC_TTL, NXAST_POP_QUEUE, NXAST_EXIT, + * OFPIT11_CLEAR_ACTIONS, OFPIT11_WRITE_ACTIONS. * * Action structure for actions that do not have any extra data beyond the * action type. */ @@ -380,6 +387,14 @@ struct ofpact_note { uint8_t data[]; }; +/* OFPACT_GOTO_TABLE + * + * Used for OFPIT11_GOTO_TABLE */ +struct ofpact_goto_table { + struct ofpact ofpact; + uint8_t table_id; +}; + /* Converting OpenFlow to ofpacts. */ enum ofperr ofpacts_pull_openflow10(struct ofpbuf *openflow, unsigned int actions_len, @@ -529,4 +544,13 @@ enum { #undef DEFINE_INST }; +static inline bool +ofpact_is_instruction(const struct ofpact *a) +{ + return a->type == OFPACT_CLEAR_ACTIONS + || a->type == OFPACT_WRITE_ACTIONS + /* TODO:XXX Write-Metadata */ + || a->type == OFPACT_GOTO_TABLE; +} + #endif /* ofp-actions.h */ diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index dc15c15..8a63a44 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -5539,6 +5539,18 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, ctx->has_fin_timeout = true; xlate_fin_timeout(ctx, ofpact_get_FIN_TIMEOUT(a)); break; + + case OFPACT_CLEAR_ACTIONS: + NOT_REACHED(); /* TODO:XXX */ + break; + + case OFPACT_WRITE_ACTIONS: + NOT_REACHED(); /* TODO:XXX */ + break; + + case OFPACT_GOTO_TABLE: + NOT_REACHED(); /* TODO:XXX */ + break; } } -- 1.7.1.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev