summaryrefslogtreecommitdiff
path: root/staticd/static_srv6.h
diff options
context:
space:
mode:
Diffstat (limited to 'staticd/static_srv6.h')
-rw-r--r--staticd/static_srv6.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/staticd/static_srv6.h b/staticd/static_srv6.h
new file mode 100644
index 0000000000..bed0ab7fa5
--- /dev/null
+++ b/staticd/static_srv6.h
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * STATICd - Segment Routing over IPv6 (SRv6) header
+ * Copyright (C) 2025 Alibaba Inc.
+ * Yuqing Zhao
+ * Lingyu Zhang
+ */
+#ifndef __STATIC_SRV6_H__
+#define __STATIC_SRV6_H__
+
+#include "vrf.h"
+#include "srv6.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Attributes for an SRv6 SID */
+struct static_srv6_sid_attributes {
+ /* VRF name */
+ char vrf_name[VRF_NAMSIZ];
+ char ifname[IFNAMSIZ];
+ struct in6_addr nh6;
+};
+
+/* Static SRv6 SID */
+struct static_srv6_sid {
+ /* SRv6 SID address */
+ struct prefix_ipv6 addr;
+ /* behavior bound to the SRv6 SID */
+ enum srv6_endpoint_behavior_codepoint behavior;
+ /* SID attributes */
+ struct static_srv6_sid_attributes attributes;
+
+ /* SRv6 SID flags */
+ uint8_t flags;
+/*
+ * this SRv6 SID has been allocated by SID Manager
+ * and can be installed in the zebra RIB
+ */
+#define STATIC_FLAG_SRV6_SID_VALID (1 << 0)
+/* this SRv6 SID has been installed in the zebra RIB */
+#define STATIC_FLAG_SRV6_SID_SENT_TO_ZEBRA (1 << 1)
+
+ char locator_name[SRV6_LOCNAME_SIZE];
+ struct static_srv6_locator *locator;
+};
+
+struct static_srv6_locator {
+ char name[SRV6_LOCNAME_SIZE];
+ struct prefix_ipv6 prefix;
+
+ /*
+ * Bit length of SRv6 locator described in
+ * draft-ietf-bess-srv6-services-05#section-3.2.1
+ */
+ uint8_t block_bits_length;
+ uint8_t node_bits_length;
+ uint8_t function_bits_length;
+ uint8_t argument_bits_length;
+
+ uint8_t flags;
+};
+
+/* List of SRv6 SIDs. */
+extern struct list *srv6_locators;
+extern struct list *srv6_sids;
+
+/*
+ * Allocate an SRv6 SID object and initialize its fields, SID address and
+ * behavor.
+ */
+extern struct static_srv6_sid *static_srv6_sid_alloc(struct prefix_ipv6 *addr);
+extern void static_srv6_sid_free(struct static_srv6_sid *sid);
+/* Look-up an SRv6 SID in the list of SRv6 SIDs. */
+extern struct static_srv6_sid *static_srv6_sid_lookup(struct prefix_ipv6 *sid_addr);
+/*
+ * Remove an SRv6 SID from the zebra RIB (if it was previously installed) and
+ * release the memory previously allocated for the SID.
+ */
+extern void static_srv6_sid_del(struct static_srv6_sid *sid);
+
+/* Initialize SRv6 data structures. */
+extern void static_srv6_init(void);
+/* Clean up all the SRv6 data structures. */
+extern void static_srv6_cleanup(void);
+
+struct static_srv6_locator *static_srv6_locator_alloc(const char *name);
+void static_srv6_locator_free(struct static_srv6_locator *locator);
+struct static_srv6_locator *static_srv6_locator_lookup(const char *name);
+
+void delete_static_srv6_sid(void *val);
+void delete_static_srv6_locator(void *val);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STATIC_SRV6_H__ */