X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fmeta-flow.h;h=91dfecdaaea18c5e394ddbc7ecfc5353c1dc097f;hb=28c5588e8e1a8d091c5d2275232c35f2968a97fa;hp=11502f0a8a7d167fb7e44bee5a2f62e87142a0a7;hpb=dc235f7fbcff39b318b715f9d3d01f97b2634357;p=sliver-openvswitch.git diff --git a/lib/meta-flow.h b/lib/meta-flow.h index 11502f0a8..91dfecdaa 100644 --- a/lib/meta-flow.h +++ b/lib/meta-flow.h @@ -24,14 +24,17 @@ #include "ofp-errors.h" #include "ofp-util.h" #include "packets.h" +#include "util.h" struct ds; struct match; /* The comment on each of these indicates the member in "union mf_value" used * to represent its value. */ -enum mf_field_id { +enum OVS_PACKED_ENUM mf_field_id { /* Metadata. */ + MFF_DP_HASH, /* be32 */ + MFF_RECIRC_ID, /* be32 */ MFF_TUN_ID, /* be64 */ MFF_TUN_SRC, /* be32 */ MFF_TUN_DST, /* be32 */ @@ -180,7 +183,7 @@ enum mf_field_id { * A field may only be matched if the correct lower-level protocols are also * matched. For example, the TCP port may be matched only if the Ethernet type * matches ETH_TYPE_IP and the IP protocol matches IPPROTO_TCP. */ -enum mf_prereqs { +enum OVS_PACKED_ENUM mf_prereqs { MFP_NONE, /* L2 requirements. */ @@ -209,13 +212,13 @@ enum mf_prereqs { /* Forms of partial-field masking allowed for a field. * * Every field may be masked as a whole. */ -enum mf_maskable { +enum OVS_PACKED_ENUM mf_maskable { MFM_NONE, /* No sub-field masking. */ MFM_FULLY, /* Every bit is individually maskable. */ }; /* How to format or parse a field's value. */ -enum mf_string { +enum OVS_PACKED_ENUM mf_string { /* Integer formats. * * The particular MFS_* constant sets the output format. On input, either @@ -231,6 +234,7 @@ enum mf_string { MFS_OFP_PORT_OXM, /* An OpenFlow port number or name (32-bit). */ MFS_FRAG, /* no, yes, first, later, not_later */ MFS_TNL_FLAGS, /* FLOW_TNL_F_* flags */ + MFS_TCP_FLAGS, /* TCP_* flags */ }; struct mf_field { @@ -295,6 +299,9 @@ struct mf_field { enum ofputil_protocol usable_protocols; /* If fully/cidr masked. */ /* If partially/non-cidr masked. */ enum ofputil_protocol usable_protocols_bitwise; + + int flow_be32ofs; /* Field's be32 offset in "struct flow", if prefix tree + * lookup is supported for the field, or -1. */ }; /* The representation of a field's value. */ @@ -331,11 +338,18 @@ union mf_subvalue { BUILD_ASSERT_DECL(sizeof(union mf_value) == sizeof (union mf_subvalue)); /* Finding mf_fields. */ -const struct mf_field *mf_from_id(enum mf_field_id); const struct mf_field *mf_from_name(const char *name); const struct mf_field *mf_from_nxm_header(uint32_t nxm_header); const struct mf_field *mf_from_nxm_name(const char *nxm_name); +static inline const struct mf_field * +mf_from_id(enum mf_field_id id) +{ + extern const struct mf_field mf_fields[MFF_N_IDS]; + ovs_assert((unsigned int) id < MFF_N_IDS); + return &mf_fields[id]; +} + /* Inspecting wildcarded bits. */ bool mf_is_all_wild(const struct mf_field *, const struct flow_wildcards *); @@ -370,8 +384,6 @@ enum ofputil_protocol mf_set(const struct mf_field *, void mf_set_wild(const struct mf_field *, struct match *); -void mf_random_value(const struct mf_field *, union mf_value *value); - /* Subfields. */ void mf_write_subfield_flow(const struct mf_subfield *, const union mf_subvalue *, struct flow *);