From: Kaushik Date: Sat, 19 Sep 2020 07:29:25 +0000 (-0700) Subject: ospfd : Fix for ospf dead interval and hello due. X-Git-Tag: base_7.6~534^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=182d6bdc160ea1cc23b790029dd64a3f138070a5;p=mirror%2Ffrr.git ospfd : Fix for ospf dead interval and hello due. 1. Ospf dead-interval will be set as 4 times of hello-interval, incase if it is not set by using "ip ospf dead-interval ". 2. On resetting hello-interval using "no ip ospf hello-interval" the dead interval and hello due will be changed accordingly. Signed-off-by: Kaushik --- diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index adc3037598..6bfdb1e9e0 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -539,6 +539,7 @@ static struct ospf_if_params *ospf_new_if_params(void) oip->auth_crypt = list_new(); oip->network_lsa_seqnum = htonl(OSPF_INITIAL_SEQUENCE_NUMBER); + oip->is_v_wait_set = false; return oip; } diff --git a/ospfd/ospf_interface.h b/ospfd/ospf_interface.h index 1d28eac6b3..bf59af16c2 100644 --- a/ospfd/ospf_interface.h +++ b/ospfd/ospf_interface.h @@ -84,6 +84,7 @@ struct ospf_if_params { DECLARE_IF_PARAM(uint32_t, v_hello); /* Hello Interval */ DECLARE_IF_PARAM(uint32_t, v_wait); /* Router Dead Interval */ + bool is_v_wait_set; /* Check for Dead Interval set */ /* MTU mismatch check (see RFC2328, chap 10.6) */ DECLARE_IF_PARAM(uint8_t, mtu_ignore); diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index 9d00ff65f9..8099b0160c 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -7310,6 +7310,7 @@ static int ospf_vty_dead_interval_set(struct vty *vty, const char *interval_str, SET_IF_PARAM(params, v_wait); params->v_wait = seconds; + params->is_v_wait_set = true; /* Update timer values in neighbor structure. */ if (nbr_str) { @@ -7419,6 +7420,7 @@ DEFUN (no_ip_ospf_dead_interval, UNSET_IF_PARAM(params, v_wait); params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT; + params->is_v_wait_set = false; UNSET_IF_PARAM(params, fast_hello); params->fast_hello = OSPF_FAST_HELLO_DEFAULT; @@ -7495,6 +7497,17 @@ DEFUN (ip_ospf_hello_interval, SET_IF_PARAM(params, v_hello); params->v_hello = seconds; + if (!params->is_v_wait_set) { + SET_IF_PARAM(params, v_wait); + /* As per RFC 4062 + * The router dead interval should + * be some multiple of the HelloInterval (perhaps 4 times the + * hello interval) and must be the same for all routers + * attached to a common network. + */ + params->v_wait = 4 * seconds; + } + return CMD_SUCCESS; } @@ -7523,6 +7536,7 @@ DEFUN (no_ip_ospf_hello_interval, int idx = 0; struct in_addr addr; struct ospf_if_params *params; + struct route_node *rn; params = IF_DEF_PARAMS(ifp); @@ -7541,6 +7555,25 @@ DEFUN (no_ip_ospf_hello_interval, UNSET_IF_PARAM(params, v_hello); params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT; + if (!params->is_v_wait_set) { + UNSET_IF_PARAM(params, v_wait); + params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT; + } + + for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) { + struct ospf_interface *oi = rn->info; + + if (!oi) + continue; + + oi->type = IF_DEF_PARAMS(ifp)->type; + + if (oi->state > ISM_Down) { + OSPF_ISM_EVENT_EXECUTE(oi, ISM_InterfaceDown); + OSPF_ISM_EVENT_EXECUTE(oi, ISM_InterfaceUp); + } + } + if (params != IF_DEF_PARAMS(ifp)) { ospf_free_if_params(ifp, addr); ospf_if_update_params(ifp, addr);