[Feature] Merge MR0.5 from MTK
Change-Id: I77f817d2d58dfa7a69b4af32123f2929c724356e
diff --git a/src/kernel/linux/v4.19/net/ipv6/addrconf.c b/src/kernel/linux/v4.19/net/ipv6/addrconf.c
index 8fb4986..36168fd 100644
--- a/src/kernel/linux/v4.19/net/ipv6/addrconf.c
+++ b/src/kernel/linux/v4.19/net/ipv6/addrconf.c
@@ -95,7 +95,7 @@
#include <linux/export.h>
#define INFINITY_LIFE_TIME 0xFFFFFFFF
-
+#define RTR_SOLICITS_MAX 3
#define IPV6_MAX_STRLEN \
sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")
@@ -322,9 +322,9 @@
unsigned int flag = 1;
struct in6_addr addr;
-
- if (sysctl_optr == MTK_IPV6_VZW_ALL ||
- sysctl_optr == MTK_IPV6_EX_RS_INTERVAL) {
+ if ((sysctl_optr == MTK_IPV6_VZW_ALL ||
+ sysctl_optr == MTK_IPV6_EX_RS_INTERVAL) &&
+ (strncmp(idev->dev->name, "ccmni", 2) == 0)) {
/*This ifi_flags refers to the dev flag in kernel,
*but hereI use it as a valid flag. When ifi_flags
*is zero , it means RA refesh Fail, And When
@@ -3943,7 +3943,12 @@
/* Announcement received after solicitation was sent */
if (idev->if_flags & IF_RA_RCVD)
goto out;
-
+ if (idev->rs_probes == RTR_SOLICITS_MAX &&
+ (idev->if_flags & IF_RS_VZW_SENT)) {
+ idev->if_flags &= ~IF_RS_VZW_SENT;
+ inet6_no_ra_notify(RTM_DELADDR, idev);
+ goto out;
+ }
if (idev->rs_probes++ < idev->cnf.rtr_solicits || idev->cnf.rtr_solicits < 0) {
write_unlock(&idev->lock);
if (!ipv6_get_lladdr(dev, &lladdr, IFA_F_TENTATIVE))
@@ -3968,13 +3973,6 @@
idev->cnf.rtr_solicit_delay :
idev->rs_interval);
} else {
- inet6_no_ra_notify(RTM_DELADDR, idev);
- if (sysctl_optr == MTK_IPV6_VZW_ALL ||
- sysctl_optr == MTK_IPV6_EX_RS_INTERVAL) {
- /*add for VzW feature : remove IF_RS_VZW_SENT flag*/
- if (idev->if_flags & IF_RS_VZW_SENT)
- idev->if_flags &= ~IF_RS_VZW_SENT;
- }
/*
* Note: we do not support deprecated "all on-link"
* assumption any longer.
@@ -4589,9 +4587,9 @@
unsigned long age;
u32 min_lft;
struct fib6_info *rt = NULL;
-
- if (sysctl_optr == MTK_IPV6_VZW_ALL ||
- sysctl_optr == MTK_IPV6_EX_RS_INTERVAL)
+ if ((sysctl_optr == MTK_IPV6_VZW_ALL ||
+ sysctl_optr == MTK_IPV6_EX_RS_INTERVAL) &&
+ (strncmp(ifp->idev->dev->name, "ccmni", 2) == 0))
rt = calc_lft_vzw(ifp, &min_lft);
/* When setting preferred_lft to a value not zero or
* infinity, while valid_lft is infinity
@@ -4612,8 +4610,10 @@
ipv6_del_addr(ifp);
goto restart;
} else if (ifp->prefered_lft == INFINITY_LIFE_TIME) {
- if (sysctl_optr == MTK_IPV6_VZW_ALL ||
- sysctl_optr == MTK_IPV6_EX_RS_INTERVAL) {
+ if ((sysctl_optr == MTK_IPV6_VZW_ALL ||
+ sysctl_optr == MTK_IPV6_EX_RS_INTERVAL) &&
+ (strncmp(ifp->idev->dev->name,
+ "ccmni", 2) == 0)) {
/*Patch for VzW
*prefered_lft is INFINITY scenario
*ccmni interface will send RS when
@@ -4679,8 +4679,10 @@
/* ifp->prefered_lft <= ifp->valid_lft */
if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next))
next = ifp->tstamp + ifp->prefered_lft * HZ;
- if (sysctl_optr == MTK_IPV6_VZW_ALL ||
- sysctl_optr == MTK_IPV6_EX_RS_INTERVAL) {
+ if ((sysctl_optr == MTK_IPV6_VZW_ALL ||
+ sysctl_optr == MTK_IPV6_EX_RS_INTERVAL) &&
+ (strncmp(ifp->idev->dev->name,
+ "ccmni", 2) == 0)) {
/*patch for VzW
*prefered_lft is NOT INFINITY scenario
*ccmni interface will send RS when time