From 58e5d748c9f8ec6d4f1882e4c08629975cb4ecc1 Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Mon, 5 Mar 2018 21:29:15 +0100 Subject: [PATCH] isisd: add nerd-knob to turn three-way-adj off Signed-off-by: Christian Franke --- isisd/isis_adjacency.c | 2 +- isisd/isis_circuit.c | 5 +++++ isisd/isis_circuit.h | 1 + isisd/isis_pdu.c | 3 ++- isisd/isis_vty.c | 17 +++++++++++++++++ 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index ece080347d..a6e1a55a9f 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -169,7 +169,7 @@ void isis_adj_process_threeway(struct isis_adjacency *adj, { enum isis_threeway_state next_tw_state = ISIS_THREEWAY_DOWN; - if (tw_adj) { + if (tw_adj && !adj->circuit->disable_threeway_adj) { if (tw_adj->state == ISIS_THREEWAY_DOWN) { next_tw_state = ISIS_THREEWAY_INITIALIZING; } else if (tw_adj->state == ISIS_THREEWAY_INITIALIZING) { diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index c8642b623d..2c443c71f7 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -1041,6 +1041,11 @@ int isis_interface_config_write(struct vty *vty) write++; } + if (circuit->disable_threeway_adj) { + vty_out(vty, " no isis three-way-handshake\n"); + write++; + } + /* ISIS - Hello interval */ if (circuit->hello_interval[0] == circuit->hello_interval[1]) { diff --git a/isisd/isis_circuit.h b/isisd/isis_circuit.h index de6e7f2d87..246279c6f3 100644 --- a/isisd/isis_circuit.h +++ b/isisd/isis_circuit.h @@ -132,6 +132,7 @@ struct isis_circuit { u_int16_t upadjcount[2]; #define ISIS_CIRCUIT_FLAPPED_AFTER_SPF 0x01 u_char flags; + bool disable_threeway_adj; /* * Counters as in 10589--11.2.5.9 */ diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index 8dd43258fd..bcbda33088 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -1559,7 +1559,8 @@ int send_hello(struct isis_circuit *circuit, int level) if (circuit->circ_type == CIRCUIT_T_BROADCAST) { isis_tlvs_add_lan_neighbors( tlvs, circuit->u.bc.lan_neighs[level - 1]); - } else if (circuit->circ_type == CIRCUIT_T_P2P) { + } else if (circuit->circ_type == CIRCUIT_T_P2P + && !circuit->disable_threeway_adj) { uint32_t ext_circuit_id = circuit->idx; if (circuit->u.p2p.neighbor) { isis_tlvs_add_threeway_adj(tlvs, diff --git a/isisd/isis_vty.c b/isisd/isis_vty.c index 02e28a73fe..66d79b2e9f 100644 --- a/isisd/isis_vty.c +++ b/isisd/isis_vty.c @@ -927,6 +927,21 @@ DEFUN (no_isis_hello_padding, return CMD_SUCCESS; } +DEFUN (isis_threeway_adj, + isis_threeway_adj_cmd, + "[no] isis three-way-handshake", + NO_STR + "IS-IS commands\n" + "Enable/Disable three-way handshake\n") +{ + struct isis_circuit *circuit = isis_circuit_lookup(vty); + if (!circuit) + return CMD_ERR_NO_MATCH; + + circuit->disable_threeway_adj = !strcmp(argv[0]->text, "no"); + return CMD_SUCCESS; +} + DEFUN (csnp_interval, csnp_interval_cmd, "isis csnp-interval (1-600)", @@ -2085,6 +2100,8 @@ void isis_vty_init(void) install_element(INTERFACE_NODE, &isis_hello_padding_cmd); install_element(INTERFACE_NODE, &no_isis_hello_padding_cmd); + install_element(INTERFACE_NODE, &isis_threeway_adj_cmd); + install_element(INTERFACE_NODE, &csnp_interval_cmd); install_element(INTERFACE_NODE, &no_csnp_interval_cmd); install_element(INTERFACE_NODE, &csnp_interval_l1_cmd); -- 2.39.5