1/* ********************************************************************* 2 * Broadcom Common Firmware Environment (CFE) 3 * 4 * Ethernet test commands File: ui_test_ether.c 5 * 6 * User interface commands to test Ethernet devices 7 * 8 * Author: Mitch Lichtenberg (mpl@broadcom.com) 9 * 10 ********************************************************************* 11 * 12 * Copyright 2000,2001,2002,2003 13 * Broadcom Corporation. All rights reserved. 14 * 15 * This software is furnished under license and may be used and 16 * copied only in accordance with the following terms and 17 * conditions. Subject to these conditions, you may download, 18 * copy, install, use, modify and distribute modified or unmodified 19 * copies of this software in source and/or binary form. No title 20 * or ownership is transferred hereby. 21 * 22 * 1) Any source code used, modified or distributed must reproduce 23 * and retain this copyright notice and list of conditions 24 * as they appear in the source file. 25 * 26 * 2) No right is granted to use any trade name, trademark, or 27 * logo of Broadcom Corporation. The "Broadcom Corporation" 28 * name may not be used to endorse or promote products derived 29 * from this software without the prior written permission of 30 * Broadcom Corporation. 31 * 32 * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR 33 * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED 34 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 35 * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT 36 * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN 37 * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT, 38 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 39 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 40 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 41 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 42 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 43 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF 44 * THE POSSIBILITY OF SUCH DAMAGE. 45 ********************************************************************* */ 46 47 48#include "lib_types.h" 49#include "lib_string.h" 50#include "lib_queue.h" 51#include "lib_malloc.h" 52#include "lib_printf.h" 53 54#include "cfe_iocb.h" 55#include "cfe_device.h" 56#include "cfe_console.h" 57#include "cfe_error.h" 58#include "cfe_ioctl.h" 59#include "cfe_devfuncs.h" 60#include "ui_command.h" 61#include "cfe.h" 62 63typedef struct netparam_s { 64 const char *str; 65 int num; 66} netparam_t; 67 68const static netparam_t speedtypes[] = { 69 {"auto",ETHER_SPEED_AUTO}, 70 {"10hdx",ETHER_SPEED_10HDX}, 71 {"10fdx",ETHER_SPEED_10FDX}, 72 {"100hdx",ETHER_SPEED_100HDX}, 73 {"100fdx",ETHER_SPEED_100FDX}, 74 {"1000hdx",ETHER_SPEED_1000HDX}, 75 {"1000fdx",ETHER_SPEED_1000FDX}, 76 {0,NULL}}; 77 78 79int ui_init_ethertestcmds(void); 80 81static int ui_cmd_ethertest(ui_cmdline_t *cmd,int argc,char *argv[]); 82 83int ui_init_ethertestcmds(void) 84{ 85 cmd_addcmd("test ether", 86 ui_cmd_ethertest, 87 NULL, 88 "Do an ethernet test, reading packets from the net", 89 "test ether device-name", 90 "-speed=*;Specify speed|" 91 "-q;Be quiet|" 92 "-send=*;Transmit packets" 93 ); 94 95 return 0; 96} 97 98 99static int ui_ifconfig_lookup(char *name,char *val,const netparam_t *list) 100{ 101 const netparam_t *p = list; 102 103 while (p->str) { 104 if (strcmp(p->str,val) == 0) return p->num; 105 p++; 106 } 107 108 xprintf("Invalid parameter for %s: Valid options are: "); 109 110 p = list; 111 while (p->str) { 112 xprintf("%s ",p->str); 113 p++; 114 } 115 116 xprintf("\n"); 117 return -1; 118} 119 120static int ui_cmd_ethertest(ui_cmdline_t *cmd,int argc,char *argv[]) 121{ 122 char *tok; 123 int fh; 124 uint8_t packet[2048]; 125 int res; 126 int idx; 127 int speed = ETHER_SPEED_AUTO; 128 char *x; 129 int count = 0; 130 int quiet; 131 132 tok = cmd_getarg(cmd,0); 133 if (!tok) return -1; 134 135 if (cmd_sw_value(cmd,"-speed",&x)) { 136 speed = ui_ifconfig_lookup("-speed",x,speedtypes); 137 if (speed < 0) return CFE_ERR_INV_PARAM; 138 } 139 140 quiet = cmd_sw_isset(cmd,"-q"); 141 142 143 fh = cfe_open(tok); 144 if (fh < 0) { 145 xprintf("Could not open device: %s\n",cfe_errortext(fh)); 146 return fh; 147 } 148 149 if (speed != ETHER_SPEED_AUTO) { 150 xprintf("Setting speed to %d...\n",speed); 151 cfe_ioctl(fh,IOCTL_ETHER_SETSPEED,(uint8_t *) &speed,sizeof(speed),&idx,0); 152 } 153 154 155 if (cmd_sw_value(cmd,"-send",&x)) { 156 count = atoi(x); 157 memset(packet,0xEE,sizeof(packet)); 158 memcpy(packet,"\xFF\xFF\xFF\xFF\xFF\xFF\x40\x00\x00\x10\x00\x00\x12\x34",16); 159 res = 0; 160 for (idx = 0; idx < count; idx++) { 161 res = cfe_write(fh,packet,128); 162 if (res < 0) break; 163 } 164 if (res) { 165 ui_showerror(res,"Could not transmit packet"); 166 } 167 cfe_close(fh); 168 return 0; 169 } 170 171 xprintf("Receiving... press enter to stop\n"); 172 while (!console_status()) { 173 res = cfe_read(fh,packet,sizeof(packet)); 174 if (res == 0) continue; 175 if (res < 0) { 176 xprintf("Read error: %s\n",cfe_errortext(res)); 177 break; 178 } 179 180 if (!quiet) { 181 xprintf("%4d ",res); 182 if (res > 32) res = 32; 183 184 for (idx = 0; idx < res; idx++) { 185 xprintf("%02X",packet[idx]); 186 if ((idx == 5) || (idx == 11) || (idx == 13)) xprintf(" "); 187 } 188 189 xprintf("\n"); 190 } 191 192 count++; 193 if (quiet && !(count % 1000)) printf("."); 194 } 195 196 printf("Total packets received: %d\n",count); 197 198 cfe_close(fh); 199 200 return 0; 201} 202 203