[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