summaryrefslogtreecommitdiff
path: root/ospfd/ospf_nsm.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospf_nsm.c')
-rw-r--r--ospfd/ospf_nsm.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c
index 0e6814e22b..d3266e8355 100644
--- a/ospfd/ospf_nsm.c
+++ b/ospfd/ospf_nsm.c
@@ -170,6 +170,10 @@ nsm_packet_received (struct ospf_neighbor *nbr)
if (nbr->oi->type == OSPF_IFTYPE_NBMA && nbr->nbr_nbma)
OSPF_POLL_TIMER_OFF (nbr->nbr_nbma->t_poll);
+ /* Send proactive ARP requests */
+ if (nbr->state < NSM_Exchange)
+ ospf_proactively_arp (nbr);
+
return 0;
}
@@ -184,13 +188,22 @@ nsm_start (struct ospf_neighbor *nbr)
OSPF_NSM_TIMER_ON (nbr->t_inactivity, ospf_inactivity_timer,
nbr->v_inactivity);
+ /* Send proactive ARP requests */
+ ospf_proactively_arp (nbr);
+
return 0;
}
static int
nsm_twoway_received (struct ospf_neighbor *nbr)
{
- return (nsm_should_adj (nbr) ? NSM_ExStart : NSM_TwoWay);
+ int adj = nsm_should_adj (nbr);
+
+ /* Send proactive ARP requests */
+ if (adj)
+ ospf_proactively_arp (nbr);
+
+ return (adj ? NSM_ExStart : NSM_TwoWay);
}
int
@@ -273,6 +286,9 @@ nsm_negotiation_done (struct ospf_neighbor *nbr)
struct ospf_lsa *lsa;
struct route_node *rn;
+ /* Send proactive ARP requests */
+ ospf_proactively_arp (nbr);
+
LSDB_LOOP (ROUTER_LSDB (area), rn, lsa)
ospf_db_summary_add (nbr, lsa);
LSDB_LOOP (NETWORK_LSDB (area), rn, lsa)
@@ -334,7 +350,12 @@ nsm_adj_ok (struct ospf_neighbor *nbr)
int adj = nsm_should_adj (nbr);
if (nbr->state == NSM_TwoWay && adj == 1)
- next_state = NSM_ExStart;
+ {
+ next_state = NSM_ExStart;
+
+ /* Send proactive ARP requests */
+ ospf_proactively_arp (nbr);
+ }
else if (nbr->state >= NSM_ExStart && adj == 0)
next_state = NSM_TwoWay;