- struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
- ofp_port_t port;
- enum ofperr error;
-
- error = ofputil_decode_queue_get_config_request(oh, &port);
- if (error) {
- return error;
- }
-
- struct ofpbuf *reply = ofputil_encode_queue_get_config_reply(oh);
- struct ofport *ofport;
- if (port == OFPP_ANY) {
- HMAP_FOR_EACH (ofport, hmap_node, &ofproto->ports) {
- put_queue_config(ofport, reply);
- }
- } else {
- ofport = ofproto_get_port(ofproto, port);
- if (!ofport) {
- ofpbuf_delete(reply);
- return OFPERR_OFPQOFC_BAD_PORT;
- }
- put_queue_config(ofport, reply);
- }
- ofconn_send_reply(ofconn, reply);
-
- return 0;
+ struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
+ struct ovs_list replies;
+ struct ofport *port;
+ ofp_port_t req_port;
+ uint32_t req_queue;
+ enum ofperr error;
+
+ error = ofputil_decode_queue_get_config_request(oh, &req_port, &req_queue);
+ if (error) {
+ return error;
+ }
+
+ ofputil_start_queue_get_config_reply(oh, &replies);
+ if (req_port == OFPP_ANY) {
+ error = OFPERR_OFPQOFC_BAD_QUEUE;
+ HMAP_FOR_EACH (port, hmap_node, &ofproto->ports) {
+ if (!handle_queue_get_config_request_for_port(port, req_queue,
+ &replies)) {
+ error = 0;
+ }
+ }
+ } else {
+ port = ofproto_get_port(ofproto, req_port);
+ error = (port
+ ? handle_queue_get_config_request_for_port(port, req_queue,
+ &replies)
+ : OFPERR_OFPQOFC_BAD_PORT);
+ }
+ if (!error) {
+ ofconn_send_replies(ofconn, &replies);
+ } else {
+ ofpbuf_list_delete(&replies);
+ }
+
+ return error;