Sending and receving of hello pkts works. No I will start building neighbor

database.
This commit is contained in:
Ondrej Filip 1999-05-31 18:24:54 +00:00
parent 4a4911a36a
commit 75b84c34e3
2 changed files with 82 additions and 16 deletions

View file

@ -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)
{ {
osk=(struct ospf_sock *)mb_alloc(p->pool, sizeof(struct ospf_sock)); if((mcsk=ospf_open_socket(p, ifa))!=NULL)
osk->sk=mcsk; {
add_tail(&(ifa->sk_list),NODE osk); ifa->hello_sk=mcsk;
}
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)

View file

@ -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;