731: /* Retrieve the packet length. */
732: len = ntohs(ip->ip_len);
733:
1041: */
1042: off = (ntohs(ip->ip_off) & IP_OFFMASK) << 3;
1043: if ((off > 0 ? off + hlen : len) < IP_MINFRAGSIZE - 1) {
1077: */
1078: ip->ip_len = htons(ntohs(ip->ip_len) - hlen);
1079: mff = (ip->ip_off & htons(IP_MF)) != 0;
1084: */
1085: if (ntohs(ip->ip_len) == 0 ||
1086: (ntohs(ip->ip_len) & 0x7) != 0) {
1087: IP_STATINC(IP_STAT_BADFRAGS);
1091: }
1092: ip->ip_off = htons((ntohs(ip->ip_off) & IP_OFFMASK) << 3);
1093:
1119: hlen = ip->ip_hl << 2;
1120: ip->ip_len = htons(ntohs(ip->ip_len) + hlen);
1121: } else
1182: if (ia && ip)
1183: ia->ia_ifa.ifa_data.ifad_inbytes += ntohs(ip->ip_len);
1184: #endif
1278: p = q, q = TAILQ_NEXT(q, ipqe_q))
1279: if (ntohs(q->ipqe_ip->ip_off) > ntohs(ipqe->ipqe_ip->ip_off))
1280: break;
1287: if (p != NULL) {
1288: i = ntohs(p->ipqe_ip->ip_off) + ntohs(p->ipqe_ip->ip_len) -
1289: ntohs(ipqe->ipqe_ip->ip_off);
1290: if (i > 0) {
1291: if (i >= ntohs(ipqe->ipqe_ip->ip_len))
1292: goto dropfrag;
1294: ipqe->ipqe_ip->ip_off =
1295: htons(ntohs(ipqe->ipqe_ip->ip_off) + i);
1296: ipqe->ipqe_ip->ip_len =
1297: htons(ntohs(ipqe->ipqe_ip->ip_len) - i);
1298: }
1305: for (; q != NULL &&
1306: ntohs(ipqe->ipqe_ip->ip_off) + ntohs(ipqe->ipqe_ip->ip_len) >
1307: ntohs(q->ipqe_ip->ip_off); q = nq) {
1308: i = (ntohs(ipqe->ipqe_ip->ip_off) +
1309: ntohs(ipqe->ipqe_ip->ip_len)) - ntohs(q->ipqe_ip->ip_off);
1310: if (i < ntohs(q->ipqe_ip->ip_len)) {
1311: q->ipqe_ip->ip_len =
1312: htons(ntohs(q->ipqe_ip->ip_len) - i);
1313: q->ipqe_ip->ip_off =
1314: htons(ntohs(q->ipqe_ip->ip_off) + i);
1315: m_adj(q->ipqe_m, i);
1340: p = q, q = TAILQ_NEXT(q, ipqe_q)) {
1341: if (ntohs(q->ipqe_ip->ip_off) != next)
1342: return (0);
1343: next += ntohs(q->ipqe_ip->ip_len);
1344: }
2020: */
2021: mcopy = m_copym(m, 0, imin(ntohs(ip->ip_len), 68), M_DONTWAIT);
2022: if (mcopy)