struct ospf_neighbor *ospf_nbr_get(struct ospf_interface *oi, struct ospf_header *ospfh, struct ip *iph, struct prefix *p) { struct route_node *rn; struct prefix key; struct ospf_neighbor *nbr; key.family = AF_INET; key.prefixlen = IPV4_MAX_BITLEN; if (oi->type == OSPF_IFTYPE_VIRTUALLINK) key.u.prefix4 = ospfh->router_id; /* index vlink nbrs by router-id */ else key.u.prefix4 = iph->ip_src; rn = route_node_get(oi->nbrs, &key); if (rn->info) { route_unlock_node(rn); nbr = rn->info; if (oi->type == OSPF_IFTYPE_NBMA && nbr->state == NSM_Attempt) { nbr->src = iph->ip_src; memcpy(&nbr->address, p, sizeof(struct prefix)); } } else { rn->info = nbr = ospf_nbr_add(oi, ospfh, p); } nbr->router_id = ospfh->router_id; return nbr; }
struct ospf_neighbor * ospf_nbr_get (struct ospf_interface *oi, struct ospf_header *ospfh, struct ip *iph, struct prefix *p) { struct route_node *rn; struct prefix key; struct ospf_neighbor *nbr; key.family = AF_INET; key.prefixlen = IPV4_MAX_BITLEN; if (oi->type == OSPF_IFTYPE_VIRTUALLINK) { key.u.prefix4 = ospfh->router_id; /* index vlink nbrs by router-id */ } else { key.u.prefix4 = iph->ip_src; } rn = route_node_get (oi->nbrs, &key); if (rn->info) { route_unlock_node (rn); nbr = rn->info; if (oi->type == OSPF_IFTYPE_NBMA && nbr->state == NSM_Attempt) { nbr->src = iph->ip_src; memcpy (&nbr->address, p, sizeof (struct prefix)); } /*add by bill 20091224. if the nbr's router id is changed, then the nbr's state is transit to ExStart, to refresh the adjacency*/ if(IPV4_ADDR_CMP(&nbr->router_id, &ospfh->router_id)) { nbr->router_id = ospfh->router_id; OSPF_NSM_EVENT_EXECUTE (nbr, NSM_AdjOK); } } else { rn->info = nbr = ospf_nbr_add (oi, ospfh, p); nbr->router_id = ospfh->router_id; } return nbr; }