Changeset a17356fd in mainline for uspace/srv/net/inetsrv/inet_link.c


Ignore:
Timestamp:
2013-07-12T15:33:20Z (12 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bb9b0c6
Parents:
f5f79cd
Message:

iplink IPv6 datagram support
rudimentary IPv6 support (sans fragmentation)

File:
1 edited

Legend:

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

    rf5f79cd ra17356fd  
    201201                goto error;
    202202        }
     203       
     204        /*
     205         * Get the MAC address of the link. If the link has a MAC
     206         * address, we assume that it supports NDP.
     207         */
     208        rc = iplink_get_mac48(ilink->iplink, &ilink->mac);
     209        ilink->mac_valid = (rc == EOK);
    203210
    204211        log_msg(LOG_DEFAULT, LVL_DEBUG, "Opened IP link '%s'", ilink->svc_name);
     
    298305}
    299306
    300 /** Send datagram over Internet link */
    301 int inet_link_send_dgram(inet_link_t *ilink, inet_addr_t *lsrc,
    302     inet_addr_t *ldest, inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df)
    303 {
     307/** Send IPv4 datagram over Internet link */
     308int inet_link_send_dgram(inet_link_t *ilink, addr32_t lsrc, addr32_t ldest,
     309    inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df)
     310{
     311        addr32_t src_v4;
     312        uint16_t src_af = inet_addr_get(&dgram->src, &src_v4, NULL);
     313        if (src_af != AF_INET)
     314                return EINVAL;
     315       
     316        addr32_t dest_v4;
     317        uint16_t dest_af = inet_addr_get(&dgram->dest, &dest_v4, NULL);
     318        if (dest_af != AF_INET)
     319                return EINVAL;
     320       
    304321        /*
    305322         * Fill packet structure. Fragmentation is performed by
    306323         * inet_pdu_encode().
    307324         */
     325       
     326        iplink_sdu_t sdu;
     327       
     328        sdu.src = lsrc;
     329        sdu.dest = ldest;
    308330       
    309331        inet_packet_t packet;
     
    318340        packet.size = dgram->size;
    319341       
    320         iplink_sdu_t sdu;
    321342        size_t offs = 0;
    322343        int rc;
    323        
    324         sdu.src = *lsrc;
    325         sdu.dest = *ldest;
    326344       
    327345        do {
    328346                /* Encode one fragment */
     347               
    329348                size_t roffs;
    330                 rc = inet_pdu_encode(&packet, offs, ilink->def_mtu, &sdu.data,
    331                     &sdu.size, &roffs);
     349                rc = inet_pdu_encode(&packet, src_v4, dest_v4, offs, ilink->def_mtu,
     350                    &sdu.data, &sdu.size, &roffs);
    332351                if (rc != EOK)
    333352                        return rc;
     
    335354                /* Send the PDU */
    336355                rc = iplink_send(ilink->iplink, &sdu);
     356               
    337357                free(sdu.data);
    338                
     358                offs = roffs;
     359        } while (offs < packet.size);
     360       
     361        return rc;
     362}
     363
     364/** Send IPv6 datagram over Internet link */
     365int inet_link_send_dgram6(inet_link_t *ilink, addr48_t ldest,
     366    inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df)
     367{
     368        addr128_t src_v6;
     369        uint16_t src_af = inet_addr_get(&dgram->src, NULL, &src_v6);
     370        if (src_af != AF_INET6)
     371                return EINVAL;
     372       
     373        addr128_t dest_v6;
     374        uint16_t dest_af = inet_addr_get(&dgram->dest, NULL, &dest_v6);
     375        if (dest_af != AF_INET6)
     376                return EINVAL;
     377       
     378        iplink_sdu6_t sdu6;
     379        addr48(ldest, sdu6.dest);
     380       
     381        /*
     382         * Fill packet structure. Fragmentation is performed by
     383         * inet_pdu_encode6().
     384         */
     385       
     386        inet_packet_t packet;
     387       
     388        packet.src = dgram->src;
     389        packet.dest = dgram->dest;
     390        packet.tos = dgram->tos;
     391        packet.proto = proto;
     392        packet.ttl = ttl;
     393        packet.df = df;
     394        packet.data = dgram->data;
     395        packet.size = dgram->size;
     396       
     397        int rc;
     398        size_t offs = 0;
     399       
     400        do {
     401                /* Encode one fragment */
     402               
     403                size_t roffs;
     404                rc = inet_pdu_encode6(&packet, src_v6, dest_v6, offs, ilink->def_mtu,
     405                    &sdu6.data, &sdu6.size, &roffs);
     406                if (rc != EOK)
     407                        return rc;
     408               
     409                /* Send the PDU */
     410                rc = iplink_send6(ilink->iplink, &sdu6);
     411               
     412                free(sdu6.data);
    339413                offs = roffs;
    340414        } while (offs < packet.size);
Note: See TracChangeset for help on using the changeset viewer.