mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 04:50:35 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			132 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
						|
/*********************************************************************
 | 
						|
 * Copyright 2022 Hiroki Shirokura, LINE Corporation
 | 
						|
 * Copyright 2022 Masakazu Asama
 | 
						|
 * Copyright 2022 6WIND S.A.
 | 
						|
 *
 | 
						|
 * flex_algo.h: Flexible Algorithm library
 | 
						|
 *
 | 
						|
 * Authors
 | 
						|
 * -------
 | 
						|
 * Hiroki Shirokura
 | 
						|
 * Masakazu Asama
 | 
						|
 * Louis Scalbert
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _FRR_FLEX_ALGO_H
 | 
						|
#define _FRR_FLEX_ALGO_H
 | 
						|
 | 
						|
#include "admin_group.h"
 | 
						|
#include "linklist.h"
 | 
						|
#include "prefix.h"
 | 
						|
#include "segment_routing.h"
 | 
						|
 | 
						|
#define FLEX_ALGO_PRIO_DEFAULT 128
 | 
						|
 | 
						|
#define CALC_TYPE_SPF 0
 | 
						|
 | 
						|
/* flex-algo definition flags */
 | 
						|
 | 
						|
/* M-flag (aka. prefix-metric)
 | 
						|
 * Flex-Algorithm specific prefix and ASBR metric MUST be used
 | 
						|
 */
 | 
						|
#define FAD_FLAG_M 0x80
 | 
						|
 | 
						|
/*
 | 
						|
 * Metric Type values from RFC9350 section 5.1
 | 
						|
 */
 | 
						|
enum flex_algo_metric_type {
 | 
						|
	MT_IGP = 0,
 | 
						|
	MT_MIN_UNI_LINK_DELAY = 1,
 | 
						|
	MT_TE_DEFAULT = 2,
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Flex-Algo data about a given algorithm.
 | 
						|
 * It includes the definition and some local data.
 | 
						|
 */
 | 
						|
struct flex_algo {
 | 
						|
	/* Flex-Algo definition */
 | 
						|
	uint8_t algorithm;
 | 
						|
	enum flex_algo_metric_type metric_type;
 | 
						|
	uint8_t calc_type;
 | 
						|
	uint8_t priority;
 | 
						|
	uint8_t flags;
 | 
						|
 | 
						|
	/* extended admin-groups */
 | 
						|
	struct admin_group admin_group_exclude_any;
 | 
						|
	struct admin_group admin_group_include_any;
 | 
						|
	struct admin_group admin_group_include_all;
 | 
						|
 | 
						|
	/* Exclude SRLG Sub-TLV is not yet supported by IS-IS
 | 
						|
	 * True if a Exclude SRLG Sub-TLV has been found
 | 
						|
	 */
 | 
						|
	bool exclude_srlg;
 | 
						|
 | 
						|
	/* True if an unsupported sub-TLV other Exclude SRLG
 | 
						|
	 * has been received.
 | 
						|
	 * A router that receives an unsupported definition
 | 
						|
	 * that is elected must not participate in the algorithm.
 | 
						|
	 * This boolean prevents future sub-TLV from being considered
 | 
						|
	 * as supported.
 | 
						|
	 */
 | 
						|
	bool unsupported_subtlv;
 | 
						|
 | 
						|
	/* Flex-Algo local data */
 | 
						|
 | 
						|
	/* True if the local definition must be advertised */
 | 
						|
	bool advertise_definition;
 | 
						|
 | 
						|
	/* which dataplane must be used for the algorithm */
 | 
						|
#define FLEX_ALGO_SR_MPLS 0x01
 | 
						|
#define FLEX_ALGO_SRV6 0x02
 | 
						|
#define FLEX_ALGO_IP 0x04
 | 
						|
	uint8_t dataplanes;
 | 
						|
 | 
						|
	/* True if the Algorithm is locally enabled (ie. a definition has been
 | 
						|
	 * found and is supported).
 | 
						|
	 */
 | 
						|
	bool state;
 | 
						|
 | 
						|
	/*
 | 
						|
	 * This property can be freely extended among different routing
 | 
						|
	 * protocols. Since Flex-Algo is an IGP protocol agnostic, both IS-IS
 | 
						|
	 * and OSPF can implement Flex-Algo. The struct flex_algo thus provides
 | 
						|
	 * the general data structure of Flex-Algo, and the value of extending
 | 
						|
	 * it with the IGP protocol is provided by this property.
 | 
						|
	 */
 | 
						|
	void *data;
 | 
						|
};
 | 
						|
 | 
						|
typedef void *(*flex_algo_allocator_t)(void *);
 | 
						|
typedef void (*flex_algo_releaser_t)(void *);
 | 
						|
 | 
						|
struct flex_algos {
 | 
						|
	flex_algo_allocator_t allocator;
 | 
						|
	flex_algo_releaser_t releaser;
 | 
						|
	struct list *flex_algos;
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * Flex-Algo Utilities
 | 
						|
 */
 | 
						|
struct flex_algos *flex_algos_alloc(flex_algo_allocator_t allocator,
 | 
						|
				    flex_algo_releaser_t releaser);
 | 
						|
void flex_algos_free(struct flex_algos *flex_algos);
 | 
						|
struct flex_algo *flex_algo_alloc(struct flex_algos *flex_algos,
 | 
						|
				  uint8_t algorithm, void *arg);
 | 
						|
struct flex_algo *flex_algo_lookup(struct flex_algos *flex_algos,
 | 
						|
				   uint8_t algorithm);
 | 
						|
void flex_algos_free(struct flex_algos *flex_algos);
 | 
						|
bool flex_algo_definition_cmp(struct flex_algo *fa1, struct flex_algo *fa2);
 | 
						|
void flex_algo_delete(struct flex_algos *flex_algos, uint8_t algorithm);
 | 
						|
bool flex_algo_id_valid(uint16_t algorithm);
 | 
						|
char *flex_algo_metric_type_print(char *type_str, size_t sz,
 | 
						|
				  enum flex_algo_metric_type metric_type);
 | 
						|
 | 
						|
bool flex_algo_get_state(struct flex_algos *flex_algos, uint8_t algorithm);
 | 
						|
 | 
						|
void flex_algo_set_state(struct flex_algos *flex_algos, uint8_t algorithm,
 | 
						|
			 bool state);
 | 
						|
#endif /* _FRR_FLEX_ALGO_H */
 |