mf_from_id accesses a static table, so the compiler should be able to completely optimize it away.
Add OXM inspired names to fields that don't have them (e.g., "ip_proto" and "ip_dscp", which is nicer than "nw_tos_shifted"). Fix MFF_IP_DSCP_SHIFTED bit width to 6. Also use OVS_PACKED_ENUM to waste less space.Summary:Summary: Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> --- lib/meta-flow.c | 20 ++++++-------------- lib/meta-flow.h | 18 +++++++++++++----- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/meta-flow.c b/lib/meta-flow.c index 12811ef..14ee470 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -41,13 +41,13 @@ VLOG_DEFINE_THIS_MODULE(meta_flow); sizeof ((union mf_value *)0)->MEMBER, \ 8 * sizeof ((union mf_value *)0)->MEMBER -static const struct mf_field mf_fields[MFF_N_IDS] = { +const struct mf_field mf_fields[MFF_N_IDS] = { /* ## -------- ## */ /* ## metadata ## */ /* ## -------- ## */ { - MFF_TUN_ID, "tun_id", NULL, + MFF_TUN_ID, "tun_id", "tunnel_id", MF_FIELD_SIZES(be64), MFM_FULLY, MFS_HEXADECIMAL, @@ -409,7 +409,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = { }, { - MFF_IP_PROTO, "nw_proto", NULL, + MFF_IP_PROTO, "nw_proto", "ip_proto", MF_FIELD_SIZES(u8), MFM_NONE, MFS_DECIMAL, @@ -431,8 +431,8 @@ static const struct mf_field mf_fields[MFF_N_IDS] = { OFPUTIL_P_ANY, /* Will be shifted for OXM. */ OFPUTIL_P_NONE, }, { - MFF_IP_DSCP_SHIFTED, "nw_tos_shifted", NULL, - MF_FIELD_SIZES(u8), + MFF_IP_DSCP_SHIFTED, "ip_dscp", "nw_tos_shifted", + 1, 6, MFM_NONE, MFS_DECIMAL, MFP_IP_ANY, @@ -442,7 +442,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = { OFPUTIL_P_ANY, /* Will be shifted for non-OXM. */ OFPUTIL_P_NONE, }, { - MFF_IP_ECN, "nw_ecn", NULL, + MFF_IP_ECN, "nw_ecn", "ip_ecn", 1, 2, MFM_NONE, MFS_DECIMAL, @@ -717,14 +717,6 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); const struct mf_field *mf_from_nxm_header__(uint32_t header); static void nxm_init(void); -/* Returns the field with the given 'id'. */ -const struct mf_field * -mf_from_id(enum mf_field_id id) -{ - ovs_assert((unsigned int) id < MFF_N_IDS); - return &mf_fields[id]; -} - /* Returns the field with the given 'name', or a null pointer if no field has * that name. */ const struct mf_field * diff --git a/lib/meta-flow.h b/lib/meta-flow.h index d3185e4..ab7db86 100644 --- a/lib/meta-flow.h +++ b/lib/meta-flow.h @@ -24,13 +24,14 @@ #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_TUN_ID, /* be64 */ MFF_TUN_SRC, /* be32 */ @@ -178,7 +179,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. */ @@ -207,13 +208,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 @@ -329,11 +330,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 *); -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev