]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: vrf aware routmap is missing in Zebra #2802(Part 2 of 4)
authorvishaldhingra <vdhingra@vmware.com>
Thu, 11 Oct 2018 17:46:55 +0000 (10:46 -0700)
committervishaldhingra <vdhingra@vmware.com>
Thu, 11 Oct 2018 17:46:55 +0000 (10:46 -0700)
Function parameter replacement of using zvrf instead of vrf_id

Signed-off-by: vishaldhingra vdhingra@vmware.com
zebra/zapi_msg.c
zebra/zebra_rib.c
zebra/zebra_rnh.c
zebra/zebra_rnh.h
zebra/zebra_routemap.c
zebra/zebra_vty.c

index b9897bea038c6052cb08877fa49e805cec8be84d..c193a0c47a644423ea887a39ba59fd6bfc0a5bb6 100644 (file)
@@ -1090,8 +1090,7 @@ static void zread_rnh_register(ZAPI_HANDLER_ARGS)
                zebra_add_rnh_client(rnh, client, type, zvrf_id(zvrf));
                /* Anything not AF_INET/INET6 has been filtered out above */
                if (!exist)
-                       zebra_evaluate_rnh(zvrf_id(zvrf), p.family, 1, type,
-                                          &p);
+                       zebra_evaluate_rnh(zvrf, p.family, 1, type, &p);
        }
 
 stream_failure:
index 53afbdc8fc05fe5e29b00b732497efcbc46baf9f..4c35b1003f8add81854f58d37c9e05426b46edaf 100644 (file)
@@ -1901,14 +1901,12 @@ static void meta_queue_process_complete(struct work_queue *dummy)
                        continue;
 
                zvrf->flags &= ~ZEBRA_VRF_RIB_SCHEDULED;
-               zebra_evaluate_rnh(zvrf_id(zvrf), AF_INET, 0, RNH_NEXTHOP_TYPE,
+               zebra_evaluate_rnh(zvrf, AF_INET, 0, RNH_NEXTHOP_TYPE, NULL);
+               zebra_evaluate_rnh(zvrf, AF_INET, 0, RNH_IMPORT_CHECK_TYPE,
                                   NULL);
-               zebra_evaluate_rnh(zvrf_id(zvrf), AF_INET, 0,
-                                  RNH_IMPORT_CHECK_TYPE, NULL);
-               zebra_evaluate_rnh(zvrf_id(zvrf), AF_INET6, 0, RNH_NEXTHOP_TYPE,
+               zebra_evaluate_rnh(zvrf, AF_INET6, 0, RNH_NEXTHOP_TYPE, NULL);
+               zebra_evaluate_rnh(zvrf, AF_INET6, 0, RNH_IMPORT_CHECK_TYPE,
                                   NULL);
-               zebra_evaluate_rnh(zvrf_id(zvrf), AF_INET6, 0,
-                                  RNH_IMPORT_CHECK_TYPE, NULL);
        }
 
        /* Schedule LSPs for processing, if needed. */
index e2b28673163ddd9063796544e88ca57c7a65d020..0a531990dc74d0a6d6b57b563b9dee0dc522eb2d 100644 (file)
@@ -260,13 +260,18 @@ void zebra_register_rnh_pseudowire(vrf_id_t vrf_id, struct zebra_pw *pw)
        struct prefix nh;
        struct rnh *rnh;
        bool exists;
+       struct zebra_vrf *zvrf;
+
+       zvrf = vrf_info_lookup(vrf_id);
+       if (!zvrf)
+               return;
 
        addr2hostprefix(pw->af, &pw->nexthop, &nh);
        rnh = zebra_add_rnh(&nh, vrf_id, RNH_NEXTHOP_TYPE, &exists);
        if (rnh && !listnode_lookup(rnh->zebra_pseudowire_list, pw)) {
                listnode_add(rnh->zebra_pseudowire_list, pw);
                pw->rnh = rnh;
-               zebra_evaluate_rnh(vrf_id, pw->af, 1, RNH_NEXTHOP_TYPE, &nh);
+               zebra_evaluate_rnh(zvrf, pw->af, 1, RNH_NEXTHOP_TYPE, &nh);
        }
 }
 
@@ -289,7 +294,8 @@ void zebra_deregister_rnh_pseudowire(vrf_id_t vrf_id, struct zebra_pw *pw)
 /* Apply the NHT route-map for a client to the route (and nexthops)
  * resolving a NH.
  */
-static int zebra_rnh_apply_nht_rmap(int family, struct route_node *prn,
+static int zebra_rnh_apply_nht_rmap(int family, struct zebra_vrf *zvrf,
+                                   struct route_node *prn,
                                    struct route_entry *re, int proto)
 {
        int at_least_one = 0;
@@ -302,8 +308,6 @@ static int zebra_rnh_apply_nht_rmap(int family, struct route_node *prn,
        if (prn && re) {
                for (nexthop = re->ng.nexthop; nexthop;
                     nexthop = nexthop->next) {
-                       struct zebra_vrf *zvrf =
-                               zebra_vrf_lookup_by_id(nexthop->vrf_id);
                        ret = zebra_nht_route_map_check(
                                rmap_family, proto, &prn->p, zvrf, re, nexthop);
                        if (ret != RMAP_DENYMATCH) {
@@ -322,7 +326,7 @@ static int zebra_rnh_apply_nht_rmap(int family, struct route_node *prn,
  * for BGP route for import.
  */
 static struct route_entry *
-zebra_rnh_resolve_import_entry(vrf_id_t vrfid, int family,
+zebra_rnh_resolve_import_entry(struct zebra_vrf *zvrf, int family,
                               struct route_node *nrn, struct rnh *rnh,
                               struct route_node **prn)
 {
@@ -332,7 +336,7 @@ zebra_rnh_resolve_import_entry(vrf_id_t vrfid, int family,
 
        *prn = NULL;
 
-       route_table = zebra_vrf_table(family2afi(family), SAFI_UNICAST, vrfid);
+       route_table = zvrf->table[family2afi(family)][SAFI_UNICAST];
        if (!route_table) // unexpected
                return NULL;
 
@@ -404,11 +408,9 @@ static void zebra_rnh_eval_import_check_entry(vrf_id_t vrfid, int family,
 /*
  * Notify clients registered for this nexthop about a change.
  */
-static void zebra_rnh_notify_protocol_clients(vrf_id_t vrfid, int family,
-                                             struct route_node *nrn,
-                                             struct rnh *rnh,
-                                             struct route_node *prn,
-                                             struct route_entry *re)
+static void zebra_rnh_notify_protocol_clients(
+       struct zebra_vrf *zvrf, int family, struct route_node *nrn,
+       struct rnh *rnh, struct route_node *prn, struct route_entry *re)
 {
        struct listnode *node;
        struct zserv *client;
@@ -420,11 +422,11 @@ static void zebra_rnh_notify_protocol_clients(vrf_id_t vrfid, int family,
                prefix2str(&nrn->p, bufn, INET6_ADDRSTRLEN);
                if (prn && re) {
                        prefix2str(&prn->p, bufp, INET6_ADDRSTRLEN);
-                       zlog_debug("%u:%s: NH resolved over route %s", vrfid,
-                                  bufn, bufp);
+                       zlog_debug("%u:%s: NH resolved over route %s",
+                                  zvrf->vrf->vrf_id, bufn, bufp);
                } else
-                       zlog_debug("%u:%s: NH has become unresolved", vrfid,
-                                  bufn);
+                       zlog_debug("%u:%s: NH has become unresolved",
+                                  zvrf->vrf->vrf_id, bufn);
        }
 
        for (ALL_LIST_ELEMENTS_RO(rnh->client_list, node, client)) {
@@ -434,7 +436,7 @@ static void zebra_rnh_notify_protocol_clients(vrf_id_t vrfid, int family,
                         * nexthop to see if it is filtered or not.
                         */
                        num_resolving_nh = zebra_rnh_apply_nht_rmap(
-                               family, prn, re, client->proto);
+                               family, zvrf, prn, re, client->proto);
                        if (num_resolving_nh)
                                rnh->filtered[client->proto] = 0;
                        else
@@ -443,7 +445,7 @@ static void zebra_rnh_notify_protocol_clients(vrf_id_t vrfid, int family,
                        if (IS_ZEBRA_DEBUG_NHT)
                                zlog_debug(
                                        "%u:%s: Notifying client %s about NH %s",
-                                       vrfid, bufn,
+                                       zvrf->vrf->vrf_id, bufn,
                                        zebra_route_string(client->proto),
                                        num_resolving_nh
                                                ? ""
@@ -453,11 +455,11 @@ static void zebra_rnh_notify_protocol_clients(vrf_id_t vrfid, int family,
                        if (IS_ZEBRA_DEBUG_NHT)
                                zlog_debug(
                                        "%u:%s: Notifying client %s about NH (unreachable)",
-                                       vrfid, bufn,
+                                       zvrf->vrf->vrf_id, bufn,
                                        zebra_route_string(client->proto));
                }
 
-               send_client(rnh, client, RNH_NEXTHOP_TYPE, vrfid);
+               send_client(rnh, client, RNH_NEXTHOP_TYPE, zvrf->vrf->vrf_id);
        }
 }
 
@@ -521,7 +523,7 @@ static void zebra_rnh_process_pbr_tables(int family,
  * nexthop.
  */
 static struct route_entry *
-zebra_rnh_resolve_nexthop_entry(vrf_id_t vrfid, int family,
+zebra_rnh_resolve_nexthop_entry(struct zebra_vrf *zvrf, int family,
                                struct route_node *nrn, struct rnh *rnh,
                                struct route_node **prn)
 {
@@ -531,7 +533,7 @@ zebra_rnh_resolve_nexthop_entry(vrf_id_t vrfid, int family,
 
        *prn = NULL;
 
-       route_table = zebra_vrf_table(family2afi(family), SAFI_UNICAST, vrfid);
+       route_table = zvrf->table[family2afi(family)][SAFI_UNICAST];
        if (!route_table)
                return NULL;
 
@@ -608,8 +610,8 @@ static void zebra_rnh_process_pseudowires(vrf_id_t vrfid, struct rnh *rnh)
  * take appropriate action; this involves notifying any clients and/or
  * scheduling dependent static routes for processing.
  */
-static void zebra_rnh_eval_nexthop_entry(vrf_id_t vrfid, int family, int force,
-                                        struct route_node *nrn,
+static void zebra_rnh_eval_nexthop_entry(struct zebra_vrf *zvrf, int family,
+                                        int force, struct route_node *nrn,
                                         struct rnh *rnh,
                                         struct route_node *prn,
                                         struct route_entry *re)
@@ -638,20 +640,20 @@ static void zebra_rnh_eval_nexthop_entry(vrf_id_t vrfid, int family, int force,
                 * rnh->state.
                 */
                /* Notify registered protocol clients. */
-               zebra_rnh_notify_protocol_clients(vrfid, family, nrn, rnh, prn,
+               zebra_rnh_notify_protocol_clients(zvrf, family, nrn, rnh, prn,
                                                  rnh->state);
 
-               zebra_rnh_process_pbr_tables(family, nrn, rnh, prn,
-                                            rnh->state);
+               zebra_rnh_process_pbr_tables(family, nrn, rnh, prn, rnh->state);
 
                /* Process pseudowires attached to this nexthop */
-               zebra_rnh_process_pseudowires(vrfid, rnh);
+               zebra_rnh_process_pseudowires(zvrf->vrf->vrf_id, rnh);
        }
 }
 
 /* Evaluate one tracked entry */
-static void zebra_rnh_evaluate_entry(vrf_id_t vrfid, int family, int force,
-                                    rnh_type_t type, struct route_node *nrn)
+static void zebra_rnh_evaluate_entry(struct zebra_vrf *zvrf, int family,
+                                    int force, rnh_type_t type,
+                                    struct route_node *nrn)
 {
        struct rnh *rnh;
        struct route_entry *re;
@@ -660,18 +662,18 @@ static void zebra_rnh_evaluate_entry(vrf_id_t vrfid, int family, int force,
 
        if (IS_ZEBRA_DEBUG_NHT) {
                prefix2str(&nrn->p, bufn, INET6_ADDRSTRLEN);
-               zlog_debug("%u:%s: Evaluate RNH, type %d %s", vrfid, bufn, type,
-                          force ? "(force)" : "");
+               zlog_debug("%u:%s: Evaluate RNH, type %d %s", zvrf->vrf->vrf_id,
+                          bufn, type, force ? "(force)" : "");
        }
 
        rnh = nrn->info;
 
        /* Identify route entry (RE) resolving this tracked entry. */
        if (type == RNH_IMPORT_CHECK_TYPE)
-               re = zebra_rnh_resolve_import_entry(vrfid, family, nrn, rnh,
+               re = zebra_rnh_resolve_import_entry(zvrf, family, nrn, rnh,
                                                    &prn);
        else
-               re = zebra_rnh_resolve_nexthop_entry(vrfid, family, nrn, rnh,
+               re = zebra_rnh_resolve_nexthop_entry(zvrf, family, nrn, rnh,
                                                     &prn);
 
        /* If the entry cannot be resolved and that is also the existing state,
@@ -682,11 +684,11 @@ static void zebra_rnh_evaluate_entry(vrf_id_t vrfid, int family, int force,
 
        /* Process based on type of entry. */
        if (type == RNH_IMPORT_CHECK_TYPE)
-               zebra_rnh_eval_import_check_entry(vrfid, family, force, nrn,
-                                                 rnh, re);
+               zebra_rnh_eval_import_check_entry(zvrf->vrf->vrf_id, family,
+                                                 force, nrn, rnh, re);
        else
-               zebra_rnh_eval_nexthop_entry(vrfid, family, force, nrn, rnh,
-                                            prn, re);
+               zebra_rnh_eval_nexthop_entry(zvrf, family, force, nrn, rnh, prn,
+                                            re);
 }
 
 /*
@@ -698,7 +700,7 @@ static void zebra_rnh_evaluate_entry(vrf_id_t vrfid, int family, int force,
  * we can have a situation where one re entry
  * covers multiple nexthops we are interested in.
  */
-static void zebra_rnh_clear_nhc_flag(vrf_id_t vrfid, int family,
+static void zebra_rnh_clear_nhc_flag(struct zebra_vrf *zvrf, int family,
                                     rnh_type_t type, struct route_node *nrn)
 {
        struct rnh *rnh;
@@ -709,10 +711,10 @@ static void zebra_rnh_clear_nhc_flag(vrf_id_t vrfid, int family,
 
        /* Identify route entry (RIB) resolving this tracked entry. */
        if (type == RNH_IMPORT_CHECK_TYPE)
-               re = zebra_rnh_resolve_import_entry(vrfid, family, nrn, rnh,
+               re = zebra_rnh_resolve_import_entry(zvrf, family, nrn, rnh,
                                                    &prn);
        else
-               re = zebra_rnh_resolve_nexthop_entry(vrfid, family, nrn, rnh,
+               re = zebra_rnh_resolve_nexthop_entry(zvrf, family, nrn, rnh,
                                                     &prn);
 
        if (re) {
@@ -724,13 +726,13 @@ static void zebra_rnh_clear_nhc_flag(vrf_id_t vrfid, int family,
 /* Evaluate all tracked entries (nexthops or routes for import into BGP)
  * of a particular VRF and address-family or a specific prefix.
  */
-void zebra_evaluate_rnh(vrf_id_t vrfid, int family, int force, rnh_type_t type,
-                       struct prefix *p)
+void zebra_evaluate_rnh(struct zebra_vrf *zvrf, int family, int force,
+                       rnh_type_t type, struct prefix *p)
 {
        struct route_table *rnh_table;
        struct route_node *nrn;
 
-       rnh_table = get_rnh_table(vrfid, family, type);
+       rnh_table = get_rnh_table(zvrf->vrf->vrf_id, family, type);
        if (!rnh_table) // unexpected
                return;
 
@@ -738,7 +740,7 @@ void zebra_evaluate_rnh(vrf_id_t vrfid, int family, int force, rnh_type_t type,
                /* Evaluating a specific entry, make sure it exists. */
                nrn = route_node_lookup(rnh_table, p);
                if (nrn && nrn->info)
-                       zebra_rnh_evaluate_entry(vrfid, family, force, type,
+                       zebra_rnh_evaluate_entry(zvrf, family, force, type,
                                                 nrn);
 
                if (nrn)
@@ -748,14 +750,14 @@ void zebra_evaluate_rnh(vrf_id_t vrfid, int family, int force, rnh_type_t type,
                nrn = route_top(rnh_table);
                while (nrn) {
                        if (nrn->info)
-                               zebra_rnh_evaluate_entry(vrfid, family, force,
+                               zebra_rnh_evaluate_entry(zvrf, family, force,
                                                         type, nrn);
                        nrn = route_next(nrn); /* this will also unlock nrn */
                }
                nrn = route_top(rnh_table);
                while (nrn) {
                        if (nrn->info)
-                               zebra_rnh_clear_nhc_flag(vrfid, family, type,
+                               zebra_rnh_clear_nhc_flag(zvrf, family, type,
                                                         nrn);
                        nrn = route_next(nrn); /* this will also unlock nrn */
                }
index f4b4b56390a7c526266cd7bae3eef4d7f915afa5..33302f0ee27dc5d083fc4123761edbbf63bbdab9 100644 (file)
@@ -79,7 +79,7 @@ extern void zebra_register_rnh_pseudowire(vrf_id_t, struct zebra_pw *);
 extern void zebra_deregister_rnh_pseudowire(vrf_id_t, struct zebra_pw *);
 extern void zebra_remove_rnh_client(struct rnh *rnh, struct zserv *client,
                                    rnh_type_t type);
-extern void zebra_evaluate_rnh(vrf_id_t vrfid, int family, int force,
+extern void zebra_evaluate_rnh(struct zebra_vrf *zvrf, int family, int force,
                               rnh_type_t type, struct prefix *p);
 extern void zebra_print_rnh_table(vrf_id_t vrfid, int family, struct vty *vty,
                                  rnh_type_t);
index 1318c09b572ec4b9030449a06b9ec0e9782a8bf2..598d51fd261ee9986f20a1bc0d4c9f0e4cd2e57c 100644 (file)
@@ -713,8 +713,13 @@ DEFUN (ip_protocol_nht_rmap,
                XFREE(MTYPE_ROUTE_MAP_NAME, nht_rm[AFI_IP][i]);
        }
 
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
+
+       if (!zvrf)
+               return CMD_WARNING;
+
        nht_rm[AFI_IP][i] = XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap);
-       zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
+       zebra_evaluate_rnh(zvrf, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
 
        return CMD_SUCCESS;
 }
@@ -745,10 +750,15 @@ DEFUN (no_ip_protocol_nht_rmap,
        if (!nht_rm[AFI_IP][i])
                return CMD_SUCCESS;
 
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
+
+       if (!zvrf)
+               return CMD_WARNING;
+
        if (!rmap || strcmp(rmap, nht_rm[AFI_IP][i]) == 0) {
                XFREE(MTYPE_ROUTE_MAP_NAME, nht_rm[AFI_IP][i]);
                nht_rm[AFI_IP][i] = NULL;
-               zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
+               zebra_evaluate_rnh(zvrf, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
        }
        return CMD_SUCCESS;
 }
@@ -801,10 +811,16 @@ DEFUN (ipv6_protocol_nht_rmap,
                vty_out(vty, "invalid protocol name \"%s\"\n", proto);
                return CMD_WARNING_CONFIG_FAILED;
        }
+
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
+
+       if (!zvrf)
+               return CMD_WARNING;
+
        if (nht_rm[AFI_IP6][i])
                XFREE(MTYPE_ROUTE_MAP_NAME, nht_rm[AFI_IP6][i]);
        nht_rm[AFI_IP6][i] = XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap);
-       zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
+       zebra_evaluate_rnh(zvrf, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
 
        return CMD_SUCCESS;
 }
@@ -841,8 +857,12 @@ DEFUN (no_ipv6_protocol_nht_rmap,
                XFREE(MTYPE_ROUTE_MAP_NAME, nht_rm[AFI_IP6][i]);
                nht_rm[AFI_IP6][i] = NULL;
        }
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
+
+       if (!zvrf)
+               return CMD_WARNING;
 
-       zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
+       zebra_evaluate_rnh(zvrf, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
 
        return CMD_SUCCESS;
 }
@@ -1411,8 +1431,7 @@ static void zebra_nht_rm_update(const char *rmap)
                                                afi_ip = 1;
 
                                                zebra_evaluate_rnh(
-                                                       zvrf->vrf->vrf_id,
-                                                       AF_INET, 1,
+                                                       zvrf, AF_INET, 1,
                                                        RNH_NEXTHOP_TYPE, NULL);
                                        }
                                }
@@ -1438,8 +1457,7 @@ static void zebra_nht_rm_update(const char *rmap)
                                                afi_ipv6 = 1;
 
                                                zebra_evaluate_rnh(
-                                                       zvrf->vrf->vrf_id,
-                                                       AF_INET, 1,
+                                                       zvrf, AF_INET, 1,
                                                        RNH_NEXTHOP_TYPE, NULL);
                                        }
                                }
index 86792fdd899de7ad03e4e240aad6fcda0c185863..d79d77c66653e708beade459252d69a705b3dfc4 100644 (file)
@@ -1030,8 +1030,13 @@ DEFUN (ip_nht_default_route,
        if (zebra_rnh_ip_default_route)
                return CMD_SUCCESS;
 
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
+
+       if (!zvrf)
+               return CMD_WARNING;
+
        zebra_rnh_ip_default_route = 1;
-       zebra_evaluate_rnh(VRF_DEFAULT, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
+       zebra_evaluate_rnh(zvrf, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
        return CMD_SUCCESS;
 }
 
@@ -1046,8 +1051,13 @@ DEFUN (no_ip_nht_default_route,
        if (!zebra_rnh_ip_default_route)
                return CMD_SUCCESS;
 
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
+
+       if (!zvrf)
+               return CMD_WARNING;
+
        zebra_rnh_ip_default_route = 0;
-       zebra_evaluate_rnh(VRF_DEFAULT, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
+       zebra_evaluate_rnh(zvrf, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
        return CMD_SUCCESS;
 }
 
@@ -1061,8 +1071,13 @@ DEFUN (ipv6_nht_default_route,
        if (zebra_rnh_ipv6_default_route)
                return CMD_SUCCESS;
 
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
+
+       if (!zvrf)
+               return CMD_WARNING;
+
        zebra_rnh_ipv6_default_route = 1;
-       zebra_evaluate_rnh(VRF_DEFAULT, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
+       zebra_evaluate_rnh(zvrf, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
        return CMD_SUCCESS;
 }
 
@@ -1077,8 +1092,13 @@ DEFUN (no_ipv6_nht_default_route,
        if (!zebra_rnh_ipv6_default_route)
                return CMD_SUCCESS;
 
+       struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
+
+       if (!zvrf)
+               return CMD_WARNING;
+
        zebra_rnh_ipv6_default_route = 0;
-       zebra_evaluate_rnh(VRF_DEFAULT, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
+       zebra_evaluate_rnh(zvrf, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
        return CMD_SUCCESS;
 }