Re: [PATCH v3 2/3] bpf: clear stale IPv4 options after LWT encapsulation
From: Alexei Starovoitov <hidden>
Date: 2026-09-20 17:06:49
Also in:
bpf, linux-kselftest, lkml, stable
On Mon, Sep 21, 2026 at 12:32 AM Weiming Shi [off-list ref] wrote:
Select the reset layout from the protocol callback which consumes the packet: the original family for BPF_OK and unsupported redirects, or the new family for supported reroute and redirect paths. Preserve the ingress interface and L3-slave state from the restored original control block and initialize the IPv6 next-header offset when needed. Save and restore the marker around nested LWT runs.
What Daniel sketched in v2 was 20 lines. This is still an overkill. [...]
+static void bpf_lwt_reset_cb(struct sk_buff *skb, __be16 orig_proto,
+ bool use_new_proto)
+{
+ __be16 cb_proto = use_new_proto ? skb->protocol : orig_proto;
+ int iif = skb->skb_iif;
+ bool l3slave = false;
+
+ /* VRF may have replaced skb_iif with the master device index. */
+ if (orig_proto == htons(ETH_P_IP)) {
+ iif = IPCB(skb)->iif;
+ l3slave = ipv4_l3mdev_skb(IPCB(skb)->flags);When the family doesn't change only IPCB(skb)->opt is stale. Clear just that like ip_tunnel_xmit() and udp_tunnel_xmit_skb() do. iif and flags stay as they are and the VRF special casing goes away. When the family changes do what seg6_do_srh_encap() does. [...]
+ use_new_proto = (ret == BPF_LWT_REROUTE && + lwt->prog->type != BPF_PROG_TYPE_LWT_OUT) || + (ret == BPF_REDIRECT && can_redirect); + if (lwt_ip_encap) + bpf_lwt_reset_cb(skb, orig_proto, use_new_proto);
Not needed. BPF_OK after the prog changed the family is broken no matter which layout the cb has. bpf_xmit() drops such skb and bpf_input() hands a v6 packet to ip_forward(). Use skb->protocol. pw-bot: cr