Thanks for reviewing I’m sending a V2
On 3/3/16, 1:55 PM, "dev on behalf of Guru Shetty" <dev-boun...@openvswitch.org on behalf of g...@ovn.org> wrote: >On 12 February 2016 at 17:12, Darrell Ball <dlu...@gmail.com> wrote: > >> Signed-off-by: Darrell Ball <db...@vmware.com> >> --- >> AUTHORS | 1 + >> ovn/controller-vtep/vtep.c | 207 >> ++++++++++++++++++++++++++++++++++++++++----- >> 2 files changed, 186 insertions(+), 22 deletions(-) >> >> diff --git a/AUTHORS b/AUTHORS >> index 5c3643a..b709482 100644 >> --- a/AUTHORS >> +++ b/AUTHORS >> @@ -417,6 +417,7 @@ rahim entezari rahim.entez...@gmail.com >> 胡靖飞 hujingfei...@msn.com >> 张伟 zhang...@126.com >> 张强 zhangqi...@meizu.com >> +darrell ball dlu...@gmail.com > > >I think you have added your name to the wring list. The list is also >alphabetically ordered. So please add it at the right place. Thanks; Russell pointed this out as well > > > >--snip-- > >> >> >> + } >> + free(locators); >> +} >> + >> /* Updates the vtep Logical_Switch table entries' tunnel keys based >> * on the port bindings. */ >> > >You will have to update the comment above. Done > > >> static void >> @@ -153,12 +255,15 @@ vtep_lswitch_run(struct shash *vtep_pbs, struct sset >> *vtep_pswitches, >> * bindings. */ >> > > > > >> static void >> vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, struct shash >> *ucast_macs_rmts, >> - struct shash *physical_locators, struct shash >> *vtep_lswitches, >> - struct shash *non_vtep_pbs) >> + struct shash *mcast_macs_rmts, struct shash >> *physical_locators, >> + struct shash *vtep_lswitches, struct shash *non_vtep_pbs) >> { >> struct shash_node *node; >> struct hmap ls_map; >> >> + struct vtep_rec_physical_locator_list_entry *ploc_entry; >> + const struct vteprec_physical_locator *pl; >> + >> /* Maps from ovn logical datapath tunnel key (which is also the vtep >> * logical switch tunnel key) to the corresponding vtep logical switch >> * instance. Also, the shash map 'added_macs' is used for checking >> @@ -168,6 +273,9 @@ vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, >> struct shash *ucast_macs_rmts, >> >> >The structure has some comments about added_macs above. Consider adding for >the new ones too. Sure; I added comments > >> const struct vteprec_logical_switch *vtep_ls; >> struct shash added_macs; >> + >> + struct ovs_list locators_list; >> + struct mmr_hash_node_data *mmr_ext; >> }; >> >> hmap_init(&ls_map); >> @@ -181,6 +289,8 @@ vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, >> struct shash *ucast_macs_rmts, >> ls_node = xmalloc(sizeof *ls_node); >> ls_node->vtep_ls = vtep_ls; >> shash_init(&ls_node->added_macs); >> + list_init(&ls_node->locators_list); >> + ls_node->mmr_ext = NULL; >> hmap_insert(&ls_map, &ls_node->hmap_node, >> hash_uint64((uint64_t) vtep_ls->tunnel_key[0])); >> } >> @@ -222,18 +332,31 @@ vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, >> struct shash *ucast_macs_rmts, >> continue; >> } >> >> + pl = shash_find_data(physical_locators, chassis_ip); >> + if(!pl){ >> + pl = create_pl(vtep_idl_txn, chassis_ip); >> + shash_add(physical_locators, chassis_ip, pl); >> + } >> + >> + char *mac_tnlkey = >> + xasprintf("%s_%"PRId64, "unknown-dst", tnl_key); >> + ls_node->mmr_ext = >> + shash_find_data(mcast_macs_rmts, mac_tnlkey); >> > > >Please add a comment below on why we delete the shash node. There is a >similar comment for >shash_find_and_delete(ucast_macs_rmts, mac_ip_tnlkey) and I think it is >useful while reading code. I had already added a comment regarding cleaning up stale MMRs for the hash table; I can duplicate it here to make it more obvious > > >> + if(ls_node->mmr_ext && >> + ls_node->mmr_ext->mmr->logical_switch == ls_node->vtep_ls) { >> + shash_find_and_delete(mcast_macs_rmts, mac_tnlkey); >> + } >> + free(mac_tnlkey); >> + ploc_entry = xmalloc(sizeof *ploc_entry); >> + ploc_entry->vteprec_ploc = pl; >> + list_push_back(&ls_node->locators_list, >> + &ploc_entry->locators_node); >> + >> >Are we inserting duplicate physical_locators above to the list? Is that >Okay? It looked like update_mmr was adding a record for even the duplicate >ones. Yes, its needs a check; back in Dec, I had some some misconceptions regarding OVN; thanks > > > >> for (i = 0; i < port_binding_rec->n_mac; i++) { >> const struct vteprec_ucast_macs_remote *umr; >> - const struct vteprec_physical_locator *pl; >> const struct sbrec_port_binding *conflict; >> char *mac = port_binding_rec->mac[i]; >> >> - /* xxx Need to address this later when we support >> - * update of 'Mcast_Macs_Remote' table in VTEP. */ >> - if (!strcmp(mac, "unknown")) { >> - continue; >> - } >> - >> >The above piece of code that is being removed is for cases wherein we don't >know the mac addresses of logical ports that reside in a hypervisor. Can >they still be pinged via VTEP emulator? I wonder whether VTEP emulator, >since it does not know this mac address, handle the case properly? The name was changed to unknown-dst in the vtep schema and its covered by this patch > > > >> /* Checks for duplicate MAC in the same vtep logical switch. >> */ >> conflict = shash_find_data(&ls_node->added_macs, mac); >> if (conflict) { >> @@ -257,19 +380,8 @@ vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, >> struct shash *ucast_macs_rmts, >> shash_find_and_delete(ucast_macs_rmts, mac_ip_tnlkey); >> } else { >> const struct vteprec_ucast_macs_remote *new_umr; >> - >> new_umr = create_umr(vtep_idl_txn, mac, ls_node->vtep_ls); >> - pl = shash_find_data(physical_locators, chassis_ip); >> - if (pl) { >> - vteprec_ucast_macs_remote_set_locator(new_umr, pl); >> - } else { >> - const struct vteprec_physical_locator *new_pl; >> - >> - new_pl = create_pl(vtep_idl_txn, chassis_ip); >> - vteprec_ucast_macs_remote_set_locator(new_umr, >> new_pl); >> - /* Updates the 'physical_locators'. */ >> - shash_add(physical_locators, chassis_ip, new_pl); >> - } >> + vteprec_ucast_macs_remote_set_locator(new_umr, pl); >> } >> free(mac_ip_tnlkey); >> } >> @@ -281,11 +393,25 @@ vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, >> struct shash *ucast_macs_rmts, >> } >> struct ls_hash_node *iter, *next; >> HMAP_FOR_EACH_SAFE (iter, next, hmap_node, &ls_map) { >> + vtep_update_mmr(vtep_idl_txn,&iter->locators_list, >> + iter->vtep_ls, iter->mmr_ext); >> + LIST_FOR_EACH_POP(ploc_entry,locators_node, >> + &iter->locators_list) { >> + free(ploc_entry); >> + } >> hmap_remove(&ls_map, &iter->hmap_node); >> shash_destroy(&iter->added_macs); >> free(iter); >> } >> hmap_destroy(&ls_map); >> + /* Clean stale MMRs */ >> + struct mmr_hash_node_data *mmr_ext; >> + SHASH_FOR_EACH (node, mcast_macs_rmts) { >> + mmr_ext = node->data; >> + shash_destroy(&mmr_ext->physical_locators); >> + vteprec_mcast_macs_remote_delete(mmr_ext->mmr); >> + free(mmr_ext); >> + } >> > >The above looks to do a proper cleanup of mmr_ext that still exists in >shash. It looks like for the ones that were deleted from shash with >'shash_find_and_delete()', its memory is not cleaned up, right? The new code using shash_find_and_delete() for mcast_macs_rmts is correct. I added a big comment there. However, I did review the patch again and found the cleanup above is not exactly correct. This cleanup above was meant only for the VTEP DB entries; the physical_locators hash and mmr_ext cleanups belong at the end of vtep_run(). I split out the code accordingly. > >vtep_macs_cleanup() needs comment update. updated > >For the rest of the code, there is some CodingStyle violations. I think the >following is the usual practice. Thanks; hopefully I updated most of these space and parentheses issues > >iff --git a/ovn/controller-vtep/vtep.c b/ovn/controller-vtep/vtep.c >index 04251c4..29c4192 100644 >--- a/ovn/controller-vtep/vtep.c >+++ b/ovn/controller-vtep/vtep.c >@@ -30,7 +30,7 @@ > > VLOG_DEFINE_THIS_MODULE(vtep); > >-struct vtep_rec_physical_locator_list_entry{ >+struct vtep_rec_physical_locator_list_entry { > struct ovs_list locators_node; > const struct vteprec_physical_locator *vteprec_ploc; > }; >@@ -106,17 +106,16 @@ vtep_create_mmr(struct ovsdb_idl_txn *vtep_idl_txn, > > vteprec_mcast_macs_remote_set_MAC(new_mmr, mac); > vteprec_mcast_macs_remote_set_logical_switch(new_mmr, vtep_ls); >- vteprec_mcast_macs_remote_set_locator_set(new_mmr,ploc_set); >+ vteprec_mcast_macs_remote_set_locator_set(new_mmr, ploc_set); > } > > /* Compares prev and new mmr locator sets and return true if they > * differ; false otherwise; also preps new locator set > * for database write */ > static bool >-vtep_process_pls( >- const struct ovs_list *locators_list, >- const struct mmr_hash_node_data *mmr_ext, >- struct vteprec_physical_locator **locators) >+vtep_process_pls(const struct ovs_list *locators_list, >+ const struct mmr_hash_node_data *mmr_ext, >+ struct vteprec_physical_locator **locators) > { > int i; > size_t n_locators_prev = 0; >@@ -125,22 +124,22 @@ vtep_process_pls( > const struct vteprec_physical_locator *pl = NULL; > bool prev_and_new_locator_lists_differ = false; > >- if(mmr_ext) { >+ if (mmr_ext) { > n_locators_prev = mmr_ext->mmr->locator_set->n_locators; > } >- if(n_locators_prev != n_locators_new) { >+ if (n_locators_prev != n_locators_new) { > prev_and_new_locator_lists_differ = true; > } > >- if(n_locators_new) { >+ if (n_locators_new) { > i = 0; > LIST_FOR_EACH (ploc_entry, locators_node, locators_list) { > locators[i] = (struct vteprec_physical_locator *) > ploc_entry->vteprec_ploc; >- if(mmr_ext) { >+ if (mmr_ext) { > pl = shash_find_data(&mmr_ext->physical_locators, > locators[i]->dst_ip); >- if(!pl) { >+ if (!pl) { > prev_and_new_locator_lists_differ = true; > } > } >@@ -148,7 +147,7 @@ vtep_process_pls( > } > } > >- return(prev_and_new_locator_lists_differ); >+ return prev_and_new_locator_lists_differ; > } > > /* Creates a new 'Mcast_Macs_Remote' entry if needed. >@@ -159,21 +158,20 @@ vtep_update_mmr(struct ovsdb_idl_txn *vtep_idl_txn, > const struct vteprec_logical_switch *vtep_ls, > const struct mmr_hash_node_data *mmr_ext) > { >- struct vteprec_physical_locator **locators = NULL; > size_t n_locators_new = list_size(locators_list); > bool mmr_changed = false; > const struct vteprec_physical_locator_set *ploc_set; > >- locators = xmalloc(n_locators_new * sizeof(*locators)); >+ locators = xmalloc(n_locators_new * sizeof *locators); > >- if(vtep_process_pls(locators_list, mmr_ext, locators)) { >+ if (vtep_process_pls(locators_list, mmr_ext, locators)) { > mmr_changed = true; > } > >- if(mmr_ext && (!n_locators_new)) { >+ if (mmr_ext && !n_locators_new) { > vteprec_mcast_macs_remote_delete(mmr_ext->mmr); > } else if ((mmr_ext && mmr_changed) || >- ((!mmr_ext) && n_locators_new)) { >+ (!mmr_ext && n_locators_new)) { > > ploc_set = vteprec_physical_locator_set_insert(vtep_idl_txn); > >@@ -181,7 +179,6 @@ vtep_update_mmr(struct ovsdb_idl_txn *vtep_idl_txn, > > vteprec_physical_locator_set_set_locators(ploc_set, locators, > n_locators_new); >- > } > free(locators); > } >@@ -333,7 +330,7 @@ vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, >struct shash *ucast_macs_rmts, > } > > pl = shash_find_data(physical_locators, chassis_ip); >- if(!pl){ >+ if (!pl) { > pl = create_pl(vtep_idl_txn, chassis_ip); > shash_add(physical_locators, chassis_ip, pl); > } >@@ -342,11 +339,13 @@ vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, >struct shash *ucast_macs_rmts, > xasprintf("%s_%"PRId64, "unknown-dst", tnl_key); > ls_node->mmr_ext = > shash_find_data(mcast_macs_rmts, mac_tnlkey); >- if(ls_node->mmr_ext && >- ls_node->mmr_ext->mmr->logical_switch == ls_node->vtep_ls) { >+ >+ if (ls_node->mmr_ext && >+ ls_node->mmr_ext->mmr->logical_switch == ls_node->vtep_ls) { > shash_find_and_delete(mcast_macs_rmts, mac_tnlkey); > } > free(mac_tnlkey); >+ > ploc_entry = xmalloc(sizeof *ploc_entry); > ploc_entry->vteprec_ploc = pl; > list_push_back(&ls_node->locators_list, >@@ -391,11 +390,12 @@ vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, >struct shash *ucast_macs_rmts, > SHASH_FOR_EACH (node, ucast_macs_rmts) { > vteprec_ucast_macs_remote_delete(node->data); > } >+ > struct ls_hash_node *iter, *next; > HMAP_FOR_EACH_SAFE (iter, next, hmap_node, &ls_map) { >- vtep_update_mmr(vtep_idl_txn,&iter->locators_list, >+ vtep_update_mmr(vtep_idl_txn, &iter->locators_list, > iter->vtep_ls, iter->mmr_ext); >- LIST_FOR_EACH_POP(ploc_entry,locators_node, >+ LIST_FOR_EACH_POP(ploc_entry, locators_node, > &iter->locators_list) { > free(ploc_entry); > } >@@ -513,7 +513,7 @@ vtep_run(struct controller_vtep_ctx *ctx) > locators_list = locator_set->locators; > > shash_init(&mmr_ext->physical_locators); >- for(i = 0; i < n_locators; i++) { >+ for (i = 0; i < n_locators; i++) { > shash_add(&mmr_ext->physical_locators, > locators_list[i]->dst_ip, > locators_list[i]); >_______________________________________________ >dev mailing list >dev@openvswitch.org >http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev