From: Philippe Guibert Date: Fri, 25 Apr 2025 14:08:07 +0000 (+0200) Subject: staticd: fix missing next-csid flavor for uDTx operations X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=7413c3df20af1b86bae27de5fb589406943c17df;p=mirror%2Ffrr.git staticd: fix missing next-csid flavor for uDTx operations The uDT4/uDT6/uDT46 behaviors have not set the next-csid flavor when passing the seg6local route instruction to zebra. Signed-off-by: Philippe Guibert --- diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c index cc09b42836..a889907f8b 100644 --- a/staticd/static_zebra.c +++ b/staticd/static_zebra.c @@ -660,7 +660,23 @@ void static_zebra_srv6_sid_install(struct static_srv6_sid *sid) ctx.flv.lcnode_func_len = sid->locator->node_bits_length; break; case SRV6_ENDPOINT_BEHAVIOR_END_DT6: + action = ZEBRA_SEG6_LOCAL_ACTION_END_DT6; + vrf = vrf_lookup_by_name(sid->attributes.vrf_name); + if (!vrf_is_enabled(vrf)) { + zlog_warn("Failed to install SID %pFX: VRF %s is inactive", &sid->addr, + sid->attributes.vrf_name); + return; + } + ctx.table = vrf->data.l.table_id; + ifp = if_get_vrf_loopback(vrf->vrf_id); + if (!ifp) { + zlog_warn("Failed to install SID %pFX: failed to get loopback for vrf %s", + &sid->addr, sid->attributes.vrf_name); + return; + } + break; case SRV6_ENDPOINT_BEHAVIOR_END_DT6_USID: + SET_SRV6_FLV_OP(ctx.flv.flv_ops, ZEBRA_SEG6_LOCAL_FLV_OP_NEXT_CSID); action = ZEBRA_SEG6_LOCAL_ACTION_END_DT6; vrf = vrf_lookup_by_name(sid->attributes.vrf_name); if (!vrf_is_enabled(vrf)) { @@ -677,7 +693,23 @@ void static_zebra_srv6_sid_install(struct static_srv6_sid *sid) } break; case SRV6_ENDPOINT_BEHAVIOR_END_DT4: + action = ZEBRA_SEG6_LOCAL_ACTION_END_DT4; + vrf = vrf_lookup_by_name(sid->attributes.vrf_name); + if (!vrf_is_enabled(vrf)) { + zlog_warn("Failed to install SID %pFX: VRF %s is inactive", &sid->addr, + sid->attributes.vrf_name); + return; + } + ctx.table = vrf->data.l.table_id; + ifp = if_get_vrf_loopback(vrf->vrf_id); + if (!ifp) { + zlog_warn("Failed to install SID %pFX: failed to get loopback for vrf %s", + &sid->addr, sid->attributes.vrf_name); + return; + } + break; case SRV6_ENDPOINT_BEHAVIOR_END_DT4_USID: + SET_SRV6_FLV_OP(ctx.flv.flv_ops, ZEBRA_SEG6_LOCAL_FLV_OP_NEXT_CSID); action = ZEBRA_SEG6_LOCAL_ACTION_END_DT4; vrf = vrf_lookup_by_name(sid->attributes.vrf_name); if (!vrf_is_enabled(vrf)) { @@ -694,7 +726,23 @@ void static_zebra_srv6_sid_install(struct static_srv6_sid *sid) } break; case SRV6_ENDPOINT_BEHAVIOR_END_DT46: + action = ZEBRA_SEG6_LOCAL_ACTION_END_DT46; + vrf = vrf_lookup_by_name(sid->attributes.vrf_name); + if (!vrf_is_enabled(vrf)) { + zlog_warn("Failed to install SID %pFX: VRF %s is inactive", &sid->addr, + sid->attributes.vrf_name); + return; + } + ctx.table = vrf->data.l.table_id; + ifp = if_get_vrf_loopback(vrf->vrf_id); + if (!ifp) { + zlog_warn("Failed to install SID %pFX: failed to get loopback for vrf %s", + &sid->addr, sid->attributes.vrf_name); + return; + } + break; case SRV6_ENDPOINT_BEHAVIOR_END_DT46_USID: + SET_SRV6_FLV_OP(ctx.flv.flv_ops, ZEBRA_SEG6_LOCAL_FLV_OP_NEXT_CSID); action = ZEBRA_SEG6_LOCAL_ACTION_END_DT46; vrf = vrf_lookup_by_name(sid->attributes.vrf_name); if (!vrf_is_enabled(vrf)) {