version 1.1, 2012/02/21 17:26:12
|
version 1.1.1.2, 2012/10/09 09:22:29
|
Line 272 ospf_route_install (struct ospf *ospf, struct route_ta
|
Line 272 ospf_route_install (struct ospf *ospf, struct route_ta
|
} |
} |
} |
} |
|
|
static void |
|
ospf_intra_route_add (struct route_table *rt, struct vertex *v, |
|
struct ospf_area *area) |
|
{ |
|
struct route_node *rn; |
|
struct ospf_route *or; |
|
struct prefix_ipv4 p; |
|
struct ospf_path *path; |
|
struct vertex_parent *parent; |
|
struct listnode *node, *nnode; |
|
|
|
p.family = AF_INET; |
|
p.prefix = v->id; |
|
if (v->type == OSPF_VERTEX_ROUTER) |
|
p.prefixlen = IPV4_MAX_BITLEN; |
|
else |
|
{ |
|
struct network_lsa *lsa = (struct network_lsa *) v->lsa; |
|
p.prefixlen = ip_masklen (lsa->mask); |
|
} |
|
apply_mask_ipv4 (&p); |
|
|
|
rn = route_node_get (rt, (struct prefix *) &p); |
|
if (rn->info) |
|
{ |
|
zlog_warn ("Same routing information exists for %s", inet_ntoa (v->id)); |
|
route_unlock_node (rn); |
|
return; |
|
} |
|
|
|
or = ospf_route_new (); |
|
|
|
if (v->type == OSPF_VERTEX_NETWORK) |
|
{ |
|
or->type = OSPF_DESTINATION_NETWORK; |
|
|
|
for (ALL_LIST_ELEMENTS (v->parents, node, nnode, parent)) |
|
{ |
|
path = ospf_path_new (); |
|
path->nexthop = parent->nexthop->router; |
|
listnode_add (or->paths, path); |
|
} |
|
} |
|
else |
|
or->type = OSPF_DESTINATION_ROUTER; |
|
|
|
or->id = v->id; |
|
or->u.std.area_id = area->area_id; |
|
or->u.std.external_routing= area->external_routing; |
|
or->path_type = OSPF_PATH_INTRA_AREA; |
|
or->cost = v->distance; |
|
|
|
rn->info = or; |
|
} |
|
|
|
/* RFC2328 16.1. (4). For "router". */ |
/* RFC2328 16.1. (4). For "router". */ |
void |
void |
ospf_intra_add_router (struct route_table *rt, struct vertex *v, |
ospf_intra_add_router (struct route_table *rt, struct vertex *v, |