mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-29 13:45:39 +00:00
109 lines
2.9 KiB
C
109 lines
2.9 KiB
C
// 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);
|
|
|
|
/*
|
|
* When an interface is enabled in the kernel, go through all the static SRv6 SIDs in
|
|
* the system that use this interface and install/remove them in the zebra RIB.
|
|
*
|
|
* ifp - The interface being enabled
|
|
* is_up - Whether the interface is up or down
|
|
*/
|
|
void static_ifp_srv6_sids_update(struct interface *ifp, bool is_up);
|
|
|
|
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__ */
|