From 1fa60e0f49d99de1418ed75efe79b17381c495bc Mon Sep 17 00:00:00 2001 From: yangyanjun Date: Mon, 28 Nov 2022 10:12:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BA=8C=E5=B1=82=E9=93=BE?= =?UTF-8?q?=E8=B7=AF=E4=B8=AD=E6=96=AD=E5=90=8E=EF=BC=8Cdst=20=E7=9A=84?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E8=AE=A1=E6=95=B0=E5=87=8F=E4=B8=8D=E4=B8=8B?= =?UTF-8?q?=E5=8E=BB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangyanjun --- src/linux/net/newip/route.c | 21 +++++++++++++++++++++ src/linux/net/newip/tcp_nip.c | 11 +++++++++++ src/linux/net/newip/tcp_nip_input.c | 3 +++ 3 files changed, 35 insertions(+) diff --git a/src/linux/net/newip/route.c b/src/linux/net/newip/route.c index a7acfd3..caedcf8 100644 --- a/src/linux/net/newip/route.c +++ b/src/linux/net/newip/route.c @@ -657,6 +657,8 @@ static struct neighbour *nip_neigh_lookup(const struct dst_entry *dst, static struct dst_entry *nip_dst_check(struct dst_entry *dst, u32 cookie) { + if (dst->obsolete != DST_OBSOLETE_FORCE_CHK) + return NULL; return dst; } @@ -689,9 +691,28 @@ static unsigned int nip_mtu(const struct dst_entry *dst) return mtu; } +static void nip_dst_ifdown(struct dst_entry *dst, struct net_device *dev, + int how) +{ + struct nip_rt_info *rt = (struct nip_rt_info *)dst; + struct ninet_dev *idev = rt->rt_idev; + struct net_device *loopback_dev = + dev_net(dev)->loopback_dev; + + if (idev && idev->dev != loopback_dev) { + struct ninet_dev *loopback_idev = nin_dev_get(loopback_dev); + + if (loopback_idev) { + rt->rt_idev = loopback_idev; + nin_dev_put(idev); + } + } +} + static struct dst_ops nip_dst_ops_template = { .family = AF_NINET, .destroy = nip_dst_destroy, + .ifdown = nip_dst_ifdown, .neigh_lookup = nip_neigh_lookup, .check = nip_dst_check, .default_advmss = nip_default_advmss, diff --git a/src/linux/net/newip/tcp_nip.c b/src/linux/net/newip/tcp_nip.c index 922ff08..dca3771 100644 --- a/src/linux/net/newip/tcp_nip.c +++ b/src/linux/net/newip/tcp_nip.c @@ -1300,6 +1300,15 @@ static int tcp_nip_do_rcv(struct sock *sk, struct sk_buff *skb) DEBUG("%s: received newip tcp skb, sk_state=%d", __func__, sk->sk_state); if (sk->sk_state == TCP_ESTABLISHED) { + struct dst_entry *dst = sk->sk_rx_dst; + + if (dst) { + if (inet_sk(sk)->rx_dst_ifindex != skb->skb_iif || + !dst->ops->check(dst, 0)) { + dst_release(dst); + sk->sk_rx_dst = NULL; + } + } tcp_nip_rcv_established(sk, skb, tcp_hdr(skb), skb->len); return 0; } @@ -1517,6 +1526,8 @@ static void tcp_nip_early_demux(struct sk_buff *skb) if (sk_fullsock(sk)) { struct dst_entry *dst = READ_ONCE(sk->sk_rx_dst); + if (dst) + dst = dst_check(dst, 0); if (dst && inet_sk(sk)->rx_dst_ifindex == skb->skb_iif) { DEBUG("%s: find sock in ehash, set dst for skb", __func__); diff --git a/src/linux/net/newip/tcp_nip_input.c b/src/linux/net/newip/tcp_nip_input.c index 1b01ce1..c407b77 100644 --- a/src/linux/net/newip/tcp_nip_input.c +++ b/src/linux/net/newip/tcp_nip_input.c @@ -1293,6 +1293,9 @@ void tcp_nip_rcv_established(struct sock *sk, struct sk_buff *skb, struct tcp_sock *tp = tcp_sk(sk); tcp_mstamp_refresh(tp); + if (unlikely(!sk->sk_rx_dst)) + inet_csk(sk)->icsk_af_ops->sk_rx_dst_set(sk, skb); + if (!tcp_nip_validate_incoming(sk, skb, th, 1)) return; -- Gitee