Ignore:
File:
1 edited

Legend:

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

    r02a09ed rfff7ef4  
    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 uint16_t family = AF_INET;
     59#define NETTEST1_TEXT   "Networking test 1 - sockets"
     60
     61static int family = PF_INET;
    6262static sock_type_t type = SOCK_DGRAM;
     63static char *data;
    6364static size_t size = 27;
    64 static bool verbose = false;
    65 static int sockets = 10;
    66 static int messages = 10;
    67 static uint16_t port = 7;
     65static int verbose = 0;
    6866
    6967static struct sockaddr *address;
    7068static socklen_t addrlen;
    7169
    72 static char *data;
     70static int sockets;
     71static int messages;
     72static uint16_t port;
    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, &value, 0,
    123                     socket_parse_protocol_family);
    124                 if (rc != EOK)
    125                         return rc;
    126                
    127                 family = (uint16_t) value;
     122                rc = arg_parse_name_int(argc, argv, index, &family, 0, socket_parse_protocol_family);
     123                if (rc != EOK)
     124                        return rc;
    128125                break;
    129126        case 'h':
     
    134131                if (rc != EOK)
    135132                        return rc;
    136                
    137133                break;
    138134        case 'n':
     
    140136                if (rc != EOK)
    141137                        return rc;
    142                
    143138                break;
    144139        case 'p':
     
    146141                if (rc != EOK)
    147142                        return rc;
    148                
    149143                port = (uint16_t) value;
    150144                break;
     
    153147                if (rc != EOK)
    154148                        return rc;
    155                
    156149                size = (value >= 0) ? (size_t) value : 0;
    157150                break;
    158151        case 't':
    159                 rc = arg_parse_name_int(argc, argv, index, &value, 0,
    160                     socket_parse_socket_type);
    161                 if (rc != EOK)
    162                         return rc;
    163                
     152                rc = arg_parse_name_int(argc, argv, index, &value, 0, socket_parse_socket_type);
     153                if (rc != EOK)
     154                        return rc;
    164155                type = (sock_type_t) value;
    165156                break;
     
    167158                verbose = 1;
    168159                break;
    169        
    170160        /*
    171161         * Long options with double dash ('-')
     
    173163        case '-':
    174164                if (str_lcmp(argv[*index] + 2, "family=", 7) == 0) {
    175                         rc = arg_parse_name_int(argc, argv, index, &value, 9,
     165                        rc = arg_parse_name_int(argc, argv, index, &family, 9,
    176166                            socket_parse_protocol_family);
    177167                        if (rc != EOK)
    178168                                return rc;
    179                        
    180                         family = (uint16_t) value;
    181169                } else if (str_lcmp(argv[*index] + 2, "help", 5) == 0) {
    182170                        nettest1_print_help();
     
    194182                        if (rc != EOK)
    195183                                return rc;
    196                        
    197184                        port = (uint16_t) value;
    198185                } else if (str_lcmp(argv[*index] + 2, "type=", 5) == 0) {
     
    201188                        if (rc != EOK)
    202189                                return rc;
    203                        
    204190                        type = (sock_type_t) value;
    205191                } else if (str_lcmp(argv[*index] + 2, "verbose", 8) == 0) {
     
    214200                return EINVAL;
    215201        }
    216        
     202
    217203        return EOK;
    218204}
     
    225211static void nettest1_fill_buffer(char *buffer, size_t size)
    226212{
    227         size_t length = 0;
     213        size_t length;
     214
     215        length = 0;
    228216        while (size > length + sizeof(NETTEST1_TEXT) - 1) {
    229217                memcpy(buffer + length, NETTEST1_TEXT,
     
    231219                length += sizeof(NETTEST1_TEXT) - 1;
    232220        }
    233        
     221
    234222        memcpy(buffer + length, NETTEST1_TEXT, size - length);
    235223        buffer[size] = '\0';
     
    238226static int nettest1_test(int *socket_ids, int nsockets, int nmessages)
    239227{
     228        int rc;
     229
    240230        if (verbose)
    241231                printf("%d sockets, %d messages\n", nsockets, nmessages);
    242        
    243         int rc = sockets_create(verbose, socket_ids, nsockets, family, type);
    244         if (rc != EOK)
    245                 return rc;
    246        
     232
     233        rc = sockets_create(verbose, socket_ids, nsockets, family, type);
     234        if (rc != EOK)
     235                return rc;
     236
    247237        if (type == SOCK_STREAM) {
    248238                rc = sockets_connect(verbose, socket_ids, nsockets, address,
     
    251241                        return rc;
    252242        }
    253        
     243
    254244        rc = sockets_sendto_recvfrom(verbose, socket_ids, nsockets, address,
    255245            &addrlen, data, size, nmessages);
    256246        if (rc != EOK)
    257247                return rc;
    258        
     248
    259249        rc = sockets_close(verbose, socket_ids, nsockets);
    260250        if (rc != EOK)
    261251                return rc;
    262        
     252
    263253        if (verbose)
    264254                printf("\tOK\n");
    265        
     255
    266256        /****/
    267        
     257
    268258        rc = sockets_create(verbose, socket_ids, nsockets, family, type);
    269259        if (rc != EOK)
    270260                return rc;
    271        
     261
    272262        if (type == SOCK_STREAM) {
    273263                rc = sockets_connect(verbose, socket_ids, nsockets, address,
     
    276266                        return rc;
    277267        }
    278        
     268
    279269        rc = sockets_sendto(verbose, socket_ids, nsockets, address, addrlen,
    280270            data, size, nmessages);
    281271        if (rc != EOK)
    282272                return rc;
    283        
     273
    284274        rc = sockets_recvfrom(verbose, socket_ids, nsockets, address, &addrlen,
    285275            data, size, nmessages);
    286276        if (rc != EOK)
    287277                return rc;
    288        
     278
    289279        rc = sockets_close(verbose, socket_ids, nsockets);
    290280        if (rc != EOK)
    291281                return rc;
    292        
     282
    293283        if (verbose)
    294284                printf("\tOK\n");
    295        
     285
    296286        return EOK;
    297287}
     
    299289int main(int argc, char *argv[])
    300290{
     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
    301307        /*
    302308         * Parse the command line arguments. Stop before the last argument
    303309         * if it does not start with dash ('-')
    304310         */
    305         int index;
    306         int rc;
    307        
    308         for (index = 1; (index < argc - 1) || ((index == argc - 1) &&
    309             (argv[index][0] == '-')); index++) {
     311        for (index = 1; (index < argc - 1) || ((index == argc - 1) && (argv[index][0] == '-')); index++) {
    310312                /* Options should start with dash ('-') */
    311313                if (argv[index][0] == '-') {
     
    318320                }
    319321        }
    320        
    321         /* The last argument containing the host */
     322
     323        /* If not before the last argument containing the host */
    322324        if (index >= argc) {
    323                 printf("Host name missing.\n");
     325                printf("Command line error: missing host name\n");
    324326                nettest1_print_help();
    325327                return EINVAL;
    326328        }
    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        
     329
    356330        /* Prepare the address buffer */
    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);
     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;
    368346                break;
    369347        default:
     
    371349                return EAFNOSUPPORT;
    372350        }
    373        
     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
    374365        /* Check data buffer size */
    375366        if (size <= 0) {
     
    378369                size = 1024;
    379370        }
    380        
     371
    381372        /*
    382373         * Prepare data buffer. Allocate size bytes plus one for the
     
    389380        }
    390381        nettest1_fill_buffer(data, size);
    391        
     382
    392383        /* Check socket count */
    393384        if (sockets <= 0) {
     
    396387                sockets = 2;
    397388        }
    398        
     389
    399390        /*
    400391         * Prepare socket buffer. Allocate count fields plus the terminating
    401392         * null (\0).
    402393         */
    403         int *socket_ids = (int *) malloc(sizeof(int) * (sockets + 1));
     394        socket_ids = (int *) malloc(sizeof(int) * (sockets + 1));
    404395        if (!socket_ids) {
    405396                fprintf(stderr, "Failed to allocate receive buffer.\n");
    406397                return ENOMEM;
    407398        }
    408        
    409399        socket_ids[sockets] = 0;
    410        
     400
    411401        if (verbose)
    412402                printf("Starting tests\n");
    413        
    414         struct timeval time_before;
     403
    415404        rc = gettimeofday(&time_before, NULL);
    416405        if (rc != EOK) {
     
    418407                return rc;
    419408        }
    420        
     409
    421410        nettest1_test(socket_ids,       1,        1);
    422411        nettest1_test(socket_ids,       1, messages);
    423412        nettest1_test(socket_ids, sockets,        1);
    424413        nettest1_test(socket_ids, sockets, messages);
    425        
    426         struct timeval time_after;
     414
    427415        rc = gettimeofday(&time_after, NULL);
    428416        if (rc != EOK) {
     
    430418                return rc;
    431419        }
    432        
     420
    433421        printf("Tested in %ld microseconds\n", tv_sub(&time_after,
    434422            &time_before));
    435        
     423
    436424        if (verbose)
    437425                printf("Exiting\n");
    438        
     426
    439427        return EOK;
    440428}
    441429
     430
    442431/** @}
    443432 */
Note: See TracChangeset for help on using the changeset viewer.