From: Christian Franke Date: Mon, 5 Mar 2018 20:29:15 +0000 (+0100) Subject: isisd: add nerd-knob to turn three-way-adj off X-Git-Tag: frr-5.0-dev~162^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=58e5d748c9f8ec6d4f1882e4c08629975cb4ecc1;p=matthieu%2Ffrr.git isisd: add nerd-knob to turn three-way-adj off Signed-off-by: Christian Franke --- 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);