Changeset 1d24ad3 in mainline


Ignore:
Timestamp:
2013-07-03T14:20:04Z (11 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d8b47eca
Parents:
02a09ed
Message:

more IPv6 stub code

Files:
7 added
17 edited

Legend:

Unmodified
Added
Removed
  • boot/Makefile.common

    r02a09ed r1d24ad3  
    193193        $(USPACE_PATH)/app/nterm/nterm \
    194194        $(USPACE_PATH)/app/ping/ping \
     195        $(USPACE_PATH)/app/ping6/ping6 \
    195196        $(USPACE_PATH)/app/stats/stats \
    196197        $(USPACE_PATH)/app/sysinfo/sysinfo \
  • uspace/Makefile

    r02a09ed r1d24ad3  
    7272        app/nettest3 \
    7373        app/ping \
     74        app/ping6 \
    7475        app/sysinfo \
    7576        app/mkbd \
  • uspace/lib/c/Makefile

    r02a09ed r1d24ad3  
    9696        generic/inetcfg.c \
    9797        generic/inetping.c \
     98        generic/inetping6.c \
    9899        generic/io/asprintf.c \
    99100        generic/io/input.c \
  • uspace/lib/c/include/ipc/inet.h

    r02a09ed r1d24ad3  
    4545        INET_PORT_CFG,
    4646        /** Ping service port */
    47         INET_PORT_PING
     47        INET_PORT_PING,
     48        /** Ping6 service port */
     49        INET_PORT_PING6
    4850} inet_port_t;
    4951
     
    8890} inetping_request_t;
    8991
     92/** Events on Inet ping6 port */
     93typedef enum {
     94        INETPING6_EV_RECV = IPC_FIRST_USER_METHOD
     95} inetping6_event_t;
     96
     97/** Requests on Inet ping6 port */
     98typedef enum {
     99        INETPING6_SEND = IPC_FIRST_USER_METHOD,
     100        INETPING6_GET_SRCADDR
     101} inetping6_request_t;
     102
    90103#endif
    91104
  • uspace/lib/c/include/ipc/services.h

    r02a09ed r1d24ad3  
    5353} services_t;
    5454
    55 #define SERVICE_NAME_DNSR     "net/dnsr"
    56 #define SERVICE_NAME_INET     "net/inet"
    57 #define SERVICE_NAME_INETCFG  "net/inetcfg"
    58 #define SERVICE_NAME_INETPING "net/inetping"
     55#define SERVICE_NAME_DNSR       "net/dnsr"
     56#define SERVICE_NAME_INET       "net/inet"
     57#define SERVICE_NAME_INETCFG    "net/inetcfg"
     58#define SERVICE_NAME_INETPING   "net/inetping"
     59#define SERVICE_NAME_INETPING6  "net/inetping6"
    5960
    6061#endif
  • uspace/srv/net/ethip/ethip.c

    r02a09ed r1d24ad3  
    245245                rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET);
    246246                break;
     247        case ETYPE_IPV6:
     248                log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU IPv6");
     249                sdu.data = frame.data;
     250                sdu.size = frame.size;
     251                log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv");
     252                rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET6);
     253                break;
    247254        default:
    248255                log_msg(LOG_DEFAULT, LVL_DEBUG, "Unknown ethertype 0x%" PRIx16,
  • uspace/srv/net/inetsrv/Makefile

    r02a09ed r1d24ad3  
    3333        addrobj.c \
    3434        icmp.c \
     35        icmpv6.c \
    3536        inetsrv.c \
    3637        inet_link.c \
    3738        inetcfg.c \
    3839        inetping.c \
     40        inetping6.c \
    3941        pdu.c \
    4042        reass.c \
  • uspace/srv/net/inetsrv/inet_link.c

    r02a09ed r1d24ad3  
    7171                break;
    7272        case AF_INET6:
    73                 // FIXME TODO
    74                 return ENOTSUP;
     73                rc = inet_pdu_decode6(sdu->data, sdu->size, &packet);
     74                break;
    7575        default:
    7676                log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid address family");
     
    206206
    207207        inet_addrobj_t *addr;
     208        inet_addrobj_t *addr6;
    208209
    209210        static int first = 1;
    210211       
    211212        addr = inet_addrobj_new();
     213        addr6 = inet_addrobj_new();
    212214       
    213215        if (first) {
    214216                inet_naddr(&addr->naddr, 127, 0, 0, 1, 24);
     217                inet_naddr6(&addr6->naddr, 0, 0, 0, 0, 0, 0, 0, 1, 128);
    215218                first = 0;
    216219        } else {
    217                 /* XXX For testing: set static IP address 10.0.2.15/24 */
     220                /*
     221                 * FIXME
     222                 * Setting static IP addresses for testing purposes
     223                 * 10.0.2.15/24
     224                 * fd19:1680::4/120
     225                 */
    218226                inet_naddr(&addr->naddr, 10, 0, 2, 15, 24);
     227                inet_naddr6(&addr6->naddr, 0xfd19, 0x1680, 0, 0, 0, 0, 0, 4, 120);
    219228        }
    220229       
    221230        addr->ilink = ilink;
     231        addr6->ilink = ilink;
    222232        addr->name = str_dup("v4a");
     233        addr6->name = str_dup("v6a");
     234       
    223235        rc = inet_addrobj_add(addr);
    224236        if (rc != EOK) {
    225                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IP address on internet link.");
     237                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv4 address.");
    226238                inet_addrobj_delete(addr);
    227239                /* XXX Roll back */
    228240                return rc;
    229241        }
    230 
     242       
     243        rc = inet_addrobj_add(addr6);
     244        if (rc != EOK) {
     245                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv6 address.");
     246                inet_addrobj_delete(addr6);
     247                /* XXX Roll back */
     248                return rc;
     249        }
     250       
    231251        inet_naddr_addr(&addr->naddr, &iaddr);
    232252        rc = iplink_addr_add(ilink->iplink, &iaddr);
    233253        if (rc != EOK) {
    234                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IP address on internet link.");
     254                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IPv4 address on internet link.");
    235255                inet_addrobj_remove(addr);
    236256                inet_addrobj_delete(addr);
     
    238258                return rc;
    239259        }
    240 
     260       
     261        inet_naddr_addr(&addr6->naddr, &iaddr);
     262        rc = iplink_addr_add(ilink->iplink, &iaddr);
     263        if (rc != EOK) {
     264                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IPv6 address on internet link.");
     265                inet_addrobj_remove(addr6);
     266                inet_addrobj_delete(addr6);
     267                /* XXX Roll back */
     268                return rc;
     269        }
     270       
    241271        return EOK;
    242272       
  • uspace/srv/net/inetsrv/inet_std.h

    r02a09ed r1d24ad3  
    4040#include <sys/types.h>
    4141
    42 /** Internet Datagram header (fixed part) */
     42/** IPv4 Datagram header (fixed part) */
    4343typedef struct {
    4444        /** Version, Internet Header Length */
     
    9090};
    9191
     92/** IPv6 Datagram header (fixed part) */
     93typedef struct {
     94        /** Version, Traffic class first 4 bits */
     95        uint8_t ver_tc;
     96        /** Traffic class (the rest), Flow label */
     97        uint8_t tc_fl[3];
     98        /* Payload length */
     99        uint16_t payload_len;
     100        /** Next header */
     101        uint8_t next;
     102        /** Hop limit */
     103        uint8_t hop_limit;
     104        /** Source address */
     105        uint8_t src_addr[16];
     106        /** Destination address */
     107        uint8_t dest_addr[16];
     108} ip6_header_t;
     109
     110/** IPv6 Datagram Fragment extension header */
     111typedef struct {
     112        /** Next header */
     113        uint8_t next;
     114        /** Reserved */
     115        uint8_t reserved;
     116        /** Fragment Offset, Flags */
     117        uint16_t foff_flags;
     118        /** Identification */
     119        uint32_t id;
     120} ip6_header_fragment_t;
     121
    92122/** Fragment offset is expressed in units of 8 bytes */
    93123#define FRAG_OFFS_UNIT 8
  • uspace/srv/net/inetsrv/inetsrv.c

    r02a09ed r1d24ad3  
    5050#include "icmp.h"
    5151#include "icmp_std.h"
     52#include "icmpv6.h"
     53#include "icmpv6_std.h"
    5254#include "inetsrv.h"
    5355#include "inetcfg.h"
    5456#include "inetping.h"
     57#include "inetping6.h"
    5558#include "inet_link.h"
    5659#include "reass.h"
     
    9396        rc = loc_service_register_with_iface(SERVICE_NAME_INETPING, &sid,
    9497            INET_PORT_PING);
     98        if (rc != EOK) {
     99                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service (%d).", rc);
     100                return EEXIST;
     101        }
     102       
     103        rc = loc_service_register_with_iface(SERVICE_NAME_INETPING6, &sid,
     104            INET_PORT_PING6);
    95105        if (rc != EOK) {
    96106                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service (%d).", rc);
     
    350360                inetping_conn(iid, icall, arg);
    351361                break;
     362        case INET_PORT_PING6:
     363                inetping6_conn(iid, icall, arg);
     364                break;
    352365        default:
    353366                async_answer_0(iid, ENOTSUP);
     
    416429        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_recv_dgram_local()");
    417430
    418         /* ICMP messages are handled internally */
     431        /* ICMP and ICMPv6 messages are handled internally */
    419432        if (proto == IP_PROTO_ICMP)
    420433                return icmp_recv(dgram);
     434       
     435        if (proto == IP_PROTO_ICMPV6)
     436                return icmpv6_recv(dgram);
    421437
    422438        client = inet_client_find(proto);
  • uspace/srv/net/inetsrv/inetsrv.h

    r02a09ed r1d24ad3  
    6363} inetping_client_t;
    6464
     65/** Inetping6 Client */
     66typedef struct {
     67        /** Callback session */
     68        async_sess_t *sess;
     69        /** Session identifier */
     70        uint16_t ident;
     71        /** Link to client list */
     72        link_t client_list;
     73} inetping6_client_t;
     74
    6575/** Address object info */
    6676typedef struct {
     
    179189} inetping_sdu_t;
    180190
     191typedef struct {
     192        addr128_t src;
     193        addr128_t dest;
     194        uint16_t seq_no;
     195        void *data;
     196        size_t size;
     197} inetping6_sdu_t;
     198
    181199extern int inet_ev_recv(inet_client_t *, inet_dgram_t *);
    182200extern int inet_recv_packet(inet_packet_t *);
  • uspace/srv/net/inetsrv/pdu.c

    r02a09ed r1d24ad3  
    131131                break;
    132132        case AF_INET6:
    133                 // FIXME TODO
    134                 assert(false);
     133                hdr_size = sizeof(ip6_header_t);
     134                break;
    135135        default:
    136136                assert(false);
     
    178178        /* Encode header fields */
    179179        ip_header_t *hdr;
     180        ip6_header_t *hdr6;
    180181       
    181182        switch (src_af) {
     
    202203                break;
    203204        case AF_INET6:
    204                 // FIXME TODO
    205                 return ENOTSUP;
     205                // TODO FIXME: fragmentation
     206               
     207                hdr6 = (ip6_header_t *) data;
     208               
     209                hdr6->ver_tc = (6 << (VI_VERSION_l));
     210                memset(hdr6->tc_fl, 0, 3);
     211                hdr6->payload_len = host2uint16_t_be(packet->size);
     212                hdr6->next = packet->proto;
     213                hdr6->hop_limit = packet->ttl;
     214               
     215                host2addr128_t_be(src_v6, hdr6->src_addr);
     216                host2addr128_t_be(dest_v6, hdr6->dest_addr);
     217               
     218                break;
    206219        default:
    207220                assert(false);
     
    281294}
    282295
     296int inet_pdu_decode6(void *data, size_t size, inet_packet_t *packet)
     297{
     298        // FIXME TODO
     299        return ENOTSUP;
     300}
     301
    283302/** @}
    284303 */
  • uspace/srv/net/inetsrv/pdu.h

    r02a09ed r1d24ad3  
    4848    size_t *, size_t *);
    4949extern int inet_pdu_decode(void *, size_t, inet_packet_t *);
     50extern int inet_pdu_decode6(void *, size_t, inet_packet_t *);
    5051
    5152#endif
  • uspace/srv/net/tcp/pdu.c

    r02a09ed r1d24ad3  
    145145}
    146146
    147 static uint16_t tcp_phdr_setup(tcp_pdu_t *pdu, tcp_phdr_t *phdr)
     147static uint16_t tcp_phdr_setup(tcp_pdu_t *pdu, tcp_phdr_t *phdr,
     148    tcp_phdr6_t *phdr6)
    148149{
    149150        addr32_t src_v4;
     
    167168                break;
    168169        case AF_INET6:
    169                 // FIXME TODO
    170                 assert(false);
     170                host2addr128_t_be(src_v6, phdr6->src);
     171                host2addr128_t_be(dest_v6, phdr6->dest);
     172                phdr6->tcp_length =
     173                    host2uint32_t_be(pdu->header_size + pdu->text_size);
     174                memset(phdr6->zero, 0, 3);
     175                phdr6->next = IP_PROTO_TCP;
     176                break;
    171177        default:
    172178                assert(false);
     
    259265        uint16_t cs_headers;
    260266        tcp_phdr_t phdr;
    261        
    262         uint16_t af = tcp_phdr_setup(pdu, &phdr);
     267        tcp_phdr6_t phdr6;
     268       
     269        uint16_t af = tcp_phdr_setup(pdu, &phdr, &phdr6);
    263270        switch (af) {
    264271        case AF_INET:
     
    267274                break;
    268275        case AF_INET6:
    269                 // FIXME TODO
    270                 assert(false);
     276                cs_phdr = tcp_checksum_calc(TCP_CHECKSUM_INIT, (void *) &phdr6,
     277                    sizeof(tcp_phdr6_t));
     278                break;
    271279        default:
    272280                assert(false);
  • uspace/srv/net/tcp/std.h

    r02a09ed r1d24ad3  
    7575};
    7676
    77 /** TCP pseudo header */
     77/** TCP IPv4 pseudo header */
    7878typedef struct {
    7979        /** Source address */
     
    8888        uint16_t tcp_length;
    8989} tcp_phdr_t;
     90
     91/** TCP IPv6 pseudo header */
     92typedef struct {
     93        /** Source address */
     94        addr128_t src;
     95        /** Destination address */
     96        addr128_t dest;
     97        /** TCP length */
     98        uint32_t tcp_length;
     99        /** Zeroes */
     100        uint8_t zero[3];
     101        /** Next header */
     102        uint8_t next;
     103} tcp_phdr6_t;
    90104
    91105/** Option kind */
  • uspace/srv/net/udp/pdu.c

    r02a09ed r1d24ad3  
    8585}
    8686
    87 static uint16_t udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr)
     87static uint16_t udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr,
     88    udp_phdr6_t *phdr6)
    8889{
    8990        addr32_t src_v4;
     
    106107                break;
    107108        case AF_INET6:
    108                 // FIXME TODO
    109                 assert(false);
     109                host2addr128_t_be(src_v6, phdr6->src_addr);
     110                host2addr128_t_be(dest_v6, phdr6->dest_addr);
     111                phdr6->udp_length = host2uint32_t_be(pdu->data_size);
     112                memset(phdr6->zero, 0, 3);
     113                phdr6->next = IP_PROTO_UDP;
     114                break;
    110115        default:
    111116                assert(false);
     
    130135        uint16_t cs_phdr;
    131136        udp_phdr_t phdr;
    132        
    133         uint16_t af = udp_phdr_setup(pdu, &phdr);
     137        udp_phdr6_t phdr6;
     138       
     139        uint16_t af = udp_phdr_setup(pdu, &phdr, &phdr6);
    134140        switch (af) {
    135141        case AF_INET:
     
    138144                break;
    139145        case AF_INET6:
    140                 // FIXME TODO
    141                 assert(false);
     146                cs_phdr = udp_checksum_calc(UDP_CHECKSUM_INIT, (void *) &phdr6,
     147                    sizeof(udp_phdr6_t));
     148                break;
    142149        default:
    143150                assert(false);
  • uspace/srv/net/udp/std.h

    r02a09ed r1d24ad3  
    5454} udp_header_t;
    5555
    56 /** UDP pseudo header */
     56/** UDP IPv4 pseudo header */
    5757typedef struct {
    5858        /** Source address */
     
    6868} udp_phdr_t;
    6969
     70/** UDP IPv6 pseudo header */
     71typedef struct {
     72        /** Source address */
     73        addr128_t src_addr;
     74        /** Destination address */
     75        addr128_t dest_addr;
     76        /** UDP length */
     77        uint32_t udp_length;
     78        /** Reserved */
     79        uint8_t zero[3];
     80        /** Next header */
     81        uint8_t next;
     82} udp_phdr6_t;
     83
    7084#endif
    7185
Note: See TracChangeset for help on using the changeset viewer.