X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofp-actions.h;h=fd53e62cf59f25ae1364aafda11d827a0fd74e9c;hb=ad4c35fe2dd8edaab6331667021b6b8410abde90;hp=604b56c264e87a40cf5dadbaec90738c912aac02;hpb=99c476dcd9c2709cad3d406aa6dfa58404c52d23;p=openvswitch diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h index 604b56c2..fd53e62c 100644 --- a/lib/ofp-actions.h +++ b/lib/ofp-actions.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 Nicira Networks. + * Copyright (c) 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,7 +69,7 @@ DEFINE_OFPACT(SET_L4_DST_PORT, ofpact_l4_port, ofpact) \ DEFINE_OFPACT(REG_MOVE, ofpact_reg_move, ofpact) \ DEFINE_OFPACT(REG_LOAD, ofpact_reg_load, ofpact) \ - DEFINE_OFPACT(DEC_TTL, ofpact_null, ofpact) \ + DEFINE_OFPACT(DEC_TTL, ofpact_cnt_ids, cnt_ids) \ \ /* Metadata. */ \ DEFINE_OFPACT(SET_TUNNEL, ofpact_tunnel, ofpact) \ @@ -108,7 +108,31 @@ enum { * * Each action is a structure "struct ofpact_*" that begins with "struct * ofpact", usually followed by other data that describes the action. Actions - * are padded out to a multiple of OFPACT_ALIGNTO bytes in length. */ + * are padded out to a multiple of OFPACT_ALIGNTO bytes in length. + * + * The 'compat' member is special: + * + * - Most "struct ofpact"s correspond to one particular kind of OpenFlow + * action, at least in a given OpenFlow version. For example, + * OFPACT_SET_VLAN_VID corresponds to OFPAT10_SET_VLAN_VID in OpenFlow + * 1.0. + * + * For such actions, the 'compat' member is not meaningful and generally + * should be zero. + * + * - A few "struct ofpact"s correspond to multiple OpenFlow actions. For + * example, OFPACT_SET_TUNNEL can be NXAST_SET_TUNNEL or + * NXAST_SET_TUNNEL64. In these cases, if the "struct ofpact" originated + * from OpenFlow, then we want to make sure that, if it gets translated + * back to OpenFlow later, it is translated back to the same action type. + * (Otherwise, we'd violate the promise made in DESIGN, in the "Action + * Reproduction" section.) + * + * For such actions, the 'compat' member should be the original action + * type. (If the action didn't originate from OpenFlow, then setting + * 'compat' to zero should be fine: code to translate the ofpact to + * OpenFlow must tolerate this case.) + */ struct ofpact { enum ofpact_type type; /* OFPACT_*. */ enum ofputil_action_code compat; /* Original type when added, if any. */ @@ -145,7 +169,7 @@ 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_POP_QUEUE, OFPACT_EXIT. * * Used for OFPAT10_STRIP_VLAN, NXAST_DEC_TTL, NXAST_POP_QUEUE, NXAST_EXIT. * @@ -271,11 +295,11 @@ struct ofpact_reg_move { /* OFPACT_REG_LOAD. * - * Used for NXAST_REG_LOAD. */ + * Used for NXAST_REG_LOAD, OFPAT12_SET_FIELD. */ struct ofpact_reg_load { struct ofpact ofpact; struct mf_subfield dst; - uint64_t value; + union mf_subvalue subvalue; /* Least-significant bits are used. */ }; /* OFPACT_SET_TUNNEL. @@ -380,6 +404,18 @@ struct ofpact_note { uint8_t data[]; }; +/* OFPACT_DEC_TTL. + * + * Used for NXAST_DEC_TTL and NXAST_DEC_TTL_CNT_IDS. */ +struct ofpact_cnt_ids { + struct ofpact ofpact; + + /* Controller ids. */ + unsigned int n_controllers; + uint16_t cnt_ids[]; + +}; + /* Converting OpenFlow to ofpacts. */ enum ofperr ofpacts_pull_openflow10(struct ofpbuf *openflow, unsigned int actions_len, @@ -530,4 +566,10 @@ enum { #undef DEFINE_INST }; +const char *ofpact_instruction_name_from_type(enum ovs_instruction_type type); +int ofpact_instruction_type_from_name(const char *name); + +void ofpact_set_field_init(struct ofpact_reg_load *load, + const struct mf_field *mf, const void *src); + #endif /* ofp-actions.h */