- union ofp_action action;
-
- action.type = htons(OFPAT_OUTPUT);
- action.output.len = htons(sizeof action);
- action.output.port = htons(OFPP_NORMAL);
- action.output.max_len = htons(0);
- ofproto_add_flow(ib->ofproto, rule, &action, 1);
+ struct {
+ struct nx_action_set_queue nxsq;
+ struct ofp_action_output oao;
+ } actions;
+
+ memset(&actions, 0, sizeof actions);
+
+ actions.oao.type = htons(OFPAT_OUTPUT);
+ actions.oao.len = htons(sizeof actions.oao);
+ actions.oao.port = htons(OFPP_NORMAL);
+ actions.oao.max_len = htons(0);
+
+ if (ib->queue_id < 0) {
+ ofproto_add_flow(ib->ofproto, rule,
+ (union ofp_action *) &actions.oao, 1);
+ } else {
+ actions.nxsq.type = htons(OFPAT_VENDOR);
+ actions.nxsq.len = htons(sizeof actions.nxsq);
+ actions.nxsq.vendor = htonl(NX_VENDOR_ID);
+ actions.nxsq.subtype = htons(NXAST_SET_QUEUE);
+ actions.nxsq.queue_id = htonl(ib->queue_id);
+
+ ofproto_add_flow(ib->ofproto, rule, (union ofp_action *) &actions,
+ sizeof actions / sizeof(union ofp_action));
+ }