I allocate struct ifa before unlocking. So route exported to OSPF are correct.

I work also with interfaces that have some problems with socket opening.
I declare them as stub.
This commit is contained in:
Ondrej Filip 2000-09-04 19:42:17 +00:00
parent fdb1998202
commit b02e40111e
3 changed files with 86 additions and 89 deletions

View file

@ -314,6 +314,10 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
struct ospf_iface_patt *ip=NULL; struct ospf_iface_patt *ip=NULL;
struct ospf_iface *ifa; struct ospf_iface *ifa;
struct object_lock *lock; struct object_lock *lock;
struct nbma_node *nbma,*nb;
u8 i;
sock *mcsk;
DBG("%s: If notify called\n", p->name); DBG("%s: If notify called\n", p->name);
if (iface->flags & IF_IGNORE) if (iface->flags & IF_IGNORE)
@ -330,12 +334,74 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
if(ip) if(ip)
{ {
OSPF_TRACE(D_EVENTS, "Using interface %s.", iface->name); OSPF_TRACE(D_EVENTS, "Using interface %s.", iface->name);
ifa=mb_allocz(p->pool, sizeof(struct ospf_iface));
ifa->proto=po;
ifa->iface=iface;
ifa->an=ac->areaid;
ifa->cost=ip->cost;
ifa->rxmtint=ip->rxmtint;
ifa->inftransdelay=ip->inftransdelay;
ifa->priority=ip->priority;
ifa->helloint=ip->helloint;
ifa->pollint=ip->pollint;
ifa->strictnbma=ip->strictnbma;
ifa->waitint=ip->waitint;
ifa->deadc=ip->deadc;
ifa->stub=ip->stub;
ifa->autype=ip->autype;
memcpy(ifa->aukey,ip->password,8);
ifa->options=2; /* FIXME what options? */
if(ip->type==OSPF_IT_UNDEF)
ifa->type=ospf_iface_clasify(ifa->iface, (struct proto *)ifa->proto);
else ifa->type=ip->type;
init_list(&ifa->neigh_list);
init_list(&ifa->nbma_list);
WALK_LIST(nb,ip->nbma_list)
{
nbma=mb_alloc(p->pool,sizeof(struct nbma_node));
nbma->ip=nb->ip;
nbma->eligible=nb->eligible;
add_tail(&ifa->nbma_list, NODE nbma);
}
/* Add hello timer */
ifa->hello_timer=tm_new(p->pool);
ifa->hello_timer->data=ifa;
ifa->hello_timer->randomize=0;
ifa->hello_timer->hook=hello_timer_hook;
ifa->hello_timer->recurrent=ifa->helloint;
DBG("%s: Installing hello timer. (%u)\n", p->name, ifa->helloint);
if(ifa->type==OSPF_IT_NBMA)
{
ifa->poll_timer=tm_new(p->pool);
ifa->poll_timer->data=ifa;
ifa->poll_timer->randomize=0;
ifa->poll_timer->hook=poll_timer_hook;
ifa->poll_timer->recurrent=ifa->pollint;
DBG("%s: Installing poll timer. (%u)\n", p->name, ifa->pollint);
}
else ifa->poll_timer=NULL;
ifa->wait_timer=tm_new(p->pool);
ifa->wait_timer->data=ifa;
ifa->wait_timer->randomize=0;
ifa->wait_timer->hook=wait_timer_hook;
ifa->wait_timer->recurrent=0;
DBG("%s: Installing wait timer. (%u)\n", p->name, ifa->waitint);
add_tail(&((struct proto_ospf *)p)->iface_list, NODE ifa);
ifa->state=OSPF_IS_DOWN;
lock = olock_new( p->pool ); lock = olock_new( p->pool );
lock->addr = AllSPFRouters; lock->addr = AllSPFRouters;
lock->type = OBJLOCK_IP; lock->type = OBJLOCK_IP;
lock->port = OSPF_PROTO; lock->port = OSPF_PROTO;
lock->iface = iface; lock->iface = iface;
lock->data = p; lock->data = ifa;
lock->hook = ospf_ifa_add; lock->hook = ospf_ifa_add;
olock_acquire(lock); olock_acquire(lock);
} }
@ -394,50 +460,12 @@ ospf_iface_info(struct ospf_iface *ifa)
void void
ospf_ifa_add(struct object_lock *lock) ospf_ifa_add(struct object_lock *lock)
{ {
struct proto_ospf *po=lock->data; struct ospf_iface *ifa=lock->data;
struct proto_ospf *po=ifa->proto;
struct iface *iface=lock->iface; struct iface *iface=lock->iface;
struct proto *p=&po->proto; struct proto *p=&po->proto;
struct nbma_node *nbma,*nb;
u8 i;
sock *mcsk;
struct ospf_iface *ifa;
struct ospf_config *c=(struct ospf_config *)(p->cf);
struct ospf_area_config *ac;
struct ospf_iface_patt *ip=NULL;
WALK_LIST(ac, c->area_list) ifa->ioprob=OSPF_I_OK;
{
if(ip=(struct ospf_iface_patt *)
iface_patt_match(&ac->patt_list, iface)) break;
}
if(!ip)
{
bug("After lock I cannot find pattern.");
}
ifa=mb_allocz(p->pool, sizeof(struct ospf_iface));
ifa->proto=po;
ifa->iface=iface;
ifa->an=ac->areaid;
ifa->cost=ip->cost;
ifa->rxmtint=ip->rxmtint;
ifa->inftransdelay=ip->inftransdelay;
ifa->priority=ip->priority;
ifa->helloint=ip->helloint;
ifa->pollint=ip->pollint;
ifa->strictnbma=ip->strictnbma;
ifa->waitint=ip->waitint;
ifa->deadc=ip->deadc;
ifa->stub=ip->stub;
ifa->autype=ip->autype;
memcpy(ifa->aukey,ip->password,8);
ifa->options=2; /* FIXME what options? */
if(ip->type==OSPF_IT_UNDEF)
ifa->type=ospf_iface_clasify(ifa->iface, (struct proto *)ifa->proto);
else ifa->type=ip->type;
if(ifa->type!=OSPF_IT_NBMA) if(ifa->type!=OSPF_IT_NBMA)
{ {
@ -445,10 +473,9 @@ ospf_ifa_add(struct object_lock *lock)
{ {
log("%s: Huh? could not open mc socket on interface %s?", p->name, log("%s: Huh? could not open mc socket on interface %s?", p->name,
iface->name); iface->name);
mb_free(ifa); log("%s: Declaring as stub.", p->name);
log("%s: Ignoring this interface.", p->name); ifa->stub=1;
rfree(lock); ifa->ioprob += OSPF_I_MC;
return;
} }
ifa->dr_sk=NULL; ifa->dr_sk=NULL;
} }
@ -457,49 +484,12 @@ ospf_ifa_add(struct object_lock *lock)
{ {
log("%s: Huh? could not open ip socket on interface %s?", p->name, log("%s: Huh? could not open ip socket on interface %s?", p->name,
iface->name); iface->name);
mb_free(ifa); log("%s: Declaring as stub.", p->name);
log("%s: Ignoring this interface", p->name); ifa->stub=1;
rfree(lock); ifa->ioprob += OSPF_I_IP;
return;
} }
ifa->lock = lock; ifa->lock = lock;
init_list(&ifa->neigh_list);
init_list(&ifa->nbma_list);
WALK_LIST(nb,ip->nbma_list)
{
nbma=mb_alloc(p->pool,sizeof(struct nbma_node));
nbma->ip=nb->ip;
nbma->eligible=nb->eligible;
add_tail(&ifa->nbma_list, NODE nbma);
}
/* Add hello timer */
ifa->hello_timer=tm_new(p->pool);
ifa->hello_timer->data=ifa;
ifa->hello_timer->randomize=0;
ifa->hello_timer->hook=hello_timer_hook;
ifa->hello_timer->recurrent=ifa->helloint;
DBG("%s: Installing hello timer. (%u)\n", p->name, ifa->helloint);
if(ifa->type==OSPF_IT_NBMA)
{
ifa->poll_timer=tm_new(p->pool);
ifa->poll_timer->data=ifa;
ifa->poll_timer->randomize=0;
ifa->poll_timer->hook=poll_timer_hook;
ifa->poll_timer->recurrent=ifa->pollint;
DBG("%s: Installing poll timer. (%u)\n", p->name, ifa->pollint);
}
else ifa->poll_timer=NULL;
ifa->wait_timer=tm_new(p->pool);
ifa->wait_timer->data=ifa;
ifa->wait_timer->randomize=0;
ifa->wait_timer->hook=wait_timer_hook;
ifa->wait_timer->recurrent=0;
DBG("%s: Installing wait timer. (%u)\n", p->name, ifa->waitint);
add_tail(&((struct proto_ospf *)p)->iface_list, NODE ifa);
ifa->state=OSPF_IS_DOWN; ifa->state=OSPF_IS_DOWN;
ospf_int_sm(ifa, ISM_UP); ospf_int_sm(ifa, ISM_UP);
} }

View file

@ -578,7 +578,10 @@ ospf_reconfigure(struct proto *p, struct proto_config *c)
"Interface %s is now stub.", "Interface %s is now stub.",
ifa->iface->name); ifa->iface->name);
} }
if((ip1->stub!=0)&&(ip2->stub==0)) if((ip1->stub!=0)&&(ip2->stub==0)&&
((ifa->ioprob & OSPF_I_IP)==0)&&
(((ifa->ioprob & OSPF_I_MC)==0)||
(ifa->type==OSPF_IT_NBMA)))
{ {
ifa->stub=ip2->stub; ifa->stub=ip2->stub;
OSPF_TRACE(D_EVENTS, OSPF_TRACE(D_EVENTS,

View file

@ -102,13 +102,17 @@ struct ospf_iface {
ip_addr bdrip; /* Backup DR */ ip_addr bdrip; /* Backup DR */
u32 bdrid; u32 bdrid;
u8 type; /* OSPF view of type */ u8 type; /* OSPF view of type */
u8 strictnbma; /* Can I talk with unknown neighbors? */
u8 stub; /* Inactive interface */
#define OSPF_IT_BCAST 0 #define OSPF_IT_BCAST 0
#define OSPF_IT_NBMA 1 #define OSPF_IT_NBMA 1
#define OSPF_IT_PTP 2 #define OSPF_IT_PTP 2
#define OSPF_IT_VLINK 3 #define OSPF_IT_VLINK 3
#define OSPF_IT_UNDEF 4 #define OSPF_IT_UNDEF 4
u8 strictnbma; /* Can I talk with unknown neighbors? */
u8 stub; /* Inactive interface */
u8 ioprob;
#define OSPF_I_OK 0 /* Everything OK */
#define OSPF_I_MC 1 /* I didn't open MC socket */
#define OSPF_I_IP 2 /* I didn't open IP socet */
u8 state; /* Interface state machine */ u8 state; /* Interface state machine */
#define OSPF_IS_DOWN 0 /* Not working */ #define OSPF_IS_DOWN 0 /* Not working */
#define OSPF_IS_LOOP 1 /* Should never happen */ #define OSPF_IS_LOOP 1 /* Should never happen */