Changes in uspace/srv/net/inetsrv/reass.c [8ef1c1e:34c1bba] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/reass.c
r8ef1c1e r34c1bba 129 129 assert(fibril_mutex_is_locked(&reass_dgram_map_lock)); 130 130 131 list_foreach(reass_dgram_map, map_link, reass_dgram_t, rdg) { 131 list_foreach(reass_dgram_map, link) { 132 reass_dgram_t *rdg = list_get_instance(link, reass_dgram_t, 133 map_link); 134 132 135 link_t *f1_link = list_first(&rdg->frags); 133 136 assert(f1_link != NULL); … … 193 196 194 197 data_copy = malloc(packet->size); 195 if (data_copy == NULL) { 196 free(frag); 198 if (data_copy == NULL) 197 199 return ENOMEM; 198 }199 200 memcpy(data_copy, packet->data, packet->size);201 200 202 201 frag->packet = *packet; … … 220 219 break; 221 220 222 link = li st_next(link, &rdg->frags);221 link = link->next; 223 222 } 224 223 … … 244 243 assert(!list_empty(&rdg->frags)); 245 244 246 link = list_first(&rdg->frags); 247 assert(link != NULL); 248 249 frag = list_get_instance(link, reass_frag_t, 245 /* First fragment must be at offset zero */ 246 frag = list_get_instance(list_first(&rdg->frags), reass_frag_t, 250 247 dgram_link); 251 252 /* First fragment must be at offset zero */253 248 if (frag->packet.offs != 0) 254 249 return false; 255 250 256 251 prev = frag; 257 258 252 while (true) { 259 link = list_next(link, &rdg->frags);253 link = frag->dgram_link.next; 260 254 if (link == NULL) 261 break;255 return false; 262 256 263 257 /* Each next fragment must follow immediately or overlap */ … … 295 289 size_t fragoff_limit; 296 290 inet_dgram_t dgram; 291 reass_frag_t *frag; 297 292 uint8_t proto; 298 reass_frag_t *frag;299 int rc;300 293 301 294 /* … … 304 297 */ 305 298 frag = NULL; 306 list_foreach(rdg->frags, dgram_link, reass_frag_t, cfrag) { 307 if (!cfrag->packet.mf) { 308 frag = cfrag; 299 list_foreach(rdg->frags, link) { 300 frag = list_get_instance(link, reass_frag_t, dgram_link); 301 302 if (!frag->packet.mf) 309 303 break; 310 }311 304 } 312 305 … … 317 310 318 311 /* Upper bound for fragment offset field */ 319 fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l + 1);312 fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l); 320 313 321 314 /* Verify that total size of datagram is within reasonable bounds */ … … 327 320 return ENOMEM; 328 321 329 /* XXX What if different fragments came from different link? */330 dgram.iplink = frag->packet.link_id;331 322 dgram.size = dgram_size; 332 323 dgram.src = frag->packet.src; … … 339 330 size_t doffs = 0; 340 331 341 list_foreach(rdg->frags, dgram_link, reass_frag_t, cfrag) { 332 frag = NULL; 333 list_foreach(rdg->frags, link) { 334 frag = list_get_instance(link, reass_frag_t, dgram_link); 335 342 336 size_t cb, ce; 343 337 344 cb = max(doffs, cfrag->packet.offs);345 ce = min(dgram_size, cfrag->packet.offs + cfrag->packet.size);338 cb = max(doffs, frag->packet.offs); 339 ce = min(dgram_size, frag->packet.offs + frag->packet.size); 346 340 347 341 if (ce > cb) { 348 342 memcpy(dgram.data + cb, 349 cfrag->packet.data + cb - cfrag->packet.offs,343 frag->packet.data + cb - frag->packet.offs, 350 344 ce - cb); 351 345 } 352 346 353 if (! cfrag->packet.mf)347 if (!frag->packet.mf) 354 348 break; 355 349 } 356 350 357 rc = inet_recv_dgram_local(&dgram, proto); 358 free(dgram.data); 359 return rc; 351 return inet_recv_dgram_local(&dgram, proto); 360 352 } 361 353
Note:
See TracChangeset
for help on using the changeset viewer.