]> git.puffer.fish Git - mirror/frr.git/commitdiff
staticd: fix missing next-csid flavor for uDTx operations
authorPhilippe Guibert <philippe.guibert@6wind.com>
Fri, 25 Apr 2025 14:08:07 +0000 (16:08 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Thu, 1 May 2025 07:15:53 +0000 (09:15 +0200)
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 <philippe.guibert@6wind.com>
staticd/static_zebra.c

index cc09b428365fdc56e9210c21532fb751f077f289..a889907f8b8a85b61b9b365e6853fb65aec857be 100644 (file)
@@ -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)) {