X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fflow.h;h=8999410d8e104b744e2c91628145f60e4779d6e9;hb=06036898849974797cf49c76a56fc6e10461d37d;hp=b1292ce35bb5dfb198a5fe56440b56991e53e75b;hpb=fb892732bac6787c6fb943554f8000e26477dd85;p=openvswitch diff --git a/lib/flow.h b/lib/flow.h index b1292ce3..8999410d 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -16,13 +16,14 @@ #ifndef FLOW_H #define FLOW_H 1 +#include #include #include #include #include +#include "openflow/nicira-ext.h" #include "openflow/openflow.h" #include "hash.h" -#include "openflow/openflow.h" #include "openvswitch/datapath-protocol.h" #include "util.h" @@ -30,41 +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 *, 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, struct ofp_match *); -void flow_from_match(flow_t *, uint32_t *wildcards, const struct ofp_match *); -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); +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, 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. */ @@ -93,7 +117,7 @@ flow_nw_bits_to_mask(uint32_t wildcards, int shift) static inline void flow_wildcards_init(struct flow_wildcards *wc, uint32_t wildcards) { - wc->wildcards = wildcards & OFPFW_ALL; + wc->wildcards = wildcards & OVSFW_ALL; wc->nw_src_mask = flow_nw_bits_to_mask(wc->wildcards, OFPFW_NW_SRC_SHIFT); wc->nw_dst_mask = flow_nw_bits_to_mask(wc->wildcards, OFPFW_NW_DST_SHIFT); }