static ofp_port_t execute_hrw(const struct ofpact_bundle *bundle, const struct flow *flow, struct flow_wildcards *wc, bool (*slave_enabled)(ofp_port_t ofp_port, void *aux), void *aux) { uint32_t flow_hash, best_hash; int best, i; if (bundle->n_slaves > 1) { flow_mask_hash_fields(flow, wc, bundle->fields); } flow_hash = flow_hash_fields(flow, bundle->fields, bundle->basis); best = -1; best_hash = 0; for (i = 0; i < bundle->n_slaves; i++) { if (slave_enabled(bundle->slaves[i], aux)) { uint32_t hash = hash_2words(i, flow_hash); if (best < 0 || hash > best_hash) { best_hash = hash; best = i; } } } return best >= 0 ? bundle->slaves[best] : OFPP_NONE; }
/* Executes 'mp' based on the current contents of 'flow', writing the results * back into 'flow'. Sets fields in 'wc' that were used to calculate * the result. */ void multipath_execute(const struct ofpact_multipath *mp, struct flow *flow, struct flow_wildcards *wc) { /* Calculate value to store. */ uint32_t hash = flow_hash_fields(flow, mp->fields, mp->basis); uint16_t link = multipath_algorithm(hash, mp->algorithm, mp->max_link + 1, mp->arg); flow_mask_hash_fields(flow, wc, mp->fields); nxm_reg_load(&mp->dst, link, flow, wc); }
void multipath_execute(const struct nx_action_multipath *mp, struct flow *flow) { /* Calculate value to store. */ uint32_t hash = flow_hash_fields(flow, ntohs(mp->fields), ntohs(mp->basis)); uint16_t link = multipath_algorithm(hash, ntohs(mp->algorithm), ntohs(mp->max_link) + 1, ntohl(mp->arg)); struct mf_subfield dst; nxm_decode(&dst, mp->dst, mp->ofs_nbits); mf_set_subfield_value(&dst, link, flow); }
static uint16_t execute_hrw(const struct nx_action_bundle *nab, const struct flow *flow, bool (*slave_enabled)(uint16_t ofp_port, void *aux), void *aux) { uint32_t flow_hash, best_hash; int best, i; flow_hash = flow_hash_fields(flow, ntohs(nab->fields), ntohs(nab->basis)); best = -1; best_hash = 0; for (i = 0; i < ntohs(nab->n_slaves); i++) { if (slave_enabled(bundle_get_slave(nab, i), aux)) { uint32_t hash = hash_2words(i, flow_hash); if (best < 0 || hash > best_hash) { best_hash = hash; best = i; } } } return best >= 0 ? bundle_get_slave(nab, best) : OFPP_NONE; }