Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/inetsrv/reass.c

    r8ef1c1e r34c1bba  
    129129        assert(fibril_mutex_is_locked(&reass_dgram_map_lock));
    130130
    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
    132135                link_t *f1_link = list_first(&rdg->frags);
    133136                assert(f1_link != NULL);
     
    193196
    194197        data_copy = malloc(packet->size);
    195         if (data_copy == NULL) {
    196                 free(frag);
     198        if (data_copy == NULL)
    197199                return ENOMEM;
    198         }
    199 
    200         memcpy(data_copy, packet->data, packet->size);
    201200
    202201        frag->packet = *packet;
     
    220219                        break;
    221220
    222                 link = list_next(link, &rdg->frags);
     221                link = link->next;
    223222        }
    224223
     
    244243        assert(!list_empty(&rdg->frags));
    245244
    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,
    250247            dgram_link);
    251 
    252         /* First fragment must be at offset zero */
    253248        if (frag->packet.offs != 0)
    254249                return false;
    255250
    256251        prev = frag;
    257 
    258252        while (true) {
    259                 link = list_next(link, &rdg->frags);
     253                link = frag->dgram_link.next;
    260254                if (link == NULL)
    261                         break;
     255                        return false;
    262256
    263257                /* Each next fragment must follow immediately or overlap */
     
    295289        size_t fragoff_limit;
    296290        inet_dgram_t dgram;
     291        reass_frag_t *frag;
    297292        uint8_t proto;
    298         reass_frag_t *frag;
    299         int rc;
    300293
    301294        /*
     
    304297         */
    305298        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)
    309303                        break;
    310                 }
    311304        }
    312305
     
    317310
    318311        /* 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);
    320313
    321314        /* Verify that total size of datagram is within reasonable bounds */
     
    327320                return ENOMEM;
    328321
    329         /* XXX What if different fragments came from different link? */
    330         dgram.iplink = frag->packet.link_id;
    331322        dgram.size = dgram_size;
    332323        dgram.src = frag->packet.src;
     
    339330        size_t doffs = 0;
    340331
    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
    342336                size_t cb, ce;
    343337
    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);
    346340
    347341                if (ce > cb) {
    348342                        memcpy(dgram.data + cb,
    349                             cfrag->packet.data + cb - cfrag->packet.offs,
     343                            frag->packet.data + cb - frag->packet.offs,
    350344                            ce - cb);
    351345                }
    352346
    353                 if (!cfrag->packet.mf)
     347                if (!frag->packet.mf)
    354348                        break;
    355349        }
    356350
    357         rc = inet_recv_dgram_local(&dgram, proto);
    358         free(dgram.data);
    359         return rc;
     351        return inet_recv_dgram_local(&dgram, proto);
    360352}
    361353
Note: See TracChangeset for help on using the changeset viewer.