#ifndef FABRICD
-static bool isis_affinity_map_check_use(const char *affmap_name)
-{
- struct isis *isis = isis_lookup_by_vrfid(VRF_DEFAULT);
- struct isis_area *area;
- struct listnode *area_node, *fa_node;
- struct flex_algo *fa;
- struct affinity_map *map;
- uint16_t pos;
-
- if (!isis)
- return false;
-
- map = affinity_map_get(affmap_name);
- pos = map->bit_position;
-
- for (ALL_LIST_ELEMENTS_RO(isis->area_list, area_node, area)) {
- for (ALL_LIST_ELEMENTS_RO(area->flex_algos->flex_algos, fa_node,
- fa)) {
- if (admin_group_get(&fa->admin_group_exclude_any,
- pos) ||
- admin_group_get(&fa->admin_group_include_any,
- pos) ||
- admin_group_get(&fa->admin_group_include_all, pos))
- return true;
- }
- }
- return false;
-}
-
static void isis_affinity_map_update(const char *affmap_name, uint16_t old_pos,
uint16_t new_pos)
{
{
affinity_map_init();
- affinity_map_set_check_use_hook(isis_affinity_map_check_use);
affinity_map_set_update_hook(isis_affinity_map_update);
}
DEFINE_QOBJ_TYPE(affinity_maps);
DEFINE_QOBJ_TYPE(affinity_map);
-struct affinity_maps affinity_map_master = {NULL, NULL, NULL, NULL};
+struct affinity_maps affinity_map_master = {NULL, NULL, NULL};
static void affinity_map_free(struct affinity_map *map)
{
return NULL;
}
-bool affinity_map_check_use_hook(const char *affmap_name)
-{
- if (affinity_map_master.check_use_hook)
- return (*affinity_map_master.check_use_hook)(affmap_name);
- return false;
-}
-
bool affinity_map_check_update_hook(const char *affmap_name, uint16_t new_pos)
{
if (affinity_map_master.check_update_hook)
new_pos);
}
-
-void affinity_map_set_check_use_hook(bool (*func)(const char *affmap_name))
-{
- affinity_map_master.check_use_hook = func;
-}
-
void affinity_map_set_check_update_hook(bool (*func)(const char *affmap_name,
uint16_t new_pos))
{
struct affinity_maps {
struct list *maps;
- bool (*check_use_hook)(const char *affmap_name);
bool (*check_update_hook)(const char *affmap_name, uint16_t new_pos);
void (*update_hook)(const char *affmap_name, uint16_t old_pos,
uint16_t new_pos);
struct affinity_map *affinity_map_get(const char *name);
char *affinity_map_name_get(const int pos);
-bool affinity_map_check_use_hook(const char *affmap_name);
bool affinity_map_check_update_hook(const char *affmap_name, uint16_t new_pos);
void affinity_map_update_hook(const char *affmap_name, uint16_t new_pos);
-void affinity_map_set_check_use_hook(bool (*func)(const char *affmap_name));
void affinity_map_set_check_update_hook(bool (*func)(const char *affmap_name,
uint16_t new_pos));
void affinity_map_set_update_hook(void (*func)(const char *affmap_name,
switch (args->event) {
case NB_EV_VALIDATE:
- if (!affinity_map_check_use_hook(name))
- break;
- snprintf(args->errmsg, args->errmsg_len,
- "affinity-map %s is used", name);
- return NB_ERR_VALIDATION;
case NB_EV_PREPARE:
case NB_EV_ABORT:
break;
"Initial revision";
}
+ typedef affinity-map-ref {
+ type leafref {
+ path "/frr-affinity-map:lib/frr-affinity-map:affinity-maps/frr-affinity-map:affinity-map/frr-affinity-map:name";
+ require-instance true;
+ }
+ description
+ "Reference to an affinity map";
+ }
+
container lib {
container affinity-maps {
description
case affinity {
container affinities {
leaf-list affinity {
- type string;
+ type frr-affinity-map:affinity-map-ref;
max-elements "256";
description
"Array of Attribute Names";
#include "zebra/redistribute.h"
#include "zebra/zebra_affinitymap.h"
-static bool zebra_affinity_map_check_use(const char *affmap_name)
-{
- char xpath[XPATH_MAXLEN];
- struct interface *ifp;
- struct vrf *vrf;
-
- RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) {
- FOR_ALL_INTERFACES (vrf, ifp) {
- snprintf(xpath, sizeof(xpath),
- "/frr-interface:lib/interface[name='%s']",
- ifp->name);
- if (!yang_dnode_exists(running_config->dnode, xpath))
- continue;
- snprintf(
- xpath, sizeof(xpath),
- "/frr-interface:lib/interface[name='%s']/frr-zebra:zebra/link-params/affinities[affinity='%s']",
- ifp->name, affmap_name);
- if (yang_dnode_exists(running_config->dnode, xpath))
- return true;
- }
- }
- return false;
-}
-
static bool zebra_affinity_map_check_update(const char *affmap_name,
uint16_t new_pos)
{
{
affinity_map_init();
- affinity_map_set_check_use_hook(zebra_affinity_map_check_use);
affinity_map_set_check_update_hook(zebra_affinity_map_check_update);
affinity_map_set_update_hook(zebra_affinity_map_update);
}