if (nexthop->nh_srv6) {
json_seg6local = json_object_new_object();
json_object_string_add(json_seg6local, "action",
- seg6local_action2str(
- nexthop->nh_srv6
- ->seg6local_action));
+ seg6local_action2str_with_next_csid(
+ nexthop->nh_srv6->seg6local_action,
+ seg6local_has_next_csid(
+ &nexthop->nh_srv6->seg6local_ctx)));
json_seg6local_context = json_object_new_object();
json_object_object_add(json_nexthop, "seg6local",
json_seg6local);
if (nexthop->nh_srv6->seg6local_action !=
ZEBRA_SEG6_LOCAL_ACTION_UNSPEC)
vty_out(vty, ", seg6local %s %s",
- seg6local_action2str(
- nexthop->nh_srv6->seg6local_action),
+ seg6local_action2str_with_next_csid(nexthop->nh_srv6->seg6local_action,
+ seg6local_has_next_csid(
+ &nexthop->nh_srv6
+ ->seg6local_ctx)),
buf);
if (nexthop->nh_srv6->seg6_segs &&
IPV6_ADDR_CMP(&nexthop->nh_srv6->seg6_segs->seg[0],
DEFINE_MTYPE_STATIC(LIB, SRV6_SID_FORMAT, "SRv6 SID format");
DEFINE_MTYPE_STATIC(LIB, SRV6_SID_CTX, "SRv6 SID context");
-const char *seg6local_action2str(uint32_t action)
+const char *seg6local_action2str_with_next_csid(uint32_t action, bool has_next_csid)
{
switch (action) {
case ZEBRA_SEG6_LOCAL_ACTION_END:
- return "End";
+ return has_next_csid ? "uN" : "End";
case ZEBRA_SEG6_LOCAL_ACTION_END_X:
- return "End.X";
+ return has_next_csid ? "uA" : "End.X";
case ZEBRA_SEG6_LOCAL_ACTION_END_T:
- return "End.T";
+ return has_next_csid ? "uDT" : "End.T";
case ZEBRA_SEG6_LOCAL_ACTION_END_DX2:
- return "End.DX2";
+ return has_next_csid ? "uDX2" : "End.DX2";
case ZEBRA_SEG6_LOCAL_ACTION_END_DX6:
- return "End.DX6";
+ return has_next_csid ? "uDX6" : "End.DX6";
case ZEBRA_SEG6_LOCAL_ACTION_END_DX4:
- return "End.DX4";
+ return has_next_csid ? "uDX4" : "End.DX4";
case ZEBRA_SEG6_LOCAL_ACTION_END_DT6:
- return "End.DT6";
+ return has_next_csid ? "uDT6" : "End.DT6";
case ZEBRA_SEG6_LOCAL_ACTION_END_DT4:
- return "End.DT4";
+ return has_next_csid ? "uDT4" : "End.DT4";
case ZEBRA_SEG6_LOCAL_ACTION_END_B6:
- return "End.B6";
+ return has_next_csid ? "uB6" : "End.B6";
case ZEBRA_SEG6_LOCAL_ACTION_END_B6_ENCAP:
- return "End.B6.Encap";
+ return has_next_csid ? "uB6.Encap" : "End.B6.Encap";
case ZEBRA_SEG6_LOCAL_ACTION_END_BM:
- return "End.BM";
+ return has_next_csid ? "uBM" : "End.BM";
case ZEBRA_SEG6_LOCAL_ACTION_END_S:
return "End.S";
case ZEBRA_SEG6_LOCAL_ACTION_END_AS:
case ZEBRA_SEG6_LOCAL_ACTION_END_AM:
return "End.AM";
case ZEBRA_SEG6_LOCAL_ACTION_END_DT46:
- return "End.DT46";
+ return has_next_csid ? "uDT46" : "End.DT46";
case ZEBRA_SEG6_LOCAL_ACTION_UNSPEC:
return "unspec";
default:
}
}
+const char *seg6local_action2str(uint32_t action)
+{
+ return seg6local_action2str_with_next_csid(action, false);
+}
+
int snprintf_seg6_segs(char *str,
size_t size, const struct seg6_segs *segs)
{
SRV6_ENDPOINT_BEHAVIOR_OPAQUE = 0xFFFF,
};
+/*
+ * Return true if next-csid behavior is used, false otherwise
+ */
+static inline bool seg6local_has_next_csid(const struct seg6local_context *ctx)
+{
+ const struct seg6local_flavors_info *flv_info = &ctx->flv;
+
+ return CHECK_SRV6_FLV_OP(flv_info->flv_ops, ZEBRA_SEG6_LOCAL_FLV_OP_NEXT_CSID);
+}
+
/*
* Convert SRv6 endpoint behavior codepoints to human-friendly string.
*/
return memcpy(dst, src, sizeof(struct in6_addr));
}
+const char *seg6local_action2str_with_next_csid(uint32_t action, bool has_next_csid);
+
const char *
seg6local_action2str(uint32_t action);