X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fofp-actions.h;h=0189c8aeeae2a08d9931b9a8375ed92d2c263872;hb=4d5f814dfb737aae820b8ce70ff0a8b94c291ec3;hp=fd53e62cf59f25ae1364aafda11d827a0fd74e9c;hpb=f5c45121cf59ef3099ba669c3590d844bedf53e9;p=sliver-openvswitch.git diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h index fd53e62cf..0189c8aee 100644 --- a/lib/ofp-actions.h +++ b/lib/ofp-actions.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 Nicira, Inc. + * 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(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,16 @@ \ /* 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) \ + \ + /* Instructions */ \ + /* XXX Write-Actions */ \ + DEFINE_OFPACT(WRITE_METADATA, ofpact_metadata, ofpact) \ + DEFINE_OFPACT(CLEAR_ACTIONS, ofpact_null, 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 { @@ -169,9 +181,10 @@ ofpact_end(const struct ofpact *ofpacts, size_t ofpacts_len) /* Action structure for each OFPACT_*. */ -/* OFPACT_STRIP_VLAN, 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. */ @@ -293,6 +306,14 @@ 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, OFPAT12_SET_FIELD. */ @@ -302,6 +323,22 @@ struct ofpact_reg_load { 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. * * Used for NXAST_SET_TUNNEL, NXAST_SET_TUNNEL64. */ @@ -327,6 +364,15 @@ 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_RESUBMIT. * * Used for NXAST_RESUBMIT, NXAST_RESUBMIT_TABLE. */ @@ -386,15 +432,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. */ @@ -406,14 +443,30 @@ struct ofpact_note { /* OFPACT_DEC_TTL. * - * Used for NXAST_DEC_TTL and NXAST_DEC_TTL_CNT_IDS. */ + * 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. */ @@ -428,6 +481,7 @@ enum ofperr ofpacts_pull_openflow11_instructions(struct ofpbuf *openflow, struct ofpbuf *ofpacts); enum ofperr ofpacts_check(const struct ofpact[], size_t ofpacts_len, const struct flow *, int max_ports); +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, @@ -505,7 +559,7 @@ 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); \ + ovs_assert(ofpact->type == OFPACT_##ENUM); \ return (struct STRUCT *) ofpact; \ } \ \ @@ -566,6 +620,16 @@ enum { #undef DEFINE_INST }; + +static inline bool +ofpact_is_instruction(const struct ofpact *a) +{ + /* XXX Write-Actions */ + return a->type == OFPACT_CLEAR_ACTIONS + || a->type == OFPACT_WRITE_METADATA + || a->type == OFPACT_GOTO_TABLE; +} + const char *ofpact_instruction_name_from_type(enum ovs_instruction_type type); int ofpact_instruction_type_from_name(const char *name);