mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 10:37:29 +00:00
isisd: Add Link State Traffic Engineering support
Add Link State TED features to isis_te.c and new CLI to export LS TED and show LS TED to IS-IS. IS-IS LSPs are parse each time a new LSP event occurs in order to update accordingly the Link State Traffic Engineering Database. LS TED could be exported through the ZAPI Opaque message (see sharpd as example). Signed-off-by: Olivier Dugeon <olivier.dugeon@orange.com>
This commit is contained in:
parent
d9884a758c
commit
ed6189a9b5
@ -318,6 +318,11 @@ Traffic Engineering
|
||||
|
||||
.. note::
|
||||
|
||||
IS-IS-TE supports RFC 5305 (base TE), RFC 6119 (IPv6) and RFC 7810 / 8570
|
||||
(Extended Metric) with or without Multi-Topology. All Traffic Engineering
|
||||
information are stored in a database formally named TED. However, best
|
||||
acccuracy is provided without Multi-Topology due to inconsistency of Traffic
|
||||
Engineering Advertisement of 3rd party commercial routers when MT is enabled.
|
||||
At this time, FRR offers partial support for some of the routing protocol
|
||||
extensions that can be used with MPLS-TE. FRR does not currently support a
|
||||
complete RSVP-TE solution.
|
||||
@ -334,6 +339,11 @@ Traffic Engineering
|
||||
|
||||
Configure stable IPv6 address for MPLS-TE.
|
||||
|
||||
.. clicmd:: mpls-te export
|
||||
|
||||
Export Traffic Engineering DataBase to other daemons through the ZAPI
|
||||
Opaque Link State messages.
|
||||
|
||||
.. clicmd:: show isis mpls-te interface
|
||||
|
||||
.. clicmd:: show isis mpls-te interface INTERFACE
|
||||
@ -344,6 +354,16 @@ Traffic Engineering
|
||||
|
||||
Show Traffic Engineering router parameters.
|
||||
|
||||
.. clicmd:: show isis [vrf <NAME|all>] mpls-te database [detail|json]
|
||||
|
||||
.. clicmd:: show isis [vrf <NAME|all>] mpls-te database vertex [WORD] [detail|json]
|
||||
|
||||
.. clicmd:: show isis [vrf <NAME|all>] mpls-te database edge [A.B.C.D|X:X::X:X] [detail|json]
|
||||
|
||||
.. clicmd:: show isis [vrf <NAME|all>] mpls-te database subnet [A.B.C.D/M|X:X::X:X/M] [detail|json]
|
||||
|
||||
Show Traffic Engineering Database
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`ospf-traffic-engineering`
|
||||
@ -449,6 +469,10 @@ Debugging ISIS
|
||||
|
||||
Update related packets.
|
||||
|
||||
.. clicmd:: debug isis te-events
|
||||
|
||||
IS-IS Traffic Engineering events
|
||||
|
||||
.. clicmd:: debug isis sr-events
|
||||
|
||||
|
||||
|
@ -1189,6 +1189,36 @@ DEFPY_YANG(isis_mpls_te_inter_as, isis_mpls_te_inter_as_cmd,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-isisd:isis/instance/mpls-te/export
|
||||
*/
|
||||
DEFPY_YANG(isis_mpls_te_export, isis_mpls_te_export_cmd, "mpls-te export",
|
||||
MPLS_TE_STR "Enable export of MPLS-TE Link State information\n")
|
||||
{
|
||||
nb_cli_enqueue_change(vty, "./mpls-te/export", NB_OP_MODIFY, "true");
|
||||
|
||||
return nb_cli_apply_changes(vty, NULL);
|
||||
}
|
||||
|
||||
DEFPY_YANG(no_isis_mpls_te_export, no_isis_mpls_te_export_cmd,
|
||||
"no mpls-te export",
|
||||
NO_STR MPLS_TE_STR
|
||||
"Disable export of MPLS-TE Link State information\n")
|
||||
{
|
||||
nb_cli_enqueue_change(vty, "./mpls-te/export", NB_OP_MODIFY, "false");
|
||||
|
||||
return nb_cli_apply_changes(vty, NULL);
|
||||
}
|
||||
|
||||
void cli_show_isis_mpls_te_export(struct vty *vty, const struct lyd_node *dnode,
|
||||
bool show_defaults)
|
||||
{
|
||||
if (!yang_dnode_get_bool(dnode, NULL))
|
||||
vty_out(vty, " no");
|
||||
|
||||
vty_out(vty, " mpls-te export\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-isisd:isis/instance/default-information-originate
|
||||
*/
|
||||
@ -3165,6 +3195,8 @@ void isis_cli_init(void)
|
||||
install_element(ISIS_NODE, &isis_mpls_te_router_addr_v6_cmd);
|
||||
install_element(ISIS_NODE, &no_isis_mpls_te_router_addr_v6_cmd);
|
||||
install_element(ISIS_NODE, &isis_mpls_te_inter_as_cmd);
|
||||
install_element(ISIS_NODE, &isis_mpls_te_export_cmd);
|
||||
install_element(ISIS_NODE, &no_isis_mpls_te_export_cmd);
|
||||
|
||||
install_element(ISIS_NODE, &isis_default_originate_cmd);
|
||||
install_element(ISIS_NODE, &isis_redistribute_cmd);
|
||||
|
@ -572,6 +572,13 @@ const struct frr_yang_module_info frr_isisd_info = {
|
||||
.cli_show = cli_show_isis_mpls_te_router_addr_ipv6,
|
||||
.destroy = isis_instance_mpls_te_router_address_ipv6_destroy,
|
||||
.modify = isis_instance_mpls_te_router_address_ipv6_modify,
|
||||
}
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-isisd:isis/instance/mpls-te/export",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_isis_mpls_te_export,
|
||||
.modify = isis_instance_mpls_te_export_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -215,6 +215,7 @@ int isis_instance_mpls_te_router_address_ipv6_modify(
|
||||
struct nb_cb_modify_args *args);
|
||||
int isis_instance_mpls_te_router_address_ipv6_destroy(
|
||||
struct nb_cb_destroy_args *args);
|
||||
int isis_instance_mpls_te_export_modify(struct nb_cb_modify_args *args);
|
||||
int lib_interface_isis_create(struct nb_cb_create_args *args);
|
||||
int lib_interface_isis_destroy(struct nb_cb_destroy_args *args);
|
||||
int lib_interface_isis_area_tag_modify(struct nb_cb_modify_args *args);
|
||||
@ -470,6 +471,8 @@ void cli_show_isis_mpls_te_router_addr(struct vty *vty,
|
||||
void cli_show_isis_mpls_te_router_addr_ipv6(struct vty *vty,
|
||||
const struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_isis_mpls_te_export(struct vty *vty, const struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_isis_def_origin_ipv4(struct vty *vty,
|
||||
const struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "lib_errors.h"
|
||||
#include "vrf.h"
|
||||
#include "ldp_sync.h"
|
||||
#include "link_state.h"
|
||||
|
||||
#include "isisd/isisd.h"
|
||||
#include "isisd/isis_nb.h"
|
||||
@ -51,6 +52,7 @@
|
||||
#include "isisd/isis_redist.h"
|
||||
#include "isisd/isis_ldp_sync.h"
|
||||
#include "isisd/isis_dr.h"
|
||||
#include "isisd/isis_zebra.h"
|
||||
|
||||
DEFINE_MTYPE_STATIC(ISISD, ISIS_MPLS_TE, "ISIS MPLS_TE parameters");
|
||||
DEFINE_MTYPE_STATIC(ISISD, ISIS_PLIST_NAME, "ISIS prefix-list name");
|
||||
@ -1827,12 +1829,19 @@ int isis_instance_mpls_te_create(struct nb_cb_create_args *args)
|
||||
new->inter_as = off;
|
||||
new->interas_areaid.s_addr = 0;
|
||||
new->router_id.s_addr = 0;
|
||||
new->ted = ls_ted_new(1, "ISIS", 0);
|
||||
if (!new->ted)
|
||||
zlog_warn("Unable to create Link State Data Base");
|
||||
|
||||
area->mta = new;
|
||||
} else {
|
||||
area->mta->status = enable;
|
||||
}
|
||||
|
||||
/* Initialize Link State Database */
|
||||
if (area->mta->ted)
|
||||
isis_te_init_ted(area);
|
||||
|
||||
/* Update Extended TLVs according to Interface link parameters */
|
||||
for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit))
|
||||
isis_link_params_update(circuit, circuit->interface);
|
||||
@ -1858,6 +1867,9 @@ int isis_instance_mpls_te_destroy(struct nb_cb_destroy_args *args)
|
||||
else
|
||||
return NB_OK;
|
||||
|
||||
/* Remove Link State Database */
|
||||
ls_ted_del_all(area->mta->ted);
|
||||
|
||||
/* Flush LSP if circuit engage */
|
||||
for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
|
||||
if (!IS_EXT_TE(circuit->ext))
|
||||
@ -1980,6 +1992,37 @@ int isis_instance_mpls_te_router_address_ipv6_destroy(
|
||||
return NB_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-isisd:isis/instance/mpls-te/export
|
||||
*/
|
||||
int isis_instance_mpls_te_export_modify(struct nb_cb_modify_args *args)
|
||||
{
|
||||
struct isis_area *area;
|
||||
|
||||
if (args->event != NB_EV_APPLY)
|
||||
return NB_OK;
|
||||
|
||||
area = nb_running_get_entry(args->dnode, NULL, true);
|
||||
/* only proceed if MPLS-TE is enabled */
|
||||
if (!IS_MPLS_TE(area->mta))
|
||||
return NB_OK;
|
||||
|
||||
area->mta->export = yang_dnode_get_bool(args->dnode, NULL);
|
||||
if (area->mta->export) {
|
||||
if (IS_DEBUG_EVENTS)
|
||||
zlog_debug("MPLS-TE: Enabled Link State export");
|
||||
if (isis_zebra_ls_register(true) != 0)
|
||||
zlog_warn("Unable to register Link State\n");
|
||||
} else {
|
||||
if (IS_DEBUG_EVENTS)
|
||||
zlog_debug("MPLS-TE: Disable Link State export");
|
||||
if (isis_zebra_ls_register(false) != 0)
|
||||
zlog_warn("Unable to register Link State\n");
|
||||
}
|
||||
|
||||
return NB_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-isisd:isis/instance/segment-routing/enabled
|
||||
*/
|
||||
|
1231
isisd/isis_te.c
1231
isisd/isis_te.c
File diff suppressed because it is too large
Load Diff
@ -88,8 +88,10 @@ typedef enum _interas_mode_t { off, region, as, emulate } interas_mode_t;
|
||||
&& e->status != EXT_ADJ_SID \
|
||||
&& e->status != EXT_LAN_ADJ_SID)
|
||||
#define IS_MPLS_TE(a) (a && a->status == enable)
|
||||
#define IS_EXPORT_TE(a) (a->export)
|
||||
|
||||
/* Per area MPLS-TE parameters */
|
||||
struct ls_ted;
|
||||
struct mpls_te_area {
|
||||
/* Status of MPLS-TE: enable or disable */
|
||||
status_t status;
|
||||
@ -104,11 +106,27 @@ struct mpls_te_area {
|
||||
/* MPLS_TE IPv4 & IPv6 Router IDs */
|
||||
struct in_addr router_id;
|
||||
struct in6_addr router_id_ipv6;
|
||||
|
||||
/* Link State Database */
|
||||
struct ls_ted *ted;
|
||||
bool export;
|
||||
};
|
||||
|
||||
/* Structure to provide parameters to lsp iterate callback function */
|
||||
struct isis_te_args {
|
||||
struct ls_ted *ted;
|
||||
struct ls_vertex *vertex;
|
||||
bool export;
|
||||
};
|
||||
|
||||
enum lsp_event { LSP_UNKNOWN, LSP_ADD, LSP_UPD, LSP_DEL, LSP_INC, LSP_TICK };
|
||||
|
||||
/* Prototypes. */
|
||||
void isis_mpls_te_init(void);
|
||||
void isis_link_params_update(struct isis_circuit *, struct interface *);
|
||||
int isis_mpls_te_update(struct interface *);
|
||||
void isis_te_lsp_event(struct isis_lsp *lsp, enum lsp_event event);
|
||||
int isis_te_sync_ted(struct zapi_opaque_reg_info dst);
|
||||
void isis_te_init_ted(struct isis_area *area);
|
||||
|
||||
#endif /* _ZEBRA_ISIS_MPLS_TE_H */
|
||||
|
@ -1486,6 +1486,12 @@ module frr-isisd {
|
||||
description
|
||||
"Stable IPv6 address of the advertising router.";
|
||||
}
|
||||
leaf export {
|
||||
type boolean;
|
||||
default "false";
|
||||
description
|
||||
"Export Link State informatin.";
|
||||
}
|
||||
}
|
||||
|
||||
container segment-routing {
|
||||
|
Loading…
Reference in New Issue
Block a user