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 = ofputil_put_NXAST_OUTPUT_REG(b); 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)); } }
/* Helper for bundle_parse and bundle_parse_load. */ static void bundle_parse__(struct ofpbuf *b, const char *s, char **save_ptr, const char *fields, const char *basis, const char *algorithm, const char *slave_type, const char *dst, const char *slave_delim) { enum ofputil_action_code code; struct nx_action_bundle *nab; uint16_t n_slaves; if (!slave_delim) { ovs_fatal(0, "%s: not enough arguments to bundle action", s); } if (strcasecmp(slave_delim, "slaves")) { ovs_fatal(0, "%s: missing slave delimiter, expected `slaves' got `%s'", s, slave_delim); } code = dst ? OFPUTIL_NXAST_BUNDLE_LOAD : OFPUTIL_NXAST_BUNDLE; b->l2 = ofputil_put_action(code, b); n_slaves = 0; for (;;) { ovs_be16 slave_be; char *slave; slave = strtok_r(NULL, ", ", save_ptr); if (!slave || n_slaves >= BUNDLE_MAX_SLAVES) { break; } slave_be = htons(atoi(slave)); ofpbuf_put(b, &slave_be, sizeof slave_be); n_slaves++; } /* Slaves array must be multiple of 8 bytes long. */ if (b->size % 8) { ofpbuf_put_zeros(b, 8 - (b->size % 8)); } nab = b->l2; nab->len = htons(b->size - ((char *) b->l2 - (char *) b->data)); nab->n_slaves = htons(n_slaves); nab->basis = htons(atoi(basis)); if (!strcasecmp(fields, "eth_src")) { nab->fields = htons(NX_HASH_FIELDS_ETH_SRC); } else if (!strcasecmp(fields, "symmetric_l4")) { nab->fields = htons(NX_HASH_FIELDS_SYMMETRIC_L4); } else { ovs_fatal(0, "%s: unknown fields `%s'", s, fields); } if (!strcasecmp(algorithm, "active_backup")) { nab->algorithm = htons(NX_BD_ALG_ACTIVE_BACKUP); } else if (!strcasecmp(algorithm, "hrw")) { nab->algorithm = htons(NX_BD_ALG_HRW); } else { ovs_fatal(0, "%s: unknown algorithm `%s'", s, algorithm); } if (!strcasecmp(slave_type, "ofport")) { nab->slave_type = htonl(NXM_OF_IN_PORT); } else { ovs_fatal(0, "%s: unknown slave_type `%s'", s, slave_type); } if (dst) { uint32_t reg; int ofs, n_bits; nxm_parse_field_bits(dst, ®, &ofs, &n_bits); nab->dst = htonl(reg); nab->ofs_nbits = nxm_encode_ofs_nbits(ofs, n_bits); } b->l2 = NULL; }