Annotation of qemu/roms/SLOF/clients/net-snk/app/netapps/ping.c, revision 1.1.1.1

1.1       root        1: /******************************************************************************
                      2:  * Copyright (c) 2004, 2008 IBM Corporation
                      3:  * All rights reserved.
                      4:  * This program and the accompanying materials
                      5:  * are made available under the terms of the BSD License
                      6:  * which accompanies this distribution, and is available at
                      7:  * http://www.opensource.org/licenses/bsd-license.php
                      8:  *
                      9:  * Contributors:
                     10:  *     IBM Corporation - initial implementation
                     11:  *****************************************************************************/
                     12: 
                     13: #include <netlib/ipv4.h>
                     14: #include <netlib/dhcp.h>
                     15: #include <netlib/ethernet.h>
                     16: #include <sys/socket.h>
                     17: #include <string.h>
                     18: #include <stdio.h>
                     19: #include <stdlib.h>
                     20: #include <time.h>
                     21: #include <netapps/args.h>
                     22: 
                     23: struct ping_args {
                     24:        union {
                     25:                char string[4];
                     26:                unsigned int integer;
                     27:        } server_ip;
                     28:        union {
                     29:                char string[4];
                     30:                unsigned int integer;
                     31:        } client_ip;
                     32:        union {
                     33:                char string[4];
                     34:                unsigned int integer;
                     35:        } gateway_ip;
                     36:        unsigned int timeout;
                     37: };
                     38: 
                     39: static void
                     40: usage()
                     41: {
                     42:        printf
                     43:            ("\nping device-path:[device-args,]server-ip,[client-ip],[gateway-ip][,timeout]\n");
                     44: 
                     45: }
                     46: 
                     47: static int
                     48: parse_args(const char *args, struct ping_args *ping_args)
                     49: {
                     50:        unsigned int argc = get_args_count(args);
                     51:        char buf[64];
                     52:        ping_args->timeout = 10;
                     53:        if (argc == 0)
                     54:                /* at least server-ip has to be specified */
                     55:                return -1;
                     56:        if (argc == 1) {
                     57:                /* probably only server ip is specified */
                     58:                argncpy(args, 0, buf, 64);
                     59:                if (!strtoip(buf, ping_args->server_ip.string))
                     60:                        return -1;
                     61:                return 0;
                     62:        }
                     63:        /* get first option from list */
                     64:        argncpy(args, 0, buf, 64);
                     65:        if (!strtoip(buf, ping_args->server_ip.string)) {
                     66:                /* it is not an IP address
                     67:                 * therefore it has to be device-args
                     68:                 * device-args are not supported and just ignored */
                     69:                args = get_arg_ptr(args, 1);
                     70:                argc--;
                     71:        }
                     72: 
                     73:        argncpy(args, 0, buf, 64);
                     74:        if (!strtoip(buf, ping_args->server_ip.string)) {
                     75:                /* this should have been the server IP address */
                     76:                return -1;
                     77:        } else {
                     78:                args = get_arg_ptr(args, 1);
                     79:                if (!--argc)
                     80:                        return 0;
                     81:        }
                     82: 
                     83:        argncpy(args, 0, buf, 64);
                     84:        if (!strtoip(buf, ping_args->client_ip.string)) {
                     85:                /* this should have been the client (our) IP address */
                     86:                return -1;
                     87:        } else {
                     88:                args = get_arg_ptr(args, 1);
                     89:                if (!--argc)
                     90:                        return 0;
                     91:        }
                     92:        argncpy(args, 0, buf, 64);
                     93:        if (!strtoip(buf, ping_args->gateway_ip.string)) {
                     94:                /* this should have been the gateway IP address */
                     95:                return -1;
                     96:        } else {
                     97:                args = get_arg_ptr(args, 1);
                     98:                if (!--argc)
                     99:                        return 0;
                    100:        }
                    101:        argncpy(args, 0, buf, 64);
                    102:        ping_args->timeout = strtol(args, 0, 10);
                    103:        return 0;
                    104: }
                    105: 
                    106: int
                    107: ping(int argc, char *argv[])
                    108: {
                    109:        short arp_failed = 0;
                    110:        filename_ip_t fn_ip;
                    111:        int fd_device;
                    112:        struct ping_args ping_args;
                    113:        uint8_t own_mac[6];
                    114: 
                    115:        memset(&ping_args, 0, sizeof(struct ping_args));
                    116: 
                    117:        if (argc == 2) {
                    118:                if (parse_args(argv[1], &ping_args)) {
                    119:                        usage();
                    120:                        return -1;
                    121:                }
                    122:        } else {
                    123:                usage();
                    124:                return -1;
                    125:        }
                    126: 
                    127:        memset(&fn_ip, 0, sizeof(filename_ip_t));
                    128: 
                    129:        /* Get mac_addr from device */
                    130:        printf("\n  Reading MAC address from device: ");
                    131:        fd_device = socket(0, 0, 0, (char *) own_mac);
                    132:        if (fd_device == -1) {
                    133:                printf("\nE3000: Could not read MAC address\n");
                    134:                return -100;
                    135:        } else if (fd_device == -2) {
                    136:                printf("\nE3006: Could not initialize network device\n");
                    137:                return -101;
                    138:        }
                    139: 
                    140:        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
                    141:               own_mac[0], own_mac[1], own_mac[2],
                    142:               own_mac[3], own_mac[4], own_mac[5]);
                    143: 
                    144:        // init ethernet layer
                    145:        set_mac_address(own_mac);
                    146:        // identify the BOOTP/DHCP server via broadcasts
                    147:        // don't do this, when using DHCP !!!
                    148:        //  fn_ip.server_ip = 0xFFFFFFFF;
                    149:        //  memset(fn_ip.server_mac, 0xff, 6);
                    150: 
                    151:        if (!ping_args.client_ip.integer) {
                    152:                /* Get ip address for our mac address */
                    153:                printf("  Requesting IP address via DHCP: ");
                    154:                arp_failed = dhcp(0, &fn_ip, 30);
                    155: 
                    156:                if (arp_failed == -1) {
                    157:                        printf("\n  DHCP: Could not get ip address\n");
                    158:                        return -1;
                    159:                }
                    160: 
                    161:        } else {
                    162:                memcpy(&fn_ip.own_ip, &ping_args.client_ip.integer, 4);
                    163:                arp_failed = 1;
                    164:                printf("  Own IP address: ");
                    165:        }
                    166: 
                    167:        // reinit network stack
                    168:        set_ipv4_address(fn_ip.own_ip);
                    169: 
                    170:        printf("%d.%d.%d.%d\n",
                    171:               ((fn_ip.own_ip >> 24) & 0xFF), ((fn_ip.own_ip >> 16) & 0xFF),
                    172:               ((fn_ip.own_ip >> 8) & 0xFF), (fn_ip.own_ip & 0xFF));
                    173: 
                    174:        memcpy(&fn_ip.server_ip, &ping_args.server_ip.integer, 4);
                    175:        printf("  Ping to %d.%d.%d.%d ", ((fn_ip.server_ip >> 24) & 0xFF),
                    176:               ((fn_ip.server_ip >> 16) & 0xFF),
                    177:               ((fn_ip.server_ip >> 8) & 0xFF), (fn_ip.server_ip & 0xFF));
                    178: 
                    179: 
                    180:        ping_ipv4(fn_ip.server_ip);
                    181: 
                    182:        set_timer(TICKS_SEC / 10 * ping_args.timeout);
                    183:        while(get_timer() > 0) {
                    184:                receive_ether();
                    185:                if(pong_ipv4() == 0) {
                    186:                        printf("success\n");
                    187:                        return 0;
                    188:                }
                    189:        }
                    190: 
                    191:        printf("failed\n");
                    192:        return -1;
                    193: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.