- m0->m_next = m;
- m0->m_pkthdr.rcvif = m->m_pkthdr.rcvif ; /* XXX! */
- m0->m_pkthdr.len = m->m_pkthdr.len; /* XXX! */
- m = m0;
- m->m_len = cs->cs_hlen;
- ip = mtod(m, struct ip *);
- BCOPY(&cs->cs_ip, ip, cs->cs_hlen);
-
- ip->ip_sum = in_cksum(m, hlen);
- return (m);
-
+ if ((int)cp & 3) {
+ if (len > 0)
+ (void) ovbcopy(cp, (caddr_t)((int)cp &~ 3), len);
+ cp = (u_char *)((int)cp &~ 3);
+ }
+ cp -= cs->cs_hlen;
+ len += cs->cs_hlen;
+ cs->cs_ip.ip_len = htons(len);
+ BCOPY(&cs->cs_ip, cp, cs->cs_hlen);
+ *bufp = cp;
+
+ /* recompute the ip header checksum */
+ {
+ register u_short *bp = (u_short *)cp;
+ for (changes = 0; hlen > 0; hlen -= 2)
+ changes += *bp++;
+ changes = (changes & 0xffff) + (changes >> 16);
+ changes = (changes & 0xffff) + (changes >> 16);
+ ((struct ip *)cp)->ip_sum = ~ changes;
+ }
+ return (len);