if (set)
{
UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE);
- zebra_deregister_rnh_static_nexthops(nexthop->resolved, top);
+ zebra_deregister_rnh_static_nexthops(rib->vrf_id, nexthop->resolved, top);
nexthops_free(nexthop->resolved);
nexthop->resolved = NULL;
}
if (set)
{
UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE);
- zebra_deregister_rnh_static_nexthops (nexthop->resolved, top);
+ zebra_deregister_rnh_static_nexthops (rib->vrf_id, nexthop->resolved, top);
nexthops_free(nexthop->resolved);
nexthop->resolved = NULL;
}
}
/* free RIB and nexthops */
- zebra_deregister_rnh_static_nexthops (rib->nexthop, rn);
+ zebra_deregister_rnh_static_nexthops (rib->vrf_id, rib->nexthop, rn);
nexthops_free(rib->nexthop);
XFREE (MTYPE_RIB, rib);
nh_p.family = AF_INET;
nh_p.prefixlen = IPV4_MAX_BITLEN;
nh_p.u.prefix4 = si->addr.ipv4;
- zebra_register_rnh_static_nh(&nh_p, rn);
+ zebra_register_rnh_static_nh(si->vrf_id, &nh_p, rn);
break;
case STATIC_IFINDEX:
rib_nexthop_ifindex_add (rib, si->ifindex);
nh_p.family = AF_INET6;
nh_p.prefixlen = IPV6_MAX_BITLEN;
nh_p.u.prefix6 = si->addr.ipv6;
- zebra_register_rnh_static_nh(&nh_p, rn);
+ zebra_register_rnh_static_nh(si->vrf_id, &nh_p, rn);
break;
case STATIC_IPV6_GATEWAY_IFINDEX:
rib_nexthop_ipv6_ifindex_add (rib, &si->addr.ipv6, si->ifindex);
nh_p.family = AF_INET;
nh_p.prefixlen = IPV4_MAX_BITLEN;
nh_p.u.prefix4 = si->addr.ipv4;
- zebra_register_rnh_static_nh(&nh_p, rn);
+ zebra_register_rnh_static_nh(si->vrf_id, &nh_p, rn);
break;
case STATIC_IFINDEX:
rib_nexthop_ifindex_add (rib, si->ifindex);
nh_p.family = AF_INET6;
nh_p.prefixlen = IPV6_MAX_BITLEN;
nh_p.u.prefix6 = si->addr.ipv6;
- zebra_register_rnh_static_nh(&nh_p, rn);
+ zebra_register_rnh_static_nh(si->vrf_id, &nh_p, rn);
break;
case STATIC_IPV6_GATEWAY_IFINDEX:
rib_nexthop_ipv6_ifindex_add (rib, &si->addr.ipv6, si->ifindex);
nh_p.u.prefix6 = nexthop->gate.ipv6;
}
rib_nexthop_delete (rib, nexthop);
- zebra_deregister_rnh_static_nh(&nh_p, rn);
+ zebra_deregister_rnh_static_nh(si->vrf_id, &nh_p, rn);
nexthop_free (nexthop);
}
/* Unlock node. */
/* Default rtm_table for all clients */
extern struct zebra_t zebrad;
-static void free_state(struct rib *rib, struct route_node *rn);
+static void free_state(vrf_id_t vrf_id, struct rib *rib, struct route_node *rn);
static void copy_state(struct rnh *rnh, struct rib *rib,
struct route_node *rn);
#define lookup_rnh_table(v, f) \
{
rnh = XCALLOC(MTYPE_RNH, sizeof(struct rnh));
rnh->client_list = list_new();
+ rnh->vrf_id = vrfid;
rnh->zebra_static_route_list = list_new();
route_lock_node (rn);
rn->info = rnh;
rnh->flags |= ZEBRA_NHT_DELETED;
list_free(rnh->client_list);
list_free(rnh->zebra_static_route_list);
- free_state(rnh->state, rn);
+ free_state(rnh->vrf_id, rnh->state, rn);
XFREE(MTYPE_RNH, rn->info);
rn->info = NULL;
route_unlock_node (rn);
}
void
-zebra_register_rnh_static_nh(struct prefix *nh, struct route_node *static_rn)
+zebra_register_rnh_static_nh(vrf_id_t vrf_id, struct prefix *nh,
+ struct route_node *static_rn)
{
struct rnh *rnh;
- rnh = zebra_add_rnh(nh, 0, RNH_NEXTHOP_TYPE);
+ rnh = zebra_add_rnh(nh, vrf_id, RNH_NEXTHOP_TYPE);
if (rnh && !listnode_lookup(rnh->zebra_static_route_list, static_rn))
{
listnode_add(rnh->zebra_static_route_list, static_rn);
}
void
-zebra_deregister_rnh_static_nh(struct prefix *nh, struct route_node *static_rn)
+zebra_deregister_rnh_static_nh(vrf_id_t vrf_id, struct prefix *nh,
+ struct route_node *static_rn)
{
struct rnh *rnh;
- rnh = zebra_lookup_rnh(nh, 0, RNH_NEXTHOP_TYPE);
+ rnh = zebra_lookup_rnh(nh, vrf_id, RNH_NEXTHOP_TYPE);
if (!rnh || (rnh->flags & ZEBRA_NHT_DELETED))
return;
}
void
-zebra_deregister_rnh_static_nexthops (struct nexthop *nexthop, struct route_node *rn)
+zebra_deregister_rnh_static_nexthops (vrf_id_t vrf_id, struct nexthop *nexthop,
+ struct route_node *rn)
{
struct nexthop *nh;
struct prefix nh_p;
nh_p.prefixlen = IPV6_MAX_BITLEN;
nh_p.u.prefix6 = nh->gate.ipv6;
}
- zebra_deregister_rnh_static_nh(&nh_p, rn);
+ zebra_deregister_rnh_static_nh(vrf_id, &nh_p, rn);
}
}
* free_state - free up the rib structure associated with the rnh.
*/
static void
-free_state (struct rib *rib, struct route_node *rn)
+free_state (vrf_id_t vrf_id, struct rib *rib, struct route_node *rn)
{
if (!rib)
return;
/* free RIB and nexthops */
- zebra_deregister_rnh_static_nexthops (rib->nexthop, rn);
+ zebra_deregister_rnh_static_nexthops (vrf_id, rib->nexthop, rn);
nexthops_free(rib->nexthop);
XFREE (MTYPE_RIB, rib);
}
if (rnh->state)
{
- free_state(rnh->state, rn);
+ free_state(rnh->vrf_id, rnh->state, rn);
rnh->state = NULL;
}
#define ZEBRA_NHT_DELETED 0x2
#define ZEBRA_NHT_EXACT_MATCH 0x4
+ /* VRF identifier. */
+ vrf_id_t vrf_id;
+
struct rib *state;
struct prefix resolved_route;
struct list *client_list;
extern void zebra_delete_rnh(struct rnh *rnh, rnh_type_t type);
extern void zebra_add_rnh_client(struct rnh *rnh, struct zserv *client, rnh_type_t type,
vrf_id_t vrfid);
-extern void zebra_register_rnh_static_nh(struct prefix *, struct route_node *);
-extern void zebra_deregister_rnh_static_nexthops (struct nexthop *nexthop, struct route_node *rn);
-extern void zebra_deregister_rnh_static_nh(struct prefix *, struct route_node *);
+extern void zebra_register_rnh_static_nh(vrf_id_t, struct prefix *, struct route_node *);
+extern void zebra_deregister_rnh_static_nexthops (vrf_id_t, struct nexthop *nexthop,
+ struct route_node *rn);
+extern void zebra_deregister_rnh_static_nh(vrf_id_t, struct prefix *, struct route_node *);
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, rnh_type_t type,
rnh_type_t type)
{}
-void zebra_register_rnh_static_nh(struct prefix *p, struct route_node *rn)
+void zebra_register_rnh_static_nh(vrf_id_t vrfid, struct prefix *p, struct route_node *rn)
{}
-void zebra_deregister_rnh_static_nh(struct prefix *p, struct route_node *rn)
+void zebra_deregister_rnh_static_nh(vrf_id_t vrfid, struct prefix *p, struct route_node *rn)
{}
-void zebra_deregister_rnh_static_nexthops (struct nexthop *nexthop, struct route_node *rn)
+void zebra_deregister_rnh_static_nexthops (vrf_id_t vrfid, struct nexthop *nexthop,
+ struct route_node *rn)
{}