X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofp-util.h;h=18cee7a32b6bd389b6debc24763a66431acff9f9;hb=a0ae0b6e8360116c8843325922c3346ab8f208c7;hp=f7d3307f6cecfc6fb696d1be31fb073446c1acea;hpb=2b07c8b182b76e4e3a162796d3ae273ef51d4131;p=openvswitch diff --git a/lib/ofp-util.h b/lib/ofp-util.h index f7d3307f..18cee7a3 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -31,85 +31,6 @@ struct cls_rule; struct ofpbuf; -/* Basic decoding and length validation of OpenFlow messages. */ -enum ofputil_msg_code { - OFPUTIL_MSG_INVALID, - - /* OFPT_* messages. */ - OFPUTIL_OFPT_HELLO, - OFPUTIL_OFPT_ERROR, - OFPUTIL_OFPT_ECHO_REQUEST, - OFPUTIL_OFPT_ECHO_REPLY, - OFPUTIL_OFPT_FEATURES_REQUEST, - OFPUTIL_OFPT_FEATURES_REPLY, - OFPUTIL_OFPT_GET_CONFIG_REQUEST, - OFPUTIL_OFPT_GET_CONFIG_REPLY, - OFPUTIL_OFPT_SET_CONFIG, - OFPUTIL_OFPT_PACKET_IN, - OFPUTIL_OFPT_FLOW_REMOVED, - OFPUTIL_OFPT_PORT_STATUS, - OFPUTIL_OFPT_PACKET_OUT, - OFPUTIL_OFPT_FLOW_MOD, - OFPUTIL_OFPT_PORT_MOD, - OFPUTIL_OFPT_BARRIER_REQUEST, - OFPUTIL_OFPT_BARRIER_REPLY, - OFPUTIL_OFPT_QUEUE_GET_CONFIG_REQUEST, - OFPUTIL_OFPT_QUEUE_GET_CONFIG_REPLY, - - /* OFPST_* stat requests. */ - OFPUTIL_OFPST_DESC_REQUEST, - OFPUTIL_OFPST_FLOW_REQUEST, - OFPUTIL_OFPST_AGGREGATE_REQUEST, - OFPUTIL_OFPST_TABLE_REQUEST, - OFPUTIL_OFPST_PORT_REQUEST, - OFPUTIL_OFPST_QUEUE_REQUEST, - OFPUTIL_OFPST_PORT_DESC_REQUEST, - - /* OFPST_* stat replies. */ - OFPUTIL_OFPST_DESC_REPLY, - OFPUTIL_OFPST_FLOW_REPLY, - OFPUTIL_OFPST_QUEUE_REPLY, - OFPUTIL_OFPST_PORT_REPLY, - OFPUTIL_OFPST_TABLE_REPLY, - OFPUTIL_OFPST_AGGREGATE_REPLY, - OFPUTIL_OFPST_PORT_DESC_REPLY, - - /* NXT_* messages. */ - OFPUTIL_NXT_ROLE_REQUEST, - OFPUTIL_NXT_ROLE_REPLY, - OFPUTIL_NXT_SET_FLOW_FORMAT, - OFPUTIL_NXT_FLOW_MOD_TABLE_ID, - OFPUTIL_NXT_FLOW_MOD, - OFPUTIL_NXT_FLOW_REMOVED, - OFPUTIL_NXT_SET_PACKET_IN_FORMAT, - OFPUTIL_NXT_PACKET_IN, - OFPUTIL_NXT_FLOW_AGE, - OFPUTIL_NXT_SET_ASYNC_CONFIG, - OFPUTIL_NXT_SET_CONTROLLER_ID, - OFPUTIL_NXT_FLOW_MONITOR_CANCEL, - OFPUTIL_NXT_FLOW_MONITOR_PAUSED, - OFPUTIL_NXT_FLOW_MONITOR_RESUMED, - - /* NXST_* stat requests. */ - OFPUTIL_NXST_FLOW_REQUEST, - OFPUTIL_NXST_AGGREGATE_REQUEST, - OFPUTIL_NXST_FLOW_MONITOR_REQUEST, - - /* NXST_* stat replies. */ - OFPUTIL_NXST_FLOW_REPLY, - OFPUTIL_NXST_AGGREGATE_REPLY, - OFPUTIL_NXST_FLOW_MONITOR_REPLY, -}; - -struct ofputil_msg_type; -enum ofperr ofputil_decode_msg_type(const struct ofp_header *, - const struct ofputil_msg_type **); -enum ofperr ofputil_decode_msg_type_partial(const struct ofp_header *, - size_t length, - const struct ofputil_msg_type **); -enum ofputil_msg_code ofputil_msg_type_code(const struct ofputil_msg_type *); -const char *ofputil_msg_type_name(const struct ofputil_msg_type *); - /* Port numbers. */ enum ofperr ofputil_port_from_ofp11(ovs_be32 ofp11_port, uint16_t *ofp10_port); ovs_be32 ofputil_port_to_ofp11(uint16_t ofp10_port); @@ -147,6 +68,9 @@ enum ofputil_protocol { OFPUTIL_P_NXM_TID = 1 << 3, /* NXM + flow_mod_table_id extension. */ #define OFPUTIL_P_NXM_ANY (OFPUTIL_P_NXM | OFPUTIL_P_NXM_TID) + /* OpenFlow 1.2 */ + OFPUTIL_P_OF12 = 1 << 4, /* OpenFlow 1.2 flow format. */ + /* All protocols. */ #define OFPUTIL_P_ANY (OFPUTIL_P_OF10_ANY | OFPUTIL_P_NXM_ANY) @@ -158,8 +82,9 @@ enum ofputil_protocol { extern enum ofputil_protocol ofputil_flow_dump_protocols[]; extern size_t ofputil_n_flow_dump_protocols; -enum ofputil_protocol ofputil_protocol_from_ofp_version(int version); -uint8_t ofputil_protocol_to_ofp_version(enum ofputil_protocol); +enum ofputil_protocol +ofputil_protocol_from_ofp_version(enum ofp_version version); +enum ofp_version ofputil_protocol_to_ofp_version(enum ofputil_protocol); bool ofputil_protocol_is_valid(enum ofputil_protocol); enum ofputil_protocol ofputil_protocol_set_tid(enum ofputil_protocol, @@ -193,6 +118,8 @@ void ofputil_cls_rule_to_ofp10_match(const struct cls_rule *, struct ofp10_match *); /* Work with ofp11_match. */ +enum ofperr ofputil_pull_ofp11_match(struct ofpbuf *, unsigned int priority, + struct cls_rule *); enum ofperr ofputil_cls_rule_from_ofp11_match(const struct ofp11_match *, unsigned int priority, struct cls_rule *); @@ -306,7 +233,10 @@ struct ofputil_aggregate_stats { struct ofpbuf *ofputil_encode_aggregate_stats_reply( const struct ofputil_aggregate_stats *stats, - const struct ofp_stats_msg *request); + const struct ofp_header *request); +enum ofperr ofputil_decode_aggregate_stats_reply( + struct ofputil_aggregate_stats *, + const struct ofp_header *reply); /* Flow removed message, independent of protocol. */ struct ofputil_flow_removed { @@ -365,7 +295,7 @@ struct ofputil_packet_out { }; enum ofperr ofputil_decode_packet_out(struct ofputil_packet_out *, - const struct ofp_packet_out *, + const struct ofp_header *, struct ofpbuf *ofpacts); struct ofpbuf *ofputil_encode_packet_out(const struct ofputil_packet_out *); @@ -416,19 +346,24 @@ struct ofputil_phy_port { }; enum ofputil_capabilities { - /* OpenFlow 1.0 and 1.1 share these values for these capabilities. */ + /* OpenFlow 1.0, 1.1 and 1.2 share these values for these capabilities. */ OFPUTIL_C_FLOW_STATS = 1 << 0, /* Flow statistics. */ OFPUTIL_C_TABLE_STATS = 1 << 1, /* Table statistics. */ OFPUTIL_C_PORT_STATS = 1 << 2, /* Port statistics. */ OFPUTIL_C_IP_REASM = 1 << 5, /* Can reassemble IP fragments. */ OFPUTIL_C_QUEUE_STATS = 1 << 6, /* Queue statistics. */ + + /* OpenFlow 1.0 and 1.1 share this capability. */ OFPUTIL_C_ARP_MATCH_IP = 1 << 7, /* Match IP addresses in ARP pkts. */ /* OpenFlow 1.0 only. */ OFPUTIL_C_STP = 1 << 3, /* 802.1d spanning tree. */ - /* OpenFlow 1.1 only. */ + /* OpenFlow 1.1 and 1.2 share this capability. */ OFPUTIL_C_GROUP_STATS = 1 << 4, /* Group statistics. */ + + /* OpenFlow 1.2 only */ + OFPUTIL_C_PORT_BLOCKED = 1 << 8, /* Switch will block looping ports */ }; enum ofputil_action_bitmap { @@ -470,7 +405,7 @@ struct ofputil_switch_features { enum ofputil_action_bitmap actions; }; -enum ofperr ofputil_decode_switch_features(const struct ofp_switch_features *, +enum ofperr ofputil_decode_switch_features(const struct ofp_header *, struct ofputil_switch_features *, struct ofpbuf *); @@ -482,7 +417,7 @@ void ofputil_put_switch_features_port(const struct ofputil_phy_port *, bool ofputil_switch_features_ports_trunc(struct ofpbuf *b); /* phy_port helper functions. */ -int ofputil_pull_phy_port(uint8_t ofp_version, struct ofpbuf *, +int ofputil_pull_phy_port(enum ofp_version ofp_version, struct ofpbuf *, struct ofputil_phy_port *); size_t ofputil_count_phy_ports(uint8_t ofp_version, struct ofpbuf *); @@ -492,7 +427,7 @@ struct ofputil_port_status { struct ofputil_phy_port desc; }; -enum ofperr ofputil_decode_port_status(const struct ofp_port_status *, +enum ofperr ofputil_decode_port_status(const struct ofp_header *, struct ofputil_port_status *); struct ofpbuf *ofputil_encode_port_status(const struct ofputil_port_status *, enum ofputil_protocol); @@ -553,56 +488,16 @@ void ofputil_append_flow_update(const struct ofputil_flow_update *, uint32_t ofputil_decode_flow_monitor_cancel(const struct ofp_header *); struct ofpbuf *ofputil_encode_flow_monitor_cancel(uint32_t id); -/* OpenFlow protocol utility functions. */ -void *make_openflow(size_t openflow_len, uint8_t type, struct ofpbuf **); -void *make_nxmsg(size_t openflow_len, uint32_t subtype, struct ofpbuf **); - -void *make_openflow_xid(size_t openflow_len, uint8_t type, - ovs_be32 xid, struct ofpbuf **); -void *make_nxmsg_xid(size_t openflow_len, uint32_t subtype, ovs_be32 xid, - struct ofpbuf **); - -void *put_openflow(size_t openflow_len, uint8_t type, struct ofpbuf *); -void *put_openflow_xid(size_t openflow_len, uint8_t type, ovs_be32 xid, - struct ofpbuf *); - -void *put_nxmsg(size_t openflow_len, uint32_t subtype, struct ofpbuf *); -void *put_nxmsg_xid(size_t openflow_len, uint32_t subtype, ovs_be32 xid, - struct ofpbuf *); - -void update_openflow_length(struct ofpbuf *); - -void *ofputil_make_stats_request(size_t openflow_len, uint16_t type, - uint32_t subtype, struct ofpbuf **); -void *ofputil_make_stats_reply(size_t openflow_len, - const struct ofp_stats_msg *request, - struct ofpbuf **); - -void ofputil_put_stats_header(ovs_be32 xid, uint8_t ofp_type, - ovs_be16 ofpst_type, ovs_be32 nxst_subtype, - struct ofpbuf *); - -void ofputil_start_stats_reply(const struct ofp_stats_msg *request, - struct list *); -struct ofpbuf *ofputil_reserve_stats_reply(size_t len, struct list *); -void *ofputil_append_stats_reply(size_t len, struct list *); -void ofputil_postappend_stats_reply(size_t start_ofs, struct list *); - -void ofputil_append_port_desc_stats_reply(uint8_t ofp_version, +/* Encoding OpenFlow stats messages. */ +void ofputil_append_port_desc_stats_reply(enum ofp_version ofp_version, const struct ofputil_phy_port *pp, struct list *replies); -const void *ofputil_stats_body(const struct ofp_header *); -size_t ofputil_stats_body_len(const struct ofp_header *); - -const void *ofputil_nxstats_body(const struct ofp_header *); -size_t ofputil_nxstats_body_len(const struct ofp_header *); - -/* */ +/* Encoding simple OpenFlow messages. */ struct ofpbuf *make_echo_request(void); struct ofpbuf *make_echo_reply(const struct ofp_header *rq); -struct ofpbuf *ofputil_encode_barrier_request(void); +struct ofpbuf *ofputil_encode_barrier_request(enum ofp_version); const char *ofputil_frag_handling_to_string(enum ofp_config_flags); bool ofputil_frag_handling_from_string(const char *, enum ofp_config_flags *);