Changeset f3386d7 in mainline for uspace/app/nettest1/nettest1.c


Ignore:
Timestamp:
2013-07-15T20:44:54Z (11 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f8d3df3
Parents:
273c976 (diff), a940f1d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

mainline changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/nettest1/nettest1.c

    r273c976 rf3386d7  
    5454
    5555/** Echo module name. */
    56 #define NAME    "Nettest1"
     56#define NAME  "nettest1"
    5757
    5858/** Packet data pattern. */
    59 #define NETTEST1_TEXT   "Networking test 1 - sockets"
    60 
    61 static int family = PF_INET;
     59#define NETTEST1_TEXT  "Networking test 1 - sockets"
     60
     61static uint16_t family = AF_INET;
    6262static sock_type_t type = SOCK_DGRAM;
    63 static char *data;
    6463static size_t size = 27;
    65 static int verbose = 0;
     64static bool verbose = false;
     65static int sockets = 10;
     66static int messages = 10;
     67static uint16_t port = 7;
    6668
    6769static struct sockaddr *address;
    6870static socklen_t addrlen;
    6971
    70 static int sockets;
    71 static int messages;
    72 static uint16_t port;
     72static char *data;
    7373
    7474static void nettest1_print_help(void)
     
    114114        int value;
    115115        int rc;
    116 
     116       
    117117        switch (argv[*index][1]) {
    118118        /*
     
    120120         */
    121121        case 'f':
    122                 rc = arg_parse_name_int(argc, argv, index, &family, 0, socket_parse_protocol_family);
    123                 if (rc != EOK)
    124                         return rc;
     122                rc = arg_parse_name_int(argc, argv, index, &value, 0,
     123                    socket_parse_protocol_family);
     124                if (rc != EOK)
     125                        return rc;
     126               
     127                family = (uint16_t) value;
    125128                break;
    126129        case 'h':
     
    131134                if (rc != EOK)
    132135                        return rc;
     136               
    133137                break;
    134138        case 'n':
     
    136140                if (rc != EOK)
    137141                        return rc;
     142               
    138143                break;
    139144        case 'p':
     
    141146                if (rc != EOK)
    142147                        return rc;
     148               
    143149                port = (uint16_t) value;
    144150                break;
     
    147153                if (rc != EOK)
    148154                        return rc;
     155               
    149156                size = (value >= 0) ? (size_t) value : 0;
    150157                break;
    151158        case 't':
    152                 rc = arg_parse_name_int(argc, argv, index, &value, 0, socket_parse_socket_type);
    153                 if (rc != EOK)
    154                         return rc;
     159                rc = arg_parse_name_int(argc, argv, index, &value, 0,
     160                    socket_parse_socket_type);
     161                if (rc != EOK)
     162                        return rc;
     163               
    155164                type = (sock_type_t) value;
    156165                break;
     
    158167                verbose = 1;
    159168                break;
     169       
    160170        /*
    161171         * Long options with double dash ('-')
     
    163173        case '-':
    164174                if (str_lcmp(argv[*index] + 2, "family=", 7) == 0) {
    165                         rc = arg_parse_name_int(argc, argv, index, &family, 9,
     175                        rc = arg_parse_name_int(argc, argv, index, &value, 9,
    166176                            socket_parse_protocol_family);
    167177                        if (rc != EOK)
    168178                                return rc;
     179                       
     180                        family = (uint16_t) value;
    169181                } else if (str_lcmp(argv[*index] + 2, "help", 5) == 0) {
    170182                        nettest1_print_help();
     
    182194                        if (rc != EOK)
    183195                                return rc;
     196                       
    184197                        port = (uint16_t) value;
    185198                } else if (str_lcmp(argv[*index] + 2, "type=", 5) == 0) {
     
    188201                        if (rc != EOK)
    189202                                return rc;
     203                       
    190204                        type = (sock_type_t) value;
    191205                } else if (str_lcmp(argv[*index] + 2, "verbose", 8) == 0) {
     
    200214                return EINVAL;
    201215        }
    202 
     216       
    203217        return EOK;
    204218}
     
    211225static void nettest1_fill_buffer(char *buffer, size_t size)
    212226{
    213         size_t length;
    214 
    215         length = 0;
     227        size_t length = 0;
    216228        while (size > length + sizeof(NETTEST1_TEXT) - 1) {
    217229                memcpy(buffer + length, NETTEST1_TEXT,
     
    219231                length += sizeof(NETTEST1_TEXT) - 1;
    220232        }
    221 
     233       
    222234        memcpy(buffer + length, NETTEST1_TEXT, size - length);
    223235        buffer[size] = '\0';
     
    226238static int nettest1_test(int *socket_ids, int nsockets, int nmessages)
    227239{
    228         int rc;
    229 
    230240        if (verbose)
    231241                printf("%d sockets, %d messages\n", nsockets, nmessages);
    232 
    233         rc = sockets_create(verbose, socket_ids, nsockets, family, type);
    234         if (rc != EOK)
    235                 return rc;
    236 
     242       
     243        int rc = sockets_create(verbose, socket_ids, nsockets, family, type);
     244        if (rc != EOK)
     245                return rc;
     246       
    237247        if (type == SOCK_STREAM) {
    238248                rc = sockets_connect(verbose, socket_ids, nsockets, address,
     
    241251                        return rc;
    242252        }
    243 
     253       
    244254        rc = sockets_sendto_recvfrom(verbose, socket_ids, nsockets, address,
    245255            &addrlen, data, size, nmessages);
    246256        if (rc != EOK)
    247257                return rc;
    248 
     258       
    249259        rc = sockets_close(verbose, socket_ids, nsockets);
    250260        if (rc != EOK)
    251261                return rc;
    252 
     262       
    253263        if (verbose)
    254264                printf("\tOK\n");
    255 
     265       
    256266        /****/
    257 
     267       
    258268        rc = sockets_create(verbose, socket_ids, nsockets, family, type);
    259269        if (rc != EOK)
    260270                return rc;
    261 
     271       
    262272        if (type == SOCK_STREAM) {
    263273                rc = sockets_connect(verbose, socket_ids, nsockets, address,
     
    266276                        return rc;
    267277        }
    268 
     278       
    269279        rc = sockets_sendto(verbose, socket_ids, nsockets, address, addrlen,
    270280            data, size, nmessages);
    271281        if (rc != EOK)
    272282                return rc;
    273 
     283       
    274284        rc = sockets_recvfrom(verbose, socket_ids, nsockets, address, &addrlen,
    275285            data, size, nmessages);
    276286        if (rc != EOK)
    277287                return rc;
    278 
     288       
    279289        rc = sockets_close(verbose, socket_ids, nsockets);
    280290        if (rc != EOK)
    281291                return rc;
    282 
     292       
    283293        if (verbose)
    284294                printf("\tOK\n");
    285 
     295       
    286296        return EOK;
    287297}
     
    289299int main(int argc, char *argv[])
    290300{
    291         struct sockaddr_in address_in;
    292         struct sockaddr_in6 address_in6;
    293         dnsr_hostinfo_t *hinfo;
    294         uint8_t *address_start;
    295 
    296         int *socket_ids;
    297         int index;
    298         struct timeval time_before;
    299         struct timeval time_after;
    300 
    301         int rc;
    302 
    303         sockets = 10;
    304         messages = 10;
    305         port = 7;
    306 
    307301        /*
    308302         * Parse the command line arguments. Stop before the last argument
    309303         * if it does not start with dash ('-')
    310304         */
    311         for (index = 1; (index < argc - 1) || ((index == argc - 1) && (argv[index][0] == '-')); index++) {
     305        int index;
     306        int rc;
     307       
     308        for (index = 1; (index < argc - 1) || ((index == argc - 1) &&
     309            (argv[index][0] == '-')); index++) {
    312310                /* Options should start with dash ('-') */
    313311                if (argv[index][0] == '-') {
     
    320318                }
    321319        }
    322 
    323         /* If not before the last argument containing the host */
     320       
     321        /* The last argument containing the host */
    324322        if (index >= argc) {
    325                 printf("Command line error: missing host name\n");
     323                printf("Host name missing.\n");
    326324                nettest1_print_help();
    327325                return EINVAL;
    328326        }
    329 
     327       
     328        char *addr_s = argv[argc - 1];
     329       
     330        /* Interpret as address */
     331        inet_addr_t addr_addr;
     332        rc = inet_addr_parse(addr_s, &addr_addr);
     333       
     334        if (rc != EOK) {
     335                /* Interpret as a host name */
     336                dnsr_hostinfo_t *hinfo = NULL;
     337                rc = dnsr_name2host(addr_s, &hinfo);
     338               
     339                if (rc != EOK) {
     340                        printf("Error resolving host '%s'.\n", addr_s);
     341                        return EINVAL;
     342                }
     343               
     344                addr_addr = hinfo->addr;
     345        }
     346       
     347        struct sockaddr_in addr;
     348        struct sockaddr_in6 addr6;
     349        uint16_t af = inet_addr_sockaddr_in(&addr_addr, &addr, &addr6);
     350       
     351        if (af != family) {
     352                printf("Address family does not match explicitly set family.\n");
     353                return EINVAL;
     354        }
     355       
    330356        /* Prepare the address buffer */
    331 
    332         switch (family) {
    333         case PF_INET:
    334                 address_in.sin_family = AF_INET;
    335                 address_in.sin_port = htons(port);
    336                 address = (struct sockaddr *) &address_in;
    337                 addrlen = sizeof(address_in);
    338                 address_start = (uint8_t *) &address_in.sin_addr.s_addr;
    339                 break;
    340         case PF_INET6:
    341                 address_in6.sin6_family = AF_INET6;
    342                 address_in6.sin6_port = htons(port);
    343                 address = (struct sockaddr *) &address_in6;
    344                 addrlen = sizeof(address_in6);
    345                 address_start = (uint8_t *) &address_in6.sin6_addr.s6_addr;
     357       
     358        switch (af) {
     359        case AF_INET:
     360                addr.sin_port = htons(port);
     361                address = (struct sockaddr *) &addr;
     362                addrlen = sizeof(addr);
     363                break;
     364        case AF_INET6:
     365                addr6.sin6_port = htons(port);
     366                address = (struct sockaddr *) &addr6;
     367                addrlen = sizeof(addr6);
    346368                break;
    347369        default:
     
    349371                return EAFNOSUPPORT;
    350372        }
    351 
    352         /* Parse the last argument which should contain the host/address */
    353         rc = inet_pton(family, argv[argc - 1], address_start);
    354         if (rc != EOK) {
    355                 /* Try interpreting as a host name */
    356                 rc = dnsr_name2host(argv[argc - 1], &hinfo);
    357                 if (rc != EOK) {
    358                         printf("Error resolving host '%s'.\n", argv[argc - 1]);
    359                         return rc;
    360                 }
    361 
    362                 address_in.sin_addr.s_addr = host2uint32_t_be(hinfo->addr.ipv4);
    363         }
    364 
     373       
    365374        /* Check data buffer size */
    366375        if (size <= 0) {
     
    369378                size = 1024;
    370379        }
    371 
     380       
    372381        /*
    373382         * Prepare data buffer. Allocate size bytes plus one for the
     
    380389        }
    381390        nettest1_fill_buffer(data, size);
    382 
     391       
    383392        /* Check socket count */
    384393        if (sockets <= 0) {
     
    387396                sockets = 2;
    388397        }
    389 
     398       
    390399        /*
    391400         * Prepare socket buffer. Allocate count fields plus the terminating
    392401         * null (\0).
    393402         */
    394         socket_ids = (int *) malloc(sizeof(int) * (sockets + 1));
     403        int *socket_ids = (int *) malloc(sizeof(int) * (sockets + 1));
    395404        if (!socket_ids) {
    396405                fprintf(stderr, "Failed to allocate receive buffer.\n");
    397406                return ENOMEM;
    398407        }
     408       
    399409        socket_ids[sockets] = 0;
    400 
     410       
    401411        if (verbose)
    402412                printf("Starting tests\n");
    403 
     413       
     414        struct timeval time_before;
    404415        rc = gettimeofday(&time_before, NULL);
    405416        if (rc != EOK) {
     
    407418                return rc;
    408419        }
    409 
     420       
    410421        nettest1_test(socket_ids,       1,        1);
    411422        nettest1_test(socket_ids,       1, messages);
    412423        nettest1_test(socket_ids, sockets,        1);
    413424        nettest1_test(socket_ids, sockets, messages);
    414 
     425       
     426        struct timeval time_after;
    415427        rc = gettimeofday(&time_after, NULL);
    416428        if (rc != EOK) {
     
    418430                return rc;
    419431        }
    420 
     432       
    421433        printf("Tested in %ld microseconds\n", tv_sub(&time_after,
    422434            &time_before));
    423 
     435       
    424436        if (verbose)
    425437                printf("Exiting\n");
    426 
     438       
    427439        return EOK;
    428440}
    429441
    430 
    431442/** @}
    432443 */
Note: See TracChangeset for help on using the changeset viewer.