Merge pull request #7133 from Niral-Networks/niral_fix_ospf_timer

ospfd : Fix for ospf dead interval and hello due.
This commit is contained in:
Donald Sharp 2020-09-19 08:18:46 -04:00 committed by GitHub
commit 68f383438d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 0 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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);