Serious bug in ext lsa origination found. Going for 1.0.4.

This commit is contained in:
Ondrej Filip 2000-09-03 22:18:40 +00:00
parent f02e4258b9
commit fdb1998202
7 changed files with 40 additions and 11 deletions

View file

@ -1,6 +1,6 @@
Summary: BIRD Internet Routing Daemon Summary: BIRD Internet Routing Daemon
Name: bird Name: bird
Version: 1.0.3 Version: 1.0.4
Release: 1 Release: 1
Copyright: GPL Copyright: GPL
Group: Networking/Daemons Group: Networking/Daemons

View file

@ -123,7 +123,7 @@ htonlsab(void *h, void *n, u8 type, u16 len)
hrt=h; hrt=h;
links=hrt->links; links=hrt->links;
nrt->VEB=hrt->VEB; nrt->veb.byte=hrt->veb.byte;
nrt->padding=0; nrt->padding=0;
nrt->links=htons(hrt->links); nrt->links=htons(hrt->links);
nrtl=(struct ospf_lsa_rt_link *)(nrt+1); nrtl=(struct ospf_lsa_rt_link *)(nrt+1);
@ -220,7 +220,7 @@ ntohlsab(void *n, void *h, u8 type, u16 len)
nrt=n; nrt=n;
hrt=h; hrt=h;
hrt->VEB=nrt->VEB; hrt->veb.byte=nrt->veb.byte;
hrt->padding=0; hrt->padding=0;
links=hrt->links=ntohs(nrt->links); links=hrt->links=ntohs(nrt->links);
nrtl=(struct ospf_lsa_rt_link *)(nrt+1); nrtl=(struct ospf_lsa_rt_link *)(nrt+1);

View file

@ -164,6 +164,7 @@ ospf_init(struct proto_config *c)
p->rte_same = ospf_rte_same; p->rte_same = ospf_rte_same;
po->rfc1583=oc->rfc1583; po->rfc1583=oc->rfc1583;
po->ebit=0;
return p; return p;
} }

View file

@ -209,8 +209,20 @@ struct ospf_lsa_header {
u16 length; u16 length;
}; };
struct vebb {
u8 b:1;
u8 e:1;
u8 v:1;
u8 padding:5;
};
union veb {
u8 byte;
struct vebb bit;
};
struct ospf_lsa_rt { struct ospf_lsa_rt {
u8 VEB; union veb veb;
#define LSA_RT_V 5 #define LSA_RT_V 5
#define LSA_RT_E 6 #define LSA_RT_E 6
#define LSA_RT_B 7 #define LSA_RT_B 7
@ -375,7 +387,8 @@ struct proto_ospf {
list area_list; list area_list;
int areano; /* Number of area I belong to */ int areano; /* Number of area I belong to */
struct fib efib; /* FIB for external routes */ struct fib efib; /* FIB for external routes */
int rfc1583; int rfc1583; /* RFC1583 compatibility */
int ebit; /* Did I originate any ext lsa? */
}; };
struct ospf_iface_patt { struct ospf_iface_patt {

View file

@ -96,7 +96,7 @@ ospf_rt_spfa(struct ospf_area *oa)
{ {
case LSA_T_RT: case LSA_T_RT:
rt=(struct ospf_lsa_rt *)act->lsa_body; rt=(struct ospf_lsa_rt *)act->lsa_body;
if((rt->VEB)&(1>>LSA_RT_V)) oa->trcap=1; if(rt->veb.bit.v) oa->trcap=1;
rr=(struct ospf_lsa_rt_link *)(rt+1); rr=(struct ospf_lsa_rt_link *)(rt+1);
DBG(" Number of links: %u\n",rt->links); DBG(" Number of links: %u\n",rt->links);
for(i=0;i<rt->links;i++) for(i=0;i<rt->links;i++)
@ -269,6 +269,7 @@ ospf_ext_spfa(struct proto_ospf *po) /* FIXME looking into inter-area */
struct proto *p=&po->proto; struct proto *p=&po->proto;
struct ospf_lsa_ext *le; struct ospf_lsa_ext *le;
struct ospf_lsa_ext_tos *lt; struct ospf_lsa_ext_tos *lt;
struct ospf_lsa_rt *rt;
int mlen; int mlen;
ip_addr ip,nnh; ip_addr ip,nnh;
struct iface *nnhi=NULL; struct iface *nnhi=NULL;
@ -347,7 +348,8 @@ ospf_ext_spfa(struct proto_ospf *po) /* FIXME looking into inter-area */
} }
} }
} }
if((absr==NULL)||(absr->dist==LSINFINITY)) rt=(struct ospf_lsa_rt *)absr->lsa_body;
if((absr==NULL)||(absr->dist==LSINFINITY)||(rt->veb.bit.e==0))
{ {
DBG("ASBR is null or its dist=INF\n"); DBG("ASBR is null or its dist=INF\n");
continue; continue;

View file

@ -24,7 +24,7 @@ void *
originate_rt_lsa_body(struct ospf_area *oa, u16 *length, struct proto_ospf *p) originate_rt_lsa_body(struct ospf_area *oa, u16 *length, struct proto_ospf *p)
{ {
struct ospf_iface *ifa; struct ospf_iface *ifa;
int j=0,k=0,v=0,e=0,b=0; int j=0,k=0,v=0;
u16 i=0; u16 i=0;
struct ospf_lsa_rt *rt; struct ospf_lsa_rt *rt;
struct ospf_lsa_rt_link *ln; struct ospf_lsa_rt_link *ln;
@ -45,8 +45,9 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length, struct proto_ospf *p)
} }
rt=mb_allocz(p->proto.pool, sizeof(struct ospf_lsa_rt)+ rt=mb_allocz(p->proto.pool, sizeof(struct ospf_lsa_rt)+
i*sizeof(struct ospf_lsa_rt_link)); i*sizeof(struct ospf_lsa_rt_link));
if((p->areano>1) && (!oa->stub)) e=1; if((p->areano>1) && (!oa->stub)) rt->veb.bit.b=1;
rt->VEB=(v>>LSA_RT_V)+(e>>LSA_RT_E)+(b>>LSA_RT_B); if((p->ebit)&&(!oa->stub)) rt->veb.bit.e=1;
rt->veb.bit.v=v;
ln=(struct ospf_lsa_rt_link *)(rt+1); ln=(struct ospf_lsa_rt_link *)(rt+1);
WALK_LIST (ifa, p->iface_list) WALK_LIST (ifa, p->iface_list)
@ -352,6 +353,9 @@ originate_ext_lsa_body(net *n, rte *e, struct proto_ospf *po, struct ea_list *at
* external LSA. LSA header of such LSA does not contain information about * external LSA. LSA header of such LSA does not contain information about
* prefix lenght, so if I have to originate multiple LSAs for route with * prefix lenght, so if I have to originate multiple LSAs for route with
* different prefixes I try to increment prefix id to find a "free" one. * different prefixes I try to increment prefix id to find a "free" one.
*
* The function also set flag ebit. If it's first time, the new router lsa
* origination is necessary.
*/ */
void void
originate_ext_lsa(net *n, rte *e, struct proto_ospf *po, struct ea_list *attrs) originate_ext_lsa(net *n, rte *e, struct proto_ospf *po, struct ea_list *attrs)
@ -406,6 +410,15 @@ originate_ext_lsa(net *n, rte *e, struct proto_ospf *po, struct ea_list *attrs)
body=originate_ext_lsa_body(n, e, po, attrs); body=originate_ext_lsa_body(n, e, po, attrs);
} }
mb_free(body); mb_free(body);
if(po->ebit==0)
{
po->ebit=1;
WALK_LIST(oa, po->area_list)
{
schedule_rt_lsa(oa);
}
}
} }

View file

@ -7,7 +7,7 @@
#define _BIRD_CONFIG_H_ #define _BIRD_CONFIG_H_
/* BIRD version */ /* BIRD version */
#define BIRD_VERSION "1.0.3" #define BIRD_VERSION "1.0.4"
/* Include parameters determined by configure script */ /* Include parameters determined by configure script */
#include "sysdep/autoconf.h" #include "sysdep/autoconf.h"