Changeset 347768d in mainline for uspace/srv/inet/inet_link.c


Ignore:
Timestamp:
2012-04-11T05:52:47Z (12 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7f95c904
Parents:
7094e196
Message:

Fragmentation of outgoing datagrams, default link MTU.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/inet/inet_link.c

    r7094e196 r347768d  
    161161
    162162        ilink->svc_id = sid;
     163        ilink->iplink = NULL;
    163164
    164165        rc = loc_service_get_name(sid, &ilink->svc_name);
     
    177178        if (rc != EOK) {
    178179                log_msg(LVL_ERROR, "Failed opening IP link '%s'",
     180                    ilink->svc_name);
     181                goto error;
     182        }
     183
     184        rc = iplink_get_mtu(ilink->iplink, &ilink->def_mtu);
     185        if (rc != EOK) {
     186                log_msg(LVL_ERROR, "Failed determinning MTU of link '%s'",
    179187                    ilink->svc_name);
    180188                goto error;
     
    211219
    212220error:
     221        if (ilink->iplink != NULL)
     222                iplink_close(ilink->iplink);
    213223        inet_link_delete(ilink);
    214224        return rc;
     
    241251        inet_packet_t packet;
    242252        int rc;
    243 
    244         /* XXX Fragment packet */
     253        size_t offs, roffs;
     254
     255        /*
     256         * Fill packet structure. Fragmentation is performed by
     257         * inet_pdu_encode().
     258         */
    245259        packet.src = dgram->src;
    246260        packet.dest = dgram->dest;
     
    254268        sdu.lsrc.ipv4 = lsrc->ipv4;
    255269        sdu.ldest.ipv4 = ldest->ipv4;
    256         rc = inet_pdu_encode(&packet, &sdu.data, &sdu.size);
    257         if (rc != EOK)
    258                 return rc;
    259 
    260         rc = iplink_send(ilink->iplink, &sdu);
    261         free(sdu.data);
     270
     271        offs = 0;
     272        do {
     273                /* Encode one fragment */
     274                rc = inet_pdu_encode(&packet, offs, ilink->def_mtu, &sdu.data,
     275                    &sdu.size, &roffs);
     276                if (rc != EOK)
     277                        return rc;
     278
     279                /* Send the PDU */
     280                rc = iplink_send(ilink->iplink, &sdu);
     281                free(sdu.data);
     282
     283                offs = roffs;
     284        } while (offs < packet.size);
    262285
    263286        return rc;
Note: See TracChangeset for help on using the changeset viewer.