summaryrefslogtreecommitdiffstats
path: root/ospf6d/ospf6_message.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospf6d/ospf6_message.c')
-rw-r--r--ospf6d/ospf6_message.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/ospf6d/ospf6_message.c b/ospf6d/ospf6_message.c
index d382f038..b0e94288 100644
--- a/ospf6d/ospf6_message.c
+++ b/ospf6d/ospf6_message.c
@@ -245,6 +245,7 @@ ospf6_hello_recv (struct in6_addr *src, struct in6_addr *dst,
char *p;
int twoway = 0;
int neighborchange = 0;
+ int neighbor_ifindex_change = 0;
int backupseen = 0;
hello = (struct ospf6_hello *)
@@ -285,10 +286,16 @@ ospf6_hello_recv (struct in6_addr *src, struct in6_addr *dst,
on->priority = hello->priority;
}
- /* always override neighbor's source address and ifindex */
- on->ifindex = ntohl (hello->interface_id);
+ /* Always override neighbor's source address */
memcpy (&on->linklocal_addr, src, sizeof (struct in6_addr));
+ /* Neighbor ifindex check */
+ if (on->ifindex != (ifindex_t)ntohl (hello->interface_id))
+ {
+ on->ifindex = ntohl (hello->interface_id);
+ neighbor_ifindex_change++;
+ }
+
/* TwoWay check */
for (p = (char *) ((caddr_t) hello + sizeof (struct ospf6_hello));
p + sizeof (u_int32_t) <= OSPF6_MESSAGE_END (oh);
@@ -348,6 +355,9 @@ ospf6_hello_recv (struct in6_addr *src, struct in6_addr *dst,
thread_add_event (master, backup_seen, oi, 0);
if (neighborchange)
thread_add_event (master, neighbor_change, oi, 0);
+
+ if (neighbor_ifindex_change && on->state == OSPF6_NEIGHBOR_FULL)
+ OSPF6_ROUTER_LSA_SCHEDULE (oi->area);
}
static void