Fixes another bug in OSPFv3 vlinks.
This commit is contained in:
parent
8249ad9b30
commit
dd4da6f640
7 changed files with 18 additions and 13 deletions
|
@ -261,7 +261,7 @@ ospf_hello_send(struct ospf_iface *ifa, int kind, struct ospf_neighbor *dirn)
|
||||||
pkt->priority = ifa->priority;
|
pkt->priority = ifa->priority;
|
||||||
|
|
||||||
#ifdef OSPFv3
|
#ifdef OSPFv3
|
||||||
pkt->iface_id = htonl(ifa->iface->index);
|
pkt->iface_id = htonl(ifa->iface_id);
|
||||||
|
|
||||||
pkt->options3 = ifa->oa->options >> 16;
|
pkt->options3 = ifa->oa->options >> 16;
|
||||||
pkt->options2 = ifa->oa->options >> 8;
|
pkt->options2 = ifa->oa->options >> 8;
|
||||||
|
|
|
@ -567,6 +567,8 @@ ospf_iface_new(struct ospf_area *oa, struct ifa *addr, struct ospf_iface_patt *i
|
||||||
log(L_WARN "%s: Cannot use interface %s as %s, forcing %s",
|
log(L_WARN "%s: Cannot use interface %s as %s, forcing %s",
|
||||||
p->name, iface->name, ospf_it[old_type], ospf_it[ifa->type]);
|
p->name, iface->name, ospf_it[old_type], ospf_it[ifa->type]);
|
||||||
|
|
||||||
|
/* Assign iface ID, for vlinks, this is ugly hack */
|
||||||
|
ifa->iface_id = (ifa->type != OSPF_IT_VLINK) ? iface->index : oa->po->last_vlink_id++;
|
||||||
|
|
||||||
init_list(&ifa->neigh_list);
|
init_list(&ifa->neigh_list);
|
||||||
init_list(&ifa->nbma_list);
|
init_list(&ifa->nbma_list);
|
||||||
|
|
|
@ -123,7 +123,7 @@ ospf_lsa_flooding_allowed(struct ospf_lsa_header *lsa, u32 domain, struct ospf_i
|
||||||
switch (scope)
|
switch (scope)
|
||||||
{
|
{
|
||||||
case LSA_SCOPE_LINK:
|
case LSA_SCOPE_LINK:
|
||||||
return ifa->iface->index == domain;
|
return ifa->iface_id == domain;
|
||||||
|
|
||||||
case LSA_SCOPE_AREA:
|
case LSA_SCOPE_AREA:
|
||||||
return ifa->oa->areaid == domain;
|
return ifa->oa->areaid == domain;
|
||||||
|
|
|
@ -459,7 +459,7 @@ bdr_election(struct ospf_iface *ifa)
|
||||||
#else /* OSPFv3 */
|
#else /* OSPFv3 */
|
||||||
me.dr = ifa->drid;
|
me.dr = ifa->drid;
|
||||||
me.bdr = ifa->bdrid;
|
me.bdr = ifa->bdrid;
|
||||||
me.iface_id = ifa->iface->index;
|
me.iface_id = ifa->iface_id;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
add_tail(&ifa->neigh_list, NODE & me);
|
add_tail(&ifa->neigh_list, NODE & me);
|
||||||
|
|
|
@ -232,6 +232,7 @@ ospf_start(struct proto *p)
|
||||||
struct ospf_area_config *ac;
|
struct ospf_area_config *ac;
|
||||||
|
|
||||||
po->router_id = proto_get_router_id(p->cf);
|
po->router_id = proto_get_router_id(p->cf);
|
||||||
|
po->last_vlink_id = 0x80000000;
|
||||||
po->rfc1583 = c->rfc1583;
|
po->rfc1583 = c->rfc1583;
|
||||||
po->ebit = 0;
|
po->ebit = 0;
|
||||||
po->ecmp = c->ecmp;
|
po->ecmp = c->ecmp;
|
||||||
|
|
|
@ -189,7 +189,8 @@ struct ospf_iface
|
||||||
u32 rxmtint; /* number of seconds between LSA retransmissions */
|
u32 rxmtint; /* number of seconds between LSA retransmissions */
|
||||||
u32 pollint; /* Poll interval */
|
u32 pollint; /* Poll interval */
|
||||||
u32 deadint; /* after "deadint" missing hellos is router dead */
|
u32 deadint; /* after "deadint" missing hellos is router dead */
|
||||||
u32 vid; /* Id of peer of virtual link */
|
u32 iface_id; /* Interface ID (iface->index or new value for vlinks) */
|
||||||
|
u32 vid; /* ID of peer of virtual link */
|
||||||
ip_addr vip; /* IP of peer of virtual link */
|
ip_addr vip; /* IP of peer of virtual link */
|
||||||
struct ospf_iface *vifa; /* OSPF iface which the vlink goes through */
|
struct ospf_iface *vifa; /* OSPF iface which the vlink goes through */
|
||||||
struct ospf_area *voa; /* OSPF area which the vlink goes through */
|
struct ospf_area *voa; /* OSPF area which the vlink goes through */
|
||||||
|
@ -776,6 +777,7 @@ struct proto_ospf
|
||||||
int lsab_size, lsab_used;
|
int lsab_size, lsab_used;
|
||||||
linpool *nhpool; /* Linpool used for next hops computed in SPF */
|
linpool *nhpool; /* Linpool used for next hops computed in SPF */
|
||||||
u32 router_id;
|
u32 router_id;
|
||||||
|
u32 last_vlink_id; /* Interface IDs for vlinks (starts at 0x80000000) */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ospf_iface_patt
|
struct ospf_iface_patt
|
||||||
|
|
|
@ -259,7 +259,7 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length)
|
||||||
ln->type = LSART_PTP;
|
ln->type = LSART_PTP;
|
||||||
ln->id = neigh->rid;
|
ln->id = neigh->rid;
|
||||||
ln->data = (ifa->addr->flags & IA_PEER) ?
|
ln->data = (ifa->addr->flags & IA_PEER) ?
|
||||||
ifa->iface->index : ipa_to_u32(ifa->addr->ip);
|
ifa->iface_id : ipa_to_u32(ifa->addr->ip);
|
||||||
ln->metric = ifa->cost;
|
ln->metric = ifa->cost;
|
||||||
ln->padding = 0;
|
ln->padding = 0;
|
||||||
i++;
|
i++;
|
||||||
|
@ -368,7 +368,7 @@ add_lsa_rt_link(struct proto_ospf *po, struct ospf_iface *ifa, u8 type, u32 nif,
|
||||||
ln->type = type;
|
ln->type = type;
|
||||||
ln->padding = 0;
|
ln->padding = 0;
|
||||||
ln->metric = ifa->cost;
|
ln->metric = ifa->cost;
|
||||||
ln->lif = ifa->iface->index;
|
ln->lif = ifa->iface_id;
|
||||||
ln->nif = nif;
|
ln->nif = nif;
|
||||||
ln->id = id;
|
ln->id = id;
|
||||||
}
|
}
|
||||||
|
@ -546,7 +546,7 @@ originate_net_lsa_body(struct ospf_iface *ifa, u16 *length,
|
||||||
if (n->state == NEIGHBOR_FULL)
|
if (n->state == NEIGHBOR_FULL)
|
||||||
{
|
{
|
||||||
#ifdef OSPFv3
|
#ifdef OSPFv3
|
||||||
en = ospf_hash_find(po->gr, ifa->iface->index, n->iface_id, n->rid, LSA_T_LINK);
|
en = ospf_hash_find(po->gr, ifa->iface_id, n->iface_id, n->rid, LSA_T_LINK);
|
||||||
if (en)
|
if (en)
|
||||||
options |= ((struct ospf_lsa_link *) en->lsa_body)->options;
|
options |= ((struct ospf_lsa_link *) en->lsa_body)->options;
|
||||||
#endif
|
#endif
|
||||||
|
@ -596,7 +596,7 @@ originate_net_lsa(struct ospf_iface *ifa)
|
||||||
lsa.options = ifa->oa->options;
|
lsa.options = ifa->oa->options;
|
||||||
lsa.id = ipa_to_u32(ifa->addr->ip);
|
lsa.id = ipa_to_u32(ifa->addr->ip);
|
||||||
#else /* OSPFv3 */
|
#else /* OSPFv3 */
|
||||||
lsa.id = ifa->iface->index;
|
lsa.id = ifa->iface_id;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
lsa.rt = po->router_id;
|
lsa.rt = po->router_id;
|
||||||
|
@ -1207,10 +1207,10 @@ originate_link_lsa(struct ospf_iface *ifa)
|
||||||
|
|
||||||
lsa.age = 0;
|
lsa.age = 0;
|
||||||
lsa.type = LSA_T_LINK;
|
lsa.type = LSA_T_LINK;
|
||||||
lsa.id = ifa->iface->index;
|
lsa.id = ifa->iface_id;
|
||||||
lsa.rt = po->router_id;
|
lsa.rt = po->router_id;
|
||||||
lsa.sn = get_seqnum(ifa->link_lsa);
|
lsa.sn = get_seqnum(ifa->link_lsa);
|
||||||
u32 dom = ifa->iface->index;
|
u32 dom = ifa->iface_id;
|
||||||
|
|
||||||
body = originate_link_lsa_body(ifa, &lsa.length);
|
body = originate_link_lsa_body(ifa, &lsa.length);
|
||||||
lsasum_calculate(&lsa, body);
|
lsasum_calculate(&lsa, body);
|
||||||
|
@ -1471,7 +1471,7 @@ originate_prefix_net_lsa_body(struct ospf_iface *ifa, u16 *length)
|
||||||
|
|
||||||
WALK_LIST(n, ifa->neigh_list)
|
WALK_LIST(n, ifa->neigh_list)
|
||||||
if ((n->state == NEIGHBOR_FULL) &&
|
if ((n->state == NEIGHBOR_FULL) &&
|
||||||
(en = ospf_hash_find(po->gr, ifa->iface->index, n->iface_id, n->rid, LSA_T_LINK)))
|
(en = ospf_hash_find(po->gr, ifa->iface_id, n->iface_id, n->rid, LSA_T_LINK)))
|
||||||
add_link_lsa(po, en, offset, &pxc);
|
add_link_lsa(po, en, offset, &pxc);
|
||||||
|
|
||||||
lp = po->lsab;
|
lp = po->lsab;
|
||||||
|
@ -1493,7 +1493,7 @@ originate_prefix_net_lsa(struct ospf_iface *ifa)
|
||||||
|
|
||||||
lsa.age = 0;
|
lsa.age = 0;
|
||||||
lsa.type = LSA_T_PREFIX;
|
lsa.type = LSA_T_PREFIX;
|
||||||
lsa.id = ifa->iface->index;
|
lsa.id = ifa->iface_id;
|
||||||
lsa.rt = po->router_id;
|
lsa.rt = po->router_id;
|
||||||
lsa.sn = get_seqnum(ifa->pxn_lsa);
|
lsa.sn = get_seqnum(ifa->pxn_lsa);
|
||||||
u32 dom = ifa->oa->areaid;
|
u32 dom = ifa->oa->areaid;
|
||||||
|
@ -1664,7 +1664,7 @@ ospf_lsa_domain(u32 type, struct ospf_iface *ifa)
|
||||||
switch (type & LSA_SCOPE_MASK)
|
switch (type & LSA_SCOPE_MASK)
|
||||||
{
|
{
|
||||||
case LSA_SCOPE_LINK:
|
case LSA_SCOPE_LINK:
|
||||||
return ifa->iface->index;
|
return ifa->iface_id;
|
||||||
|
|
||||||
case LSA_SCOPE_AREA:
|
case LSA_SCOPE_AREA:
|
||||||
return ifa->oa->areaid;
|
return ifa->oa->areaid;
|
||||||
|
|
Loading…
Reference in a new issue