From 08da92c2d2bb089ff5eaa540983537b01e5c2e7b Mon Sep 17 00:00:00 2001 From: liangbotong Date: Fri, 2 Dec 2022 00:59:16 -0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E7=BD=91=E5=8F=A3=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=9B=B8=E5=90=8C=E5=9C=B0=E5=9D=80=E5=8F=AA=E8=83=BD?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=AC=AC=E4=B8=80=E4=B8=AA=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liangbotong --- src/linux/include/net/nip.h | 7 +++++++ src/linux/net/newip/nip_fib.c | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/linux/include/net/nip.h b/src/linux/include/net/nip.h index b51ce6f..5759c61 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 2029798..bc7299f 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; } -- Gitee