142 |
reassembly buffer, we discard the entire packet. */ |
reassembly buffer, we discard the entire packet. */ |
143 |
if (offset > IP_REASS_BUFSIZE || offset + len > IP_REASS_BUFSIZE) { |
if (offset > IP_REASS_BUFSIZE || offset + len > IP_REASS_BUFSIZE) { |
144 |
LWIP_DEBUGF(IP_REASS_DEBUG, |
LWIP_DEBUGF(IP_REASS_DEBUG, |
145 |
("ip_reass: fragment outside of buffer (%d:%d/%d).\n", offset, |
("ip_reass: fragment outside of buffer (%"S16_F":%"S16_F"/%"S16_F").\n", offset, |
146 |
offset + len, IP_REASS_BUFSIZE)); |
offset + len, IP_REASS_BUFSIZE)); |
147 |
sys_untimeout(ip_reass_timer, NULL); |
sys_untimeout(ip_reass_timer, NULL); |
148 |
ip_reasstmr = 0; |
ip_reasstmr = 0; |
152 |
/* Copy the fragment into the reassembly buffer, at the right |
/* Copy the fragment into the reassembly buffer, at the right |
153 |
offset. */ |
offset. */ |
154 |
LWIP_DEBUGF(IP_REASS_DEBUG, |
LWIP_DEBUGF(IP_REASS_DEBUG, |
155 |
("ip_reass: copying with offset %d into %d:%d\n", offset, |
("ip_reass: copying with offset %"S16_F" into %"S16_F":%"S16_F"\n", offset, |
156 |
IP_HLEN + offset, IP_HLEN + offset + len)); |
IP_HLEN + offset, IP_HLEN + offset + len)); |
157 |
i = IPH_HL(fraghdr) * 4; |
i = IPH_HL(fraghdr) * 4; |
158 |
copy_from_pbuf(p, &i, &ip_reassbuf[IP_HLEN + offset], len); |
copy_from_pbuf(p, &i, &ip_reassbuf[IP_HLEN + offset], len); |
172 |
0xff. */ |
0xff. */ |
173 |
ip_reassbitmap[offset / (8 * 8)] |= bitmap_bits[(offset / 8) & 7]; |
ip_reassbitmap[offset / (8 * 8)] |= bitmap_bits[(offset / 8) & 7]; |
174 |
LWIP_DEBUGF(IP_REASS_DEBUG, |
LWIP_DEBUGF(IP_REASS_DEBUG, |
175 |
("ip_reass: updating many bytes in bitmap (%d:%d).\n", |
("ip_reass: updating many bytes in bitmap (%"S16_F":%"S16_F").\n", |
176 |
1 + offset / (8 * 8), (offset + len) / (8 * 8))); |
1 + offset / (8 * 8), (offset + len) / (8 * 8))); |
177 |
for (i = 1 + offset / (8 * 8); i < (offset + len) / (8 * 8); ++i) { |
for (i = 1 + offset / (8 * 8); i < (offset + len) / (8 * 8); ++i) { |
178 |
ip_reassbitmap[i] = 0xff; |
ip_reassbitmap[i] = 0xff; |
191 |
ip_reassflags |= IP_REASS_FLAG_LASTFRAG; |
ip_reassflags |= IP_REASS_FLAG_LASTFRAG; |
192 |
ip_reasslen = offset + len; |
ip_reasslen = offset + len; |
193 |
LWIP_DEBUGF(IP_REASS_DEBUG, |
LWIP_DEBUGF(IP_REASS_DEBUG, |
194 |
("ip_reass: last fragment seen, total len %d\n", |
("ip_reass: last fragment seen, total len %"S16_F"\n", |
195 |
ip_reasslen)); |
ip_reasslen)); |
196 |
} |
} |
197 |
|
|
204 |
for (i = 0; i < ip_reasslen / (8 * 8) - 1; ++i) { |
for (i = 0; i < ip_reasslen / (8 * 8) - 1; ++i) { |
205 |
if (ip_reassbitmap[i] != 0xff) { |
if (ip_reassbitmap[i] != 0xff) { |
206 |
LWIP_DEBUGF(IP_REASS_DEBUG, |
LWIP_DEBUGF(IP_REASS_DEBUG, |
207 |
("ip_reass: last fragment seen, bitmap %d/%d failed (%x)\n", |
("ip_reass: last fragment seen, bitmap %"S16_F"/%"S16_F" failed (%"X16_F")\n", |
208 |
i, ip_reasslen / (8 * 8) - 1, ip_reassbitmap[i])); |
i, ip_reasslen / (8 * 8) - 1, ip_reassbitmap[i])); |
209 |
goto nullreturn; |
goto nullreturn; |
210 |
} |
} |
214 |
if (ip_reassbitmap[ip_reasslen / (8 * 8)] != |
if (ip_reassbitmap[ip_reasslen / (8 * 8)] != |
215 |
(u8_t) ~ bitmap_bits[ip_reasslen / 8 & 7]) { |
(u8_t) ~ bitmap_bits[ip_reasslen / 8 & 7]) { |
216 |
LWIP_DEBUGF(IP_REASS_DEBUG, |
LWIP_DEBUGF(IP_REASS_DEBUG, |
217 |
("ip_reass: last fragment seen, bitmap %d didn't contain %x (%x)\n", |
("ip_reass: last fragment seen, bitmap %"S16_F" didn't contain %"X16_F" (%"X16_F")\n", |
218 |
ip_reasslen / (8 * 8), ~bitmap_bits[ip_reasslen / 8 & 7], |
ip_reasslen / (8 * 8), ~bitmap_bits[ip_reasslen / 8 & 7], |
219 |
ip_reassbitmap[ip_reasslen / (8 * 8)])); |
ip_reassbitmap[ip_reasslen / (8 * 8)])); |
220 |
goto nullreturn; |
goto nullreturn; |
243 |
available data in the pbuf is given by the q->len |
available data in the pbuf is given by the q->len |
244 |
variable. */ |
variable. */ |
245 |
LWIP_DEBUGF(IP_REASS_DEBUG, |
LWIP_DEBUGF(IP_REASS_DEBUG, |
246 |
("ip_reass: memcpy from %p (%d) to %p, %d bytes\n", |
("ip_reass: memcpy from %p (%"S16_F") to %p, %"S16_F" bytes\n", |
247 |
(void *)&ip_reassbuf[i], i, q->payload, |
(void *)&ip_reassbuf[i], i, q->payload, |
248 |
q->len > ip_reasslen - i ? ip_reasslen - i : q->len)); |
q->len > ip_reasslen - i ? ip_reasslen - i : q->len)); |
249 |
memcpy(q->payload, &ip_reassbuf[i], |
memcpy(q->payload, &ip_reassbuf[i], |