X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fflow.h;h=8999410d8e104b744e2c91628145f60e4779d6e9;hb=06036898849974797cf49c76a56fc6e10461d37d;hp=603c4aceb1b65e30f989ca3740143da1923440dc;hpb=d295e8e97acae13552a5b220d3fbcff8201064a2;p=openvswitch diff --git a/lib/flow.h b/lib/flow.h index 603c4ace..8999410d 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -31,43 +31,64 @@ struct ds; struct ofp_match; struct ofpbuf; -typedef struct odp_flow_key flow_t; +struct flow { + uint32_t tun_id; /* Encapsulating tunnel ID. */ + uint32_t nw_src; /* IP source address. */ + uint32_t nw_dst; /* IP destination address. */ + uint16_t in_port; /* Input switch port. */ + uint16_t dl_vlan; /* Input VLAN. */ + uint16_t dl_type; /* Ethernet frame type. */ + uint16_t tp_src; /* TCP/UDP source port. */ + uint16_t tp_dst; /* TCP/UDP destination port. */ + uint8_t dl_src[6]; /* Ethernet source address. */ + uint8_t dl_dst[6]; /* Ethernet destination address. */ + uint8_t nw_proto; /* IP protocol or low 8 bits of ARP opcode. */ + uint8_t dl_vlan_pcp; /* Input VLAN priority. */ + uint8_t nw_tos; /* IP ToS (DSCP field, 6 bits). */ +}; + +/* Assert that there are FLOW_SIG_SIZE bytes of significant data in "struct + * flow", followed by FLOW_PAD_SIZE bytes of padding. */ +#define FLOW_SIG_SIZE 37 +#define FLOW_PAD_SIZE 3 +BUILD_ASSERT_DECL(offsetof(struct flow, nw_tos) == FLOW_SIG_SIZE - 1); +BUILD_ASSERT_DECL(sizeof(((struct flow *)0)->nw_tos) == 1); +BUILD_ASSERT_DECL(sizeof(struct flow) == FLOW_SIG_SIZE + FLOW_PAD_SIZE); -int flow_extract(struct ofpbuf *, uint32_t tun_id, uint16_t in_port, flow_t *); -void flow_extract_stats(const flow_t *flow, struct ofpbuf *packet, +int flow_extract(struct ofpbuf *, uint32_t tun_id, uint16_t in_port, + struct flow *); +void flow_extract_stats(const struct flow *flow, struct ofpbuf *packet, struct odp_flow_stats *stats); -void flow_to_match(const flow_t *, uint32_t wildcards, bool tun_id_cookie, +void flow_to_match(const struct flow *, uint32_t wildcards, bool tun_id_cookie, struct ofp_match *); void flow_from_match(const struct ofp_match *, bool tun_id_from_cookie, - uint64_t cookie, flow_t *, uint32_t *wildcards); -char *flow_to_string(const flow_t *); -void flow_format(struct ds *, const flow_t *); -void flow_print(FILE *, const flow_t *); -static inline int flow_compare(const flow_t *, const flow_t *); -static inline bool flow_equal(const flow_t *, const flow_t *); -static inline size_t flow_hash(const flow_t *, uint32_t basis); + uint64_t cookie, struct flow *, uint32_t *wildcards); +char *flow_to_string(const struct flow *); +void flow_format(struct ds *, const struct flow *); +void flow_print(FILE *, const struct flow *); +static inline int flow_compare(const struct flow *, const struct flow *); +static inline bool flow_equal(const struct flow *, const struct flow *); +static inline size_t flow_hash(const struct flow *, uint32_t basis); static inline int -flow_compare(const flow_t *a, const flow_t *b) +flow_compare(const struct flow *a, const struct flow *b) { - return memcmp(a, b, sizeof *a); + return memcmp(a, b, FLOW_SIG_SIZE); } static inline bool -flow_equal(const flow_t *a, const flow_t *b) +flow_equal(const struct flow *a, const struct flow *b) { return !flow_compare(a, b); } static inline size_t -flow_hash(const flow_t *flow, uint32_t basis) +flow_hash(const struct flow *flow, uint32_t basis) { - BUILD_ASSERT_DECL(!(sizeof *flow % sizeof(uint32_t))); - return hash_words((const uint32_t *) flow, - sizeof *flow / sizeof(uint32_t), basis); + return hash_bytes(flow, FLOW_SIG_SIZE, basis); } -/* Information on wildcards for a flow, as a supplement to flow_t. */ +/* Information on wildcards for a flow, as a supplement to struct flow. */ struct flow_wildcards { uint32_t wildcards; /* enum ofp_flow_wildcards (in host order). */ uint32_t nw_src_mask; /* 1-bit in each significant nw_src bit. */