* [PATCH net-next v2 0/2] seg6: skip route refcounts in seg6local lookups
@ 2026-10-10 10:10 Yuya Kusakabe
2026-10-10 10:10 ` [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups Yuya Kusakabe
2026-10-10 10:10 ` [PATCH net-next v2 2/2] seg6: skip the route refcount in seg6local IPv4 lookups Yuya Kusakabe
0 siblings, 2 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-10-10 10:10 UTC (permalink / raw)
To: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: netdev, linux-kernel, Yuya Kusakabe
seg6local looks up the nexthop of its IPv6 and IPv4 behaviors from the
RCU read-side section of the receive path, yet takes and drops a route
reference for every packet. Skip the reference, as ip6_route_input()
and ip_rcv_finish() do.
---
Changes in v2:
- Split the lookup into a noref primitive for the seg6local input
actions and a refcounted seg6_lookup_nexthop() wrapper, which the BPF
LWT helpers also call (Andrea Mayer, Sashiko).
- Rebase onto net-next and re-measure.
- Link to v1: https://patch.msgid.link/20261005-seg6-lookup-noref-v1-0-092e84774e80@gmail.com
---
Yuya Kusakabe (2):
seg6: skip the route refcount in seg6local IPv6 lookups
seg6: skip the route refcount in seg6local IPv4 lookups
net/ipv6/seg6_local.c | 58 +++++++++++++++++++++++++++++++++++++--------------
1 file changed, 42 insertions(+), 16 deletions(-)
---
base-commit: 758fe10f83a655bed0f7b98fcfacdfc3556fb9a1
change-id: 20261004-seg6-lookup-noref-e016495b60ed
Best regards,
--
Yuya Kusakabe <yuya.kusakabe@gmail.com>
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups 2026-10-10 10:10 [PATCH net-next v2 0/2] seg6: skip route refcounts in seg6local lookups Yuya Kusakabe @ 2026-10-10 10:10 ` Yuya Kusakabe 2026-10-13 23:58 ` Andrea Mayer 2026-10-15 14:30 ` Gabriel Goller 2026-10-10 10:10 ` [PATCH net-next v2 2/2] seg6: skip the route refcount in seg6local IPv4 lookups Yuya Kusakabe 1 sibling, 2 replies; 7+ messages in thread From: Yuya Kusakabe @ 2026-10-10 10:10 UTC (permalink / raw) To: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman Cc: netdev, linux-kernel, Yuya Kusakabe ip6_route_input() attaches the input route to the skb without taking a reference, relying on the RCU read-side section of the receive path. The seg6local input actions run in that same section, either directly from the seg6local input handler or from a netfilter okfn, yet seg6_lookup_any_nexthop() takes and drops a route reference for every packet. Look the route up with RT6_LOOKUP_F_DST_NOREF, as ip6_route_input() does, for the input and table lookups of those actions. Keep seg6_lookup_nexthop(), which the BPF LWT helpers also call, refcounted: BPF_PROG_TEST_RUN runs them repeatedly on the same skb and may leave the RCU read-side section between runs. Like ip6_route_output_flags(), it now takes the reference on top of the noref lookup. Throughput at 0.5% packet loss of 94-byte End packets (two-segment SRH, no payload), spread by RSS on an ixgbe 82599ES across two 2.30 GHz Xeon E5-2650 v3 with 10 cores each, offered by TRex and binary-searched over 10 runs of 10 s, in Mpps: queues cores before after 1 1 0.740 0.756 (+2.2%) 10 10 on the NIC's socket 6.404 6.950 (+8.5%) 16 10 + 6 on two sockets 6.550 10.124 (+54.6%) With the default rules, fib6_rule_lookup() tries the local table first, and the miss takes and drops a reference on ip6_null_entry, one route shared by every CPU. At 16 queues that cache line bounces between the sockets, and ip6_hold_safe() and dst_release() together take about a third of the cycles. Assisted-by: LLM Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com> --- net/ipv6/seg6_local.c | 54 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/net/ipv6/seg6_local.c b/net/ipv6/seg6_local.c index 0c3d1be7f129..f23330278922 100644 --- a/net/ipv6/seg6_local.c +++ b/net/ipv6/seg6_local.c @@ -318,8 +318,8 @@ static struct ipv6_sr_hdr *advance_nextseg(struct sk_buff *skb, } static int -seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, - u32 tbl_id, bool local_delivery, int oif) +seg6_lookup_any_nexthop_noref(struct sk_buff *skb, struct in6_addr *nhaddr, + u32 tbl_id, bool local_delivery, int oif) { struct net *net = dev_net(skb->dev); struct ipv6hdr *hdr = ipv6_hdr(skb); @@ -342,6 +342,7 @@ seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, fl6.flowi6_flags = FLOWI_FLAG_KNOWN_NH; if (!tbl_id && !oif) { + flags |= RT6_LOOKUP_F_DST_NOREF; dst = ip6_route_input_lookup(net, skb->dev, &fl6, skb, flags); } else if (tbl_id) { struct fib6_table *table; @@ -350,6 +351,7 @@ seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, if (!table) goto out; + flags |= RT6_LOOKUP_F_DST_NOREF; rt = ip6_pol_route(net, table, oif, &fl6, skb, flags); dst = &rt->dst; } else { @@ -363,7 +365,7 @@ seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, dev_flags |= IFF_LOOPBACK; if (dst && (dst_dev(dst)->flags & dev_flags) && !dst->error) { - dst_release(dst); + ip6_rt_put_flags(dst_rt6_info(dst), flags); dst = NULL; } @@ -372,17 +374,41 @@ seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, rt = net->ipv6.ip6_blk_hole_entry; dst = &rt->dst; dst_hold(dst); + flags &= ~RT6_LOOKUP_F_DST_NOREF; } skb_dst_drop(skb); - skb_dst_set(skb, dst); + if ((flags & RT6_LOOKUP_F_DST_NOREF) && !dst->rt_uncached_list) + skb_dst_set_noref(skb, dst); + else + skb_dst_set(skb, dst); return dst->error; } +static int seg6_lookup_nexthop_noref(struct sk_buff *skb, + struct in6_addr *nhaddr, u32 tbl_id) +{ + return seg6_lookup_any_nexthop_noref(skb, nhaddr, tbl_id, false, 0); +} + int seg6_lookup_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, u32 tbl_id) { - return seg6_lookup_any_nexthop(skb, nhaddr, tbl_id, false, 0); + int err; + + rcu_read_lock(); + err = seg6_lookup_nexthop_noref(skb, nhaddr, tbl_id); + if (!skb_dst_force(skb)) { + struct dst_entry *dst; + + dst = &dev_net(skb->dev)->ipv6.ip6_blk_hole_entry->dst; + dst_hold(dst); + skb_dst_set(skb, dst); + err = dst->error; + } + rcu_read_unlock(); + + return err; } static __u8 seg6_flv_lcblock_octects(const struct seg6_flavors_info *finfo) @@ -446,7 +472,7 @@ seg6_next_csid_advance_arg(struct sk_buff *skb, static int input_action_end_finish(struct sk_buff *skb, struct seg6_local_lwt *slwt) { - seg6_lookup_nexthop(skb, NULL, 0); + seg6_lookup_nexthop_noref(skb, NULL, 0); return dst_input(skb); } @@ -497,7 +523,7 @@ static int end_next_csid_core(struct sk_buff *skb, struct seg6_local_lwt *slwt) static int input_action_end_x_finish(struct sk_buff *skb, struct seg6_local_lwt *slwt) { - seg6_lookup_any_nexthop(skb, &slwt->nh6, 0, false, slwt->oif); + seg6_lookup_any_nexthop_noref(skb, &slwt->nh6, 0, false, slwt->oif); return dst_input(skb); } @@ -939,7 +965,7 @@ static int input_action_end_t(struct sk_buff *skb, struct seg6_local_lwt *slwt) goto drop; } - seg6_lookup_nexthop(skb, NULL, slwt->table); + seg6_lookup_nexthop_noref(skb, NULL, slwt->table); return dst_input(skb); @@ -1023,7 +1049,7 @@ static int input_action_end_dx6_finish(struct net *net, struct sock *sk, if (!ipv6_addr_any(&slwt->nh6)) nhaddr = &slwt->nh6; - seg6_lookup_nexthop(skb, nhaddr, 0); + seg6_lookup_nexthop_noref(skb, nhaddr, 0); return dst_input(skb); } @@ -1383,7 +1409,7 @@ static int input_action_end_dt6(struct sk_buff *skb, /* note: this time we do not need to specify the table because the VRF * takes care of selecting the correct table. */ - seg6_lookup_any_nexthop(skb, NULL, 0, true, 0); + seg6_lookup_any_nexthop_noref(skb, NULL, 0, true, 0); return dst_input(skb); @@ -1391,7 +1417,7 @@ static int input_action_end_dt6(struct sk_buff *skb, #endif skb_set_transport_header(skb, sizeof(struct ipv6hdr)); - seg6_lookup_any_nexthop(skb, NULL, slwt->table, true, 0); + seg6_lookup_any_nexthop_noref(skb, NULL, slwt->table, true, 0); return dst_input(skb); @@ -1446,7 +1472,7 @@ static int input_action_end_b6(struct sk_buff *skb, struct seg6_local_lwt *slwt) skb_set_transport_header(skb, sizeof(struct ipv6hdr)); - seg6_lookup_nexthop(skb, NULL, 0); + seg6_lookup_nexthop_noref(skb, NULL, 0); return dst_input(skb); @@ -1482,7 +1508,7 @@ static int input_action_end_b6_encap(struct sk_buff *skb, skb_set_transport_header(skb, sizeof(struct ipv6hdr)); - seg6_lookup_nexthop(skb, NULL, 0); + seg6_lookup_nexthop_noref(skb, NULL, 0); return dst_input(skb); @@ -1571,7 +1597,7 @@ static int input_action_end_bpf(struct sk_buff *skb, local_unlock_nested_bh(&seg6_bpf_srh_states.bh_lock); if (ret != BPF_REDIRECT) - seg6_lookup_nexthop(skb, NULL, 0); + seg6_lookup_nexthop_noref(skb, NULL, 0); return dst_input(skb); -- 2.50.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups 2026-10-10 10:10 ` [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups Yuya Kusakabe @ 2026-10-13 23:58 ` Andrea Mayer 2026-10-15 14:31 ` Yuya Kusakabe 2026-10-15 14:30 ` Gabriel Goller 1 sibling, 1 reply; 7+ messages in thread From: Andrea Mayer @ 2026-10-13 23:58 UTC (permalink / raw) To: Yuya Kusakabe Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman, netdev, linux-kernel, Andrea Mayer On Sat, 10 Oct 2026 19:10:39 +0900 Yuya Kusakabe <yuya.kusakabe@gmail.com> wrote: Hi Yuya, Thanks for v2. I re-ran the BPF_PROG_TEST_RUN case from v1 on 32-bit ARM with the changes of v2, and I could not reproduce the use-after-free anymore. > ip6_route_input() attaches the input route to the skb without taking a > reference, relying on the RCU read-side section of the receive path. > The seg6local input actions run in that same section, either directly > from the seg6local input handler or from a netfilter okfn, yet > seg6_lookup_any_nexthop() takes and drops a route reference for every > packet. For a packet queued with NFQUEUE, the okfn runs later from nf_reinject(), under the rcu_read_lock() of the nfnetlink verdict handler. Is "that same section" accurate for that case? > [snip] > if (!tbl_id && !oif) { > + flags |= RT6_LOOKUP_F_DST_NOREF; > dst = ip6_route_input_lookup(net, skb->dev, &fl6, skb, flags); > [snip] > + flags |= RT6_LOOKUP_F_DST_NOREF; > rt = ip6_pol_route(net, table, oif, &fl6, skb, flags); With RT6_LOOKUP_F_DST_NOREF, ip6_pol_route() no longer calls ip6_hold_safe(). If the route it finds is released on another CPU during the lookup, the packet can be dropped without an ICMP error. Before the series, when ip6_hold_safe() did not get the reference on the released route, the packet went to the next policy rule, or to ip6_null_entry and its ICMPv6 Destination Unreachable. As far as I can see, only packets that race with the release are affected. It is still a change in behavior, and it would be worth at least mentioning it in the commit message. > [snip] > int seg6_lookup_nexthop(struct sk_buff *skb, > struct in6_addr *nhaddr, u32 tbl_id) > { > - return seg6_lookup_any_nexthop(skb, nhaddr, tbl_id, false, 0); > + int err; > + > + rcu_read_lock(); > + err = seg6_lookup_nexthop_noref(skb, nhaddr, tbl_id); > + if (!skb_dst_force(skb)) { > + struct dst_entry *dst; > + > + dst = &dev_net(skb->dev)->ipv6.ip6_blk_hole_entry->dst; > + dst_hold(dst); > + skb_dst_set(skb, dst); > + err = dst->error; > + } > + rcu_read_unlock(); > + > + return err; > } The split works, and the contract is now in the names. One detail is how seg6_lookup_nexthop() takes its reference: after the noref lookup, with skb_dst_force(). Because of this, the BPF LWT helpers are affected by this race too. Before the series, when ip6_hold_safe() did not get the reference on the released route, seg6_lookup_nexthop() returned 0 if a later policy rule had a route, or -ENETUNREACH. Now it can return -EINVAL in both cases. The Sashiko review points out the second one. It would be good to keep seg6_lookup_nexthop() unchanged for the BPF helpers, also while a route is being released. One idea, as a refinement of the split, could be a common lookup function with a noref argument. For example, seg6_lookup_any_nexthop_noref() would call it with noref set, and seg6_lookup_nexthop() with noref clear, keeping the refcounted lookup it had before the series. What do you think? > [snip] Ciao, Andrea ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups 2026-10-13 23:58 ` Andrea Mayer @ 2026-10-15 14:31 ` Yuya Kusakabe 0 siblings, 0 replies; 7+ messages in thread From: Yuya Kusakabe @ 2026-10-15 14:31 UTC (permalink / raw) To: Andrea Mayer Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman, netdev, linux-kernel On Wed, 14 Oct 2026 01:58:19 +0200 Andrea Mayer <andrea.mayer@uniroma2.it> wrote: > For a packet queued with NFQUEUE, the okfn runs later from nf_reinject(), > under the rcu_read_lock() of the nfnetlink verdict handler. Is "that same > section" accurate for that case? No, it is not. The lookup and dst_input() still run within one RCU read-side section, but for a reinjected packet it is the one of the verdict handler. v3 will say so in both patches. > With RT6_LOOKUP_F_DST_NOREF, ip6_pol_route() no longer calls > ip6_hold_safe(). If the route it finds is released on another CPU during > the lookup, the packet can be dropped without an ICMP error. Before the > series, when ip6_hold_safe() did not get the reference on the released > route, the packet went to the next policy rule, or to ip6_null_entry and > its ICMPv6 Destination Unreachable. As far as I can see, only packets that > race with the release are affected. It is still a change in behavior, and > it would be worth at least mentioning it in the commit message. Agreed. v3 will mention it in the 1/2 message, along with the fact that ip6_route_input() has the same window. > It would be good to keep seg6_lookup_nexthop() unchanged for the BPF > helpers, also while a route is being released. One idea, as a refinement of > the split, could be a common lookup function with a noref argument. For > example, seg6_lookup_any_nexthop_noref() would call it with noref set, and > seg6_lookup_nexthop() with noref clear, keeping the refcounted lookup it > had before the series. What do you think? That works better. In v3, seg6_lookup_any_nexthop() will take a noref argument, seg6_lookup_any_nexthop_noref() will set it for the seg6local input actions, and seg6_lookup_nexthop() will keep its refcounted lookup. The skb_dst_force() fallback goes away, and with it the -EINVAL that Sashiko pointed out. pw-bot: cr ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups 2026-10-10 10:10 ` [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups Yuya Kusakabe 2026-10-13 23:58 ` Andrea Mayer @ 2026-10-15 14:30 ` Gabriel Goller 2026-10-15 14:38 ` Yuya Kusakabe 1 sibling, 1 reply; 7+ messages in thread From: Gabriel Goller @ 2026-10-15 14:30 UTC (permalink / raw) To: Yuya Kusakabe Cc: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman, netdev, linux-kernel Hi Yuya, > [snip] > @@ -372,17 +374,41 @@ seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, > rt = net->ipv6.ip6_blk_hole_entry; > dst = &rt->dst; > dst_hold(dst); > + flags &= ~RT6_LOOKUP_F_DST_NOREF; > } > > skb_dst_drop(skb); > - skb_dst_set(skb, dst); > + if ((flags & RT6_LOOKUP_F_DST_NOREF) && !dst->rt_uncached_list) > + skb_dst_set_noref(skb, dst); > + else > + skb_dst_set(skb, dst); > return dst->error; > } > > +static int seg6_lookup_nexthop_noref(struct sk_buff *skb, > + struct in6_addr *nhaddr, u32 tbl_id) > +{ > + return seg6_lookup_any_nexthop_noref(skb, nhaddr, tbl_id, false, 0); > +} > + > int seg6_lookup_nexthop(struct sk_buff *skb, > struct in6_addr *nhaddr, u32 tbl_id) > { > - return seg6_lookup_any_nexthop(skb, nhaddr, tbl_id, false, 0); > + int err; > + > + rcu_read_lock(); > + err = seg6_lookup_nexthop_noref(skb, nhaddr, tbl_id); > + if (!skb_dst_force(skb)) { > + struct dst_entry *dst; > + > + dst = &dev_net(skb->dev)->ipv6.ip6_blk_hole_entry->dst; I think we should use ip6_null_entry instead of ip6_blk_hole_entry here. Previously this path (failure to acquire the dst ref) was reached through ip6_pol_route() and ip6_hold_safe(), which uses ip6_null_entry and returns -ENETUNREACH as an error. After this patch, the error is triggered here and we use ip6_blk_hole_entry, which returns -EINVAL. What do you think? > + dst_hold(dst); > + skb_dst_set(skb, dst); > + err = dst->error; > + } > + rcu_read_unlock(); > + > + return err; > } > > static __u8 seg6_flv_lcblock_octects(const struct seg6_flavors_info *finfo) > [snip] Thanks, Gabriel ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups 2026-10-15 14:30 ` Gabriel Goller @ 2026-10-15 14:38 ` Yuya Kusakabe 0 siblings, 0 replies; 7+ messages in thread From: Yuya Kusakabe @ 2026-10-15 14:38 UTC (permalink / raw) To: Gabriel Goller Cc: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman, netdev, linux-kernel On Thu, 15 Oct 2026 16:30:02 +0200 Gabriel Goller <g.goller@proxmox.com> wrote: > I think we should use ip6_null_entry instead of ip6_blk_hole_entry here. > Previously this path (failure to acquire the dst ref) was reached through > ip6_pol_route() and ip6_hold_safe(), which uses ip6_null_entry and returns > -ENETUNREACH as an error. > After this patch, the error is triggered here and we use ip6_blk_hole_entry, > which returns -EINVAL. > > What do you think? Agreed, the error changes. v3 will drop this fallback altogether: following Andrea's suggestion, seg6_lookup_nexthop() will keep its refcounted lookup, so ip6_hold_safe() handles the failure as before. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net-next v2 2/2] seg6: skip the route refcount in seg6local IPv4 lookups 2026-10-10 10:10 [PATCH net-next v2 0/2] seg6: skip route refcounts in seg6local lookups Yuya Kusakabe 2026-10-10 10:10 ` [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups Yuya Kusakabe @ 2026-10-10 10:10 ` Yuya Kusakabe 1 sibling, 0 replies; 7+ messages in thread From: Yuya Kusakabe @ 2026-10-10 10:10 UTC (permalink / raw) To: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman Cc: netdev, linux-kernel, Yuya Kusakabe ip_route_input() looks the input route up with ip_route_input_noref() and then forces a reference on it, which is dropped again when the packet is transmitted. End.DX4 and End.DT4 call it from the RCU read-side section of the receive path, either directly from the seg6local input handler or from a netfilter okfn, and hand the skb to dst_input() before leaving that section. Use ip_route_input_noref(), as ip_rcv_finish() does. Throughput at 0.5% packet loss of 82-byte IPv4-in-IPv6 UDP packets (no SRH), spread by RSS on an ixgbe 82599ES across two 10-core Xeon E5-2650 v3, offered by TRex over 10 runs of 10 s, in Mpps: End.DX4 queues cores before after 1 1 0.791 0.811 (+2.5%) 10 10 on the NIC's socket 6.118 7.394 (+20.9%) 16 10 + 6 on two sockets 3.305 10.205 (+208.8%) End.DT4 queues cores before after 1 1 0.481 0.489 (+1.6%) 10 10 on the NIC's socket 4.328 4.588 (+6.0%) 16 10 + 6 on two sockets 3.351 7.153 (+113.5%) Every CPU takes and drops a reference on the same input route, the one cached on the nexthop. At 16 queues that cache line bounces between the sockets, and skb_dst_force() and dst_release() together take more than half of the cycles for End.DX4 and over 40% for End.DT4. Assisted-by: LLM Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com> --- net/ipv6/seg6_local.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/ipv6/seg6_local.c b/net/ipv6/seg6_local.c index f23330278922..60abd139dbe3 100644 --- a/net/ipv6/seg6_local.c +++ b/net/ipv6/seg6_local.c @@ -1099,7 +1099,7 @@ static int input_action_end_dx4_finish(struct net *net, struct sock *sk, skb_dst_drop(skb); - reason = ip_route_input(skb, nhaddr, iph->saddr, 0, skb->dev); + reason = ip_route_input_noref(skb, nhaddr, iph->saddr, 0, skb->dev); if (reason) { kfree_skb_reason(skb, reason); return -EINVAL; @@ -1325,7 +1325,7 @@ static int input_action_end_dt4(struct sk_buff *skb, iph = ip_hdr(skb); - reason = ip_route_input(skb, iph->daddr, iph->saddr, 0, skb->dev); + reason = ip_route_input_noref(skb, iph->daddr, iph->saddr, 0, skb->dev); if (unlikely(reason)) goto drop; -- 2.50.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-10-15 14:38 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-10-10 10:10 [PATCH net-next v2 0/2] seg6: skip route refcounts in seg6local lookups Yuya Kusakabe 2026-10-10 10:10 ` [PATCH net-next v2 1/2] seg6: skip the route refcount in seg6local IPv6 lookups Yuya Kusakabe 2026-10-13 23:58 ` Andrea Mayer 2026-10-15 14:31 ` Yuya Kusakabe 2026-10-15 14:30 ` Gabriel Goller 2026-10-15 14:38 ` Yuya Kusakabe 2026-10-10 10:10 ` [PATCH net-next v2 2/2] seg6: skip the route refcount in seg6local IPv4 lookups Yuya Kusakabe
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.