void ip6_reass_tmr(void) { struct ip6_reassdata *r, *tmp; #if !IPV6_FRAG_COPYHEADER LWIP_ASSERT("sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN, set IPV6_FRAG_COPYHEADER to 1", sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN); #endif /* !IPV6_FRAG_COPYHEADER */ r = reassdatagrams; while (r != NULL) { /* Decrement the timer. Once it reaches 0, * clean up the incomplete fragment assembly */ if (r->timer > 0) { r->timer--; r = r->next; } else { /* reassembly timed out */ tmp = r; /* get the next pointer before freeing */ r = r->next; /* free the helper struct and all enqueued pbufs */ ip6_reass_free_complete_datagram(tmp); } } }
/** * Free the oldest datagram to make room for enqueueing new fragments. * The datagram ipr is not freed! * * @param ipr ip6_reassdata for the current fragment * @param pbufs_needed number of pbufs needed to enqueue * (used for freeing other datagrams if not enough space) */ static void ip6_reass_remove_oldest_datagram(struct ip6_reassdata *ipr, int pbufs_needed) { struct ip6_reassdata *r, *oldest; /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs, * but don't free the current datagram! */ do { r = oldest = reassdatagrams; while (r != NULL) { if (r != ipr) { if (r->timer <= oldest->timer) { /* older than the previous oldest */ oldest = r; } } r = r->next; } if (oldest == ipr) { /* nothing to free, ipr is the only element on the list */ return; } if (oldest != NULL) { ip6_reass_free_complete_datagram(oldest); } } while (((ip6_reass_pbufcount + pbufs_needed) > IP_REASS_MAX_PBUFS) && (reassdatagrams != NULL)); }
void ip6_reass_tmr(void) { struct ip6_reassdata *r, *tmp; r = reassdatagrams; while (r != NULL) { /* Decrement the timer. Once it reaches 0, * clean up the incomplete fragment assembly */ if (r->timer > 0) { r->timer--; r = r->next; } else { /* reassembly timed out */ tmp = r; /* get the next pointer before freeing */ r = r->next; /* free the helper struct and all enqueued pbufs */ ip6_reass_free_complete_datagram(tmp); } } }