Sending and receving of hello pkts works. No I will start building neighbor
database.
This commit is contained in:
parent
4a4911a36a
commit
75b84c34e3
2 changed files with 82 additions and 16 deletions
|
@ -196,7 +196,7 @@ ospf_open_socket(struct proto *p, struct ospf_iface *ifa)
|
||||||
{
|
{
|
||||||
sock *mcsk;
|
sock *mcsk;
|
||||||
|
|
||||||
/* No NBMA networks now */
|
/* FIXME: No NBMA networks now */
|
||||||
|
|
||||||
if(ifa->iface->flags & IF_MULTICAST)
|
if(ifa->iface->flags & IF_MULTICAST)
|
||||||
{
|
{
|
||||||
|
@ -261,16 +261,83 @@ ospf_iface_clasify(struct iface *ifa)
|
||||||
return OSPF_IT_PTP;
|
return OSPF_IT_PTP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fill_ospf_pkt_hdr(struct ospf_iface *ifa, void *buf, u8 h_type)
|
||||||
|
{
|
||||||
|
struct ospf_packet *pkt;
|
||||||
|
struct proto *p;
|
||||||
|
|
||||||
|
p=(struct proto *)(ifa->proto);
|
||||||
|
|
||||||
|
pkt=(struct ospf_packet *)buf;
|
||||||
|
|
||||||
|
pkt->version=OSPF_VERSION;
|
||||||
|
|
||||||
|
pkt->type=h_type;
|
||||||
|
|
||||||
|
pkt->routerid=htonl(p->cf->global->router_id);
|
||||||
|
pkt->areaid=htonl(ifa->area);
|
||||||
|
pkt->autype=htons(ifa->autype);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
hello_timer_hook(timer *timer)
|
hello_timer_hook(timer *timer)
|
||||||
{
|
{
|
||||||
struct ospf_iface *ifa;
|
struct ospf_iface *ifa;
|
||||||
|
struct ospf_hello_packet *pkt;
|
||||||
|
struct ospf_packet *op;
|
||||||
struct proto *p;
|
struct proto *p;
|
||||||
|
struct ospf_neighbor *neigh;
|
||||||
|
u16 length;
|
||||||
|
u32 *pp;
|
||||||
|
int i;
|
||||||
|
|
||||||
ifa=(struct ospf_iface *)timer->data;
|
ifa=(struct ospf_iface *)timer->data;
|
||||||
p=(struct proto *)(ifa->proto);
|
p=(struct proto *)(ifa->proto);
|
||||||
debug("%s: Hello timer fired on interface %s.\n",
|
debug("%s: Hello timer fired on interface %s.\n",
|
||||||
p->name, ifa->iface->name);
|
p->name, ifa->iface->name);
|
||||||
|
/* Now we should send a hello packet */
|
||||||
|
/* First a common packet header */
|
||||||
|
//if(ifa->type!=OSPF_IT_NBMA)
|
||||||
|
if(ifa->hello_sk!=NULL)
|
||||||
|
{
|
||||||
|
/* Now fill ospf_hello header */
|
||||||
|
pkt=(struct ospf_hello_packet *)(ifa->hello_sk->tbuf);
|
||||||
|
op=(struct ospf_packet *)pkt;
|
||||||
|
|
||||||
|
fill_ospf_pkt_hdr(ifa, pkt, HELLO);
|
||||||
|
|
||||||
|
pkt->netmask=ipa_mkmask(ifa->iface->addr->pxlen);
|
||||||
|
ipa_hton(pkt->netmask);
|
||||||
|
pkt->hello_int=ntohs(ifa->helloint);
|
||||||
|
pkt->options=ifa->options;
|
||||||
|
pkt->priority=ifa->priority;
|
||||||
|
pkt->deadint=htonl(ifa->deadint*ifa->helloint);
|
||||||
|
pkt->dr=ifa->drid;
|
||||||
|
pkt->bdr=ifa->bdrid;
|
||||||
|
|
||||||
|
/* Fill all neighbors */
|
||||||
|
i=0;
|
||||||
|
pp=(u32 *)(((byte *)pkt)+sizeof(struct ospf_hello_packet));
|
||||||
|
WALK_LIST (neigh, ifa->neigh_list)
|
||||||
|
{
|
||||||
|
*(pp+i)=neigh->rid;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
length=sizeof(struct ospf_hello_packet)+i*sizeof(u32);
|
||||||
|
|
||||||
|
op->length=ntohs(length);
|
||||||
|
|
||||||
|
/* Do authentification */
|
||||||
|
|
||||||
|
op->checksum=ipsum_calculate(op,sizeof(struct ospf_packet)-8,
|
||||||
|
&(pkt->netmask),length-sizeof(struct ospf_packet),NULL);
|
||||||
|
|
||||||
|
sk_send(ifa->hello_sk,length);
|
||||||
|
|
||||||
|
/* XXXX */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -325,7 +392,7 @@ ospf_add_timers(struct ospf_iface *ifa, pool *pool, int wait)
|
||||||
ifa->hello_timer->hook=hello_timer_hook;
|
ifa->hello_timer->hook=hello_timer_hook;
|
||||||
ifa->hello_timer->recurrent=ifa->helloint;
|
ifa->hello_timer->recurrent=ifa->helloint;
|
||||||
ifa->hello_timer->expires=0;
|
ifa->hello_timer->expires=0;
|
||||||
tm_start(ifa->hello_timer,0);
|
tm_start(ifa->hello_timer,ifa->helloint);
|
||||||
DBG("%s: Installing hello timer.\n", p->name);
|
DBG("%s: Installing hello timer.\n", p->name);
|
||||||
if((ifa->type!=OSPF_IT_PTP))
|
if((ifa->type!=OSPF_IT_PTP))
|
||||||
{
|
{
|
||||||
|
@ -359,7 +426,7 @@ ospf_iface_default(struct ospf_iface *ifa)
|
||||||
ifa->deadint=DEADINT_D;
|
ifa->deadint=DEADINT_D;
|
||||||
ifa->autype=0;
|
ifa->autype=0;
|
||||||
for(i=0;i<8;i++) ifa->aukey[i]=0;
|
for(i=0;i<8;i++) ifa->aukey[i]=0;
|
||||||
ifa->options=0;
|
ifa->options=2;
|
||||||
ifa->drip=ipa_from_u32(0x00000000);
|
ifa->drip=ipa_from_u32(0x00000000);
|
||||||
ifa->drid=0;
|
ifa->drid=0;
|
||||||
ifa->bdrip=ipa_from_u32(0x00000000);
|
ifa->bdrip=ipa_from_u32(0x00000000);
|
||||||
|
@ -382,8 +449,7 @@ void
|
||||||
ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
|
ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
|
||||||
{
|
{
|
||||||
struct ospf_iface *ifa;
|
struct ospf_iface *ifa;
|
||||||
sock *mcsk, *newsk;
|
sock *mcsk;
|
||||||
struct ospf_sock *osk;
|
|
||||||
|
|
||||||
struct ospf_config *c;
|
struct ospf_config *c;
|
||||||
c=(struct ospf_config *)(p->cf);
|
c=(struct ospf_config *)(p->cf);
|
||||||
|
@ -403,13 +469,17 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
|
||||||
ospf_iface_default(ifa);
|
ospf_iface_default(ifa);
|
||||||
/* FIXME: This should read config */
|
/* FIXME: This should read config */
|
||||||
ospf_add_timers(ifa,p->pool,0);
|
ospf_add_timers(ifa,p->pool,0);
|
||||||
init_list(&(ifa->sk_list));
|
if(ifa->type!=OSPF_IT_NBMA)
|
||||||
|
{
|
||||||
if((mcsk=ospf_open_socket(p, ifa))!=NULL)
|
if((mcsk=ospf_open_socket(p, ifa))!=NULL)
|
||||||
{
|
{
|
||||||
osk=(struct ospf_sock *)mb_alloc(p->pool, sizeof(struct ospf_sock));
|
ifa->hello_sk=mcsk;
|
||||||
osk->sk=mcsk;
|
|
||||||
add_tail(&(ifa->sk_list),NODE osk);
|
|
||||||
}
|
}
|
||||||
|
else log("Huh? could not open socket?");
|
||||||
|
/* FIXME: In fail case??? */
|
||||||
|
init_list(&(ifa->neigh_list));
|
||||||
|
}
|
||||||
|
/* FIXME: NBMA? */
|
||||||
}
|
}
|
||||||
|
|
||||||
if(flags & IF_CHANGE_DOWN)
|
if(flags & IF_CHANGE_DOWN)
|
||||||
|
|
|
@ -33,7 +33,8 @@ struct ospf_iface {
|
||||||
node n;
|
node n;
|
||||||
struct proto_ospf *proto;
|
struct proto_ospf *proto;
|
||||||
struct iface *iface; /* Nest's iface */
|
struct iface *iface; /* Nest's iface */
|
||||||
list sk_list; /* List of active sockets */
|
sock *hello_sk; /* List of active sockets */
|
||||||
|
list neigh_list; /* List of neigbours */
|
||||||
u32 area; /* OSPF Area */
|
u32 area; /* OSPF Area */
|
||||||
u16 cost; /* Cost of iface */
|
u16 cost; /* Cost of iface */
|
||||||
int rxmtint; /* number of seconds between LSA retransmissions */
|
int rxmtint; /* number of seconds between LSA retransmissions */
|
||||||
|
@ -73,11 +74,6 @@ struct ospf_iface {
|
||||||
#define WAIT_DMH 2 /* Value of Wait timer - not found it in RFC - using 2*HELLO */
|
#define WAIT_DMH 2 /* Value of Wait timer - not found it in RFC - using 2*HELLO */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ospf_sock {
|
|
||||||
node n;
|
|
||||||
sock *sk;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ospf_patt {
|
struct ospf_patt {
|
||||||
struct iface_patt i;
|
struct iface_patt i;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue