* [PATCH v13 nf-next 0/3] conntrack: bridge: add double vlan, pppoe and pppoe-in-q
@ 2025-07-04 19:11 Eric Woudstra
2025-07-04 19:11 ` [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader Eric Woudstra
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Eric Woudstra @ 2025-07-04 19:11 UTC (permalink / raw)
To: Pablo Neira Ayuso, Jozsef Kadlecsik, Nikolay Aleksandrov,
Ido Schimmel, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: netfilter-devel, bridge, netdev, Eric Woudstra
Conntrack bridge only tracks untagged and 802.1q.
To make the bridge-fastpath experience more similar to the
forward-fastpath experience, add double vlan, pppoe and pppoe-in-q
tagged packets to bridge conntrack and to bridge filter chain.
Changes in v13:
- Do not use pull/push before/after calling nf_conntrack_in() or
nft_do_chain().
- Add patch to correct calculating checksum when skb->data !=
skb_network_header(skb).
Changes in v12:
- Only allow tracking this traffic when a conntrack zone is set.
- nf_ct_bridge_pre(): skb pull/push without touching the checksum,
because the pull is always restored with push.
- nft_do_chain_bridge(): handle the extra header similar to
nf_ct_bridge_pre(), using pull/push.
Changes in v11:
- nft_do_chain_bridge(): Proper readout of encapsulated proto.
- nft_do_chain_bridge(): Use skb_set_network_header() instead of thoff.
- removed test script, it is now in separate patch.
v10 split from patch-set: bridge-fastpath and related improvements v9
Eric Woudstra (3):
netfilter: utils: nf_checksum(_partial) correct data!=networkheader
netfilter: bridge: Add conntrack double vlan and pppoe
netfilter: nft_chain_filter: Add bridge double vlan and pppoe
net/bridge/netfilter/nf_conntrack_bridge.c | 88 ++++++++++++++++++----
net/netfilter/nft_chain_filter.c | 52 ++++++++++++-
net/netfilter/utils.c | 22 ++++--
3 files changed, 139 insertions(+), 23 deletions(-)
--
2.47.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader
2025-07-04 19:11 [PATCH v13 nf-next 0/3] conntrack: bridge: add double vlan, pppoe and pppoe-in-q Eric Woudstra
@ 2025-07-04 19:11 ` Eric Woudstra
2025-07-04 19:39 ` Florian Westphal
` (2 more replies)
2025-07-04 19:11 ` [PATCH v13 nf-next 2/3] netfilter: bridge: Add conntrack double vlan and pppoe Eric Woudstra
2025-07-04 19:11 ` [PATCH v13 nf-next 3/3] netfilter: nft_chain_filter: Add bridge " Eric Woudstra
2 siblings, 3 replies; 8+ messages in thread
From: Eric Woudstra @ 2025-07-04 19:11 UTC (permalink / raw)
To: Pablo Neira Ayuso, Jozsef Kadlecsik, Nikolay Aleksandrov,
Ido Schimmel, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: netfilter-devel, bridge, netdev, Eric Woudstra
In the conntrack hook it may not always be the case that:
skb_network_header(skb) == skb->data.
This is problematic when L4 function nf_conntrack_handle_packet()
is accessing L3 data. This function uses thoff and ip_hdr()
to finds it's data. But it also calculates the checksum.
nf_checksum() and nf_checksum_partial() both use lower skb-checksum
functions that are based on using skb->data.
When skb_network_header(skb) != skb->data, adjust accordingly,
so that the checksum is calculated correctly.
Signed-off-by: Eric Woudstra <ericwouds@gmail.com>
---
net/netfilter/utils.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/net/netfilter/utils.c b/net/netfilter/utils.c
index 008419db815a..daee035c25b8 100644
--- a/net/netfilter/utils.c
+++ b/net/netfilter/utils.c
@@ -124,16 +124,21 @@ __sum16 nf_checksum(struct sk_buff *skb, unsigned int hook,
unsigned int dataoff, u8 protocol,
unsigned short family)
{
+ unsigned int nhpull = skb_network_header(skb) - skb->data;
__sum16 csum = 0;
+ if (!pskb_may_pull(skb, nhpull))
+ return -ENOMEM;
+ __skb_pull(skb, nhpull);
switch (family) {
case AF_INET:
- csum = nf_ip_checksum(skb, hook, dataoff, protocol);
+ csum = nf_ip_checksum(skb, hook, dataoff - nhpull, protocol);
break;
case AF_INET6:
- csum = nf_ip6_checksum(skb, hook, dataoff, protocol);
+ csum = nf_ip6_checksum(skb, hook, dataoff - nhpull, protocol);
break;
}
+ __skb_push(skb, nhpull);
return csum;
}
@@ -143,18 +148,23 @@ __sum16 nf_checksum_partial(struct sk_buff *skb, unsigned int hook,
unsigned int dataoff, unsigned int len,
u8 protocol, unsigned short family)
{
+ unsigned int nhpull = skb_network_header(skb) - skb->data;
__sum16 csum = 0;
+ if (!pskb_may_pull(skb, nhpull))
+ return -ENOMEM;
+ __skb_pull(skb, nhpull);
switch (family) {
case AF_INET:
- csum = nf_ip_checksum_partial(skb, hook, dataoff, len,
- protocol);
+ csum = nf_ip_checksum_partial(skb, hook, dataoff - nhpull,
+ len, protocol);
break;
case AF_INET6:
- csum = nf_ip6_checksum_partial(skb, hook, dataoff, len,
- protocol);
+ csum = nf_ip6_checksum_partial(skb, hook, dataoff - nhpull,
+ len, protocol);
break;
}
+ __skb_push(skb, nhpull);
return csum;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v13 nf-next 2/3] netfilter: bridge: Add conntrack double vlan and pppoe
2025-07-04 19:11 [PATCH v13 nf-next 0/3] conntrack: bridge: add double vlan, pppoe and pppoe-in-q Eric Woudstra
2025-07-04 19:11 ` [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader Eric Woudstra
@ 2025-07-04 19:11 ` Eric Woudstra
2025-07-04 19:11 ` [PATCH v13 nf-next 3/3] netfilter: nft_chain_filter: Add bridge " Eric Woudstra
2 siblings, 0 replies; 8+ messages in thread
From: Eric Woudstra @ 2025-07-04 19:11 UTC (permalink / raw)
To: Pablo Neira Ayuso, Jozsef Kadlecsik, Nikolay Aleksandrov,
Ido Schimmel, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: netfilter-devel, bridge, netdev, Eric Woudstra
This adds the capability to conntrack 802.1ad, QinQ, PPPoE and PPPoE-in-Q
packets that are passing a bridge, only when a conntrack zone is set.
Signed-off-by: Eric Woudstra <ericwouds@gmail.com>
---
net/bridge/netfilter/nf_conntrack_bridge.c | 88 ++++++++++++++++++----
1 file changed, 72 insertions(+), 16 deletions(-)
diff --git a/net/bridge/netfilter/nf_conntrack_bridge.c b/net/bridge/netfilter/nf_conntrack_bridge.c
index 6482de4d8750..5fcb1bdf2e31 100644
--- a/net/bridge/netfilter/nf_conntrack_bridge.c
+++ b/net/bridge/netfilter/nf_conntrack_bridge.c
@@ -242,53 +242,109 @@ static unsigned int nf_ct_bridge_pre(void *priv, struct sk_buff *skb,
{
struct nf_hook_state bridge_state = *state;
enum ip_conntrack_info ctinfo;
+ u32 len, data_len = U32_MAX;
+ int ret, offset = 0;
struct nf_conn *ct;
- u32 len;
- int ret;
+ __be16 outer_proto;
ct = nf_ct_get(skb, &ctinfo);
if ((ct && !nf_ct_is_template(ct)) ||
ctinfo == IP_CT_UNTRACKED)
return NF_ACCEPT;
+ if (ct && nf_ct_zone_id(nf_ct_zone(ct), CTINFO2DIR(ctinfo)) !=
+ NF_CT_DEFAULT_ZONE_ID) {
+ switch (skb->protocol) {
+ case htons(ETH_P_PPP_SES): {
+ struct ppp_hdr {
+ struct pppoe_hdr hdr;
+ __be16 proto;
+ } *ph;
+
+ offset = PPPOE_SES_HLEN;
+ if (!pskb_may_pull(skb, offset))
+ return NF_ACCEPT;
+ outer_proto = skb->protocol;
+ ph = (struct ppp_hdr *)(skb->data);
+ switch (ph->proto) {
+ case htons(PPP_IP):
+ skb->protocol = htons(ETH_P_IP);
+ break;
+ case htons(PPP_IPV6):
+ skb->protocol = htons(ETH_P_IPV6);
+ break;
+ default:
+ nf_ct_set(skb, NULL, IP_CT_UNTRACKED);
+ return NF_ACCEPT;
+ }
+ data_len = ntohs(ph->hdr.length) - 2;
+ skb_set_network_header(skb, offset);
+ break;
+ }
+ case htons(ETH_P_8021Q): {
+ struct vlan_hdr *vhdr;
+
+ offset = VLAN_HLEN;
+ if (!pskb_may_pull(skb, offset))
+ return NF_ACCEPT;
+ outer_proto = skb->protocol;
+ vhdr = (struct vlan_hdr *)(skb->data);
+ skb->protocol = vhdr->h_vlan_encapsulated_proto;
+ data_len = U32_MAX;
+ skb_set_network_header(skb, offset);
+ break;
+ }
+ }
+ }
+
+ ret = NF_ACCEPT;
switch (skb->protocol) {
case htons(ETH_P_IP):
- if (!pskb_may_pull(skb, sizeof(struct iphdr)))
- return NF_ACCEPT;
+ if (!pskb_may_pull(skb, offset + sizeof(struct iphdr)))
+ goto do_not_track;
len = skb_ip_totlen(skb);
- if (pskb_trim_rcsum(skb, len))
- return NF_ACCEPT;
+ if (data_len < len)
+ len = data_len;
+ if (pskb_trim_rcsum(skb, len + offset))
+ goto do_not_track;
if (nf_ct_br_ip_check(skb))
- return NF_ACCEPT;
+ goto do_not_track;
bridge_state.pf = NFPROTO_IPV4;
ret = nf_ct_br_defrag4(skb, &bridge_state);
break;
case htons(ETH_P_IPV6):
- if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
- return NF_ACCEPT;
+ if (!pskb_may_pull(skb, offset + sizeof(struct ipv6hdr)))
+ goto do_not_track;
len = sizeof(struct ipv6hdr) + ntohs(ipv6_hdr(skb)->payload_len);
- if (pskb_trim_rcsum(skb, len))
- return NF_ACCEPT;
+ if (data_len < len)
+ len = data_len;
+ if (pskb_trim_rcsum(skb, len + offset))
+ goto do_not_track;
if (nf_ct_br_ipv6_check(skb))
- return NF_ACCEPT;
+ goto do_not_track;
bridge_state.pf = NFPROTO_IPV6;
ret = nf_ct_br_defrag6(skb, &bridge_state);
break;
default:
nf_ct_set(skb, NULL, IP_CT_UNTRACKED);
- return NF_ACCEPT;
+ goto do_not_track;
}
- if (ret != NF_ACCEPT)
- return ret;
+ if (ret == NF_ACCEPT)
+ ret = nf_conntrack_in(skb, &bridge_state);
- return nf_conntrack_in(skb, &bridge_state);
+do_not_track:
+ if (offset) {
+ skb_reset_network_header(skb);
+ skb->protocol = outer_proto;
+ }
+ return ret;
}
static unsigned int nf_ct_bridge_in(void *priv, struct sk_buff *skb,
--
2.47.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v13 nf-next 3/3] netfilter: nft_chain_filter: Add bridge double vlan and pppoe
2025-07-04 19:11 [PATCH v13 nf-next 0/3] conntrack: bridge: add double vlan, pppoe and pppoe-in-q Eric Woudstra
2025-07-04 19:11 ` [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader Eric Woudstra
2025-07-04 19:11 ` [PATCH v13 nf-next 2/3] netfilter: bridge: Add conntrack double vlan and pppoe Eric Woudstra
@ 2025-07-04 19:11 ` Eric Woudstra
2025-07-04 20:02 ` Florian Westphal
2 siblings, 1 reply; 8+ messages in thread
From: Eric Woudstra @ 2025-07-04 19:11 UTC (permalink / raw)
To: Pablo Neira Ayuso, Jozsef Kadlecsik, Nikolay Aleksandrov,
Ido Schimmel, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: netfilter-devel, bridge, netdev, Eric Woudstra
This adds the capability to evaluate 802.1ad, QinQ, PPPoE and PPPoE-in-Q
packets in the bridge filter chain.
Signed-off-by: Eric Woudstra <ericwouds@gmail.com>
---
net/netfilter/nft_chain_filter.c | 52 +++++++++++++++++++++++++++++++-
1 file changed, 51 insertions(+), 1 deletion(-)
diff --git a/net/netfilter/nft_chain_filter.c b/net/netfilter/nft_chain_filter.c
index 19a553550c76..8445ddfb9cea 100644
--- a/net/netfilter/nft_chain_filter.c
+++ b/net/netfilter/nft_chain_filter.c
@@ -232,11 +232,55 @@ nft_do_chain_bridge(void *priv,
struct sk_buff *skb,
const struct nf_hook_state *state)
{
+ __be16 outer_proto, proto = 0;
struct nft_pktinfo pkt;
+ int ret, offset = 0;
nft_set_pktinfo(&pkt, skb, state);
switch (eth_hdr(skb)->h_proto) {
+ case htons(ETH_P_PPP_SES): {
+ struct ppp_hdr {
+ struct pppoe_hdr hdr;
+ __be16 proto;
+ } *ph;
+
+ if (!pskb_may_pull(skb, PPPOE_SES_HLEN))
+ break;
+ offset = PPPOE_SES_HLEN;
+ outer_proto = skb->protocol;
+ ph = (struct ppp_hdr *)(skb->data);
+ switch (ph->proto) {
+ case htons(PPP_IP):
+ proto = htons(ETH_P_IP);
+ break;
+ case htons(PPP_IPV6):
+ proto = htons(ETH_P_IPV6);
+ break;
+ }
+ skb_set_network_header(skb, offset);
+ skb->protocol = proto;
+ break;
+ }
+ case htons(ETH_P_8021Q): {
+ struct vlan_hdr *vhdr;
+
+ if (!pskb_may_pull(skb, VLAN_HLEN))
+ break;
+ offset = VLAN_HLEN;
+ outer_proto = skb->protocol;
+ vhdr = (struct vlan_hdr *)(skb->data);
+ proto = vhdr->h_vlan_encapsulated_proto;
+ skb_set_network_header(skb, offset);
+ skb->protocol = proto;
+ break;
+ }
+ default:
+ proto = eth_hdr(skb)->h_proto;
+ break;
+ }
+
+ switch (proto) {
case htons(ETH_P_IP):
nft_set_pktinfo_ipv4_validate(&pkt);
break;
@@ -248,7 +292,13 @@ nft_do_chain_bridge(void *priv,
break;
}
- return nft_do_chain(&pkt, priv);
+ ret = nft_do_chain(&pkt, priv);
+
+ if (offset) {
+ skb_reset_network_header(skb);
+ skb->protocol = outer_proto;
+ }
+ return ret;
}
static const struct nft_chain_type nft_chain_filter_bridge = {
--
2.47.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader
2025-07-04 19:11 ` [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader Eric Woudstra
@ 2025-07-04 19:39 ` Florian Westphal
2025-07-05 17:33 ` kernel test robot
2025-07-14 19:06 ` Dan Carpenter
2 siblings, 0 replies; 8+ messages in thread
From: Florian Westphal @ 2025-07-04 19:39 UTC (permalink / raw)
To: Eric Woudstra
Cc: Pablo Neira Ayuso, Jozsef Kadlecsik, Nikolay Aleksandrov,
Ido Schimmel, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman, netfilter-devel, bridge, netdev
Eric Woudstra <ericwouds@gmail.com> wrote:
> In the conntrack hook it may not always be the case that:
> skb_network_header(skb) == skb->data.
>
> This is problematic when L4 function nf_conntrack_handle_packet()
> is accessing L3 data. This function uses thoff and ip_hdr()
> to finds it's data. But it also calculates the checksum.
> nf_checksum() and nf_checksum_partial() both use lower skb-checksum
> functions that are based on using skb->data.
>
> When skb_network_header(skb) != skb->data, adjust accordingly,
> so that the checksum is calculated correctly.
>
> Signed-off-by: Eric Woudstra <ericwouds@gmail.com>
> ---
> net/netfilter/utils.c | 22 ++++++++++++++++------
> 1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/net/netfilter/utils.c b/net/netfilter/utils.c
> index 008419db815a..daee035c25b8 100644
> --- a/net/netfilter/utils.c
> +++ b/net/netfilter/utils.c
> @@ -124,16 +124,21 @@ __sum16 nf_checksum(struct sk_buff *skb, unsigned int hook,
> unsigned int dataoff, u8 protocol,
> unsigned short family)
> {
> + unsigned int nhpull = skb_network_header(skb) - skb->data;
> __sum16 csum = 0;
>
> + if (!pskb_may_pull(skb, nhpull))
> + return -ENOMEM;
Hmm. Not sure about this. We should really audit all conntrack users
to make sure the network header is in the linear area, i.e.
ip_hdr() and friends return the right value, even though skb->data !=
skb_network_header().
Such may_pull, in case of skb->head reallocation, invalidate a pointer
to e.g. ethernet header in the caller.
No idea if we have callers that do this, I did not check, but such
"hidden" pulls tend to cause hard to spot bugs.
Maybe use
if (WARN_ON_ONCE(skb_pointer_if_linear())
return 0;
instead? That allows to track down any offenders. Given conntrack
takes presence of the l3 header in the linear area for granted, I don't
see how this can ever trigger. You could also use
DEBUG_NET_WARN_ON_ONCE if you prefer, given this condition should never
be true anyway.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v13 nf-next 3/3] netfilter: nft_chain_filter: Add bridge double vlan and pppoe
2025-07-04 19:11 ` [PATCH v13 nf-next 3/3] netfilter: nft_chain_filter: Add bridge " Eric Woudstra
@ 2025-07-04 20:02 ` Florian Westphal
0 siblings, 0 replies; 8+ messages in thread
From: Florian Westphal @ 2025-07-04 20:02 UTC (permalink / raw)
To: Eric Woudstra
Cc: Pablo Neira Ayuso, Jozsef Kadlecsik, Nikolay Aleksandrov,
Ido Schimmel, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman, netfilter-devel, bridge, netdev
Eric Woudstra <ericwouds@gmail.com> wrote:
> This adds the capability to evaluate 802.1ad, QinQ, PPPoE and PPPoE-in-Q
> packets in the bridge filter chain.
>
> Signed-off-by: Eric Woudstra <ericwouds@gmail.com>
> ---
> net/netfilter/nft_chain_filter.c | 52 +++++++++++++++++++++++++++++++-
> 1 file changed, 51 insertions(+), 1 deletion(-)
>
> diff --git a/net/netfilter/nft_chain_filter.c b/net/netfilter/nft_chain_filter.c
> index 19a553550c76..8445ddfb9cea 100644
> --- a/net/netfilter/nft_chain_filter.c
> +++ b/net/netfilter/nft_chain_filter.c
> @@ -232,11 +232,55 @@ nft_do_chain_bridge(void *priv,
> struct sk_buff *skb,
> const struct nf_hook_state *state)
> {
> + __be16 outer_proto, proto = 0;
> struct nft_pktinfo pkt;
> + int ret, offset = 0;
>
> nft_set_pktinfo(&pkt, skb, state);
>
> switch (eth_hdr(skb)->h_proto) {
> + case htons(ETH_P_PPP_SES): {
> + struct ppp_hdr {
> + struct pppoe_hdr hdr;
> + __be16 proto;
> + } *ph;
> +
> + if (!pskb_may_pull(skb, PPPOE_SES_HLEN))
> + break;
> + offset = PPPOE_SES_HLEN;
> + outer_proto = skb->protocol;
> + ph = (struct ppp_hdr *)(skb->data);
> + switch (ph->proto) {
> + case htons(PPP_IP):
> + proto = htons(ETH_P_IP);
> + break;
> + case htons(PPP_IPV6):
> + proto = htons(ETH_P_IPV6);
> + break;
> + }
What if ph->proto is neither ipv4 nor ipv6? I don't think
we should clobber skb->protocol or set a new network header in that
case.
> + ret = nft_do_chain(&pkt, priv);
> +
> + if (offset) {
> + skb_reset_network_header(skb);
if ret == NF_STOLEN, skb has already been free'd or is queued
elsewhere and must not be modified anymore.
I would restrict this to ret == NF_ACCEPT.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader
2025-07-04 19:11 ` [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader Eric Woudstra
2025-07-04 19:39 ` Florian Westphal
@ 2025-07-05 17:33 ` kernel test robot
2025-07-14 19:06 ` Dan Carpenter
2 siblings, 0 replies; 8+ messages in thread
From: kernel test robot @ 2025-07-05 17:33 UTC (permalink / raw)
To: Eric Woudstra, Pablo Neira Ayuso, Jozsef Kadlecsik,
Nikolay Aleksandrov, Ido Schimmel, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Simon Horman
Cc: oe-kbuild-all, netdev, netfilter-devel, bridge, Eric Woudstra
Hi Eric,
kernel test robot noticed the following build warnings:
[auto build test WARNING on netfilter-nf/main]
[also build test WARNING on horms-ipvs/master linus/master v6.16-rc4 next-20250704]
[cannot apply to nf-next/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Eric-Woudstra/netfilter-utils-nf_checksum-_partial-correct-data-networkheader/20250705-031418
base: https://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git main
patch link: https://lore.kernel.org/r/20250704191135.1815969-2-ericwouds%40gmail.com
patch subject: [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader
config: x86_64-randconfig-121-20250705 (https://download.01.org/0day-ci/archive/20250706/202507060106.A5xgr1Rs-lkp@intel.com/config)
compiler: clang version 20.1.7 (https://github.com/llvm/llvm-project 6146a88f60492b520a36f8f8f3231e15f3cc6082)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250706/202507060106.A5xgr1Rs-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202507060106.A5xgr1Rs-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> net/netfilter/utils.c:131:24: sparse: sparse: incorrect type in return expression (different base types) @@ expected restricted __sum16 @@ got int @@
net/netfilter/utils.c:131:24: sparse: expected restricted __sum16
net/netfilter/utils.c:131:24: sparse: got int
net/netfilter/utils.c:155:24: sparse: sparse: incorrect type in return expression (different base types) @@ expected restricted __sum16 @@ got int @@
net/netfilter/utils.c:155:24: sparse: expected restricted __sum16
net/netfilter/utils.c:155:24: sparse: got int
vim +131 net/netfilter/utils.c
122
123 __sum16 nf_checksum(struct sk_buff *skb, unsigned int hook,
124 unsigned int dataoff, u8 protocol,
125 unsigned short family)
126 {
127 unsigned int nhpull = skb_network_header(skb) - skb->data;
128 __sum16 csum = 0;
129
130 if (!pskb_may_pull(skb, nhpull))
> 131 return -ENOMEM;
132 __skb_pull(skb, nhpull);
133 switch (family) {
134 case AF_INET:
135 csum = nf_ip_checksum(skb, hook, dataoff - nhpull, protocol);
136 break;
137 case AF_INET6:
138 csum = nf_ip6_checksum(skb, hook, dataoff - nhpull, protocol);
139 break;
140 }
141 __skb_push(skb, nhpull);
142
143 return csum;
144 }
145 EXPORT_SYMBOL_GPL(nf_checksum);
146
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader
2025-07-04 19:11 ` [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader Eric Woudstra
2025-07-04 19:39 ` Florian Westphal
2025-07-05 17:33 ` kernel test robot
@ 2025-07-14 19:06 ` Dan Carpenter
2 siblings, 0 replies; 8+ messages in thread
From: Dan Carpenter @ 2025-07-14 19:06 UTC (permalink / raw)
To: oe-kbuild, Eric Woudstra, Pablo Neira Ayuso, Jozsef Kadlecsik,
Nikolay Aleksandrov, Ido Schimmel, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Simon Horman
Cc: lkp, oe-kbuild-all, netdev, netfilter-devel, bridge,
Eric Woudstra
Hi Eric,
kernel test robot noticed the following build warnings:
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Eric-Woudstra/netfilter-utils-nf_checksum-_partial-correct-data-networkheader/20250705-031418
base: https://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git main
patch link: https://lore.kernel.org/r/20250704191135.1815969-2-ericwouds%40gmail.com
patch subject: [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader
config: x86_64-randconfig-r071-20250706 (https://download.01.org/0day-ci/archive/20250706/202507061710.RCwA4Kjw-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14+deb12u1) 12.2.0
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202507061710.RCwA4Kjw-lkp@intel.com/
smatch warnings:
net/netfilter/utils.c:131 nf_checksum() warn: signedness bug returning '(-12)'
net/netfilter/utils.c:155 nf_checksum_partial() warn: signedness bug returning '(-12)'
vim +131 net/netfilter/utils.c
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 123 __sum16 nf_checksum(struct sk_buff *skb, unsigned int hook,
^^^^^^^
ebee5a50d0b7cd Florian Westphal 2018-06-25 124 unsigned int dataoff, u8 protocol,
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 125 unsigned short family)
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 126 {
39644744ee13d9 Eric Woudstra 2025-07-04 127 unsigned int nhpull = skb_network_header(skb) - skb->data;
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 128 __sum16 csum = 0;
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 129
39644744ee13d9 Eric Woudstra 2025-07-04 130 if (!pskb_may_pull(skb, nhpull))
39644744ee13d9 Eric Woudstra 2025-07-04 @131 return -ENOMEM;
This -ENOMEM doesn't work because the return type is u16.
39644744ee13d9 Eric Woudstra 2025-07-04 132 __skb_pull(skb, nhpull);
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 133 switch (family) {
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 134 case AF_INET:
39644744ee13d9 Eric Woudstra 2025-07-04 135 csum = nf_ip_checksum(skb, hook, dataoff - nhpull, protocol);
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 136 break;
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 137 case AF_INET6:
39644744ee13d9 Eric Woudstra 2025-07-04 138 csum = nf_ip6_checksum(skb, hook, dataoff - nhpull, protocol);
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 139 break;
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 140 }
39644744ee13d9 Eric Woudstra 2025-07-04 141 __skb_push(skb, nhpull);
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 142
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 143 return csum;
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 144 }
ef71fe27ec2f16 Pablo Neira Ayuso 2017-11-27 145 EXPORT_SYMBOL_GPL(nf_checksum);
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 146
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 147 __sum16 nf_checksum_partial(struct sk_buff *skb, unsigned int hook,
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 148 unsigned int dataoff, unsigned int len,
ebee5a50d0b7cd Florian Westphal 2018-06-25 149 u8 protocol, unsigned short family)
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 150 {
39644744ee13d9 Eric Woudstra 2025-07-04 151 unsigned int nhpull = skb_network_header(skb) - skb->data;
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 152 __sum16 csum = 0;
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 153
39644744ee13d9 Eric Woudstra 2025-07-04 154 if (!pskb_may_pull(skb, nhpull))
39644744ee13d9 Eric Woudstra 2025-07-04 @155 return -ENOMEM;
Same.
39644744ee13d9 Eric Woudstra 2025-07-04 156 __skb_pull(skb, nhpull);
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 157 switch (family) {
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 158 case AF_INET:
39644744ee13d9 Eric Woudstra 2025-07-04 159 csum = nf_ip_checksum_partial(skb, hook, dataoff - nhpull,
39644744ee13d9 Eric Woudstra 2025-07-04 160 len, protocol);
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 161 break;
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 162 case AF_INET6:
39644744ee13d9 Eric Woudstra 2025-07-04 163 csum = nf_ip6_checksum_partial(skb, hook, dataoff - nhpull,
39644744ee13d9 Eric Woudstra 2025-07-04 164 len, protocol);
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 165 break;
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 166 }
39644744ee13d9 Eric Woudstra 2025-07-04 167 __skb_push(skb, nhpull);
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 168
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 169 return csum;
f7dcbe2f36a660 Pablo Neira Ayuso 2017-12-20 170 }
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-07-14 19:06 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-04 19:11 [PATCH v13 nf-next 0/3] conntrack: bridge: add double vlan, pppoe and pppoe-in-q Eric Woudstra
2025-07-04 19:11 ` [PATCH v13 nf-next 1/3] netfilter: utils: nf_checksum(_partial) correct data!=networkheader Eric Woudstra
2025-07-04 19:39 ` Florian Westphal
2025-07-05 17:33 ` kernel test robot
2025-07-14 19:06 ` Dan Carpenter
2025-07-04 19:11 ` [PATCH v13 nf-next 2/3] netfilter: bridge: Add conntrack double vlan and pppoe Eric Woudstra
2025-07-04 19:11 ` [PATCH v13 nf-next 3/3] netfilter: nft_chain_filter: Add bridge " Eric Woudstra
2025-07-04 20:02 ` Florian Westphal
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).