]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Added ip_skip_header() and modified OSPF to use it.
authorMartin Mares <mj@ucw.cz>
Fri, 14 May 1999 18:03:09 +0000 (18:03 +0000)
committerMartin Mares <mj@ucw.cz>
Fri, 14 May 1999 18:03:09 +0000 (18:03 +0000)
TODO
lib/ipv4.c
lib/ipv4.h
proto/ospf/ospf.c

diff --git a/TODO b/TODO
index 0746c483ded07bb22f26bcb56484950ba603628b..28f94ccb331b1af62cd74751247758da21d45b2e 100644 (file)
--- a/TODO
+++ b/TODO
@@ -30,6 +30,8 @@ Core
 
 - socket: Use IP_RECVERR for BGP TCP sockets?
 
+- lib: use better checksum function
+
 Cleanup
 ~~~~~~~
 - right usage of DBG vs. debug
index 186b36a837cefc024de80448873554cb2440e546..943e2c86f9812a7f0c2cf9249e21fc0eebb9f976 100644 (file)
@@ -94,3 +94,18 @@ ip_pton(char *a, ip_addr *o)
   *o = ipa_from_u32(ia);
   return 1;
 }
+
+byte *
+ipv4_skip_header(byte *pkt, int *len)
+{
+  int l = *len;
+  int q;
+
+  if (l < 20 || (*pkt & 0xf0) != 0x40)
+    return NULL;
+  q = (*pkt & 0x0f) * 4;
+  if (q < l)
+    return NULL;
+  *len -= q;
+  return pkt + q;
+}
index a6720361dec7c3857b44f9909a16b33ab230ef32..87e08742bf4ddaef88359f76e7e3b9f8a0bb98a0 100644 (file)
@@ -58,8 +58,11 @@ typedef u32 ip_addr;
 #define ipa_to_u32(x) _I(x)
 #define ipa_compare(x,y) ipv4_compare(_I(x),_I(y))
 
+#define ip_skip_header(x, y) ipv4_skip_header(x, y)
+
 int ipv4_classify(u32);
 u32 ipv4_class_mask(u32);
+byte *ipv4_skip_header(byte *, int *);
 
 static inline unsigned ipv4_hash(u32 a)
 {
index ef65064bf5af63b39058b1d34f7b8799dad2647b..954df8e422a6b6b4b8d40d62d5bd046a88d6990f 100644 (file)
@@ -80,16 +80,15 @@ ospf_rx_hook(sock *sk, int size)
   DBG(sk->iface->name);
   DBG(".\n");
 
-  ps=(struct ospf_packet *)(sk->rbuf+5*4);
-
-  if(size<=(20+sizeof(struct ospf_packet)))
+  ps = (struct ospf_packet *) ipv4_skip_header(sk->rbuf, &size);
+  if(!ps || size < sizeof(struct ospf_packet))
   {
     log("%s: Bad packet received: too short", p->name);
     log("%s: Discarding",p->name);
     return(1);
   }
 
-  if((ntohs(ps->length))!=(size-20))
+  if(ntohs(ps->length) != size)
   {
     log("%s: Bad packet received: size fields does not match", p->name);
     log("%s: Discarding",p->name);