- socket: Use IP_RECVERR for BGP TCP sockets?
+- lib: use better checksum function
+
Cleanup
~~~~~~~
- right usage of DBG vs. debug
*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;
+}
#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)
{
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);