From 067f8c4a88ac839bbe69b9e479251dd434f5a166 Mon Sep 17 00:00:00 2001 From: liangbotong Date: Mon, 19 Jun 2023 10:48:32 +0800 Subject: [PATCH] NewIP code problem modification 1.Add the log information about the NewIP route exception branch 2.Code specification check and rectify Signed-off-by: liangbotong --- newip/src/common/nip_addr.c | 16 +++--- newip/src/common/nip_addr.h | 2 +- newip/src/linux-5.10/drivers/net/bt/btdev.c | 4 +- .../linux-5.10/net/newip/af_ninet.c | 2 +- .../linux-5.10/net/newip/nip_addrconf.c | 2 +- .../linux-5.10/net/newip/nip_fib.c | 54 +++++++++++-------- .../linux-5.10/net/newip/tcp_nip_output.c | 5 +- 7 files changed, 47 insertions(+), 38 deletions(-) diff --git a/newip/src/common/nip_addr.c b/newip/src/common/nip_addr.c index 03f9e82..64cd026 100644 --- a/newip/src/common/nip_addr.c +++ b/newip/src/common/nip_addr.c @@ -128,13 +128,13 @@ static inline int is_public_addr_flag(unsigned char first_byte) return first_byte == ADDR_FIRST_FF ? NIP_TRUE : NIP_FALSE; } -int is_nip_local_addr(const struct nip_addr *ad) +int is_nip_local_addr(const struct nip_addr *addr) { int result = 0; - if (ad->bitlen == NIP_ADDR_BIT_LEN_16) { - if (ad->nip_addr_field16[0] == nip_local_addr.nip_addr_field16[0] && - ad->nip_addr_field16[1] == nip_local_addr.nip_addr_field16[1]) + if (addr->bitlen == NIP_ADDR_BIT_LEN_16) { + if (addr->nip_addr_field16[0] == nip_local_addr.nip_addr_field16[0] && + addr->nip_addr_field16[1] == nip_local_addr.nip_addr_field16[1]) result = 1; } return result; @@ -353,13 +353,13 @@ int nip_addr_public(const struct nip_addr *addr) } /* judge whether the nip_addr is equal to 0xFF09 */ -int nip_addr_any(const struct nip_addr *ad) +int nip_addr_any(const struct nip_addr *addr) { int result = 0; - if (ad->bitlen == NIP_ADDR_BIT_LEN_16) { - if (ad->nip_addr_field16[0] == nip_any_addr.nip_addr_field16[0] && - ad->nip_addr_field16[1] == nip_any_addr.nip_addr_field16[1]) + if (addr->bitlen == NIP_ADDR_BIT_LEN_16) { + if (addr->nip_addr_field16[0] == nip_any_addr.nip_addr_field16[0] && + addr->nip_addr_field16[1] == nip_any_addr.nip_addr_field16[1]) result = 1; } return result; diff --git a/newip/src/common/nip_addr.h b/newip/src/common/nip_addr.h index 3a461fe..1e1d6bf 100644 --- a/newip/src/common/nip_addr.h +++ b/newip/src/common/nip_addr.h @@ -111,7 +111,7 @@ extern const struct nip_addr nip_broadcast_addr_arp; int nip_addr_invalid(const struct nip_addr *addr); int nip_addr_public(const struct nip_addr *addr); -int nip_addr_any(const struct nip_addr *ad); +int nip_addr_any(const struct nip_addr *addr); int get_nip_addr_len(const struct nip_addr *addr); unsigned char *build_nip_addr(const struct nip_addr *addr, unsigned char *buf); unsigned char *decode_nip_addr(unsigned char *buf, struct nip_addr *addr); diff --git a/newip/src/linux-5.10/drivers/net/bt/btdev.c b/newip/src/linux-5.10/drivers/net/bt/btdev.c index 446d207..89a060f 100644 --- a/newip/src/linux-5.10/drivers/net/bt/btdev.c +++ b/newip/src/linux-5.10/drivers/net/bt/btdev.c @@ -707,7 +707,6 @@ static struct bt_virnet *bt_table_find(struct bt_table *tbl, const char *ifa_nam static void __bt_table_delete_all(struct bt_drv *drv) { - int err; dev_t number; struct bt_virnet *vnet = NULL, *tmp_vnet = NULL; @@ -718,7 +717,8 @@ static void __bt_table_delete_all(struct bt_drv *drv) tmp_vnet, &drv->devices_table->head, virnet_entry) { - err = bt_virnet_get_cdev_number(vnet, &number); + int err = bt_virnet_get_cdev_number(vnet, &number); + if (likely(!err)) bt_clear_bit(&drv->bitmap, (u32)MINOR(number)); list_del(&vnet->virnet_entry); diff --git a/newip/third_party/linux-5.10/net/newip/af_ninet.c b/newip/third_party/linux-5.10/net/newip/af_ninet.c index 5718b1c..dabd7dc 100644 --- a/newip/third_party/linux-5.10/net/newip/af_ninet.c +++ b/newip/third_party/linux-5.10/net/newip/af_ninet.c @@ -546,7 +546,7 @@ static int __ninet_ioctl_cmd(struct socket *sock, unsigned int cmd, int ninet_ioctl_cmd(struct socket *sock, const struct iovec *iov) { - char ioctl_flag[NINET_IOCTL_FLAG_LEN] = NINET_IOCTL_FLAG_VALUE; + const char ioctl_flag[NINET_IOCTL_FLAG_LEN] = NINET_IOCTL_FLAG_VALUE; char ioctl_head[NINET_IOCTL_HEAD_LEN]; int i; unsigned int cmd; diff --git a/newip/third_party/linux-5.10/net/newip/nip_addrconf.c b/newip/third_party/linux-5.10/net/newip/nip_addrconf.c index 043cf03..afbe350 100644 --- a/newip/third_party/linux-5.10/net/newip/nip_addrconf.c +++ b/newip/third_party/linux-5.10/net/newip/nip_addrconf.c @@ -557,7 +557,7 @@ static int nip_addrconf_notify(struct notifier_block *this, unsigned long event, /* allocate new idev */ idev = nip_add_dev(dev); - if (IS_ERR(idev)) + if (IS_ERR_OR_NULL(idev)) break; /* device is still not ready */ diff --git a/newip/third_party/linux-5.10/net/newip/nip_fib.c b/newip/third_party/linux-5.10/net/newip/nip_fib.c index d5f71f6..dfdc4ce 100644 --- a/newip/third_party/linux-5.10/net/newip/nip_fib.c +++ b/newip/third_party/linux-5.10/net/newip/nip_fib.c @@ -108,10 +108,31 @@ struct nip_fib_node *nip_fib_locate(struct hlist_head *nip_tb_head, return NULL; } +static bool is_nip_route_exist(const struct hlist_head *h, const struct nip_rt_info *rt, + u8 table_id) +{ + struct nip_fib_node *fib_node; + + hlist_for_each_entry(fib_node, h, fib_hlist) { + if (table_id == NIP_RT_TABLE_MAIN) { + if (nip_addr_eq(&fib_node->nip_route_info->rt_dst, + &rt->rt_dst)) + return true; + } else if (table_id == NIP_RT_TABLE_LOCAL) { + 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)) + return true; + } + } + return false; +} + /* nip_tb_lock must be taken to avoid racing */ int nip_fib_add(struct nip_fib_table *table, struct nip_rt_info *rt) { - struct nip_fib_node *fib_node, *new_node; + struct nip_fib_node *new_node; int err = 0; struct hlist_head *h; unsigned int hash; @@ -121,22 +142,16 @@ int nip_fib_add(struct nip_fib_table *table, struct nip_rt_info *rt) hash = ninet_route_hash(&rt->rt_dst); h = &table->nip_tb_head[hash]; - hlist_for_each_entry(fib_node, h, fib_hlist) { - if (table->nip_tb_id == NIP_RT_TABLE_MAIN) { - if (nip_addr_eq(&fib_node->nip_route_info->rt_dst, - &rt->rt_dst)) { - err = -EEXIST; - goto fail; - } - } else if (table->nip_tb_id == NIP_RT_TABLE_LOCAL) { - 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; - } - } + nip_addr_to_str(&rt->rt_dst, dst, NIP_ADDR_BIT_LEN_MAX); + nip_addr_to_str(&rt->gateway, gateway, NIP_ADDR_BIT_LEN_MAX); + nip_dbg("%s ifindex=%u (addr=%s, gateway=%s, rt_idev->refcnt=%u)", + rt->rt_idev->dev->name, rt->rt_idev->dev->ifindex, + dst, gateway, refcount_read(&rt->rt_idev->refcnt)); + + if (is_nip_route_exist(h, rt, table->nip_tb_id)) { + err = -EEXIST; + nip_dbg("File exists"); + goto fail; } new_node = nip_node_alloc(); @@ -149,11 +164,6 @@ int nip_fib_add(struct nip_fib_table *table, struct nip_rt_info *rt) rcu_assign_pointer(rt->rt_node, new_node); atomic_inc(&rt->rt_ref); hlist_add_tail_rcu(&new_node->fib_hlist, h); - nip_addr_to_str(&rt->rt_dst, dst, NIP_ADDR_BIT_LEN_MAX); - nip_addr_to_str(&rt->gateway, gateway, NIP_ADDR_BIT_LEN_MAX); - nip_dbg("%s ifindex=%u (addr=%s, gateway=%s, rt_idev->refcnt=%u)", - rt->rt_idev->dev->name, rt->rt_idev->dev->ifindex, - dst, gateway, refcount_read(&rt->rt_idev->refcnt)); out: return err; diff --git a/newip/third_party/linux-5.10/net/newip/tcp_nip_output.c b/newip/third_party/linux-5.10/net/newip/tcp_nip_output.c index dcc46a7..0a62877 100644 --- a/newip/third_party/linux-5.10/net/newip/tcp_nip_output.c +++ b/newip/third_party/linux-5.10/net/newip/tcp_nip_output.c @@ -145,10 +145,9 @@ static void tcp_nip_event_new_data_sent(struct sock *sk, struct sk_buff *skb) /* check probe0 timer */ static void tcp_nip_check_probe_timer(struct sock *sk) { - unsigned long when; - if (!tcp_sk(sk)->packets_out && !inet_csk(sk)->icsk_pending) { - when = tcp_probe0_base(sk); + unsigned long when = tcp_probe0_base(sk); + nip_dbg("start probe0 timer, when=%lu, RTO MAX=%u", when, TCP_RTO_MAX); inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0, when, TCP_RTO_MAX); } else if (inet_csk(sk)->icsk_pending != ICSK_TIME_PROBE0) { -- Gitee