- }
- i = ip->ip_sum;
- ip->ip_sum = 0;
-#ifdef vax
- if (hlen == sizeof (struct ip)) {
- asm("movl r10,r0; movl (r0)+,r1; addl2 (r0)+,r1");
- asm("adwc (r0)+,r1; adwc (r0)+,r1; adwc (r0)+,r1");
- asm("adwc $0,r1; ashl $-16,r1,r0; addw2 r0,r1");
- asm("adwc $0,r1"); /* ### */
- asm("mcoml r1,r1; movzwl r1,r1; subl2 r1,r11");
- } else
-#endif
- i -= cksum(m, hlen);
- if (i) {
- netstat.ip_badsum++;
- if (!nosum) {
- m_freem(m);
- return;
+ if (m->m_len < sizeof (struct ip) &&
+ m_pullup(m, sizeof (struct ip)) == 0)
+ goto bad;
+ ip = mtod(m, struct ip *);
+ if ((hlen = ip->ip_hl << 2) > m->m_len &&
+ m_pullup(m, hlen) == 0)
+ goto bad;
+ if (ipcksum)
+ if ((ip->ip_sum = in_cksum(m, hlen)) != 0xffff) {
+ printf("ip_sum %x\n", ip->ip_sum);
+ ipstat.ips_badsum++;
+ goto bad;