+lnet_move_route(struct lnet_route *route, struct lnet_peer *lp,
+ struct list_head *rt_list)
+{
+ struct lnet_remotenet *rnet;
+ struct list_head zombies;
+ struct list_head *l;
+
+ INIT_LIST_HEAD(&zombies);
+
+ if (rt_list)
+ l = rt_list;
+ else
+ l = &zombies;
+
+ rnet = lnet_find_rnet_locked(route->lr_net);
+ LASSERT(rnet);
+
+ CDEBUG(D_NET, "deleting route %s->%s\n",
+ libcfs_net2str(route->lr_net),
+ libcfs_nidstr(&route->lr_nid));
+
+ /*
+ * use the gateway's lp_primary_nid to delete the route as the
+ * lr_nid can be a constituent NID of the peer
+ */
+ lnet_del_route_from_rnet(
+ &route->lr_gateway->lp_primary_nid,
+ &rnet->lrn_routes, l);
+
+ if (lp) {
+ route = list_first_entry(l, struct lnet_route,
+ lr_list);
+ route->lr_gateway = lp;
+ lnet_add_route_to_rnet(rnet, route);
+ } else {
+ while (!list_empty(l) && !rt_list) {
+ route = list_first_entry(l, struct lnet_route,
+ lr_list);
+ list_del(&route->lr_list);
+ LIBCFS_FREE(route, sizeof(*route));
+ }
+ }
+}
+
+void