> On Aug 27, 2015, at 11:21 PM, Alex Wang <ee07b...@gmail.com> wrote: > > > +/* Searches the 'chassis_rec->encaps' for the first vtep tunnel > + * configuration, returns the 'ip'. */ > +static const char * > +get_chassis_vtep_ip(const struct sbrec_chassis *chassis_rec)
It might be nice to indicate to the caller the length of time the returned value can be used, since they don't own the string. > +/* Creates a new 'Physical_Locator'. */ > +static struct vteprec_physical_locator * > +create_pl(struct ovsdb_idl_txn *vtep_idl_txn, const char *chassis_ip) > +{ > + struct vteprec_physical_locator *new_pl; > + > + new_pl = vteprec_physical_locator_insert(vtep_idl_txn); > + vteprec_physical_locator_set_dst_ip(new_pl, chassis_ip); > + vteprec_physical_locator_set_encapsulation_type(new_pl, VTEP_ENCAP_TYPE); We're looking at adding IPv6 tunnel support into OVS. It might be nice to to called this definition VTEPv4_ENCAP_TYPE or something similar. > + SHASH_FOR_EACH (node, vtep_lswitches) { > + struct ls_hash_node *ls_node = xmalloc(sizeof *ls_node); > + > + ls_node->vtep_ls = node->data; > + shash_init(&ls_node->added_macs); > + hmap_insert(&ls_map, &ls_node->hmap_node, > + hash_uint64((uint64_t) ls_node->vtep_ls->tunnel_key[0])); Can't "ls_node->vtep_ls->tunnel_key" be NULL? > > + SHASH_FOR_EACH (node, other_pbs) { > + const struct sbrec_port_binding *port_binding_rec = node->data; > + const struct sbrec_chassis *chassis_rec; > + struct ls_hash_node *ls_node; > + const char *chassis_ip; > + int64_t tnl_key; > + size_t i; > + > + chassis_rec = port_binding_rec->chassis; > + if (!chassis_rec) { > + continue; > + } > + > + tnl_key = port_binding_rec->datapath->tunnel_key; > + HMAP_FOR_EACH_WITH_HASH (ls_node, hmap_node, > + hash_uint64((uint64_t) tnl_key), > + &ls_map) { > + if (ls_node->vtep_ls->tunnel_key[0] == tnl_key) { Once again, can't this result in a NULL comparison? > + /* If finds the 'umr' entry for the mac and ip, deletes the > + * entry from shash so that it is not gargage collected. > + * > + * If not found, creates a new 'umr' entry. > + * > + * If vtep logical switch does not match, the logical port > + * owning the MAC may be moved to a new ovn logical datapath. Couldn't they also just have overlapping addresses? > + /* Collects 'Ucast_Macs_Remote's. */ > + VTEPREC_UCAST_MACS_REMOTE_FOR_EACH (umr, ctx->vtep_idl) { > + char *mac_ip = > + xasprintf("%s%s", umr->MAC, > + umr->locator ? umr->locator->dst_ip : ""); > + > + shash_add(&ucast_macs_rmts, mac_ip, umr); > + free(mac_ip); > + } Based on how this is used in vtep_macs_run(), don't you need to account for overlapping MAC addresses? I'd think you'd also need to take into account the logical switch tunnel key to help disambiguate that case. > + struct shash vtep_pbs = SHASH_INITIALIZER(&vtep_pbs); > + struct shash other_pbs = SHASH_INITIALIZER(&other_pbs); I think "non_vtep_pbs" or something similar may be a helpful name. Later in the code, it becomes unclear what these are "other" from. > + /* Collects 'Ucast_Macs_Remote's. */ > + VTEPREC_UCAST_MACS_REMOTE_FOR_EACH (umr, ctx->vtep_idl) { > + char *mac_ip = > + xasprintf("%s%s", umr->MAC, > + umr->locator ? umr->locator->dst_ip : ""); xxx Surprised there's no delimiter. > + shash_destroy(&vtep_lswitches); > + shash_destroy(&ucast_macs_rmts); > + shash_destroy(&physical_locators); > + shash_destroy(&vtep_pbs); > + shash_destroy(&other_pbs); I think you're missing a sset_destroy(&vtep_pswitches). Acked-by: Justin Pettit <jpet...@nicira.com> --Justin _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev