diff --git a/src/linux/include/net/nip.h b/src/linux/include/net/nip.h index b51ce6f7089d5b49173e236519905ddff7443f76..5759c617862c0eb7cd8de6ecd6dcfb95052fa736 100644 --- a/src/linux/include/net/nip.h +++ b/src/linux/include/net/nip.h @@ -59,6 +59,13 @@ int nip_rcv(struct sk_buff *skb, struct net_device *dev, struct nip_rt_info *nip_dst_alloc(struct net *net, struct net_device *dev, int flags); +static inline bool nip_addr_and_ifindex_eq(const struct nip_addr *a1, + const struct nip_addr *a2, int ifindex1, int ifindex2) +{ + return (a1->bitlen == a2->bitlen) && (a1->bitlen <= NIP_ADDR_BIT_LEN_MAX) && + (memcmp(&a1->v.u, &a2->v.u, a1->bitlen >> 3) == 0) && (ifindex1 == ifindex2); +}; + static inline bool nip_addr_eq(const struct nip_addr *a1, const struct nip_addr *a2) { diff --git a/src/linux/net/newip/nip_fib.c b/src/linux/net/newip/nip_fib.c index 2029798c7e366c47f86f81259116a275add57b3f..bc7299f55393d70c9b713a44173f88473ba6d27d 100644 --- a/src/linux/net/newip/nip_fib.c +++ b/src/linux/net/newip/nip_fib.c @@ -115,8 +115,10 @@ int nip_fib_add(struct hlist_head *nip_tb_head, struct nip_rt_info *rt) h = &nip_tb_head[hash]; hlist_for_each_entry(fib_node, h, fib_hlist) { - if (nip_addr_eq(&fib_node->nip_route_info->rt_dst, - &rt->rt_dst)) { + if (nip_addr_and_ifindex_eq + (&fib_node->nip_route_info->rt_dst, &rt->rt_dst, + fib_node->nip_route_info->rt_idev->dev->ifindex, + rt->rt_idev->dev->ifindex)) { err = -EEXIST; goto fail; }