Detecting of new neighbor added. It starts inactivity timer.
This commit is contained in:
parent
bd7f1081f2
commit
cd70d93470
2 changed files with 63 additions and 13 deletions
|
@ -23,17 +23,36 @@
|
||||||
|
|
||||||
#include "ospf.h"
|
#include "ospf.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
neighbor_timer_hook(timer *timer)
|
||||||
|
{
|
||||||
|
struct ospf_neighbor *n;
|
||||||
|
struct ospf_iface *ifa;
|
||||||
|
struct proto *p;
|
||||||
|
|
||||||
|
n=(struct ospf_neighbor *)timer->data;
|
||||||
|
ifa=n->ifa;
|
||||||
|
p=(struct proto *)(ifa->proto);
|
||||||
|
debug("%s: Inactivity timer fired on interface %s for neighbor %d.\n",
|
||||||
|
p->name, ifa->iface->name, n->rid);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
struct ospf_iface *ifa)
|
struct ospf_iface *ifa)
|
||||||
{
|
{
|
||||||
char sip[100]; /* FIXME: Should be smaller */
|
char sip[100]; /* FIXME: Should be smaller */
|
||||||
|
u32 nrid;
|
||||||
|
struct ospf_neighbor *neigh,*n;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
nrid=ntohl(((struct ospf_packet *)ps)->routerid);
|
||||||
|
|
||||||
if(ipa_mklen(ipa_ntoh(ps->netmask))!=ifa->iface->addr->pxlen)
|
if(ipa_mklen(ipa_ntoh(ps->netmask))!=ifa->iface->addr->pxlen)
|
||||||
{
|
{
|
||||||
ip_ntop(ps->netmask,sip);
|
ip_ntop(ps->netmask,sip);
|
||||||
log("%s: Bad OSPF packet from %d received: bad netmask %s.",
|
log("%s: Bad OSPF packet from %d received: bad netmask %s.",
|
||||||
p->name, ntohl(((struct ospf_packet *)ps)->routerid), sip);
|
p->name, nrid, sip);
|
||||||
log("%s: Discarding",p->name);
|
log("%s: Discarding",p->name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -41,7 +60,7 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
if(ntohs(ps->helloint)!=ifa->helloint)
|
if(ntohs(ps->helloint)!=ifa->helloint)
|
||||||
{
|
{
|
||||||
log("%s: Bad OSPF packet from %d received: hello interval mismatch.",
|
log("%s: Bad OSPF packet from %d received: hello interval mismatch.",
|
||||||
p->name, ntohl(((struct ospf_packet *)ps)->routerid));
|
p->name, nrid);
|
||||||
log("%s: Discarding",p->name);
|
log("%s: Discarding",p->name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -49,19 +68,53 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
if(ntohl(ps->deadint)!=ifa->helloint*ifa->deadc)
|
if(ntohl(ps->deadint)!=ifa->helloint*ifa->deadc)
|
||||||
{
|
{
|
||||||
log("%s: Bad OSPF packet from %d received: dead interval mismatch.",
|
log("%s: Bad OSPF packet from %d received: dead interval mismatch.",
|
||||||
p->name, ntohl(((struct ospf_packet *)ps)->routerid));
|
p->name, nrid);
|
||||||
log("%s: Discarding",p->name);
|
log("%s: Discarding",p->name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(ps->options!=ifa->options)
|
if(ps->options!=ifa->options)
|
||||||
{
|
{
|
||||||
log("%s: Bad OSPF packet from %d received: options mismatch.",
|
log("%s: Bad OSPF packet from %d received: options mismatch.",
|
||||||
p->name, ntohl(((struct ospf_packet *)ps)->routerid));
|
p->name, nrid);
|
||||||
log("%s: Discarding",p->name);
|
log("%s: Discarding",p->name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n=NULL;
|
||||||
|
WALK_LIST (neigh, ifa->neigh_list)
|
||||||
|
{
|
||||||
|
if(neigh->rid==nrid)
|
||||||
|
{
|
||||||
|
n=neigh;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(n==NULL)
|
||||||
|
{
|
||||||
|
log("%s: New neighbor found: %d.",p->name,nrid);
|
||||||
|
n=mb_alloc(p->pool, sizeof(struct ospf_neighbor));
|
||||||
|
add_tail(&ifa->neigh_list, NODE n);
|
||||||
|
n->inactim=tm_new(p->pool);
|
||||||
|
n->inactim->data=n;
|
||||||
|
n->inactim->randomize=0;
|
||||||
|
n->inactim->hook=neighbor_timer_hook;
|
||||||
|
n->inactim->recurrent=ifa->deadc*ifa->helloint;
|
||||||
|
n->inactim->expires=0;
|
||||||
|
tm_start(ifa->hello_timer,ifa->deadc*ifa->helloint);
|
||||||
|
DBG("%s: Installing inactivity timer.\n", p->name);
|
||||||
|
n->state=NEIGHBOR_INIT;
|
||||||
|
n->rid=nrid;
|
||||||
|
n->dr=ntohl(ps->dr);
|
||||||
|
n->bdr=ntohl(ps->bdr);
|
||||||
|
n->priority=ps->priority;
|
||||||
|
n->options=ps->options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XXXX */
|
||||||
|
|
||||||
switch(ifa->state)
|
switch(ifa->state)
|
||||||
{
|
{
|
||||||
case OSPF_IS_DOWN:
|
case OSPF_IS_DOWN:
|
||||||
|
@ -323,8 +376,7 @@ hello_timer_hook(timer *timer)
|
||||||
p->name, ifa->iface->name);
|
p->name, ifa->iface->name);
|
||||||
/* Now we should send a hello packet */
|
/* Now we should send a hello packet */
|
||||||
/* First a common packet header */
|
/* First a common packet header */
|
||||||
//if(ifa->type!=OSPF_IT_NBMA)
|
if(ifa->type!=OSPF_IT_NBMA)
|
||||||
if(ifa->hello_sk!=NULL)
|
|
||||||
{
|
{
|
||||||
/* Now fill ospf_hello header */
|
/* Now fill ospf_hello header */
|
||||||
pkt=(struct ospf_hello_packet *)(ifa->hello_sk->tbuf);
|
pkt=(struct ospf_hello_packet *)(ifa->hello_sk->tbuf);
|
||||||
|
@ -359,9 +411,8 @@ hello_timer_hook(timer *timer)
|
||||||
op->checksum=ipsum_calculate(op,sizeof(struct ospf_packet)-8,
|
op->checksum=ipsum_calculate(op,sizeof(struct ospf_packet)-8,
|
||||||
&(pkt->netmask),length-sizeof(struct ospf_packet),NULL);
|
&(pkt->netmask),length-sizeof(struct ospf_packet),NULL);
|
||||||
|
|
||||||
|
/* And finally send it :-) */
|
||||||
sk_send(ifa->hello_sk,length);
|
sk_send(ifa->hello_sk,length);
|
||||||
|
|
||||||
/* XXXX */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,7 +485,6 @@ ospf_add_timers(struct ospf_iface *ifa, pool *pool, int wait)
|
||||||
DBG(": Installing wait timer.\n");
|
DBG(": Installing wait timer.\n");
|
||||||
}
|
}
|
||||||
else ifa->state=OSPF_IS_PTP;
|
else ifa->state=OSPF_IS_PTP;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -113,9 +113,9 @@ struct ospf_neighbor
|
||||||
struct ospf_iface *ifa;
|
struct ospf_iface *ifa;
|
||||||
int state;
|
int state;
|
||||||
#define NEIGHBOR_DOWN 0
|
#define NEIGHBOR_DOWN 0
|
||||||
#define NEIGHBOR_INIT 1
|
#define NEIGHBOR_ATTEMPT 1
|
||||||
#define NEIGHBOR_2WAY 2
|
#define NEIGHBOR_INIT 2
|
||||||
#define NEIGHBOR_ATTEMPT 3
|
#define NEIGHBOR_2WAY 3
|
||||||
#define NEIGHBOR_EXSTART 4
|
#define NEIGHBOR_EXSTART 4
|
||||||
#define NEIGHBOR_EXCHANGE 5
|
#define NEIGHBOR_EXCHANGE 5
|
||||||
#define NEIGHBOR_LOADING 6
|
#define NEIGHBOR_LOADING 6
|
||||||
|
@ -125,7 +125,7 @@ struct ospf_neighbor
|
||||||
u32 dds; /* DD Sequence number being sentg */
|
u32 dds; /* DD Sequence number being sentg */
|
||||||
u32 ddr; /* last Dat Des packet */
|
u32 ddr; /* last Dat Des packet */
|
||||||
u32 rid; /* Router ID */
|
u32 rid; /* Router ID */
|
||||||
byte pri; /* Priority */
|
byte priority; /* Priority */
|
||||||
byte options; /* Options */
|
byte options; /* Options */
|
||||||
u32 dr; /* Neigbour's idea of DR */
|
u32 dr; /* Neigbour's idea of DR */
|
||||||
u32 bdr; /* Neigbour's idea of BDR */
|
u32 bdr; /* Neigbour's idea of BDR */
|
||||||
|
|
Loading…
Reference in a new issue