X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fofp-util.h;h=eae8ed5972eaddd68e475bf2c14b87964444094f;hb=3442636d01d2a73a557952ad9140de07418c28c2;hp=21311f7a1394cff9684a623c0507509ac8cd7f24;hpb=3d9c5e58759d8da79b1d6c670f77e95ee2ad92f7;p=sliver-openvswitch.git diff --git a/lib/ofp-util.h b/lib/ofp-util.h index 21311f7a1..eae8ed597 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -43,6 +43,14 @@ void ofputil_format_port(ofp_port_t port, struct ds *); void ofputil_port_to_string(ofp_port_t, char namebuf[OFP_MAX_PORT_NAME_LEN], size_t bufsize); +/* Group numbers. */ +enum { MAX_GROUP_NAME_LEN = INT_STRLEN(uint32_t) }; +bool ofputil_group_from_string(const char *, uint32_t *group_id); +void ofputil_format_group(uint32_t group_id, struct ds *); +void ofputil_group_to_string(uint32_t group_id, + char namebuf[MAX_GROUP_NAME_LEN + 1], + size_t bufsize); + /* Converting OFPFW10_NW_SRC_MASK and OFPFW10_NW_DST_MASK wildcard bit counts * to and from IP bitmasks. */ ovs_be32 ofputil_wcbits_to_netmask(int wcbits); @@ -101,6 +109,17 @@ enum ofputil_protocol { OFPUTIL_P_OF13_OXM = 1 << 6, #define OFPUTIL_P_ANY_OXM (OFPUTIL_P_OF12_OXM | OFPUTIL_P_OF13_OXM) +#define OFPUTIL_P_NXM_OF11_UP (OFPUTIL_P_OF10_NXM_ANY | OFPUTIL_P_OF11_STD | \ + OFPUTIL_P_ANY_OXM) + +#define OFPUTIL_P_NXM_OXM_ANY (OFPUTIL_P_OF10_NXM_ANY | OFPUTIL_P_ANY_OXM) + +#define OFPUTIL_P_OF11_UP (OFPUTIL_P_OF11_STD | OFPUTIL_P_ANY_OXM) + +#define OFPUTIL_P_OF12_UP (OFPUTIL_P_ANY_OXM) + +#define OFPUTIL_P_OF13_UP (OFPUTIL_P_OF13_OXM) + /* All protocols. */ #define OFPUTIL_P_ANY ((1 << 7) - 1) @@ -129,7 +148,6 @@ enum ofputil_protocol ofputil_protocol_set_base( const char *ofputil_protocol_to_string(enum ofputil_protocol); char *ofputil_protocols_to_string(enum ofputil_protocol); enum ofputil_protocol ofputil_protocols_from_string(const char *); -enum ofputil_protocol ofputil_usable_protocols(const struct match *); void ofputil_format_version(struct ds *, enum ofp_version); void ofputil_format_version_name(struct ds *, enum ofp_version); @@ -207,6 +225,16 @@ struct ofpbuf *ofputil_make_set_packet_in_format(enum ofp_version, /* NXT_FLOW_MOD_TABLE_ID extension. */ struct ofpbuf *ofputil_make_flow_mod_table_id(bool flow_mod_table_id); +/* Protocol-independent flow_mod flags. */ +enum ofputil_flow_mod_flags { + OFPUTIL_FF_SEND_FLOW_REM = 1 << 0, /* All versions. */ + OFPUTIL_FF_CHECK_OVERLAP = 1 << 1, /* All versions. */ + OFPUTIL_FF_EMERG = 1 << 2, /* OpenFlow 1.0 only. */ + OFPUTIL_FF_RESET_COUNTS = 1 << 3, /* OpenFlow 1.2+. */ + OFPUTIL_FF_NO_PKT_COUNTS = 1 << 4, /* OpenFlow 1.3+. */ + OFPUTIL_FF_NO_BYT_COUNTS = 1 << 5 /* OpenFlow 1.3+. */ +}; + /* Protocol-independent flow_mod. * * The handling of cookies across multiple versions of OpenFlow is a bit @@ -248,7 +276,8 @@ struct ofputil_flow_mod { uint16_t hard_timeout; uint32_t buffer_id; ofp_port_t out_port; - uint16_t flags; + uint32_t out_group; + enum ofputil_flow_mod_flags flags; struct ofpact *ofpacts; /* Series of "struct ofpact"s. */ size_t ofpacts_len; /* Length of ofpacts, in bytes. */ }; @@ -260,9 +289,6 @@ enum ofperr ofputil_decode_flow_mod(struct ofputil_flow_mod *, struct ofpbuf *ofputil_encode_flow_mod(const struct ofputil_flow_mod *, enum ofputil_protocol); -enum ofputil_protocol ofputil_flow_mod_usable_protocols( - const struct ofputil_flow_mod *fms, size_t n_fms); - /* Flow stats or aggregate stats request, independent of protocol. */ struct ofputil_flow_stats_request { bool aggregate; /* Aggregate results? */ @@ -270,6 +296,7 @@ struct ofputil_flow_stats_request { ovs_be64 cookie; ovs_be64 cookie_mask; ofp_port_t out_port; + uint32_t out_group; uint8_t table_id; }; @@ -277,8 +304,6 @@ enum ofperr ofputil_decode_flow_stats_request( struct ofputil_flow_stats_request *, const struct ofp_header *); struct ofpbuf *ofputil_encode_flow_stats_request( const struct ofputil_flow_stats_request *, enum ofputil_protocol); -enum ofputil_protocol ofputil_flow_stats_request_usable_protocols( - const struct ofputil_flow_stats_request *); /* Flow stats reply, independent of protocol. */ struct ofputil_flow_stats { @@ -296,7 +321,7 @@ struct ofputil_flow_stats { uint64_t byte_count; /* Byte count, UINT64_MAX if unknown. */ struct ofpact *ofpacts; size_t ofpacts_len; - uint16_t flags; /* Added for OF 1.3 */ + enum ofputil_flow_mod_flags flags; }; int ofputil_decode_flow_stats_reply(struct ofputil_flow_stats *, @@ -342,6 +367,8 @@ struct ofpbuf *ofputil_encode_flow_removed(const struct ofputil_flow_removed *, /* Abstract packet-in message. */ struct ofputil_packet_in { + struct list list_node; /* For queueing packet_ins. */ + const void *packet; size_t packet_len; @@ -850,4 +877,88 @@ int ofputil_decode_queue_stats(struct ofputil_queue_stats *qs, struct ofpbuf *ms void ofputil_append_queue_stat(struct list *replies, const struct ofputil_queue_stats *oqs); +/* Bucket for use in groups. */ +struct ofputil_bucket { + struct list list_node; + uint16_t weight; /* Relative weight, for "select" groups. */ + ofp_port_t watch_port; /* Port whose state affects whether this bucket + * is live. Only required for fast failover + * groups. */ + uint32_t watch_group; /* Group whose state affects whether this + * bucket is live. Only required for fast + * failover groups. */ + struct ofpact *ofpacts; /* Series of "struct ofpact"s. */ + size_t ofpacts_len; /* Length of ofpacts, in bytes. */ +}; + +/* Protocol-independent group_mod. */ +struct ofputil_group_mod { + uint16_t command; /* One of OFPGC11_*. */ + uint8_t type; /* One of OFPGT11_*. */ + uint32_t group_id; /* Group identifier. */ + struct list buckets; /* Contains "struct ofputil_bucket"s. */ +}; + +struct bucket_counter { + uint64_t packet_count; /* Number of packets processed by bucket. */ + uint64_t byte_count; /* Number of bytes processed by bucket. */ +}; + +/* Group stats reply, independent of protocol. */ +struct ofputil_group_stats { + uint32_t group_id; /* Group identifier. */ + uint32_t ref_count; + uint64_t packet_count; /* Packet count, UINT64_MAX if unknown. */ + uint64_t byte_count; /* Byte count, UINT64_MAX if unknown. */ + uint32_t duration_sec; /* UINT32_MAX if unknown. */ + uint32_t duration_nsec; + uint32_t n_buckets; + struct bucket_counter *bucket_stats; +}; + +/* Group features reply, independent of protocol. */ +struct ofputil_group_features { + uint32_t types; /* Bitmap of OFPGT_* values supported. */ + uint32_t capabilities; /* Bitmap of OFPGFC12_* capability supported. */ + uint32_t max_groups[4]; /* Maximum number of groups for each type. */ + uint32_t actions[4]; /* Bitmaps of OFPAT_* that are supported. */ +}; + +/* Group desc reply, independent of protocol. */ +struct ofputil_group_desc { + uint8_t type; /* One of OFPGT_*. */ + uint32_t group_id; /* Group identifier. */ + struct list buckets; /* Contains "struct ofputil_bucket"s. */ +}; + +void ofputil_bucket_list_destroy(struct list *buckets); + +struct ofpbuf *ofputil_encode_group_stats_request(enum ofp_version, + uint32_t group_id); +enum ofperr ofputil_decode_group_stats_request( + const struct ofp_header *request, uint32_t *group_id); +void ofputil_append_group_stats(struct list *replies, + const struct ofputil_group_stats *); +struct ofpbuf *ofputil_encode_group_features_request(enum ofp_version); +struct ofpbuf *ofputil_encode_group_features_reply( + const struct ofputil_group_features *, const struct ofp_header *request); +void ofputil_decode_group_features_reply(const struct ofp_header *, + struct ofputil_group_features *); +struct ofpbuf *ofputil_encode_group_mod(enum ofp_version ofp_version, + const struct ofputil_group_mod *gm); + +enum ofperr ofputil_decode_group_mod(const struct ofp_header *, + struct ofputil_group_mod *); + +int ofputil_decode_group_stats_reply(struct ofpbuf *, + struct ofputil_group_stats *); + +int ofputil_decode_group_desc_reply(struct ofputil_group_desc *, + struct ofpbuf *); + +void ofputil_append_group_desc_reply(const struct ofputil_group_desc *, + struct list *buckets, + struct list *replies); +struct ofpbuf *ofputil_encode_group_desc_request(enum ofp_version); + #endif /* ofp-util.h */