X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fofp-actions.h;h=ca33ca897142afa4910fcf16de50053e16b9b2b2;hb=4b570f12766f3c4eeb527de69d8eedfd59c34b86;hp=7c9cb055f7bdb5ff742cb304ce9538a53037f9a3;hpb=d01c980ffe0d61497298a9f907ff93fe1751e2bd;p=sliver-openvswitch.git diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h index 7c9cb055f..ca33ca897 100644 --- a/lib/ofp-actions.h +++ b/lib/ofp-actions.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 Nicira Networks. + * Copyright (c) 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,6 +60,7 @@ DEFINE_OFPACT(SET_VLAN_VID, ofpact_vlan_vid, ofpact) \ DEFINE_OFPACT(SET_VLAN_PCP, ofpact_vlan_pcp, ofpact) \ DEFINE_OFPACT(STRIP_VLAN, ofpact_null, ofpact) \ + DEFINE_OFPACT(PUSH_VLAN, ofpact_null, ofpact) \ DEFINE_OFPACT(SET_ETH_SRC, ofpact_mac, ofpact) \ DEFINE_OFPACT(SET_ETH_DST, ofpact_mac, ofpact) \ DEFINE_OFPACT(SET_IPV4_SRC, ofpact_ipv4, ofpact) \ @@ -69,7 +70,13 @@ 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(STACK_PUSH, ofpact_stack, ofpact) \ + DEFINE_OFPACT(STACK_POP, ofpact_stack, ofpact) \ + DEFINE_OFPACT(DEC_TTL, ofpact_cnt_ids, cnt_ids) \ + DEFINE_OFPACT(SET_MPLS_TTL, ofpact_mpls_ttl, ofpact) \ + DEFINE_OFPACT(DEC_MPLS_TTL, ofpact_null, ofpact) \ + DEFINE_OFPACT(PUSH_MPLS, ofpact_push_mpls, ofpact) \ + DEFINE_OFPACT(POP_MPLS, ofpact_pop_mpls, ofpact) \ \ /* Metadata. */ \ DEFINE_OFPACT(SET_TUNNEL, ofpact_tunnel, ofpact) \ @@ -83,11 +90,18 @@ \ /* Arithmetic. */ \ DEFINE_OFPACT(MULTIPATH, ofpact_multipath, ofpact) \ - DEFINE_OFPACT(AUTOPATH, ofpact_autopath, ofpact) \ \ /* Other. */ \ DEFINE_OFPACT(NOTE, ofpact_note, data) \ - DEFINE_OFPACT(EXIT, ofpact_null, ofpact) + DEFINE_OFPACT(EXIT, ofpact_null, ofpact) \ + DEFINE_OFPACT(SAMPLE, ofpact_sample, ofpact) \ + \ + /* Instructions */ \ + DEFINE_OFPACT(METER, ofpact_meter, ofpact) \ + /* XXX Write-Actions */ \ + DEFINE_OFPACT(CLEAR_ACTIONS, ofpact_null, ofpact) \ + DEFINE_OFPACT(WRITE_METADATA, ofpact_metadata, ofpact) \ + DEFINE_OFPACT(GOTO_TABLE, ofpact_goto_table, ofpact) /* enum ofpact_type, with a member OFPACT_ for each action. */ enum OVS_PACKED_ENUM ofpact_type { @@ -108,7 +122,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,9 +183,10 @@ 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, OFPACT_CLEAR_ACTIONS. * - * Used for OFPAT10_STRIP_VLAN, NXAST_DEC_TTL, NXAST_POP_QUEUE, NXAST_EXIT. + * Used for OFPAT10_STRIP_VLAN, NXAST_POP_QUEUE, NXAST_EXIT, + * OFPAT11_POP_VLAN, OFPIT11_CLEAR_ACTIONS. * * Action structure for actions that do not have any extra data beyond the * action type. */ @@ -160,7 +199,7 @@ struct ofpact_null { * Used for OFPAT10_OUTPUT. */ struct ofpact_output { struct ofpact ofpact; - uint16_t port; /* Output port. */ + ofp_port_t port; /* Output port. */ uint16_t max_len; /* Max send len, for port OFPP_CONTROLLER. */ }; @@ -179,7 +218,7 @@ struct ofpact_controller { * Used for OFPAT10_ENQUEUE. */ struct ofpact_enqueue { struct ofpact ofpact; - uint16_t port; + ofp_port_t port; uint32_t queue; }; @@ -209,7 +248,7 @@ struct ofpact_bundle { /* Slaves for output. */ unsigned int n_slaves; - uint16_t slaves[]; + ofp_port_t slaves[]; }; /* OFPACT_SET_VLAN_VID. @@ -269,13 +308,37 @@ struct ofpact_reg_move { struct mf_subfield dst; }; +/* OFPACT_STACK_PUSH. + * + * Used for NXAST_STACK_PUSH and NXAST_STACK_POP. */ +struct ofpact_stack { + struct ofpact ofpact; + struct mf_subfield subfield; +}; + /* 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_PUSH_VLAN/MPLS/PBB + * + * Used for NXAST_PUSH_MPLS, OFPAT11_PUSH_MPLS. */ +struct ofpact_push_mpls { + struct ofpact ofpact; + ovs_be16 ethertype; +}; + +/* OFPACT_POP_MPLS + * + * Used for NXAST_POP_MPLS, OFPAT11_POP_MPLS.. */ +struct ofpact_pop_mpls { + struct ofpact ofpact; + ovs_be16 ethertype; }; /* OFPACT_SET_TUNNEL. @@ -303,25 +366,42 @@ struct ofpact_fin_timeout { uint16_t fin_hard_timeout; }; +/* OFPACT_WRITE_METADATA. + * + * Used for NXAST_WRITE_METADATA. */ +struct ofpact_metadata { + struct ofpact ofpact; + ovs_be64 metadata; + ovs_be64 mask; +}; + +/* OFPACT_METER. + * + * Used for OFPIT13_METER. */ +struct ofpact_meter { + struct ofpact ofpact; + uint32_t meter_id; +}; + /* OFPACT_RESUBMIT. * * Used for NXAST_RESUBMIT, NXAST_RESUBMIT_TABLE. */ struct ofpact_resubmit { struct ofpact ofpact; - uint16_t in_port; + ofp_port_t in_port; uint8_t table_id; }; /* Part of struct ofpact_learn, below. */ struct ofpact_learn_spec { - int n_bits; + int n_bits; /* Number of bits in source and dest. */ - int src_type; - struct mf_subfield src; - union mf_subvalue src_imm; + int src_type; /* One of NX_LEARN_SRC_*. */ + struct mf_subfield src; /* NX_LEARN_SRC_FIELD only. */ + union mf_subvalue src_imm; /* NX_LEARN_SRC_IMMEDIATE only. */ - int dst_type; - struct mf_subfield dst; + int dst_type; /* One of NX_LEARN_DST_*. */ + struct mf_subfield dst; /* NX_LEARN_DST_MATCH, NX_LEARN_DST_LOAD only. */ }; /* OFPACT_LEARN. @@ -362,15 +442,6 @@ struct ofpact_multipath { struct mf_subfield dst; }; -/* OFPACT_AUTOPATH. - * - * Used for NXAST_AUTOPATH. */ -struct ofpact_autopath { - struct ofpact ofpact; - struct mf_subfield dst; - uint32_t port; -}; - /* OFPACT_NOTE. * * Used for NXAST_NOTE. */ @@ -380,6 +451,45 @@ struct ofpact_note { uint8_t data[]; }; +/* OFPACT_SAMPLE. + * + * Used for NXAST_SAMPLE. */ +struct ofpact_sample { + struct ofpact ofpact; + uint16_t probability; // Always >0. + uint32_t collector_set_id; + uint32_t obs_domain_id; + uint32_t obs_point_id; +}; + +/* OFPACT_DEC_TTL. + * + * Used for OFPAT11_DEC_NW_TTL, 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[]; +}; + +/* OFPACT_SET_MPLS_TTL. + * + * Used for NXAST_SET_MPLS_TTL */ +struct ofpact_mpls_ttl { + struct ofpact ofpact; + + uint8_t ttl; +}; + +/* 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, @@ -391,20 +501,22 @@ enum ofperr ofpacts_pull_openflow11_instructions(struct ofpbuf *openflow, unsigned int instructions_len, struct ofpbuf *ofpacts); enum ofperr ofpacts_check(const struct ofpact[], size_t ofpacts_len, - const struct flow *, int max_ports); + struct flow *, ofp_port_t max_ports, + uint8_t table_id); +enum ofperr ofpacts_verify(const struct ofpact ofpacts[], size_t ofpacts_len); /* Converting ofpacts to OpenFlow. */ void ofpacts_put_openflow10(const struct ofpact[], size_t ofpacts_len, struct ofpbuf *openflow); -void ofpacts_put_openflow11_actions(const struct ofpact[], size_t ofpacts_len, - struct ofpbuf *openflow); +size_t ofpacts_put_openflow11_actions(const struct ofpact[], size_t ofpacts_len, + struct ofpbuf *openflow); void ofpacts_put_openflow11_instructions(const struct ofpact[], size_t ofpacts_len, struct ofpbuf *openflow); /* Working with ofpacts. */ bool ofpacts_output_to_port(const struct ofpact[], size_t ofpacts_len, - uint16_t port); + ofp_port_t port); bool ofpacts_equal(const struct ofpact a[], size_t a_len, const struct ofpact b[], size_t b_len); @@ -469,8 +581,8 @@ void *ofpact_put(struct ofpbuf *, enum ofpact_type, size_t len); static inline struct STRUCT * \ ofpact_get_##ENUM(const struct ofpact *ofpact) \ { \ - assert(ofpact->type == OFPACT_##ENUM); \ - return (struct STRUCT *) ofpact; \ + ovs_assert(ofpact->type == OFPACT_##ENUM); \ + return ALIGNED_CAST(struct STRUCT *, ofpact); \ } \ \ static inline struct STRUCT * \ @@ -493,4 +605,53 @@ OFPACTS void ofpact_update_len(struct ofpbuf *, struct ofpact *); void ofpact_pad(struct ofpbuf *); +/* OpenFlow 1.1 instructions. + * The order is sorted in execution order. Not in the value of OFPIT11_xxx. + * It is enforced on parser from text string. + */ +#define OVS_INSTRUCTIONS \ + DEFINE_INST(OFPIT13_METER, \ + ofp13_instruction_meter, false, \ + "meter") \ + \ + DEFINE_INST(OFPIT11_APPLY_ACTIONS, \ + ofp11_instruction_actions, true, \ + "apply_actions") \ + \ + DEFINE_INST(OFPIT11_CLEAR_ACTIONS, \ + ofp11_instruction, false, \ + "clear_actions") \ + \ + DEFINE_INST(OFPIT11_WRITE_ACTIONS, \ + ofp11_instruction_actions, true, \ + "write_actions") \ + \ + DEFINE_INST(OFPIT11_WRITE_METADATA, \ + ofp11_instruction_write_metadata, false, \ + "write_metadata") \ + \ + DEFINE_INST(OFPIT11_GOTO_TABLE, \ + ofp11_instruction_goto_table, false, \ + "goto_table") + +enum ovs_instruction_type { +#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) OVSINST_##ENUM, + OVS_INSTRUCTIONS +#undef DEFINE_INST +}; + +enum { +#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) + 1 + N_OVS_INSTRUCTIONS = OVS_INSTRUCTIONS +#undef DEFINE_INST +}; + +const char *ovs_instruction_name_from_type(enum ovs_instruction_type type); +int ovs_instruction_type_from_name(const char *name); +enum ovs_instruction_type ovs_instruction_type_from_ofpact_type( + enum ofpact_type); + +void ofpact_set_field_init(struct ofpact_reg_load *load, + const struct mf_field *mf, const void *src); + #endif /* ofp-actions.h */