Пример #1
0
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;
}
Пример #2
0
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;
}