Skip to content

move IPv6 LL discovery after Linux tap up#934

Merged
sknat merged 1 commit intomasterfrom
abasu-fix-ll-punt
Mar 2, 2026
Merged

move IPv6 LL discovery after Linux tap up#934
sknat merged 1 commit intomasterfrom
abasu-fix-ll-punt

Conversation

@aritrbas
Copy link
Copy Markdown
Collaborator

@aritrbas aritrbas commented Mar 1, 2026

This PR fixes an intermittent IPv6 startup issue where DHCPv6 traffic to the node link-local address can enter a punt loop, preventing global IPv6 from being acquired.

RCA

LL discovery previously ran during configureVppUplinkInterface(), before Linux tap NETDEV_UP. In intermittent cases, no LL was discovered in time, so the LL /128 route was not installed in the punt table.

For punted LL traffic (e.g. DHCPv6 UDP/546), lookup in the punt table then matched the built-in fe80::/10 -> ip6-link-local path, which redirected traffic back to the per-interface LL FIB and created a receive/punt/redirect loop until recursion drop.

Fix

  • Added configureIPv6LinkLocal() in vpp-manager/vpp_runner.go.
  • Called it from runVpp() after configureLinuxTap() and before InterfaceAdminUp().
  • LL discovery now polls the tap LL address after tap UP with bounded retries.
  • If LL is still missing after retries, returns an error and terminates startup via existing terminateVpp() path.
  • Moved LL-specific programming into this phase:
    • LL /128 route in punt table
    • LL address on uplink in VPP
    • ND proxy for LL
  • Removed old LL handling from earlier setup path.

This patch fixes intermittent DHCPv6/link-local punt loops caused
by a startup race in IPv6 link-local discovery.

LL discovery ran in configureVppUplinkInterface() before Linux had
brought the tap UP, so LL was intermittently missing.
Without LL /128 in punt table, punted link-local packets matched
fe80::/10 (ip6-link-local DPO), got redirected back to per-interface
LL FIB, and looped until VPP recursion guard dropped them.

- Add configureIPv6LinkLocal() and call it from runVpp() after
  configureLinuxTap() (LinkSetUp) and before InterfaceAdminUp().
- Poll for tap LL with bounded retries after tap UP; if not found,
  return an error so runVpp() terminates VPP.
- Program LL-specific state in configureIPv6LinkLocal():
  * punt-table LL /128 route
  * LL address on uplink in VPP
  * ND proxy for LL
- Remove old LL handling from the previous setup path.

Signed-off-by: Aritra Basu <aritrbas@cisco.com>
@aritrbas aritrbas self-assigned this Mar 1, 2026
@aritrbas aritrbas marked this pull request as draft March 2, 2026 06:38
@sknat sknat marked this pull request as ready for review March 2, 2026 17:39
@sknat sknat merged commit d099083 into master Mar 2, 2026
5 checks passed
@sknat sknat deleted the abasu-fix-ll-punt branch March 2, 2026 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants