aboutsummaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorYOSHIFUJI Hideaki/吉藤英明 <hideaki.yoshifuji@miraclelinux.com>2015-03-19 09:41:46 -0400
committerDavid S. Miller <davem@davemloft.net>2015-03-20 21:47:40 -0400
commit8da86466b83787df0d4b89ec81c310de072d101c (patch)
tree496f60fc435a832ff6e764c02c2cea9f9befebc4 /net/core
parentfc300dc3733fdc328e6e10c7b8379b60c26cd648 (diff)
net: neighbour: Add mcast_resolicit to configure the number of multicast resolicitations in PROBE state.
We send unicast neighbor (ARP or NDP) solicitations ucast_probes times in PROBE state. Zhu Yanjun reported that some implementation does not reply against them and the entry will become FAILED, which is undesirable. We had been dealt with such nodes by sending multicast probes mcast_ solicit times after unicast probes in PROBE state. In 2003, I made a change not to send them to improve compatibility with IPv6 NDP. Let's introduce per-protocol per-interface sysctl knob "mcast_ reprobe" to configure the number of multicast (re)solicitation for reconfirmation in PROBE state. The default is 0, since we have been doing so for 10+ years. Reported-by: Zhu Yanjun <Yanjun.Zhu@windriver.com> CC: Ulf Samuelsson <ulf.samuelsson@ericsson.com> Signed-off-by: YOSHIFUJI Hideaki <hideaki.yoshifuji@miraclelinux.com> Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/neighbour.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 0e8b32efc031..3de654256028 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -817,10 +817,9 @@ out:
817static __inline__ int neigh_max_probes(struct neighbour *n) 817static __inline__ int neigh_max_probes(struct neighbour *n)
818{ 818{
819 struct neigh_parms *p = n->parms; 819 struct neigh_parms *p = n->parms;
820 int max_probes = NEIGH_VAR(p, UCAST_PROBES) + NEIGH_VAR(p, APP_PROBES); 820 return NEIGH_VAR(p, UCAST_PROBES) + NEIGH_VAR(p, APP_PROBES) +
821 if (!(n->nud_state & NUD_PROBE)) 821 (n->nud_state & NUD_PROBE ? NEIGH_VAR(p, MCAST_REPROBES) :
822 max_probes += NEIGH_VAR(p, MCAST_PROBES); 822 NEIGH_VAR(p, MCAST_PROBES));
823 return max_probes;
824} 823}
825 824
826static void neigh_invalidate(struct neighbour *neigh) 825static void neigh_invalidate(struct neighbour *neigh)
@@ -1742,6 +1741,8 @@ static int neightbl_fill_parms(struct sk_buff *skb, struct neigh_parms *parms)
1742 NEIGH_VAR(parms, UCAST_PROBES)) || 1741 NEIGH_VAR(parms, UCAST_PROBES)) ||
1743 nla_put_u32(skb, NDTPA_MCAST_PROBES, 1742 nla_put_u32(skb, NDTPA_MCAST_PROBES,
1744 NEIGH_VAR(parms, MCAST_PROBES)) || 1743 NEIGH_VAR(parms, MCAST_PROBES)) ||
1744 nla_put_u32(skb, NDTPA_MCAST_REPROBES,
1745 NEIGH_VAR(parms, MCAST_REPROBES)) ||
1745 nla_put_msecs(skb, NDTPA_REACHABLE_TIME, parms->reachable_time) || 1746 nla_put_msecs(skb, NDTPA_REACHABLE_TIME, parms->reachable_time) ||
1746 nla_put_msecs(skb, NDTPA_BASE_REACHABLE_TIME, 1747 nla_put_msecs(skb, NDTPA_BASE_REACHABLE_TIME,
1747 NEIGH_VAR(parms, BASE_REACHABLE_TIME)) || 1748 NEIGH_VAR(parms, BASE_REACHABLE_TIME)) ||
@@ -1901,6 +1902,7 @@ static const struct nla_policy nl_ntbl_parm_policy[NDTPA_MAX+1] = {
1901 [NDTPA_APP_PROBES] = { .type = NLA_U32 }, 1902 [NDTPA_APP_PROBES] = { .type = NLA_U32 },
1902 [NDTPA_UCAST_PROBES] = { .type = NLA_U32 }, 1903 [NDTPA_UCAST_PROBES] = { .type = NLA_U32 },
1903 [NDTPA_MCAST_PROBES] = { .type = NLA_U32 }, 1904 [NDTPA_MCAST_PROBES] = { .type = NLA_U32 },
1905 [NDTPA_MCAST_REPROBES] = { .type = NLA_U32 },
1904 [NDTPA_BASE_REACHABLE_TIME] = { .type = NLA_U64 }, 1906 [NDTPA_BASE_REACHABLE_TIME] = { .type = NLA_U64 },
1905 [NDTPA_GC_STALETIME] = { .type = NLA_U64 }, 1907 [NDTPA_GC_STALETIME] = { .type = NLA_U64 },
1906 [NDTPA_DELAY_PROBE_TIME] = { .type = NLA_U64 }, 1908 [NDTPA_DELAY_PROBE_TIME] = { .type = NLA_U64 },
@@ -2001,6 +2003,10 @@ static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh)
2001 NEIGH_VAR_SET(p, MCAST_PROBES, 2003 NEIGH_VAR_SET(p, MCAST_PROBES,
2002 nla_get_u32(tbp[i])); 2004 nla_get_u32(tbp[i]));
2003 break; 2005 break;
2006 case NDTPA_MCAST_REPROBES:
2007 NEIGH_VAR_SET(p, MCAST_REPROBES,
2008 nla_get_u32(tbp[i]));
2009 break;
2004 case NDTPA_BASE_REACHABLE_TIME: 2010 case NDTPA_BASE_REACHABLE_TIME:
2005 NEIGH_VAR_SET(p, BASE_REACHABLE_TIME, 2011 NEIGH_VAR_SET(p, BASE_REACHABLE_TIME,
2006 nla_get_msecs(tbp[i])); 2012 nla_get_msecs(tbp[i]));
@@ -2987,6 +2993,7 @@ static struct neigh_sysctl_table {
2987 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(MCAST_PROBES, "mcast_solicit"), 2993 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(MCAST_PROBES, "mcast_solicit"),
2988 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(UCAST_PROBES, "ucast_solicit"), 2994 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(UCAST_PROBES, "ucast_solicit"),
2989 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(APP_PROBES, "app_solicit"), 2995 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(APP_PROBES, "app_solicit"),
2996 NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(MCAST_REPROBES, "mcast_resolicit"),
2990 NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(RETRANS_TIME, "retrans_time"), 2997 NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(RETRANS_TIME, "retrans_time"),
2991 NEIGH_SYSCTL_JIFFIES_ENTRY(BASE_REACHABLE_TIME, "base_reachable_time"), 2998 NEIGH_SYSCTL_JIFFIES_ENTRY(BASE_REACHABLE_TIME, "base_reachable_time"),
2992 NEIGH_SYSCTL_JIFFIES_ENTRY(DELAY_PROBE_TIME, "delay_first_probe_time"), 2999 NEIGH_SYSCTL_JIFFIES_ENTRY(DELAY_PROBE_TIME, "delay_first_probe_time"),