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>
This commit is contained in:
parent
fc300dc373
commit
8da86466b8
|
@ -42,6 +42,7 @@ enum {
|
||||||
NEIGH_VAR_MCAST_PROBES,
|
NEIGH_VAR_MCAST_PROBES,
|
||||||
NEIGH_VAR_UCAST_PROBES,
|
NEIGH_VAR_UCAST_PROBES,
|
||||||
NEIGH_VAR_APP_PROBES,
|
NEIGH_VAR_APP_PROBES,
|
||||||
|
NEIGH_VAR_MCAST_REPROBES,
|
||||||
NEIGH_VAR_RETRANS_TIME,
|
NEIGH_VAR_RETRANS_TIME,
|
||||||
NEIGH_VAR_BASE_REACHABLE_TIME,
|
NEIGH_VAR_BASE_REACHABLE_TIME,
|
||||||
NEIGH_VAR_DELAY_PROBE_TIME,
|
NEIGH_VAR_DELAY_PROBE_TIME,
|
||||||
|
|
|
@ -126,6 +126,7 @@ enum {
|
||||||
NDTPA_PROXY_QLEN, /* u32 */
|
NDTPA_PROXY_QLEN, /* u32 */
|
||||||
NDTPA_LOCKTIME, /* u64, msecs */
|
NDTPA_LOCKTIME, /* u64, msecs */
|
||||||
NDTPA_QUEUE_LENBYTES, /* u32 */
|
NDTPA_QUEUE_LENBYTES, /* u32 */
|
||||||
|
NDTPA_MCAST_REPROBES, /* u32 */
|
||||||
__NDTPA_MAX
|
__NDTPA_MAX
|
||||||
};
|
};
|
||||||
#define NDTPA_MAX (__NDTPA_MAX - 1)
|
#define NDTPA_MAX (__NDTPA_MAX - 1)
|
||||||
|
|
|
@ -817,10 +817,9 @@ out:
|
||||||
static __inline__ int neigh_max_probes(struct neighbour *n)
|
static __inline__ int neigh_max_probes(struct neighbour *n)
|
||||||
{
|
{
|
||||||
struct neigh_parms *p = n->parms;
|
struct neigh_parms *p = n->parms;
|
||||||
int max_probes = NEIGH_VAR(p, UCAST_PROBES) + NEIGH_VAR(p, APP_PROBES);
|
return NEIGH_VAR(p, UCAST_PROBES) + NEIGH_VAR(p, APP_PROBES) +
|
||||||
if (!(n->nud_state & NUD_PROBE))
|
(n->nud_state & NUD_PROBE ? NEIGH_VAR(p, MCAST_REPROBES) :
|
||||||
max_probes += NEIGH_VAR(p, MCAST_PROBES);
|
NEIGH_VAR(p, MCAST_PROBES));
|
||||||
return max_probes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void neigh_invalidate(struct neighbour *neigh)
|
static void neigh_invalidate(struct neighbour *neigh)
|
||||||
|
@ -1742,6 +1741,8 @@ static int neightbl_fill_parms(struct sk_buff *skb, struct neigh_parms *parms)
|
||||||
NEIGH_VAR(parms, UCAST_PROBES)) ||
|
NEIGH_VAR(parms, UCAST_PROBES)) ||
|
||||||
nla_put_u32(skb, NDTPA_MCAST_PROBES,
|
nla_put_u32(skb, NDTPA_MCAST_PROBES,
|
||||||
NEIGH_VAR(parms, MCAST_PROBES)) ||
|
NEIGH_VAR(parms, MCAST_PROBES)) ||
|
||||||
|
nla_put_u32(skb, NDTPA_MCAST_REPROBES,
|
||||||
|
NEIGH_VAR(parms, MCAST_REPROBES)) ||
|
||||||
nla_put_msecs(skb, NDTPA_REACHABLE_TIME, parms->reachable_time) ||
|
nla_put_msecs(skb, NDTPA_REACHABLE_TIME, parms->reachable_time) ||
|
||||||
nla_put_msecs(skb, NDTPA_BASE_REACHABLE_TIME,
|
nla_put_msecs(skb, NDTPA_BASE_REACHABLE_TIME,
|
||||||
NEIGH_VAR(parms, BASE_REACHABLE_TIME)) ||
|
NEIGH_VAR(parms, BASE_REACHABLE_TIME)) ||
|
||||||
|
@ -1901,6 +1902,7 @@ static const struct nla_policy nl_ntbl_parm_policy[NDTPA_MAX+1] = {
|
||||||
[NDTPA_APP_PROBES] = { .type = NLA_U32 },
|
[NDTPA_APP_PROBES] = { .type = NLA_U32 },
|
||||||
[NDTPA_UCAST_PROBES] = { .type = NLA_U32 },
|
[NDTPA_UCAST_PROBES] = { .type = NLA_U32 },
|
||||||
[NDTPA_MCAST_PROBES] = { .type = NLA_U32 },
|
[NDTPA_MCAST_PROBES] = { .type = NLA_U32 },
|
||||||
|
[NDTPA_MCAST_REPROBES] = { .type = NLA_U32 },
|
||||||
[NDTPA_BASE_REACHABLE_TIME] = { .type = NLA_U64 },
|
[NDTPA_BASE_REACHABLE_TIME] = { .type = NLA_U64 },
|
||||||
[NDTPA_GC_STALETIME] = { .type = NLA_U64 },
|
[NDTPA_GC_STALETIME] = { .type = NLA_U64 },
|
||||||
[NDTPA_DELAY_PROBE_TIME] = { .type = NLA_U64 },
|
[NDTPA_DELAY_PROBE_TIME] = { .type = NLA_U64 },
|
||||||
|
@ -2001,6 +2003,10 @@ static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh)
|
||||||
NEIGH_VAR_SET(p, MCAST_PROBES,
|
NEIGH_VAR_SET(p, MCAST_PROBES,
|
||||||
nla_get_u32(tbp[i]));
|
nla_get_u32(tbp[i]));
|
||||||
break;
|
break;
|
||||||
|
case NDTPA_MCAST_REPROBES:
|
||||||
|
NEIGH_VAR_SET(p, MCAST_REPROBES,
|
||||||
|
nla_get_u32(tbp[i]));
|
||||||
|
break;
|
||||||
case NDTPA_BASE_REACHABLE_TIME:
|
case NDTPA_BASE_REACHABLE_TIME:
|
||||||
NEIGH_VAR_SET(p, BASE_REACHABLE_TIME,
|
NEIGH_VAR_SET(p, BASE_REACHABLE_TIME,
|
||||||
nla_get_msecs(tbp[i]));
|
nla_get_msecs(tbp[i]));
|
||||||
|
@ -2987,6 +2993,7 @@ static struct neigh_sysctl_table {
|
||||||
NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(MCAST_PROBES, "mcast_solicit"),
|
NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(MCAST_PROBES, "mcast_solicit"),
|
||||||
NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(UCAST_PROBES, "ucast_solicit"),
|
NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(UCAST_PROBES, "ucast_solicit"),
|
||||||
NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(APP_PROBES, "app_solicit"),
|
NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(APP_PROBES, "app_solicit"),
|
||||||
|
NEIGH_SYSCTL_ZERO_INTMAX_ENTRY(MCAST_REPROBES, "mcast_resolicit"),
|
||||||
NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(RETRANS_TIME, "retrans_time"),
|
NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(RETRANS_TIME, "retrans_time"),
|
||||||
NEIGH_SYSCTL_JIFFIES_ENTRY(BASE_REACHABLE_TIME, "base_reachable_time"),
|
NEIGH_SYSCTL_JIFFIES_ENTRY(BASE_REACHABLE_TIME, "base_reachable_time"),
|
||||||
NEIGH_SYSCTL_JIFFIES_ENTRY(DELAY_PROBE_TIME, "delay_first_probe_time"),
|
NEIGH_SYSCTL_JIFFIES_ENTRY(DELAY_PROBE_TIME, "delay_first_probe_time"),
|
||||||
|
|
Loading…
Reference in a new issue