- m0->m_data += max_linkhdr;
- bcopy(mtod(m, caddr_t) + sizeof(struct ip),
- mtod(m0, caddr_t) + sizeof(struct ip),
- sizeof(struct tcphdr));
- m->m_data += sizeof(struct tcpiphdr);
- m->m_len -= sizeof(struct tcpiphdr);
- m0->m_next = m;
- m0->m_pkthdr = m->m_pkthdr;
- m0->m_flags = m->m_flags & M_COPYFLAGS;
- m0->m_len = sizeof(struct tcpiphdr);
- m = m0;
+ m->m_next = m0;
+ m->m_data += max_linkhdr;
+ m->m_pkthdr = m->m_pkthdr;
+ m->m_flags = m->m_flags & M_COPYFLAGS;
+ if (len < sizeof(struct tcphdr)) {
+ if ((m = m_pullup(m, sizeof(struct tcpiphdr))) == 0) {
+ tcpstat.tcps_rcvshort++;
+ return;
+ }
+ } else {
+ bcopy(mtod(m, caddr_t) + sizeof(struct ip),
+ mtod(m0, caddr_t) + sizeof(struct ip),
+ sizeof(struct tcphdr));
+ m0->m_len -= sizeof(struct tcpiphdr);
+ m0->m_data += sizeof(struct tcpiphdr);
+ m->m_len = sizeof(struct tcpiphdr);
+ }