X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fofp-actions.h;h=db2c028970b2613f150e9d3ab7b3a0c7026f02e8;hb=e3f8f887480856064fab42bc01ae364d64506d85;hp=d6aabf9773d024bc7b615def0ab098e45ae53c3d;hpb=a7a2d006baae4152d338bd0bb4de1687084b1b07;p=sliver-openvswitch.git diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h index d6aabf977..db2c02897 100644 --- a/lib/ofp-actions.h +++ b/lib/ofp-actions.h @@ -59,6 +59,7 @@ DEFINE_OFPACT(BUNDLE, ofpact_bundle, slaves) \ \ /* Header changes. */ \ + DEFINE_OFPACT(SET_FIELD, ofpact_set_field, ofpact) \ 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) \ @@ -67,7 +68,9 @@ DEFINE_OFPACT(SET_ETH_DST, ofpact_mac, ofpact) \ DEFINE_OFPACT(SET_IPV4_SRC, ofpact_ipv4, ofpact) \ DEFINE_OFPACT(SET_IPV4_DST, ofpact_ipv4, ofpact) \ - DEFINE_OFPACT(SET_IPV4_DSCP, ofpact_dscp, ofpact) \ + DEFINE_OFPACT(SET_IP_DSCP, ofpact_dscp, ofpact) \ + DEFINE_OFPACT(SET_IP_ECN, ofpact_ecn, ofpact) \ + DEFINE_OFPACT(SET_IP_TTL, ofpact_ip_ttl, ofpact) \ DEFINE_OFPACT(SET_L4_SRC_PORT, ofpact_l4_port, ofpact) \ DEFINE_OFPACT(SET_L4_DST_PORT, ofpact_l4_port, ofpact) \ DEFINE_OFPACT(REG_MOVE, ofpact_reg_move, ofpact) \ @@ -255,18 +258,32 @@ struct ofpact_bundle { /* OFPACT_SET_VLAN_VID. * - * Used for OFPAT10_SET_VLAN_VID. */ + * We keep track if vlan was present at action validation time to avoid a + * PUSH_VLAN when translating to OpenFlow 1.1+. + * + * We also keep the originating OFPUTIL action code in ofpact.compat. + * + * Used for OFPAT10_SET_VLAN_VID and OFPAT11_SET_VLAN_VID. */ struct ofpact_vlan_vid { struct ofpact ofpact; uint16_t vlan_vid; /* VLAN VID in low 12 bits, 0 in other bits. */ + bool push_vlan_if_needed; /* OF 1.0 semantics if true. */ + bool flow_has_vlan; /* VLAN present at action validation time? */ }; /* OFPACT_SET_VLAN_PCP. * - * Used for OFPAT10_SET_VLAN_PCP. */ + * We keep track if vlan was present at action validation time to avoid a + * PUSH_VLAN when translating to OpenFlow 1.1+. + * + * We also keep the originating OFPUTIL action code in ofpact.compat. + * + * Used for OFPAT10_SET_VLAN_PCP and OFPAT11_SET_VLAN_PCP. */ struct ofpact_vlan_pcp { struct ofpact ofpact; uint8_t vlan_pcp; /* VLAN PCP in low 3 bits, 0 in other bits. */ + bool push_vlan_if_needed; /* OF 1.0 semantics if true. */ + bool flow_has_vlan; /* VLAN present at action validation time? */ }; /* OFPACT_SET_ETH_SRC, OFPACT_SET_ETH_DST. @@ -285,7 +302,7 @@ struct ofpact_ipv4 { ovs_be32 ipv4; }; -/* OFPACT_SET_IPV4_DSCP. +/* OFPACT_SET_IP_DSCP. * * Used for OFPAT10_SET_NW_TOS. */ struct ofpact_dscp { @@ -293,6 +310,22 @@ struct ofpact_dscp { uint8_t dscp; /* DSCP in high 6 bits, rest ignored. */ }; +/* OFPACT_SET_IP_ECN. + * + * Used for OFPAT11_SET_NW_ECN. */ +struct ofpact_ecn { + struct ofpact ofpact; + uint8_t ecn; /* ECN in low 2 bits, rest ignored. */ +}; + +/* OFPACT_SET_IP_TTL. + * + * Used for OFPAT11_SET_NW_TTL. */ +struct ofpact_ip_ttl { + struct ofpact ofpact; + uint8_t ttl; +}; + /* OFPACT_SET_L4_SRC_PORT, OFPACT_SET_L4_DST_PORT. * * Used for OFPAT10_SET_TP_SRC, OFPAT10_SET_TP_DST. */ @@ -320,7 +353,7 @@ struct ofpact_stack { /* OFPACT_REG_LOAD. * - * Used for NXAST_REG_LOAD, OFPAT12_SET_FIELD. */ + * Used for NXAST_REG_LOAD. */ struct ofpact_reg_load { struct ofpact ofpact; struct mf_subfield dst; @@ -340,6 +373,16 @@ enum ofpact_mpls_position { OFPACT_MPLS_AFTER_VLAN }; +/* OFPACT_SET_FIELD. + * + * Used for OFPAT12_SET_FIELD. */ +struct ofpact_set_field { + struct ofpact ofpact; + const struct mf_field *field; + bool flow_has_vlan; /* VLAN present at action validation time. */ + union mf_value value; +}; + /* OFPACT_PUSH_VLAN/MPLS/PBB * * Used for NXAST_PUSH_MPLS, OFPAT11_PUSH_MPLS. */ @@ -534,30 +577,26 @@ struct ofpact_group { }; /* Converting OpenFlow to ofpacts. */ -enum ofperr ofpacts_pull_openflow10(struct ofpbuf *openflow, - unsigned int actions_len, - struct ofpbuf *ofpacts); -enum ofperr ofpacts_pull_openflow11_actions(struct ofpbuf *openflow, - enum ofp_version version, - unsigned int actions_len, - struct ofpbuf *ofpacts); -enum ofperr ofpacts_pull_openflow11_instructions(struct ofpbuf *openflow, - enum ofp_version version, - unsigned int instructions_len, - struct ofpbuf *ofpacts); -enum ofperr ofpacts_check(const struct ofpact[], size_t ofpacts_len, +enum ofperr ofpacts_pull_openflow_actions(struct ofpbuf *openflow, + unsigned int actions_len, + enum ofp_version version, + struct ofpbuf *ofpacts); +enum ofperr ofpacts_pull_openflow_instructions(struct ofpbuf *openflow, + unsigned int instructions_len, + enum ofp_version version, + struct ofpbuf *ofpacts); +enum ofperr ofpacts_check(struct ofpact[], size_t ofpacts_len, struct flow *, ofp_port_t max_ports, - uint8_t table_id); + uint8_t table_id, bool enforce_consistency); 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); -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); +size_t ofpacts_put_openflow_actions(const struct ofpact[], size_t ofpacts_len, + struct ofpbuf *openflow, enum ofp_version); +void ofpacts_put_openflow_instructions(const struct ofpact[], + size_t ofpacts_len, + struct ofpbuf *openflow, + enum ofp_version ofp_version); /* Working with ofpacts. */ bool ofpacts_output_to_port(const struct ofpact[], size_t ofpacts_len, @@ -698,7 +737,4 @@ 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 */