X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofp-parse.c;h=e352bd436334b823fac85dfbe97efb3419ab4913;hb=973d7411d62e848a2b9b0175ba7bb6234efdbff3;hp=89620a61a93aa98700c0ddb0aefec1ed32117314;hpb=a877206f2f0ca10c625e311614d68a81bdc913ee;p=openvswitch diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c index 89620a61..e352bd43 100644 --- a/lib/ofp-parse.c +++ b/lib/ofp-parse.c @@ -316,6 +316,27 @@ parse_port_name(const char *name, uint16_t *port) return false; } +static void +parse_output(struct ofpbuf *b, char *arg) +{ + if (strchr(arg, '[')) { + struct nx_action_output_reg *naor; + int ofs, n_bits; + uint32_t src; + + nxm_parse_field_bits(arg, &src, &ofs, &n_bits); + + naor = put_action(b, sizeof *naor, OFPAT_VENDOR); + naor->vendor = htonl(NX_VENDOR_ID); + naor->subtype = htons(NXAST_OUTPUT_REG); + naor->ofs_nbits = nxm_encode_ofs_nbits(ofs, n_bits); + naor->src = htonl(src); + naor->max_len = htons(UINT16_MAX); + } else { + put_output_action(b, str_to_u32(arg)); + } +} + static void parse_resubmit(struct nx_action_resubmit *nar, char *arg) { @@ -541,7 +562,7 @@ str_to_action(char *str, struct ofpbuf *b) } else if (!strcasecmp(act, "bundle_load")) { bundle_parse_load(b, arg); } else if (!strcasecmp(act, "output")) { - put_output_action(b, str_to_u32(arg)); + parse_output(b, arg); } else if (!strcasecmp(act, "enqueue")) { char *sp = NULL; char *port_s = strtok_r(arg, ":q", &sp);