summaryrefslogtreecommitdiffstats
path: root/proto/ospf
diff options
context:
space:
mode:
authorOndrej Filip <feela@network.cz>1999-05-31 20:56:20 +0200
committerOndrej Filip <feela@network.cz>1999-05-31 20:56:20 +0200
commit35ff423d54ebabffc5ab9dd757dfa2a1a70e9676 (patch)
tree332a9b17de30332d9a9eae199d41092f9028a987 /proto/ospf
parentbb027be1e232ca2207a03a8e001441965cc07801 (diff)
downloadbird-35ff423d54ebabffc5ab9dd757dfa2a1a70e9676.tar
bird-35ff423d54ebabffc5ab9dd757dfa2a1a70e9676.zip
Some RX_Hello checks added.
Diffstat (limited to 'proto/ospf')
-rw-r--r--proto/ospf/ospf.c30
-rw-r--r--proto/ospf/ospf.h6
2 files changed, 30 insertions, 6 deletions
diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c
index 5fdbc22..606ab9d 100644
--- a/proto/ospf/ospf.c
+++ b/proto/ospf/ospf.c
@@ -37,6 +37,30 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
log("%s: Discarding",p->name);
return;
}
+
+ if(ntohs(ps->helloint)!=ifa->helloint)
+ {
+ log("%s: Bad OSPF packet from %d received: hello interval mismatch.",
+ p->name, ntohl(((struct ospf_packet *)ps)->routerid));
+ log("%s: Discarding",p->name);
+ return;
+ }
+
+ if(ntohl(ps->deadint)!=ifa->helloint*ifa->deadc)
+ {
+ log("%s: Bad OSPF packet from %d received: dead interval mismatch.",
+ p->name, ntohl(((struct ospf_packet *)ps)->routerid));
+ log("%s: Discarding",p->name);
+ return;
+ }
+
+ if(ps->options!=ifa->options)
+ {
+ log("%s: Bad OSPF packet from %d received: options mismatch.",
+ p->name, ntohl(((struct ospf_packet *)ps)->routerid));
+ log("%s: Discarding",p->name);
+ return;
+ }
switch(ifa->state)
{
@@ -309,10 +333,10 @@ hello_timer_hook(timer *timer)
pkt->netmask=ipa_mkmask(ifa->iface->addr->pxlen);
ipa_hton(pkt->netmask);
- pkt->hello_int=ntohs(ifa->helloint);
+ pkt->helloint=ntohs(ifa->helloint);
pkt->options=ifa->options;
pkt->priority=ifa->priority;
- pkt->deadint=htonl(ifa->deadint*ifa->helloint);
+ pkt->deadint=htonl(ifa->deadc*ifa->helloint);
pkt->dr=ifa->drid;
pkt->bdr=ifa->bdrid;
@@ -423,7 +447,7 @@ ospf_iface_default(struct ospf_iface *ifa)
ifa->iftransdelay=IFTRANSDELAY_D;
ifa->priority=PRIORITY_D;
ifa->helloint=HELLOINT_D;
- ifa->deadint=DEADINT_D;
+ ifa->deadc=DEADC_D;
ifa->autype=0;
for(i=0;i<8;i++) ifa->aukey[i]=0;
ifa->options=2;
diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h
index a0fdf81..19c9eeb 100644
--- a/proto/ospf/ospf.h
+++ b/proto/ospf/ospf.h
@@ -43,7 +43,7 @@ struct ospf_iface {
interface. LSAs contained in the update */
u8 priority; /* A router priority for DR election */
u16 helloint; /* number of seconds between hello sending */
- u32 deadint; /* after "deadint" missing hellos is router dead */
+ u32 deadc; /* after "deadint" missing hellos is router dead */
u16 autype;
u8 aukey[8];
u8 options;
@@ -70,7 +70,7 @@ struct ospf_iface {
#define IFTRANSDELAY_D 1
#define PRIORITY_D 1
#define HELLOINT_D 10
-#define DEADINT_D 4
+#define DEADC_D 4
#define WAIT_DMH 2 /* Value of Wait timer - not found it in RFC - using 2*HELLO */
};
@@ -100,7 +100,7 @@ struct ospf_packet {
struct ospf_hello_packet {
struct ospf_packet ospf_packet;
ip_addr netmask;
- u16 hello_int;
+ u16 helloint;
u8 options;
u8 priority;
u32 deadint;