]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospfd : Fix for ospf dead interval and hello due. 7133/head
authorKaushik <kaushik@niralnetworks.com>
Sat, 19 Sep 2020 07:29:25 +0000 (00:29 -0700)
committerKaushik <kaushik@niralnetworks.com>
Sat, 19 Sep 2020 07:29:25 +0000 (00:29 -0700)
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 <dead-val>".
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 <kaushik@niralnetworks.com>
ospfd/ospf_interface.c
ospfd/ospf_interface.h
ospfd/ospf_vty.c

index adc303759863f617e0eea876cb8db9f342b730ff..6bfdb1e9e0c019f6b54caef7d27db02f52f7e32a 100644 (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;
 }
index 1d28eac6b3f660d3b08fe202f12cd76068879542..bf59af16c2cd2f063fd921d564f2b983ad9d20c3 100644 (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);
index 9d00ff65f9323ab9acaaaa91c4cdbfb16c7c305e..8099b0160cf386a4983df465f5446fbf36caf9b8 100644 (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);