* [RFC ipsec-next 0/3] xfrm: policy: replace session decode with flow dissector
@ 2023-09-08 12:06 Florian Westphal
2023-09-08 12:06 ` [RFC ipsec-next 1/3] xfrm: move mark and oif flowi decode into common code Florian Westphal
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Florian Westphal @ 2023-09-08 12:06 UTC (permalink / raw)
To: netdev; +Cc: steffen.klassert, herbert, Florian Westphal
RFC, its only lightly tested, if at all.
This replaces the ipv4+ipv6 session decode functions in xfrm
with a flow dissector description and then uses that to populate
the flowi.
Main drawback is that if we don't want to break MOBIKE the
flow dissector needs more bloat to get to the mh_type from
the ipv6 mobility extension header.
Comments welcome, mainly sent for the sake of next weeks
IPSec workshop.
Florian Westphal (3):
xfrm: move mark and oif flowi decode into common code
flow_dissector: add ipv6 mobility header support
xfrm: policy: replace session decode with flow dissector
include/net/flow_dissector.h | 5 +
net/core/flow_dissector.c | 27 ++++
net/xfrm/xfrm_policy.c | 290 +++++++++++++++--------------------
3 files changed, 152 insertions(+), 170 deletions(-)
--
2.41.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [RFC ipsec-next 1/3] xfrm: move mark and oif flowi decode into common code
2023-09-08 12:06 [RFC ipsec-next 0/3] xfrm: policy: replace session decode with flow dissector Florian Westphal
@ 2023-09-08 12:06 ` Florian Westphal
2023-09-08 12:06 ` [RFC ipsec-next 2/3] flow_dissector: add ipv6 mobility header support Florian Westphal
2023-09-08 12:06 ` [RFC ipsec-next 3/3] xfrm: policy: replace session decode with flow dissector Florian Westphal
2 siblings, 0 replies; 5+ messages in thread
From: Florian Westphal @ 2023-09-08 12:06 UTC (permalink / raw)
To: netdev; +Cc: steffen.klassert, herbert, Florian Westphal
flowi4_oif/flowi6_oif and mark are aliased to flowi_common field, i.e.
all can be used interchangeably.
Instead of duplicating place this in common code.
Signed-off-by: Florian Westphal <fw@strlen.de>
---
net/xfrm/xfrm_policy.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index d6b405782b63..5efdd20a4fb6 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -3373,14 +3373,8 @@ decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
int ihl = iph->ihl;
u8 *xprth = skb_network_header(skb) + ihl * 4;
struct flowi4 *fl4 = &fl->u.ip4;
- int oif = 0;
-
- if (skb_dst(skb) && skb_dst(skb)->dev)
- oif = skb_dst(skb)->dev->ifindex;
memset(fl4, 0, sizeof(struct flowi4));
- fl4->flowi4_mark = skb->mark;
- fl4->flowi4_oif = reverse ? skb->skb_iif : oif;
fl4->flowi4_proto = iph->protocol;
fl4->daddr = reverse ? iph->saddr : iph->daddr;
@@ -3451,7 +3445,6 @@ decode_session6(struct sk_buff *skb, struct flowi *fl, bool reverse)
struct ipv6_opt_hdr *exthdr;
const unsigned char *nh = skb_network_header(skb);
u16 nhoff = IP6CB(skb)->nhoff;
- int oif = 0;
u8 nexthdr;
if (!nhoff)
@@ -3459,12 +3452,7 @@ decode_session6(struct sk_buff *skb, struct flowi *fl, bool reverse)
nexthdr = nh[nhoff];
- if (skb_dst(skb) && skb_dst(skb)->dev)
- oif = skb_dst(skb)->dev->ifindex;
-
memset(fl6, 0, sizeof(struct flowi6));
- fl6->flowi6_mark = skb->mark;
- fl6->flowi6_oif = reverse ? skb->skb_iif : oif;
fl6->daddr = reverse ? hdr->saddr : hdr->daddr;
fl6->saddr = reverse ? hdr->daddr : hdr->saddr;
@@ -3570,6 +3558,18 @@ int __xfrm_decode_session(struct sk_buff *skb, struct flowi *fl,
return -EAFNOSUPPORT;
}
+ fl->flowi_mark = skb->mark;
+ if (reverse) {
+ fl->flowi_oif = skb->skb_iif;
+ } else {
+ int oif = 0;
+
+ if (skb_dst(skb) && skb_dst(skb)->dev)
+ oif = skb_dst(skb)->dev->ifindex;
+
+ fl->flowi_oif = oif;
+ }
+
return security_xfrm_decode_session(skb, &fl->flowi_secid);
}
EXPORT_SYMBOL(__xfrm_decode_session);
--
2.41.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [RFC ipsec-next 2/3] flow_dissector: add ipv6 mobility header support
2023-09-08 12:06 [RFC ipsec-next 0/3] xfrm: policy: replace session decode with flow dissector Florian Westphal
2023-09-08 12:06 ` [RFC ipsec-next 1/3] xfrm: move mark and oif flowi decode into common code Florian Westphal
@ 2023-09-08 12:06 ` Florian Westphal
2023-09-08 12:06 ` [RFC ipsec-next 3/3] xfrm: policy: replace session decode with flow dissector Florian Westphal
2 siblings, 0 replies; 5+ messages in thread
From: Florian Westphal @ 2023-09-08 12:06 UTC (permalink / raw)
To: netdev; +Cc: steffen.klassert, herbert, Florian Westphal
Needed to replace xfrm home-grown decoder with the flow dissector if we
don't want to lose functionality.
Alternative is to drop mobility header support and see if
anyone complains.
Signed-off-by: Florian Westphal <fw@strlen.de>
---
include/net/flow_dissector.h | 5 +++++
net/core/flow_dissector.c | 27 +++++++++++++++++++++++++++
2 files changed, 32 insertions(+)
diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h
index 1a7131d6cb0e..a82b7039d755 100644
--- a/include/net/flow_dissector.h
+++ b/include/net/flow_dissector.h
@@ -329,6 +329,10 @@ struct flow_dissector_key_cfm {
#define FLOW_DIS_CFM_MDL_MASK GENMASK(7, 5)
#define FLOW_DIS_CFM_MDL_MAX 7
+struct flow_dissector_ipv6_mh {
+ u8 mh_type;
+};
+
enum flow_dissector_key_id {
FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */
FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
@@ -363,6 +367,7 @@ enum flow_dissector_key_id {
FLOW_DISSECTOR_KEY_L2TPV3, /* struct flow_dissector_key_l2tpv3 */
FLOW_DISSECTOR_KEY_CFM, /* struct flow_dissector_key_cfm */
FLOW_DISSECTOR_KEY_IPSEC, /* struct flow_dissector_key_ipsec */
+ FLOW_DISSECTOR_KEY_IPV6MH, /* struct flow_dissector_ipv6_mh */
FLOW_DISSECTOR_KEY_MAX,
};
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
index 89d15ceaf9af..6dcd608f8da6 100644
--- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c
@@ -1531,6 +1531,33 @@ bool __skb_flow_dissect(const struct net *net,
fdret = FLOW_DISSECT_RET_IPPROTO_AGAIN;
break;
}
+ case NEXTHDR_MOBILITY: {
+ struct flow_dissector_ipv6_mh *key_ipv6mh;
+ u8 _opthdr[3], *opthdr;
+
+ if (proto != htons(ETH_P_IPV6))
+ break;
+
+ opthdr = __skb_header_pointer(skb, nhoff, sizeof(_opthdr),
+ data, hlen, &_opthdr);
+ if (!opthdr) {
+ fdret = FLOW_DISSECT_RET_OUT_BAD;
+ break;
+ }
+
+ if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_IPV6MH))
+ break;
+
+ key_ipv6mh = skb_flow_dissector_target(flow_dissector,
+ FLOW_DISSECTOR_KEY_IPV6MH,
+ target_container);
+ ip_proto = opthdr[0];
+ nhoff += (opthdr[1] + 1) << 3;
+ key_ipv6mh->mh_type = opthdr[2];
+
+ fdret = FLOW_DISSECT_RET_OUT_GOOD;
+ break;
+ }
case NEXTHDR_FRAGMENT: {
struct frag_hdr _fh, *fh;
--
2.41.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [RFC ipsec-next 3/3] xfrm: policy: replace session decode with flow dissector
2023-09-08 12:06 [RFC ipsec-next 0/3] xfrm: policy: replace session decode with flow dissector Florian Westphal
2023-09-08 12:06 ` [RFC ipsec-next 1/3] xfrm: move mark and oif flowi decode into common code Florian Westphal
2023-09-08 12:06 ` [RFC ipsec-next 2/3] flow_dissector: add ipv6 mobility header support Florian Westphal
@ 2023-09-08 12:06 ` Florian Westphal
2023-09-09 22:30 ` kernel test robot
2 siblings, 1 reply; 5+ messages in thread
From: Florian Westphal @ 2023-09-08 12:06 UTC (permalink / raw)
To: netdev; +Cc: steffen.klassert, herbert, Florian Westphal
xfrm needs to populate ipv4/v6 flow struct for route lookup.
In the past there were several bugs in this code:
- callers that forget to reload header pointers after
xfrm_decode_session() (it may pull headers).
- access past the linear header area
Meanwhile network core gained a packet dissector as well.
This switches xfrm to the generic flow dissector.
Signed-off-by: Florian Westphal <fw@strlen.de>
---
net/xfrm/xfrm_policy.c | 266 +++++++++++++++++------------------------
1 file changed, 108 insertions(+), 158 deletions(-)
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index 5efdd20a4fb6..2d90eb4e2d31 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -149,6 +149,23 @@ struct xfrm_pol_inexact_candidates {
struct hlist_head *res[XFRM_POL_CAND_MAX];
};
+struct xfrm_flow_keys {
+ struct flow_dissector_key_basic basic;
+ struct flow_dissector_key_control control;
+ union {
+ struct flow_dissector_key_ipv4_addrs ipv4;
+ struct flow_dissector_key_ipv6_addrs ipv6;
+ } addrs;
+ struct flow_dissector_key_ip ip;
+ struct flow_dissector_key_tags tags;
+ struct flow_dissector_key_icmp icmp;
+ struct flow_dissector_key_ports ports;
+ struct flow_dissector_key_keyid gre;
+ struct flow_dissector_ipv6_mh ipv6mh;
+};
+
+static struct flow_dissector xfrm_session_dissector __ro_after_init;
+
static DEFINE_SPINLOCK(xfrm_if_cb_lock);
static struct xfrm_if_cb const __rcu *xfrm_if_cb __read_mostly;
@@ -3367,191 +3384,77 @@ xfrm_policy_ok(const struct xfrm_tmpl *tmpl, const struct sec_path *sp, int star
}
static void
-decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
+decode_session4(const struct xfrm_flow_keys *flkeys, struct flowi *fl, bool reverse)
{
- const struct iphdr *iph = ip_hdr(skb);
- int ihl = iph->ihl;
- u8 *xprth = skb_network_header(skb) + ihl * 4;
struct flowi4 *fl4 = &fl->u.ip4;
memset(fl4, 0, sizeof(struct flowi4));
- fl4->flowi4_proto = iph->protocol;
- fl4->daddr = reverse ? iph->saddr : iph->daddr;
- fl4->saddr = reverse ? iph->daddr : iph->saddr;
- fl4->flowi4_tos = iph->tos & ~INET_ECN_MASK;
-
- if (!ip_is_fragment(iph)) {
- switch (iph->protocol) {
- case IPPROTO_UDP:
- case IPPROTO_UDPLITE:
- case IPPROTO_TCP:
- case IPPROTO_SCTP:
- case IPPROTO_DCCP:
- if (xprth + 4 < skb->data ||
- pskb_may_pull(skb, xprth + 4 - skb->data)) {
- __be16 *ports;
-
- xprth = skb_network_header(skb) + ihl * 4;
- ports = (__be16 *)xprth;
-
- fl4->fl4_sport = ports[!!reverse];
- fl4->fl4_dport = ports[!reverse];
- }
- break;
- case IPPROTO_ICMP:
- if (xprth + 2 < skb->data ||
- pskb_may_pull(skb, xprth + 2 - skb->data)) {
- u8 *icmp;
-
- xprth = skb_network_header(skb) + ihl * 4;
- icmp = xprth;
-
- fl4->fl4_icmp_type = icmp[0];
- fl4->fl4_icmp_code = icmp[1];
- }
- break;
- case IPPROTO_GRE:
- if (xprth + 12 < skb->data ||
- pskb_may_pull(skb, xprth + 12 - skb->data)) {
- __be16 *greflags;
- __be32 *gre_hdr;
-
- xprth = skb_network_header(skb) + ihl * 4;
- greflags = (__be16 *)xprth;
- gre_hdr = (__be32 *)xprth;
-
- if (greflags[0] & GRE_KEY) {
- if (greflags[0] & GRE_CSUM)
- gre_hdr++;
- fl4->fl4_gre_key = gre_hdr[1];
- }
- }
- break;
- default:
- break;
- }
+ if (reverse) {
+ fl4->saddr = flkeys->addrs.ipv4.dst;
+ fl4->daddr = flkeys->addrs.ipv4.src;
+ fl4->fl4_sport = flkeys->ports.dst;
+ fl4->fl4_dport = flkeys->ports.src;
+ } else {
+ fl4->saddr = flkeys->addrs.ipv4.src;
+ fl4->daddr = flkeys->addrs.ipv4.dst;
+ fl4->fl4_sport = flkeys->ports.src;
+ fl4->fl4_dport = flkeys->ports.dst;
}
+
+ fl4->flowi4_proto = flkeys->basic.ip_proto;
+ fl4->flowi4_tos = flkeys->ip.tos;
+ fl4->fl4_icmp_type = flkeys->icmp.type;
+ fl4->fl4_icmp_type = flkeys->icmp.code;
+ fl4->fl4_gre_key = flkeys->gre.keyid;
}
#if IS_ENABLED(CONFIG_IPV6)
static void
-decode_session6(struct sk_buff *skb, struct flowi *fl, bool reverse)
+decode_session6(const struct xfrm_flow_keys *flkeys, struct flowi *fl, bool reverse)
{
struct flowi6 *fl6 = &fl->u.ip6;
- int onlyproto = 0;
- const struct ipv6hdr *hdr = ipv6_hdr(skb);
- u32 offset = sizeof(*hdr);
- struct ipv6_opt_hdr *exthdr;
- const unsigned char *nh = skb_network_header(skb);
- u16 nhoff = IP6CB(skb)->nhoff;
- u8 nexthdr;
-
- if (!nhoff)
- nhoff = offsetof(struct ipv6hdr, nexthdr);
-
- nexthdr = nh[nhoff];
memset(fl6, 0, sizeof(struct flowi6));
- fl6->daddr = reverse ? hdr->saddr : hdr->daddr;
- fl6->saddr = reverse ? hdr->daddr : hdr->saddr;
-
- while (nh + offset + sizeof(*exthdr) < skb->data ||
- pskb_may_pull(skb, nh + offset + sizeof(*exthdr) - skb->data)) {
- nh = skb_network_header(skb);
- exthdr = (struct ipv6_opt_hdr *)(nh + offset);
-
- switch (nexthdr) {
- case NEXTHDR_FRAGMENT:
- onlyproto = 1;
- fallthrough;
- case NEXTHDR_ROUTING:
- case NEXTHDR_HOP:
- case NEXTHDR_DEST:
- offset += ipv6_optlen(exthdr);
- nexthdr = exthdr->nexthdr;
- break;
- case IPPROTO_UDP:
- case IPPROTO_UDPLITE:
- case IPPROTO_TCP:
- case IPPROTO_SCTP:
- case IPPROTO_DCCP:
- if (!onlyproto && (nh + offset + 4 < skb->data ||
- pskb_may_pull(skb, nh + offset + 4 - skb->data))) {
- __be16 *ports;
-
- nh = skb_network_header(skb);
- ports = (__be16 *)(nh + offset);
- fl6->fl6_sport = ports[!!reverse];
- fl6->fl6_dport = ports[!reverse];
- }
- fl6->flowi6_proto = nexthdr;
- return;
- case IPPROTO_ICMPV6:
- if (!onlyproto && (nh + offset + 2 < skb->data ||
- pskb_may_pull(skb, nh + offset + 2 - skb->data))) {
- u8 *icmp;
-
- nh = skb_network_header(skb);
- icmp = (u8 *)(nh + offset);
- fl6->fl6_icmp_type = icmp[0];
- fl6->fl6_icmp_code = icmp[1];
- }
- fl6->flowi6_proto = nexthdr;
- return;
- case IPPROTO_GRE:
- if (!onlyproto &&
- (nh + offset + 12 < skb->data ||
- pskb_may_pull(skb, nh + offset + 12 - skb->data))) {
- struct gre_base_hdr *gre_hdr;
- __be32 *gre_key;
-
- nh = skb_network_header(skb);
- gre_hdr = (struct gre_base_hdr *)(nh + offset);
- gre_key = (__be32 *)(gre_hdr + 1);
-
- if (gre_hdr->flags & GRE_KEY) {
- if (gre_hdr->flags & GRE_CSUM)
- gre_key++;
- fl6->fl6_gre_key = *gre_key;
- }
- }
- fl6->flowi6_proto = nexthdr;
- return;
-
-#if IS_ENABLED(CONFIG_IPV6_MIP6)
- case IPPROTO_MH:
- offset += ipv6_optlen(exthdr);
- if (!onlyproto && (nh + offset + 3 < skb->data ||
- pskb_may_pull(skb, nh + offset + 3 - skb->data))) {
- struct ip6_mh *mh;
-
- nh = skb_network_header(skb);
- mh = (struct ip6_mh *)(nh + offset);
- fl6->fl6_mh_type = mh->ip6mh_type;
- }
- fl6->flowi6_proto = nexthdr;
- return;
-#endif
- default:
- fl6->flowi6_proto = nexthdr;
- return;
- }
+ if (reverse) {
+ fl6->saddr = flkeys->addrs.ipv6.dst;
+ fl6->daddr = flkeys->addrs.ipv6.src;
+ fl6->fl6_sport = flkeys->ports.dst;
+ fl6->fl6_dport = flkeys->ports.src;
+ } else {
+ fl6->saddr = flkeys->addrs.ipv6.src;
+ fl6->daddr = flkeys->addrs.ipv6.dst;
+ fl6->fl6_sport = flkeys->ports.src;
+ fl6->fl6_dport = flkeys->ports.dst;
}
+
+ fl6->flowi6_proto = flkeys->basic.ip_proto;
+ fl6->flowlabel = flkeys->tags.flow_label;
+
+ fl6->fl6_icmp_type = flkeys->icmp.type;
+ fl6->fl6_icmp_type = flkeys->icmp.code;
+ fl6->fl6_gre_key = flkeys->gre.keyid;
+ fl6->fl6_mh_type = flkeys->ipv6mh.mh_type;
}
#endif
int __xfrm_decode_session(struct sk_buff *skb, struct flowi *fl,
unsigned int family, int reverse)
{
+ struct xfrm_flow_keys flkeys;
+
+ memset(&flkeys, 0, sizeof(flkeys));
+
+ skb_flow_dissect(skb, &xfrm_session_dissector, &flkeys, FLOW_DISSECTOR_F_STOP_AT_ENCAP);
+
switch (family) {
case AF_INET:
- decode_session4(skb, fl, reverse);
+ decode_session4(&flkeys, fl, reverse);
break;
#if IS_ENABLED(CONFIG_IPV6)
case AF_INET6:
- decode_session6(skb, fl, reverse);
+ decode_session6(&flkeys, fl, reverse);
break;
#endif
default:
@@ -4253,8 +4156,55 @@ static struct pernet_operations __net_initdata xfrm_net_ops = {
.exit = xfrm_net_exit,
};
+static const struct flow_dissector_key xfrm_flow_dissector_keys[] = {
+ {
+ .key_id = FLOW_DISSECTOR_KEY_CONTROL,
+ .offset = offsetof(struct xfrm_flow_keys, control),
+ },
+ {
+ .key_id = FLOW_DISSECTOR_KEY_BASIC,
+ .offset = offsetof(struct xfrm_flow_keys, basic),
+ },
+ {
+ .key_id = FLOW_DISSECTOR_KEY_IPV4_ADDRS,
+ .offset = offsetof(struct xfrm_flow_keys, addrs.ipv4),
+ },
+ {
+ .key_id = FLOW_DISSECTOR_KEY_IPV6_ADDRS,
+ .offset = offsetof(struct xfrm_flow_keys, addrs.ipv6),
+ },
+ {
+ .key_id = FLOW_DISSECTOR_KEY_PORTS,
+ .offset = offsetof(struct xfrm_flow_keys, ports),
+ },
+ {
+ .key_id = FLOW_DISSECTOR_KEY_FLOW_LABEL,
+ .offset = offsetof(struct xfrm_flow_keys, tags),
+ },
+ {
+ .key_id = FLOW_DISSECTOR_KEY_GRE_KEYID,
+ .offset = offsetof(struct xfrm_flow_keys, gre),
+ },
+ {
+ .key_id = FLOW_DISSECTOR_KEY_IP,
+ .offset = offsetof(struct xfrm_flow_keys, ip),
+ },
+ {
+ .key_id = FLOW_DISSECTOR_KEY_ICMP,
+ .offset = offsetof(struct xfrm_flow_keys, icmp),
+ },
+ {
+ .key_id = FLOW_DISSECTOR_KEY_IPV6MH,
+ .offset = offsetof(struct xfrm_flow_keys, ipv6mh),
+ },
+};
+
void __init xfrm_init(void)
{
+ skb_flow_dissector_init(&xfrm_session_dissector,
+ xfrm_flow_dissector_keys,
+ ARRAY_SIZE(xfrm_flow_dissector_keys));
+
register_pernet_subsys(&xfrm_net_ops);
xfrm_dev_init();
xfrm_input_init();
--
2.41.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [RFC ipsec-next 3/3] xfrm: policy: replace session decode with flow dissector
2023-09-08 12:06 ` [RFC ipsec-next 3/3] xfrm: policy: replace session decode with flow dissector Florian Westphal
@ 2023-09-09 22:30 ` kernel test robot
0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2023-09-09 22:30 UTC (permalink / raw)
To: Florian Westphal; +Cc: oe-kbuild-all
Hi Florian,
[This is a private test report for your RFC patch.]
kernel test robot noticed the following build warnings:
[auto build test WARNING on klassert-ipsec/master]
[also build test WARNING on net/main net-next/main linus/master next-20230908]
[cannot apply to klassert-ipsec-next/master horms-ipvs/master v6.5]
[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/Florian-Westphal/xfrm-move-mark-and-oif-flowi-decode-into-common-code/20230908-201709
base: https://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec.git master
patch link: https://lore.kernel.org/r/20230908120628.26164-4-fw%40strlen.de
patch subject: [RFC ipsec-next 3/3] xfrm: policy: replace session decode with flow dissector
config: x86_64-randconfig-121-20230910 (https://download.01.org/0day-ci/archive/20230910/202309100600.3zBVGQIA-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230910/202309100600.3zBVGQIA-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/202309100600.3zBVGQIA-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
net/xfrm/xfrm_policy.c:1325:22: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct hlist_head *odst @@ got struct hlist_head [noderef] __rcu *table @@
net/xfrm/xfrm_policy.c:1325:22: sparse: expected struct hlist_head *odst
net/xfrm/xfrm_policy.c:1325:22: sparse: got struct hlist_head [noderef] __rcu *table
>> net/xfrm/xfrm_policy.c:3440:24: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be32 [usertype] flowlabel @@ got unsigned int const [usertype] flow_label @@
net/xfrm/xfrm_policy.c:3440:24: sparse: expected restricted __be32 [usertype] flowlabel
net/xfrm/xfrm_policy.c:3440:24: sparse: got unsigned int const [usertype] flow_label
net/xfrm/xfrm_policy.c:3956:43: sparse: sparse: incompatible types in comparison expression (different address spaces):
net/xfrm/xfrm_policy.c:3956:43: sparse: struct xfrm_policy_afinfo const [noderef] __rcu *
net/xfrm/xfrm_policy.c:3956:43: sparse: struct xfrm_policy_afinfo const *
net/xfrm/xfrm_policy.c:4046:29: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct hlist_head [noderef] __rcu *table @@ got struct hlist_head * @@
net/xfrm/xfrm_policy.c:4046:29: sparse: expected struct hlist_head [noderef] __rcu *table
net/xfrm/xfrm_policy.c:4046:29: sparse: got struct hlist_head *
net/xfrm/xfrm_policy.c:4073:36: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct hlist_head *n @@ got struct hlist_head [noderef] __rcu *table @@
net/xfrm/xfrm_policy.c:4073:36: sparse: expected struct hlist_head *n
net/xfrm/xfrm_policy.c:4073:36: sparse: got struct hlist_head [noderef] __rcu *table
net/xfrm/xfrm_policy.c:4101:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct hlist_head const *h @@ got struct hlist_head [noderef] __rcu *table @@
net/xfrm/xfrm_policy.c:4101:17: sparse: expected struct hlist_head const *h
net/xfrm/xfrm_policy.c:4101:17: sparse: got struct hlist_head [noderef] __rcu *table
net/xfrm/xfrm_policy.c:4102:36: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct hlist_head *n @@ got struct hlist_head [noderef] __rcu *table @@
net/xfrm/xfrm_policy.c:4102:36: sparse: expected struct hlist_head *n
net/xfrm/xfrm_policy.c:4102:36: sparse: got struct hlist_head [noderef] __rcu *table
net/xfrm/xfrm_policy.c:262:9: sparse: sparse: context imbalance in 'xfrm_policy_get_afinfo' - different lock contexts for basic block
net/xfrm/xfrm_policy.c:283:9: sparse: sparse: context imbalance in '__xfrm_dst_lookup' - unexpected unlock
net/xfrm/xfrm_policy.c: note: in included file (through include/linux/mm_types.h, include/linux/mmzone.h, include/linux/gfp.h, ...):
include/linux/rbtree.h:74:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
include/linux/rbtree.h:74:9: sparse: struct rb_node [noderef] __rcu *
include/linux/rbtree.h:74:9: sparse: struct rb_node *
include/linux/rbtree.h:74:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
include/linux/rbtree.h:74:9: sparse: struct rb_node [noderef] __rcu *
include/linux/rbtree.h:74:9: sparse: struct rb_node *
vim +3440 net/xfrm/xfrm_policy.c
3418
3419 #if IS_ENABLED(CONFIG_IPV6)
3420 static void
3421 decode_session6(const struct xfrm_flow_keys *flkeys, struct flowi *fl, bool reverse)
3422 {
3423 struct flowi6 *fl6 = &fl->u.ip6;
3424
3425 memset(fl6, 0, sizeof(struct flowi6));
3426
3427 if (reverse) {
3428 fl6->saddr = flkeys->addrs.ipv6.dst;
3429 fl6->daddr = flkeys->addrs.ipv6.src;
3430 fl6->fl6_sport = flkeys->ports.dst;
3431 fl6->fl6_dport = flkeys->ports.src;
3432 } else {
3433 fl6->saddr = flkeys->addrs.ipv6.src;
3434 fl6->daddr = flkeys->addrs.ipv6.dst;
3435 fl6->fl6_sport = flkeys->ports.src;
3436 fl6->fl6_dport = flkeys->ports.dst;
3437 }
3438
3439 fl6->flowi6_proto = flkeys->basic.ip_proto;
> 3440 fl6->flowlabel = flkeys->tags.flow_label;
3441
3442 fl6->fl6_icmp_type = flkeys->icmp.type;
3443 fl6->fl6_icmp_type = flkeys->icmp.code;
3444 fl6->fl6_gre_key = flkeys->gre.keyid;
3445 fl6->fl6_mh_type = flkeys->ipv6mh.mh_type;
3446 }
3447 #endif
3448
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-09-09 22:30 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-08 12:06 [RFC ipsec-next 0/3] xfrm: policy: replace session decode with flow dissector Florian Westphal
2023-09-08 12:06 ` [RFC ipsec-next 1/3] xfrm: move mark and oif flowi decode into common code Florian Westphal
2023-09-08 12:06 ` [RFC ipsec-next 2/3] flow_dissector: add ipv6 mobility header support Florian Westphal
2023-09-08 12:06 ` [RFC ipsec-next 3/3] xfrm: policy: replace session decode with flow dissector Florian Westphal
2023-09-09 22:30 ` kernel test robot
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.