summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2026-03-02 19:39:33 +0300
committerJakub Kicinski <kuba@kernel.org>2026-03-05 03:51:10 +0300
commitc26b8c4e291c55c7b2138d7bcb27348ca3a5ae59 (patch)
treedb9a44805f438b49c9272ef9e93e1f665396a375 /include
parent98d95000bb1207f86a0e5876755ac2308ac86d2d (diff)
downloadlinux-c26b8c4e291c55c7b2138d7bcb27348ca3a5ae59.tar.xz
net: fix off-by-one in udp_flow_src_port() / psp_write_headers()
udp_flow_src_port() and psp_write_headers() use ip_local_port_range. ip_local_port_range is inclusive : all ports between min and max can be used. Before this patch, if ip_local_port_range was set to 40000-40001 40001 would not be used as a source port. Use reciprocal_scale() to help code readability. Not tagged for stable trees, as this change could break user expectations. Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Willem de Bruijn <willemb@google.com> Link: https://patch.msgid.link/20260302163933.1754393-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'include')
-rw-r--r--include/net/udp.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/include/net/udp.h b/include/net/udp.h
index da68702ddf6e..b648003e5792 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -29,6 +29,7 @@
#include <linux/seq_file.h>
#include <linux/poll.h>
#include <linux/indirect_call_wrapper.h>
+#include <linux/math.h>
/**
* struct udp_skb_cb - UDP(-Lite) private variables
@@ -376,7 +377,7 @@ static inline __be16 udp_flow_src_port(struct net *net, struct sk_buff *skb,
*/
hash ^= hash << 16;
- return htons((((u64) hash * (max - min)) >> 32) + min);
+ return htons(reciprocal_scale(hash, max - min + 1) + min);
}
static inline int udp_rqueue_get(struct sock *sk)