+ } else if (!strcasecmp(act, "set_tunnel")
+ || !strcasecmp(act, "set_tunnel64")) {
+ uint64_t tun_id = str_to_u64(arg);
+ if (!strcasecmp(act, "set_tunnel64") || tun_id > UINT32_MAX) {
+ struct nx_action_set_tunnel64 *nast64;
+ nast64 = put_action(b, sizeof *nast64, OFPAT_VENDOR);
+ nast64->vendor = htonl(NX_VENDOR_ID);
+ nast64->subtype = htons(NXAST_SET_TUNNEL64);
+ nast64->tun_id = htonll(tun_id);
+ } else {
+ struct nx_action_set_tunnel *nast;
+ nast = put_action(b, sizeof *nast, OFPAT_VENDOR);
+ nast->vendor = htonl(NX_VENDOR_ID);
+ nast->subtype = htons(NXAST_SET_TUNNEL);
+ nast->tun_id = htonl(tun_id);
+ }
+ } else if (!strcasecmp(act, "drop_spoofed_arp")) {
+ struct nx_action_header *nah;
+ nah = put_action(b, sizeof *nah, OFPAT_VENDOR);
+ nah->vendor = htonl(NX_VENDOR_ID);
+ nah->subtype = htons(NXAST_DROP_SPOOFED_ARP);
+ } else if (!strcasecmp(act, "set_queue")) {
+ struct nx_action_set_queue *nasq;
+ nasq = put_action(b, sizeof *nasq, OFPAT_VENDOR);
+ nasq->vendor = htonl(NX_VENDOR_ID);
+ nasq->subtype = htons(NXAST_SET_QUEUE);
+ nasq->queue_id = htonl(str_to_u32(arg));
+ } else if (!strcasecmp(act, "pop_queue")) {
+ struct nx_action_header *nah;
+ nah = put_action(b, sizeof *nah, OFPAT_VENDOR);
+ nah->vendor = htonl(NX_VENDOR_ID);
+ nah->subtype = htons(NXAST_POP_QUEUE);
+ } else if (!strcasecmp(act, "note")) {
+ size_t start_ofs = b->size;
+ struct nx_action_note *nan;
+ int remainder;
+ size_t len;
+
+ nan = put_action(b, sizeof *nan, OFPAT_VENDOR);
+ nan->vendor = htonl(NX_VENDOR_ID);
+ nan->subtype = htons(NXAST_NOTE);
+
+ b->size -= sizeof nan->note;
+ while (arg && *arg != '\0') {
+ uint8_t byte;
+ bool ok;
+
+ if (*arg == '.') {
+ arg++;
+ }
+ if (*arg == '\0') {
+ break;
+ }
+
+ byte = hexits_value(arg, 2, &ok);
+ if (!ok) {
+ ovs_fatal(0, "bad hex digit in `note' argument");
+ }
+ ofpbuf_put(b, &byte, 1);
+
+ arg += 2;
+ }
+
+ len = b->size - start_ofs;
+ remainder = len % OFP_ACTION_ALIGN;
+ if (remainder) {
+ ofpbuf_put_zeros(b, OFP_ACTION_ALIGN - remainder);
+ }
+ nan->len = htons(b->size - start_ofs);
+ } else if (!strcasecmp(act, "move")) {
+ struct nx_action_reg_move *move;
+ move = ofpbuf_put_uninit(b, sizeof *move);
+ nxm_parse_reg_move(move, arg);
+ } else if (!strcasecmp(act, "load")) {
+ struct nx_action_reg_load *load;
+ load = ofpbuf_put_uninit(b, sizeof *load);
+ nxm_parse_reg_load(load, arg);
+ } else if (!strcasecmp(act, "multipath")) {
+ struct nx_action_multipath *nam;
+ nam = ofpbuf_put_uninit(b, sizeof *nam);
+ multipath_parse(nam, arg);