mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 13:27:53 +00:00
lib,yang,zebra: add affinity-map support
Add the affinity-map global command to zebra. The syntax is: > affinity-map NAME bit-position (0-1023) Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
This commit is contained in:
parent
ad1327b3d4
commit
05a12619dd
122
lib/affinitymap.c
Normal file
122
lib/affinitymap.c
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Affinity map function.
|
||||||
|
*
|
||||||
|
* Copyright 2022 Hiroki Shirokura, LINE Corporation
|
||||||
|
* Copyright 2022 Masakazu Asama
|
||||||
|
* Copyright 2022 6WIND S.A.
|
||||||
|
*
|
||||||
|
* This file is part of Free Range Routing (FRR).
|
||||||
|
*
|
||||||
|
* FRR is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2, or (at your option) any
|
||||||
|
* later version.
|
||||||
|
*
|
||||||
|
* FRR is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; see the file COPYING; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zebra.h>
|
||||||
|
|
||||||
|
#include "linklist.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "command.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "prefix.h"
|
||||||
|
#include "vty.h"
|
||||||
|
#include "affinitymap.h"
|
||||||
|
#include "command.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "hash.h"
|
||||||
|
#include "libfrr.h"
|
||||||
|
#include "lib_errors.h"
|
||||||
|
#include "table.h"
|
||||||
|
#include "json.h"
|
||||||
|
#include "jhash.h"
|
||||||
|
|
||||||
|
DEFINE_MTYPE_STATIC(LIB, AFFINITY_MAP, "Affinity map");
|
||||||
|
DEFINE_MTYPE(LIB, AFFINITY_MAP_NAME, "Affinity map name");
|
||||||
|
DEFINE_MTYPE_STATIC(LIB, AFFINITY_MAP_INDEX, "Affinity map index");
|
||||||
|
|
||||||
|
DEFINE_QOBJ_TYPE(affinity_maps);
|
||||||
|
DEFINE_QOBJ_TYPE(affinity_map);
|
||||||
|
|
||||||
|
struct affinity_maps affinity_map_master = {NULL};
|
||||||
|
|
||||||
|
static void affinity_map_free(struct affinity_map *map)
|
||||||
|
{
|
||||||
|
XFREE(MTYPE_AFFINITY_MAP, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
void affinity_map_set(const char *name, int pos)
|
||||||
|
{
|
||||||
|
struct listnode *node;
|
||||||
|
struct affinity_map *map;
|
||||||
|
|
||||||
|
if (!affinity_map_master.maps)
|
||||||
|
affinity_map_master.maps = list_new();
|
||||||
|
|
||||||
|
for (ALL_LIST_ELEMENTS_RO(affinity_map_master.maps, node, map)) {
|
||||||
|
if (strncmp(name, map->name, AFFINITY_NAME_SIZE) != 0)
|
||||||
|
continue;
|
||||||
|
map->bit_position = pos;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
map = XCALLOC(MTYPE_AFFINITY_MAP, sizeof(*map));
|
||||||
|
map->bit_position = pos;
|
||||||
|
snprintf(map->name, sizeof(map->name), "%s", name);
|
||||||
|
listnode_add(affinity_map_master.maps, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
void affinity_map_unset(const char *name)
|
||||||
|
{
|
||||||
|
struct listnode *node, *nnode;
|
||||||
|
struct affinity_map *map;
|
||||||
|
|
||||||
|
if (!affinity_map_master.maps)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (ALL_LIST_ELEMENTS(affinity_map_master.maps, node, nnode, map)) {
|
||||||
|
if (strncmp(name, map->name, AFFINITY_NAME_SIZE) != 0)
|
||||||
|
continue;
|
||||||
|
listnode_delete(affinity_map_master.maps, map);
|
||||||
|
affinity_map_free(map);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct affinity_map *affinity_map_get(const char *name)
|
||||||
|
{
|
||||||
|
struct listnode *node;
|
||||||
|
struct affinity_map *map;
|
||||||
|
|
||||||
|
if (!affinity_map_master.maps)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (ALL_LIST_ELEMENTS_RO(affinity_map_master.maps, node, map))
|
||||||
|
if (strncmp(name, map->name, AFFINITY_NAME_SIZE) == 0)
|
||||||
|
return map;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *affinity_map_name_get(int pos)
|
||||||
|
{
|
||||||
|
struct listnode *node;
|
||||||
|
struct affinity_map *map;
|
||||||
|
|
||||||
|
if (!affinity_map_master.maps)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (ALL_LIST_ELEMENTS_RO(affinity_map_master.maps, node, map))
|
||||||
|
if (map->bit_position == pos)
|
||||||
|
return map->name;
|
||||||
|
return NULL;
|
||||||
|
}
|
74
lib/affinitymap.h
Normal file
74
lib/affinitymap.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Affinity-map function.
|
||||||
|
*
|
||||||
|
* Copyright 2022 Hiroki Shirokura, LINE Corporation
|
||||||
|
* Copyright 2022 Masakazu Asama
|
||||||
|
* Copyright 2022 6WIND S.A.
|
||||||
|
*
|
||||||
|
* This file is part of Free Range Routing (FRR).
|
||||||
|
*
|
||||||
|
* FRR is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2, or (at your option) any
|
||||||
|
* later version.
|
||||||
|
*
|
||||||
|
* FRR is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; see the file COPYING; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ZEBRA_AFFINITYMAP_H
|
||||||
|
#define _ZEBRA_AFFINITYMAP_H
|
||||||
|
|
||||||
|
#include "typesafe.h"
|
||||||
|
#include "prefix.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "qobj.h"
|
||||||
|
#include "vty.h"
|
||||||
|
#include "lib/plist.h"
|
||||||
|
#include "lib/plist_int.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define AFFINITY_NAME_SIZE 32
|
||||||
|
|
||||||
|
struct affinity_map {
|
||||||
|
char name[AFFINITY_NAME_SIZE];
|
||||||
|
uint16_t bit_position;
|
||||||
|
|
||||||
|
QOBJ_FIELDS;
|
||||||
|
};
|
||||||
|
DECLARE_QOBJ_TYPE(affinity_map);
|
||||||
|
|
||||||
|
struct affinity_maps {
|
||||||
|
struct list *maps;
|
||||||
|
|
||||||
|
QOBJ_FIELDS;
|
||||||
|
};
|
||||||
|
DECLARE_QOBJ_TYPE(affinity_maps);
|
||||||
|
|
||||||
|
extern const struct frr_yang_module_info frr_affinity_map_info;
|
||||||
|
|
||||||
|
void affinity_map_set(const char *name, int pos);
|
||||||
|
void affinity_map_unset(const char *name);
|
||||||
|
struct affinity_map *affinity_map_get(const char *name);
|
||||||
|
char *affinity_map_name_get(const int pos);
|
||||||
|
|
||||||
|
void cli_show_affinity_map(struct vty *vty, const struct lyd_node *dnode,
|
||||||
|
bool show_defaults);
|
||||||
|
|
||||||
|
void affinity_map_init(void);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _ZEBRA_AFFINITYMAP_H */
|
107
lib/affinitymap_cli.c
Normal file
107
lib/affinitymap_cli.c
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Affinity map northbound CLI implementation.
|
||||||
|
*
|
||||||
|
* Copyright 2022 Hiroki Shirokura, LINE Corporation
|
||||||
|
* Copyright 2022 Masakazu Asama
|
||||||
|
* Copyright 2022 6WIND S.A.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This file is part of Free Range Routing (FRR).
|
||||||
|
*
|
||||||
|
* FRR is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2, or (at your option) any
|
||||||
|
* later version.
|
||||||
|
*
|
||||||
|
* FRR is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; see the file COPYING; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zebra.h>
|
||||||
|
|
||||||
|
#include "lib/command.h"
|
||||||
|
#include "lib/northbound_cli.h"
|
||||||
|
#include "lib/affinitymap.h"
|
||||||
|
#include "lib/affinitymap_cli_clippy.c"
|
||||||
|
|
||||||
|
/* Route map node structure. */
|
||||||
|
static int affinity_map_config_write(struct vty *vty);
|
||||||
|
static struct cmd_node affinitymap_node = {
|
||||||
|
.name = "affinity-map",
|
||||||
|
.node = AFFMAP_NODE,
|
||||||
|
.prompt = "",
|
||||||
|
.config_write = affinity_map_config_write,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* max value is EXT_ADMIN_GROUP_MAX_POSITIONS - 1 */
|
||||||
|
DEFPY_YANG_NOSH(affinity_map, affinity_map_cmd,
|
||||||
|
"affinity-map NAME$name bit-position (0-1023)$position",
|
||||||
|
"Affinity map configuration\n"
|
||||||
|
"Affinity attribute name\n"
|
||||||
|
"Bit position for affinity attribute value\n"
|
||||||
|
"Bit position\n")
|
||||||
|
{
|
||||||
|
char xpathr[XPATH_MAXLEN];
|
||||||
|
|
||||||
|
snprintf(
|
||||||
|
xpathr, sizeof(xpathr),
|
||||||
|
"/frr-affinity-map:lib/affinity-maps/affinity-map[name='%s']/value",
|
||||||
|
name);
|
||||||
|
nb_cli_enqueue_change(vty, xpathr, NB_OP_MODIFY, position_str);
|
||||||
|
return nb_cli_apply_changes(vty, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* max value is EXT_ADMIN_GROUP_MAX_POSITIONS - 1 */
|
||||||
|
DEFPY_YANG_NOSH(no_affinity_map, no_affinity_map_cmd,
|
||||||
|
"no affinity-map NAME$name [bit-position (0-1023)$position]",
|
||||||
|
NO_STR
|
||||||
|
"Affinity map configuration\n"
|
||||||
|
"Affinity attribute name\n"
|
||||||
|
"Bit position for affinity attribute value\n"
|
||||||
|
"Bit position\n")
|
||||||
|
{
|
||||||
|
char xpathr[XPATH_MAXLEN];
|
||||||
|
|
||||||
|
snprintf(xpathr, sizeof(xpathr),
|
||||||
|
"/frr-affinity-map:lib/affinity-maps/affinity-map[name='%s']",
|
||||||
|
name);
|
||||||
|
nb_cli_enqueue_change(vty, xpathr, NB_OP_DESTROY, NULL);
|
||||||
|
return nb_cli_apply_changes(vty, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int affinity_map_config_write(struct vty *vty)
|
||||||
|
{
|
||||||
|
const struct lyd_node *dnode;
|
||||||
|
int written = 0;
|
||||||
|
|
||||||
|
dnode = yang_dnode_get(running_config->dnode, "/frr-affinity-map:lib");
|
||||||
|
if (dnode) {
|
||||||
|
nb_cli_show_dnode_cmds(vty, dnode, false);
|
||||||
|
written = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return written;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cli_show_affinity_map(struct vty *vty, const struct lyd_node *dnode,
|
||||||
|
bool show_defaults __attribute__((__unused__)))
|
||||||
|
{
|
||||||
|
vty_out(vty, "affinity-map %s bit-position %u\n",
|
||||||
|
yang_dnode_get_string(dnode, "./name"),
|
||||||
|
yang_dnode_get_uint16(dnode, "./value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialization of affinity map vector. */
|
||||||
|
void affinity_map_init(void)
|
||||||
|
{
|
||||||
|
/* CLI commands. */
|
||||||
|
install_node(&affinitymap_node);
|
||||||
|
install_element(CONFIG_NODE, &affinity_map_cmd);
|
||||||
|
install_element(CONFIG_NODE, &no_affinity_map_cmd);
|
||||||
|
}
|
123
lib/affinitymap_northbound.c
Normal file
123
lib/affinitymap_northbound.c
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* affinity map northbound implementation.
|
||||||
|
*
|
||||||
|
* Copyright 2022 Hiroki Shirokura, LINE Corporation
|
||||||
|
* Copyright 2022 Masakazu Asama
|
||||||
|
* Copyright 2022 6WIND S.A.
|
||||||
|
*
|
||||||
|
* This file is part of Free Range Routing (FRR).
|
||||||
|
*
|
||||||
|
* FRR is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2, or (at your option) any
|
||||||
|
* later version.
|
||||||
|
*
|
||||||
|
* FRR is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; see the file COPYING; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zebra.h>
|
||||||
|
|
||||||
|
#include "lib/command.h"
|
||||||
|
#include "lib/log.h"
|
||||||
|
#include "lib/northbound.h"
|
||||||
|
#include "lib/affinitymap.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath: /frr-affinity-map:lib/affinity-maps/affinity-map
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int lib_affinity_map_create(struct nb_cb_create_args *args)
|
||||||
|
{
|
||||||
|
return NB_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int lib_affinity_map_destroy(struct nb_cb_destroy_args *args)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
switch (args->event) {
|
||||||
|
case NB_EV_VALIDATE:
|
||||||
|
case NB_EV_PREPARE:
|
||||||
|
case NB_EV_ABORT:
|
||||||
|
break;
|
||||||
|
case NB_EV_APPLY:
|
||||||
|
name = yang_dnode_get_string(
|
||||||
|
(const struct lyd_node *)args->dnode, "./name");
|
||||||
|
affinity_map_unset(name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return NB_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath: /frr-affinity-map:lib/affinity-maps/affinity-map/value
|
||||||
|
*/
|
||||||
|
static int lib_affinity_map_value_modify(struct nb_cb_modify_args *args)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
char *map_name;
|
||||||
|
uint16_t pos;
|
||||||
|
|
||||||
|
name = yang_dnode_get_string(
|
||||||
|
(const struct lyd_node *)args->dnode->parent, "./name");
|
||||||
|
|
||||||
|
pos = yang_dnode_get_uint16(
|
||||||
|
(const struct lyd_node *)args->dnode->parent, "./value");
|
||||||
|
|
||||||
|
switch (args->event) {
|
||||||
|
case NB_EV_VALIDATE:
|
||||||
|
map_name = affinity_map_name_get(pos);
|
||||||
|
if (!map_name)
|
||||||
|
return NB_OK;
|
||||||
|
if (strncmp(map_name, name, AFFINITY_NAME_SIZE) == 0)
|
||||||
|
return NB_ERR_NO_CHANGES;
|
||||||
|
snprintf(args->errmsg, args->errmsg_len,
|
||||||
|
"bit-position is used by %s.", map_name);
|
||||||
|
return NB_ERR_VALIDATION;
|
||||||
|
case NB_EV_PREPARE:
|
||||||
|
case NB_EV_ABORT:
|
||||||
|
break;
|
||||||
|
case NB_EV_APPLY:
|
||||||
|
affinity_map_set(name, pos);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NB_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int lib_affinity_map_value_destroy(struct nb_cb_destroy_args *args)
|
||||||
|
{
|
||||||
|
return NB_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
const struct frr_yang_module_info frr_affinity_map_info = {
|
||||||
|
.name = "frr-affinity-map",
|
||||||
|
.nodes = {
|
||||||
|
{
|
||||||
|
.xpath = "/frr-affinity-map:lib/affinity-maps/affinity-map",
|
||||||
|
.cbs = {
|
||||||
|
.create = lib_affinity_map_create,
|
||||||
|
.destroy = lib_affinity_map_destroy,
|
||||||
|
.cli_show = cli_show_affinity_map,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-affinity-map:lib/affinity-maps/affinity-map/value",
|
||||||
|
.cbs = {
|
||||||
|
.modify = lib_affinity_map_value_modify,
|
||||||
|
.destroy = lib_affinity_map_value_destroy,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.xpath = NULL,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
@ -90,6 +90,7 @@ struct host {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* List of CLI nodes. Please remember to update the name array in command.c. */
|
/* List of CLI nodes. Please remember to update the name array in command.c. */
|
||||||
|
/* clang-format off */
|
||||||
enum node_type {
|
enum node_type {
|
||||||
AUTH_NODE, /* Authentication mode of vty interface. */
|
AUTH_NODE, /* Authentication mode of vty interface. */
|
||||||
VIEW_NODE, /* View node. Default mode of vty interface. */
|
VIEW_NODE, /* View node. Default mode of vty interface. */
|
||||||
@ -106,6 +107,7 @@ enum node_type {
|
|||||||
EXTLOG_NODE, /* RFC5424 & co. extended syslog */
|
EXTLOG_NODE, /* RFC5424 & co. extended syslog */
|
||||||
KEYCHAIN_NODE, /* Key-chain node. */
|
KEYCHAIN_NODE, /* Key-chain node. */
|
||||||
KEYCHAIN_KEY_NODE, /* Key-chain key node. */
|
KEYCHAIN_KEY_NODE, /* Key-chain key node. */
|
||||||
|
AFFMAP_NODE, /* Affinity map node. */
|
||||||
IP_NODE, /* Static ip route node. */
|
IP_NODE, /* Static ip route node. */
|
||||||
VRF_NODE, /* VRF mode node. */
|
VRF_NODE, /* VRF mode node. */
|
||||||
INTERFACE_NODE, /* Interface mode node. */
|
INTERFACE_NODE, /* Interface mode node. */
|
||||||
@ -186,6 +188,7 @@ enum node_type {
|
|||||||
BMP_NODE, /* BMP config under router bgp */
|
BMP_NODE, /* BMP config under router bgp */
|
||||||
NODE_TYPE_MAX, /* maximum */
|
NODE_TYPE_MAX, /* maximum */
|
||||||
};
|
};
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
extern vector cmdvec;
|
extern vector cmdvec;
|
||||||
extern const struct message tokennames[];
|
extern const struct message tokennames[];
|
||||||
|
@ -7,6 +7,9 @@ lib_libfrr_la_LDFLAGS = $(LIB_LDFLAGS) -version-info 0:0:0 -Xlinker -e_libfrr_ve
|
|||||||
lib_libfrr_la_LIBADD = $(LIBCAP) $(UNWIND_LIBS) $(LIBYANG_LIBS) $(LUA_LIB) $(UST_LIBS) $(LIBCRYPT) $(LIBDL) $(LIBM)
|
lib_libfrr_la_LIBADD = $(LIBCAP) $(UNWIND_LIBS) $(LIBYANG_LIBS) $(LUA_LIB) $(UST_LIBS) $(LIBCRYPT) $(LIBDL) $(LIBM)
|
||||||
|
|
||||||
lib_libfrr_la_SOURCES = \
|
lib_libfrr_la_SOURCES = \
|
||||||
|
lib/affinitymap.c \
|
||||||
|
lib/affinitymap_cli.c \
|
||||||
|
lib/affinitymap_northbound.c \
|
||||||
lib/agg_table.c \
|
lib/agg_table.c \
|
||||||
lib/atomlist.c \
|
lib/atomlist.c \
|
||||||
lib/base64.c \
|
lib/base64.c \
|
||||||
@ -127,6 +130,7 @@ lib_libfrr_la_SOURCES = \
|
|||||||
# end
|
# end
|
||||||
|
|
||||||
nodist_lib_libfrr_la_SOURCES = \
|
nodist_lib_libfrr_la_SOURCES = \
|
||||||
|
yang/frr-affinity-map.yang.c \
|
||||||
yang/frr-filter.yang.c \
|
yang/frr-filter.yang.c \
|
||||||
yang/frr-interface.yang.c \
|
yang/frr-interface.yang.c \
|
||||||
yang/frr-route-map.yang.c \
|
yang/frr-route-map.yang.c \
|
||||||
@ -146,6 +150,7 @@ lib_libfrr_la_SOURCES += lib/db.c
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
clippy_scan += \
|
clippy_scan += \
|
||||||
|
lib/affinitymap_cli.c \
|
||||||
lib/if.c \
|
lib/if.c \
|
||||||
lib/filter_cli.c \
|
lib/filter_cli.c \
|
||||||
lib/log_vty.c \
|
lib/log_vty.c \
|
||||||
@ -159,6 +164,7 @@ clippy_scan += \
|
|||||||
# end
|
# end
|
||||||
|
|
||||||
pkginclude_HEADERS += \
|
pkginclude_HEADERS += \
|
||||||
|
lib/affinitymap.h \
|
||||||
lib/agg_table.h \
|
lib/agg_table.h \
|
||||||
lib/atomlist.h \
|
lib/atomlist.h \
|
||||||
lib/base64.h \
|
lib/base64.h \
|
||||||
|
@ -88,6 +88,7 @@ static const char *const frr_native_modules[] = {
|
|||||||
"frr-interface",
|
"frr-interface",
|
||||||
"frr-vrf",
|
"frr-vrf",
|
||||||
"frr-routing",
|
"frr-routing",
|
||||||
|
"frr-affinity-map",
|
||||||
"frr-route-map",
|
"frr-route-map",
|
||||||
"frr-nexthop",
|
"frr-nexthop",
|
||||||
"frr-ripd",
|
"frr-ripd",
|
||||||
|
@ -2216,6 +2216,29 @@ DEFUNSH(VTYSH_PATHD, pcep_cli_pcep_pce_config, pcep_cli_pcep_pce_config_cmd,
|
|||||||
|
|
||||||
#endif /* HAVE_PATHD */
|
#endif /* HAVE_PATHD */
|
||||||
|
|
||||||
|
/* max value is EXT_ADMIN_GROUP_MAX_POSITIONS - 1 */
|
||||||
|
DEFUNSH(VTYSH_AFFMAP, affinity_map, vtysh_affinity_map_cmd,
|
||||||
|
"affinity-map NAME bit-position (0-1023)",
|
||||||
|
"Affinity map configuration\n"
|
||||||
|
"Affinity attribute name\n"
|
||||||
|
"Bit position for affinity attribute value\n"
|
||||||
|
"Bit position\n")
|
||||||
|
{
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* max value is EXT_ADMIN_GROUP_MAX_POSITIONS - 1 */
|
||||||
|
DEFUNSH(VTYSH_AFFMAP, no_affinity_map, vtysh_no_affinity_map_cmd,
|
||||||
|
"no affinity-map NAME$name [bit-position (0-1023)$position]",
|
||||||
|
NO_STR
|
||||||
|
"Affinity map configuration\n"
|
||||||
|
"Affinity attribute name\n"
|
||||||
|
"Bit position for affinity attribute value\n"
|
||||||
|
"Bit position\n")
|
||||||
|
{
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
DEFUNSH(VTYSH_RMAP, vtysh_route_map, vtysh_route_map_cmd,
|
DEFUNSH(VTYSH_RMAP, vtysh_route_map, vtysh_route_map_cmd,
|
||||||
"route-map RMAP_NAME <deny|permit> (1-65535)",
|
"route-map RMAP_NAME <deny|permit> (1-65535)",
|
||||||
"Create route-map or enter route-map command mode\n"
|
"Create route-map or enter route-map command mode\n"
|
||||||
@ -4850,6 +4873,9 @@ void vtysh_init_vty(void)
|
|||||||
install_element(VRF_NODE, &vtysh_exit_vrf_cmd);
|
install_element(VRF_NODE, &vtysh_exit_vrf_cmd);
|
||||||
install_element(VRF_NODE, &vtysh_quit_vrf_cmd);
|
install_element(VRF_NODE, &vtysh_quit_vrf_cmd);
|
||||||
|
|
||||||
|
install_element(CONFIG_NODE, &vtysh_affinity_map_cmd);
|
||||||
|
install_element(CONFIG_NODE, &vtysh_no_affinity_map_cmd);
|
||||||
|
|
||||||
install_node(&rmap_node);
|
install_node(&rmap_node);
|
||||||
install_element(CONFIG_NODE, &vtysh_route_map_cmd);
|
install_element(CONFIG_NODE, &vtysh_route_map_cmd);
|
||||||
install_element(RMAP_NODE, &vtysh_exit_rmap_cmd);
|
install_element(RMAP_NODE, &vtysh_exit_rmap_cmd);
|
||||||
|
@ -59,6 +59,7 @@ extern struct thread_master *master;
|
|||||||
* things like prefix lists are not even initialised) */
|
* things like prefix lists are not even initialised) */
|
||||||
#define VTYSH_ALL VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_LDPD|VTYSH_BGPD|VTYSH_ISISD|VTYSH_PIMD|VTYSH_PIM6D|VTYSH_NHRPD|VTYSH_EIGRPD|VTYSH_BABELD|VTYSH_SHARPD|VTYSH_PBRD|VTYSH_STATICD|VTYSH_BFDD|VTYSH_FABRICD|VTYSH_VRRPD|VTYSH_PATHD
|
#define VTYSH_ALL VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_LDPD|VTYSH_BGPD|VTYSH_ISISD|VTYSH_PIMD|VTYSH_PIM6D|VTYSH_NHRPD|VTYSH_EIGRPD|VTYSH_BABELD|VTYSH_SHARPD|VTYSH_PBRD|VTYSH_STATICD|VTYSH_BFDD|VTYSH_FABRICD|VTYSH_VRRPD|VTYSH_PATHD
|
||||||
#define VTYSH_ACL VTYSH_BFDD|VTYSH_BABELD|VTYSH_BGPD|VTYSH_EIGRPD|VTYSH_ISISD|VTYSH_FABRICD|VTYSH_LDPD|VTYSH_NHRPD|VTYSH_OSPF6D|VTYSH_OSPFD|VTYSH_PBRD|VTYSH_PIMD|VTYSH_PIM6D|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_VRRPD|VTYSH_ZEBRA
|
#define VTYSH_ACL VTYSH_BFDD|VTYSH_BABELD|VTYSH_BGPD|VTYSH_EIGRPD|VTYSH_ISISD|VTYSH_FABRICD|VTYSH_LDPD|VTYSH_NHRPD|VTYSH_OSPF6D|VTYSH_OSPFD|VTYSH_PBRD|VTYSH_PIMD|VTYSH_PIM6D|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_VRRPD|VTYSH_ZEBRA
|
||||||
|
#define VTYSH_AFFMAP VTYSH_ZEBRA
|
||||||
#define VTYSH_RMAP VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_BGPD|VTYSH_ISISD|VTYSH_PIMD|VTYSH_EIGRPD|VTYSH_FABRICD
|
#define VTYSH_RMAP VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_BGPD|VTYSH_ISISD|VTYSH_PIMD|VTYSH_EIGRPD|VTYSH_FABRICD
|
||||||
#define VTYSH_INTERFACE_SUBSET \
|
#define VTYSH_INTERFACE_SUBSET \
|
||||||
VTYSH_ZEBRA | VTYSH_RIPD | VTYSH_RIPNGD | VTYSH_OSPFD | VTYSH_OSPF6D | \
|
VTYSH_ZEBRA | VTYSH_RIPD | VTYSH_RIPNGD | VTYSH_OSPFD | VTYSH_OSPF6D | \
|
||||||
|
@ -395,6 +395,9 @@ void vtysh_config_parse_line(void *arg, const char *line)
|
|||||||
else if (strncmp(line, "router openfabric", strlen("router openfabric"))
|
else if (strncmp(line, "router openfabric", strlen("router openfabric"))
|
||||||
== 0)
|
== 0)
|
||||||
config = config_get(OPENFABRIC_NODE, line);
|
config = config_get(OPENFABRIC_NODE, line);
|
||||||
|
else if (strncmp(line, "affinity-map",
|
||||||
|
strlen("affinity-map")) == 0)
|
||||||
|
config = config_get(AFFMAP_NODE, line);
|
||||||
else if (strncmp(line, "route-map", strlen("route-map")) == 0)
|
else if (strncmp(line, "route-map", strlen("route-map")) == 0)
|
||||||
config = config_get(RMAP_NODE, line);
|
config = config_get(RMAP_NODE, line);
|
||||||
else if (strncmp(line, "no route-map", strlen("no route-map"))
|
else if (strncmp(line, "no route-map", strlen("no route-map"))
|
||||||
@ -526,14 +529,15 @@ void vtysh_config_parse_line(void *arg, const char *line)
|
|||||||
/* Macro to check delimiter is needed between each configuration line
|
/* Macro to check delimiter is needed between each configuration line
|
||||||
* or not. */
|
* or not. */
|
||||||
#define NO_DELIMITER(I) \
|
#define NO_DELIMITER(I) \
|
||||||
((I) == ACCESS_NODE || (I) == PREFIX_NODE || (I) == IP_NODE \
|
((I) == AFFMAP_NODE || (I) == ACCESS_NODE || (I) == PREFIX_NODE || \
|
||||||
|| (I) == AS_LIST_NODE || (I) == COMMUNITY_LIST_NODE \
|
(I) == IP_NODE || (I) == AS_LIST_NODE || \
|
||||||
|| (I) == COMMUNITY_ALIAS_NODE || (I) == ACCESS_IPV6_NODE \
|
(I) == COMMUNITY_LIST_NODE || (I) == COMMUNITY_ALIAS_NODE || \
|
||||||
|| (I) == ACCESS_MAC_NODE || (I) == PREFIX_IPV6_NODE \
|
(I) == ACCESS_IPV6_NODE || (I) == ACCESS_MAC_NODE || \
|
||||||
|| (I) == FORWARDING_NODE || (I) == DEBUG_NODE || (I) == AAA_NODE \
|
(I) == PREFIX_IPV6_NODE || (I) == FORWARDING_NODE || \
|
||||||
|| (I) == VRF_DEBUG_NODE || (I) == NORTHBOUND_DEBUG_NODE \
|
(I) == DEBUG_NODE || (I) == AAA_NODE || (I) == VRF_DEBUG_NODE || \
|
||||||
|| (I) == RMAP_DEBUG_NODE || (I) == RESOLVER_DEBUG_NODE \
|
(I) == NORTHBOUND_DEBUG_NODE || (I) == RMAP_DEBUG_NODE || \
|
||||||
|| (I) == MPLS_NODE || (I) == KEYCHAIN_KEY_NODE)
|
(I) == RESOLVER_DEBUG_NODE || (I) == MPLS_NODE || \
|
||||||
|
(I) == KEYCHAIN_KEY_NODE)
|
||||||
|
|
||||||
static void configvec_dump(vector vec, bool nested)
|
static void configvec_dump(vector vec, bool nested)
|
||||||
{
|
{
|
||||||
|
81
yang/frr-affinity-map.yang
Normal file
81
yang/frr-affinity-map.yang
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
module frr-affinity-map {
|
||||||
|
yang-version 1.1;
|
||||||
|
namespace "http://frrouting.org/yang/affinity-map";
|
||||||
|
prefix frr-affinity-map;
|
||||||
|
|
||||||
|
import ietf-inet-types {
|
||||||
|
prefix inet;
|
||||||
|
}
|
||||||
|
|
||||||
|
import frr-filter {
|
||||||
|
prefix filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
import frr-interface {
|
||||||
|
prefix frr-interface;
|
||||||
|
}
|
||||||
|
|
||||||
|
organization
|
||||||
|
"FRRouting";
|
||||||
|
contact
|
||||||
|
"FRR Users List: <mailto:frog@lists.frrouting.org>
|
||||||
|
FRR Development List: <mailto:dev@lists.frrouting.org>";
|
||||||
|
description
|
||||||
|
"This module defines route map settings
|
||||||
|
|
||||||
|
Copyright 2022 FRRouting
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.";
|
||||||
|
|
||||||
|
revision 2022-11-03 {
|
||||||
|
description
|
||||||
|
"Initial revision";
|
||||||
|
}
|
||||||
|
|
||||||
|
container lib {
|
||||||
|
container affinity-maps {
|
||||||
|
description
|
||||||
|
"Affinity Mapping Table";
|
||||||
|
list affinity-map {
|
||||||
|
key "name";
|
||||||
|
description
|
||||||
|
"Affinity Mapping configuration";
|
||||||
|
leaf name {
|
||||||
|
type string {
|
||||||
|
length "1..32";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Affinity Name";
|
||||||
|
}
|
||||||
|
leaf value {
|
||||||
|
type uint16 {
|
||||||
|
range "0..1023";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Bit position";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -11,6 +11,10 @@ module frr-zebra {
|
|||||||
prefix inet;
|
prefix inet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
import frr-affinity-map {
|
||||||
|
prefix frr-affinity-map;
|
||||||
|
}
|
||||||
|
|
||||||
import frr-route-map {
|
import frr-route-map {
|
||||||
prefix frr-route-map;
|
prefix frr-route-map;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ EXTRA_DIST += yang/embedmodel.py
|
|||||||
# global symbols :(. Just put it in the daemon. Dynamic libraries.so work
|
# global symbols :(. Just put it in the daemon. Dynamic libraries.so work
|
||||||
# without problems, as seen in libfrr.
|
# without problems, as seen in libfrr.
|
||||||
|
|
||||||
|
dist_yangmodels_DATA += yang/frr-affinity-map.yang
|
||||||
dist_yangmodels_DATA += yang/frr-filter.yang
|
dist_yangmodels_DATA += yang/frr-filter.yang
|
||||||
dist_yangmodels_DATA += yang/frr-module-translator.yang
|
dist_yangmodels_DATA += yang/frr-module-translator.yang
|
||||||
dist_yangmodels_DATA += yang/frr-nexthop.yang
|
dist_yangmodels_DATA += yang/frr-nexthop.yang
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "sigevent.h"
|
#include "sigevent.h"
|
||||||
#include "vrf.h"
|
#include "vrf.h"
|
||||||
#include "libfrr.h"
|
#include "libfrr.h"
|
||||||
|
#include "affinitymap.h"
|
||||||
#include "routemap.h"
|
#include "routemap.h"
|
||||||
#include "routing_nb.h"
|
#include "routing_nb.h"
|
||||||
|
|
||||||
@ -259,6 +260,7 @@ struct frr_signal_t zebra_signals[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
static const struct frr_yang_module_info *const zebra_yang_modules[] = {
|
static const struct frr_yang_module_info *const zebra_yang_modules[] = {
|
||||||
&frr_filter_info,
|
&frr_filter_info,
|
||||||
&frr_interface_info,
|
&frr_interface_info,
|
||||||
@ -266,8 +268,10 @@ static const struct frr_yang_module_info *const zebra_yang_modules[] = {
|
|||||||
&frr_zebra_info,
|
&frr_zebra_info,
|
||||||
&frr_vrf_info,
|
&frr_vrf_info,
|
||||||
&frr_routing_info,
|
&frr_routing_info,
|
||||||
|
&frr_affinity_map_info,
|
||||||
&frr_zebra_route_map_info,
|
&frr_zebra_route_map_info,
|
||||||
};
|
};
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
FRR_DAEMON_INFO(
|
FRR_DAEMON_INFO(
|
||||||
zebra, ZEBRA, .vty_port = ZEBRA_VTY_PORT, .flags = FRR_NO_ZCLIENT,
|
zebra, ZEBRA, .vty_port = ZEBRA_VTY_PORT, .flags = FRR_NO_ZCLIENT,
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include "srcdest_table.h"
|
#include "srcdest_table.h"
|
||||||
#include "vxlan.h"
|
#include "vxlan.h"
|
||||||
#include "termtable.h"
|
#include "termtable.h"
|
||||||
|
#include "affinitymap.h"
|
||||||
|
|
||||||
#include "zebra/zebra_router.h"
|
#include "zebra/zebra_router.h"
|
||||||
#include "zebra/zserv.h"
|
#include "zebra/zserv.h"
|
||||||
@ -4496,6 +4497,8 @@ void zebra_vty_init(void)
|
|||||||
/* Route-map */
|
/* Route-map */
|
||||||
zebra_route_map_init();
|
zebra_route_map_init();
|
||||||
|
|
||||||
|
affinity_map_init();
|
||||||
|
|
||||||
install_node(&ip_node);
|
install_node(&ip_node);
|
||||||
install_node(&protocol_node);
|
install_node(&protocol_node);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user