From: Jakub Kicinski <kuba@kernel.org>
To: Brian Haley <haleyb.dev@gmail.com>
Cc: davem@davemloft.net, edumazet@google.com, pabeni@redhat.com,
netdev@vger.kernel.org
Subject: Re: [PATCH net-next] neighbor: fix proxy_delay usage when it is zero
Date: Tue, 24 Jan 2023 20:30:59 -0800 [thread overview]
Message-ID: <20230124203059.59cdb789@kernel.org> (raw)
In-Reply-To: <20230123185829.238909-1-haleyb.dev@gmail.com>
On Mon, 23 Jan 2023 13:58:29 -0500 Brian Haley wrote:
> When set to zero, the neighbor sysctl proxy_delay value
> does not cause an immediate reply for ARP/ND requests
> as expected, it instead causes a random delay between
> [0, U32_MAX]. Looking at this comment from
> __get_random_u32_below() explains the reason:
>
> /*
> * This function is technically undefined for ceil == 0, and in fact
> * for the non-underscored constant version in the header, we build bug
> * on that. But for the non-constant case, it's convenient to have that
> * evaluate to being a straight call to get_random_u32(), so that
> * get_random_u32_inclusive() can work over its whole range without
> * undefined behavior.
> */
>
> Added helper function that does not call get_random_u32_below()
> if proxy_delay is zero and just uses the current value of
> jiffies instead, causing pneigh_enqueue() to respond
> immediately.
>
> Also added definition of proxy_delay to ip-sysctl.txt since
> it was missing.
Sounds like this never worked, until commit a533b70a657c ("net:
neighbor: fix a crash caused by mod zero") it crashed, now it
does something silly. Can we instead reject 0 as invalid input
during configuration?
> diff --git a/Documentation/networking/ip-sysctl.rst b/Documentation/networking/ip-sysctl.rst
> index 7fbd060d6047..34183fb38b20 100644
> --- a/Documentation/networking/ip-sysctl.rst
> +++ b/Documentation/networking/ip-sysctl.rst
> @@ -1589,6 +1589,12 @@ proxy_arp_pvlan - BOOLEAN
> Hewlett-Packard call it Source-Port filtering or port-isolation.
> Ericsson call it MAC-Forced Forwarding (RFC Draft).
>
> +proxy_delay - INTEGER
> + Delay proxy response.
> +
> + The maximum number of jiffies to delay a response to a neighbor
> + solicitation when proxy_arp or proxy_ndp is enabled. Defaults to 80.
Is there a better way of expressing the fact that we always
choose a value lower than proxy_delay ? Maximum sounds a bit
like we'd do:
when = jiffies + random() % (proxy_delay + 1);
> shared_media - BOOLEAN
> Send(router) or accept(host) RFC1620 shared media redirects.
> Overrides secure_redirects.
> diff --git a/net/core/neighbour.c b/net/core/neighbour.c
> index f00a79fc301b..8bd8aaae6d5e 100644
> --- a/net/core/neighbour.c
> +++ b/net/core/neighbour.c
> @@ -1662,11 +1662,22 @@ static void neigh_proxy_process(struct timer_list *t)
> spin_unlock(&tbl->proxy_queue.lock);
> }
>
> +static __inline__ unsigned long neigh_proxy_delay(struct neigh_parms *p)
Drop the inline please, it's pointless for a tiny static function
> +{
> + /*
did you run checkpatch?
> + * If proxy_delay is zero, do not call get_random_u32_below()
> + * as it is undefined behavior.
> + */
> + unsigned long proxy_delay = NEIGH_VAR(p, PROXY_DELAY);
empty line here
> + return proxy_delay ?
> + jiffies + get_random_u32_below(NEIGH_VAR(p, PROXY_DELAY)) :
also - since you have proxy_delay in a local variable why not use it
> + jiffies;
> +}
> +
> void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
> struct sk_buff *skb)
> {
> - unsigned long sched_next = jiffies +
> - get_random_u32_below(NEIGH_VAR(p, PROXY_DELAY));
> + unsigned long sched_next = neigh_proxy_delay(p);
>
> if (p->qlen > NEIGH_VAR(p, PROXY_QLEN)) {
> kfree_skb(skb);
next prev parent reply other threads:[~2023-01-25 4:31 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-23 18:58 [PATCH net-next] neighbor: fix proxy_delay usage when it is zero Brian Haley
2023-01-25 4:30 ` Jakub Kicinski [this message]
2023-01-25 19:50 ` Brian Haley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230124203059.59cdb789@kernel.org \
--to=kuba@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=haleyb.dev@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.