#include "nexthop.h"
#include "nexthop_group.h"
#include "hash.h"
+#include "jhash.h"
#include "static_vrf.h"
#include "static_routes.h"
struct static_nht_data {
struct prefix *nh;
+
+ vrf_id_t nh_vrf_id;
+
uint32_t refcount;
uint8_t nh_num;
};
memset(&lookup, 0, sizeof(lookup));
lookup.nh = &nhr.prefix;
+ lookup.nh_vrf_id = vrf_id;
nhtd = hash_lookup(static_nht_hash, &lookup);
- if (nhtd)
+
+ if (nhtd) {
nhtd->nh_num = nhr.nexthop_num;
+ static_nht_update(&nhr.prefix, nhr.nexthop_num, afi,
+ nhtd->nh_vrf_id);
+ } else
+ zlog_err("No nhtd?");
- static_nht_update(&nhr.prefix, nhr.nexthop_num, afi, vrf_id);
return 1;
}
static unsigned int static_nht_hash_key(void *data)
{
struct static_nht_data *nhtd = data;
+ unsigned int key = 0;
- return prefix_hash_key(nhtd->nh);
+ key = prefix_hash_key(nhtd->nh);
+ return jhash_1word(nhtd->nh_vrf_id, key);
}
-static int static_nht_hash_cmp(const void *d1, const void *d2)
+static bool static_nht_hash_cmp(const void *d1, const void *d2)
{
const struct static_nht_data *nhtd1 = d1;
const struct static_nht_data *nhtd2 = d2;
+ if (nhtd1->nh_vrf_id != nhtd2->nh_vrf_id)
+ return false;
+
return prefix_same(nhtd1->nh, nhtd2->nh);
}
prefix_copy(new->nh, copy->nh);
new->refcount = 0;
new->nh_num = 0;
+ new->nh_vrf_id = copy->nh_vrf_id;
return new;
}
memset(&lookup, 0, sizeof(lookup));
lookup.nh = &p;
+ lookup.nh_vrf_id = si->nh_vrf_id;
si->nh_registered = reg;
memcpy(&api.src_prefix, src_pp, sizeof(api.src_prefix));
}
SET_FLAG(api.flags, ZEBRA_FLAG_RR_USE_DISTANCE);
+ if (si_changed->onlink)
+ SET_FLAG(api.flags, ZEBRA_FLAG_ONLINK);
SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
if (si_changed->distance) {
SET_FLAG(api.message, ZAPI_MESSAGE_DISTANCE);
if (si->distance != si_changed->distance)
continue;
+ if (si->table_id != si_changed->table_id)
+ continue;
+
api_nh->vrf_id = si->nh_vrf_id;
switch (si->type) {
case STATIC_IFNAME: