Skip to content

[v1.19] l7lb: bpf: fix use hairpin redirect for L7 LB on bridge devices#44760

Merged
julianwiedmann merged 1 commit intov1.19from
pr/smagnani96/fix-l7lb-v1.19
Mar 13, 2026
Merged

[v1.19] l7lb: bpf: fix use hairpin redirect for L7 LB on bridge devices#44760
julianwiedmann merged 1 commit intov1.19from
pr/smagnani96/fix-l7lb-v1.19

Conversation

@smagnani96
Copy link
Copy Markdown
Contributor

Once this PR is merged, a GitHub action will update the labels of these PRs:

 44658

[ upstream commit 52f35a9 ]

[ backporter's notes: fixed conflicts:
  * adapting to the old loader implementation, adding changes only to
    the Netdev program attached to network devices.
  * changed check in bpf/tests/l7_lb_hairpin.c to check for CILIUM_NET_IFINDEX
    instead of CONFIG(cilium_net_ifindex), as the latter is not used in this backport
]

Fix L7 proxy traffic disruption (DROP_REASON_NOSOCKET) on nodes where
the BPF program is attached to a Linux bridge device and the
br_netfilter module is loaded with net.bridge.bridge-nf-call-iptables=1.

With #36383, we changed the non-BPF-TPROXY L7 LB redirect path to mark
packets with MARK_MAGIC_TO_PROXY and punt them to the stack, relying on
an iptables TPROXY rule in PREROUTING to deliver the packet to the
proxy. This optimization avoids a hairpin redirect through cilium_net.

However, when br_netfilter is active on a bridge device, the kernel's
ip_sabotage_in() function interferes:

1. Packet arrives on bridge port -> br_netfilter evaluates PREROUTING
   (1st time, BPF hasn't run yet -> TPROXY rule doesn't match)
2. ip_sabotage_in() sets NF_HOOK_STATE_SABOTAGED on the packet
3. tc-ingress BPF runs, sets MARK_MAGIC_TO_PROXY, punts to stack
4. IP stack calls PREROUTING again, but ip_sabotage causes it to be
   SKIPPED entirely
5. TPROXY rule never fires -> no listening socket on VIP ->
   DROP_REASON_NOSOCKET

We therefore add a new datapath config variable that will be set to true
only when compiling the Netdev datapath program (cil_{from,to}_netdev)
and the network device is a bridge. This allows us to fall back to the
pre-#36383 hairpin redirect via cilium_net for L7 LB traffic, bypassing the
ip_sabotage_in() function and allowing the TPROXY rule to match as expected.

Non-bridge devices continue using the optimized punt-to-stack path.

Signed-off-by: Simone Magnani <simone.magnani@isovalent.com>
@smagnani96 smagnani96 self-assigned this Mar 12, 2026
@smagnani96 smagnani96 added kind/backports This PR provides functionality previously merged into master. backport/1.19 This PR represents a backport for Cilium 1.19.x of a PR that was merged to main. labels Mar 12, 2026
@smagnani96
Copy link
Copy Markdown
Contributor Author

/test

@smagnani96 smagnani96 marked this pull request as ready for review March 13, 2026 11:49
@smagnani96 smagnani96 requested a review from a team as a code owner March 13, 2026 11:49
Copy link
Copy Markdown
Member

@julianwiedmann julianwiedmann left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

@julianwiedmann julianwiedmann added this pull request to the merge queue Mar 13, 2026
@maintainer-s-little-helper maintainer-s-little-helper bot added the ready-to-merge This PR has passed all tests and received consensus from code owners to merge. label Mar 13, 2026
Merged via the queue into v1.19 with commit d76bee3 Mar 13, 2026
604 of 617 checks passed
@julianwiedmann julianwiedmann deleted the pr/smagnani96/fix-l7lb-v1.19 branch March 13, 2026 13:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport/1.19 This PR represents a backport for Cilium 1.19.x of a PR that was merged to main. kind/backports This PR provides functionality previously merged into master. ready-to-merge This PR has passed all tests and received consensus from code owners to merge.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants