int main(int ac, char *av[]) { char *interface = NULL; struct ifreq ifr; char *endptr; int arg; int vecarg[VECLEN]; int s; static int optind; et_var_t var; char *dbuf; int dbuf_len, dbuf_alloc = 0; if (ac < 2) usage(av[0]); optind = 1; if (av[1][0] == '-') { if ((av[1][1] != 'a') && (av[1][1] != 'i')) usage(av[0]); if (ac < 4) usage(av[0]); interface = av[2]; optind += 2; } if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) syserr("socket"); if (interface) { strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); ifr.ifr_name[sizeof(ifr.ifr_name)-1] = '\0'; } else et_find(s, &ifr); if (!*ifr.ifr_name) { fprintf(stderr, "et interface not found\n"); exit(1); } if (strcmp(av[optind], "up") == 0) { if (ioctl(s, SIOCSETCUP, (caddr_t)&ifr) < 0) syserr("etcup"); } else if (strcmp(av[optind], "down") == 0) { if (ioctl(s, SIOCSETCDOWN, (caddr_t)&ifr) < 0) syserr("etcdown"); } else if (strcmp(av[optind], "loop") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCLOOP, (caddr_t)&ifr) < 0) syserr("etcloop"); } else if ((strcmp(av[optind], "dump") == 0) && (optind == (ac - 1))) { DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.set = 0; var.cmd = IOV_DUMP; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("etcdump"); } printf("%s\n", dbuf); DUMP_BUF_FREE(dbuf_alloc, dbuf); } else if (strcmp(av[optind], "msglevel") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = strtol(av[optind + 1], &endptr, 0); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCSETMSGLEVEL, (caddr_t)&ifr) < 0) syserr("etcsetmsglevel"); } else if (strcmp(av[optind], "promisc") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCPROMISC, (caddr_t)&ifr) < 0) syserr("etcpromisc"); } else if (strcmp(av[optind], "qos") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCQOS, (caddr_t)&ifr) < 0) syserr("etcqos"); } else if (strcmp(av[optind], "speed") == 0) { if (optind >= (ac -1)) usage(av[0]); if (strcmp(av[optind+1], "auto") == 0) arg = -1; else if (strcmp(av[optind+1], "10half") == 0) arg = 0; else if (strcmp(av[optind+1], "10full") == 0) arg = 1; else if (strcmp(av[optind+1], "100half") == 0) arg = 2; else if (strcmp(av[optind+1], "100full") == 0) arg = 3; else if (strcmp(av[optind+1], "1000full") == 0) arg = 5; else usage(av[0]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCSPEED, (caddr_t)&ifr) < 0) syserr("etcspeed"); } else if (strcmp(av[optind], "phyrd") == 0) { int cmd = -1; if ((ac < (optind + 2)) || (ac > (optind + 3))) { usage(av[0]); } else if (ac == (optind + 3)) { /* PHY address provided */ vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; cmd = SIOCGETCPHYRD2; } else { /* "My" PHY address implied */ vecarg[0] = strtoul(av[optind + 1], NULL, 0); cmd = SIOCGETCPHYRD; } ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, cmd, (caddr_t)&ifr) < 0) syserr("etcphyrd"); printf("0x%04x\n", vecarg[1]); } else if (strcmp(av[optind], "phywr") == 0) { int cmd = -1; if ((ac < (optind + 3)) || (ac > (optind + 4))) { usage(av[0]); } else if (ac == (optind + 4)) { vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; vecarg[1] = strtoul(av[optind + 3], NULL, 0); cmd = SIOCSETCPHYWR2; } else { vecarg[0] = strtoul(av[optind + 1], NULL, 0); vecarg[1] = strtoul(av[optind + 2], NULL, 0); cmd = SIOCSETCPHYWR; } ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, cmd, (caddr_t)&ifr) < 0) syserr("etcphywr"); } else if (strcmp(av[optind], "robord") == 0) { if ((ac != (optind + 3)) && (ac != (optind + 4))) usage(av[0]); vecarg[1] = 2; if (av[optind + 3]) vecarg[1] = strtoul(av[optind + 3], NULL, 0); /* only 1, 2, 4, 6, and 8 bytes are valid */ if ((vecarg[1] != 1) && (vecarg[1] != 8) && (0xF9 & vecarg[1])) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, SIOCGETCROBORD, (caddr_t)&ifr) < 0) syserr("etcrobord"); /* For SPI mode, the length can only be 1, 2, and 4 bytes */ if (vecarg[1] == -1) printf("Invalid length. For SPI mode, " "the length can only be 1, 2, and 4 bytes.\n"); else printf("0x%0.*llx\n", (2*vecarg[1]), *((unsigned long long *)&vecarg[2])); } else if (strcmp(av[optind], "robowr") == 0) { if ((ac != (optind + 4)) && (ac != (optind + 5))) usage(av[0]); vecarg[1] = 2; if (av[optind + 4]) vecarg[1] = strtoul(av[optind + 4], NULL, 0); /* only 1, 2, 4, 6, and 8 bytes are valid */ if ((vecarg[1] != 1) && (vecarg[1] != 8) && (0xF9 & vecarg[1])) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; *((unsigned long long *)&vecarg[2]) = strtoull(av[optind + 3], NULL, 0); ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, SIOCSETCROBOWR, (caddr_t)&ifr) < 0) syserr("etcrobowr"); /* For SPI mode, the length can only be 1, 2, and 4 bytes */ if (vecarg[1] == -1) printf("Invalid length. " "For SPI mode, the length can only be 1, 2, and 4 bytes.\n"); } else if (strcmp(av[optind], "macrd") == 0) { uint offset; if (ac != (optind + 2)) { usage(av[0]); } vecarg[0] = strtoul(av[optind + 1], NULL, 0); offset = vecarg[0]; var.set = 0; var.len = sizeof(int); var.cmd = IOV_MACRD; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcmacrd"); printf("Offset[0x%08x] = 0x%08x\n", offset, vecarg[0]); } else if (strcmp(av[optind], "macwr") == 0) { if (ac != (optind + 3)) { usage(av[0]); } vecarg[0] = strtoul(av[optind + 1], NULL, 0); vecarg[1] = strtoul(av[optind + 2], NULL, 0); var.set = 1; var.len = 2 * sizeof(int); var.cmd = IOV_MACWR; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcmacwr"); } else if (strcmp(av[optind], "port_status") == 0) { if (ac >= (optind + 3)) usage(av[0]); var.set = 0; var.cmd = IOV_PORTSTATS; var.buf = buf; if (ac == (optind + 1) || (strcmp(av[optind+1], "all") == 0)) *(uint *)buf = 0xFF; else *(uint *)buf = atoi(av[optind + 1]); var.len = sizeof(buf); ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcportstats"); printf("%s\n", buf); } else if (strcmp(av[optind], "sw_mctbl") == 0) { if ((ac > (optind + 3))) usage(av[0]); if (ac == (optind + 1)) { *(uint *)buf = 0xff; } else if (ac == (optind + 3) && strcmp(av[optind+1], "port") == 0) { *(uint *)buf = 1 << 16; *(uint *)buf |= atoi(av[optind + 2]) & 0xffff; } else if (ac == (optind + 3) && strcmp(av[optind+1], "vid") == 0) { *(uint *)buf = atoi(av[optind + 2]) & 0xffff; } else { usage(av[0]); } var.set = 0; var.cmd = IOV_SW_MCTBL; var.buf = buf; var.len = sizeof(buf); ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcswmctbl"); printf("%s\n", buf); } else if (strcmp(av[optind], "clear_dump") == 0) { if ((ac > (optind + 2))) usage(av[0]); var.set = 1; var.cmd = IOV_ET_CLEAR_DUMP; var.buf = NULL; ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etccleardump"); } else if ((strcmp(av[optind], "pktc") == 0) || (strcmp(av[optind], "pktcbnd") == 0)) { /* Get pktc or pktcbnd */ if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = strcmp(av[optind], "pktc") == 0 ? IOV_PKTC : IOV_PKTCBND; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("pktc"); if (!var.set) printf("%d\n", vecarg[0]); } else if (strcmp(av[optind], "quota") == 0) { if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = IOV_RXQUOTA; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("quota"); if (!var.set) printf("%d\n", vecarg[0]); } else if (strcmp(av[optind], "rxlazyto") == 0) { /* rxlazy timeout */ if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = IOV_RXLAZYTO; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("rxlazyto"); if (!var.set) printf("%d\n", vecarg[0]); } else if (strcmp(av[optind], "rxlazyfc") == 0) { /* rxlazy framecnt */ if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = IOV_RXLAZYFC; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("rxlazyfc"); if (!var.set) printf("%d\n", vecarg[0]); } else if ((strcmp(av[optind], "counters") == 0)) { if (ac == (optind + 1)) var.set = 0; else syserr("counters"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_COUNTERS; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("counters"); } printf("%s\n", dbuf); DUMP_BUF_FREE(dbuf_alloc, dbuf); } else if ((strcmp(av[optind], "dump") == 0) && (optind < (ac - 1))) { if (strcmp(av[optind + 1], "oops") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump oops"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP_OOPS; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump oops"); } printf("done\n"); } else if (strcmp(av[optind + 1], "ctf") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump ctf"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP_CTF; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump ctf"); } printf("%s\n", dbuf); } else if (strcmp(av[optind + 1], "ctrace") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump ctrace"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP_CTRACE; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump ctrace"); } printf("%s\n", dbuf); } else if (strcmp(av[optind + 1], "fa") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump fa"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_FA_DUMP; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump fa"); } printf("%s\n", dbuf); } else if (strcmp(av[optind + 1], "fwd") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump fwd"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP_FWDER; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump fwd"); } printf("%s\n", dbuf); } DUMP_BUF_FREE(dbuf_alloc, dbuf); #ifdef ET_INGRESS_QOS } else if ((strcmp(av[optind], "dma_rx_thresh") == 0) || (strcmp(av[optind], "dma_rx_policy") == 0)) { /* Get case */ if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = (strcmp(av[optind], "dma_rx_thresh") == 0) ? IOV_DMA_RX_THRESH : IOV_DMA_RX_POLICY; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("dma_rx_policy_usage"); if (!var.set) printf("%d\n", vecarg[0]); #endif /* ET_INGRESS_QOS */ } else if ((strcmp(av[optind], "cap") == 0)) { if (ac == (optind + 1)) var.set = 0; else syserr("cap"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_CAP; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("cap"); } printf("%s\n", dbuf); DUMP_BUF_FREE(dbuf_alloc, dbuf); } else { if (strcmp(av[optind], "switch_mode") == 0) { int all = 0; /* GET case */ if (ac == (optind + 1)) { var.set = 0; vecarg[0] = VECLEN; all = 1; } else if (ac == (optind + 2)) { var.set = 0; vecarg[0] = strtoul(av[optind + 1], NULL, 0); all = (int)(vecarg[0] == VECLEN); } else { if (ac != (optind + 3)) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0); vecarg[1] = strtoul(av[optind + 2], NULL, 0); if (vecarg[1] > 3) usage(av[0]); var.set = 1; } var.len = VECLEN * sizeof(int); var.cmd = IOV_ET_POWER_SAVE_MODE; var.buf = &vecarg; ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcswitchmode"); if (!var.set) { if (all) printf("phy power save mode for all phys:" " %d %d %d %d %d \n", vecarg[0], vecarg[1], vecarg[2], vecarg[3], vecarg[4]); else printf("phy power save mode for phy %d mode %d\n", vecarg[0], vecarg[1]); } } else { usage(av[0]); } } return (0); }
int main(int ac, char *av[]) { char *interface = NULL; struct ifreq ifr; char *endptr; int arg; int vecarg[VECLEN]; int s; static int optind; et_var_t var; char *dbuf; int dbuf_len, dbuf_alloc = 0; if (ac < 2) usage(av[0]); optind = 1; if (av[1][0] == '-') { if ((av[1][1] != 'a') && (av[1][1] != 'i')) usage(av[0]); if (ac < 4) usage(av[0]); interface = av[2]; optind += 2; } if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) syserr("socket"); if (interface) strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); else et_find(s, &ifr); if (!*ifr.ifr_name) { fprintf(stderr, "et interface not found\n"); exit(1); } if (strcmp(av[optind], "up") == 0) { if (ioctl(s, SIOCSETCUP, (caddr_t)&ifr) < 0) syserr("etcup"); } else if (strcmp(av[optind], "down") == 0) { if (ioctl(s, SIOCSETCDOWN, (caddr_t)&ifr) < 0) syserr("etcdown"); } else if (strcmp(av[optind], "loop") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCLOOP, (caddr_t)&ifr) < 0) syserr("etcloop"); } else if ((strcmp(av[optind], "dump") == 0) && (ac == 2)) { DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("etcdump"); } printf("%s\n", dbuf); DUMP_BUF_FREE(dbuf_alloc, dbuf); } else if (strcmp(av[optind], "msglevel") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = strtol(av[optind + 1], &endptr, 0); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCSETMSGLEVEL, (caddr_t)&ifr) < 0) syserr("etcsetmsglevel"); } else if (strcmp(av[optind], "promisc") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCPROMISC, (caddr_t)&ifr) < 0) syserr("etcpromisc"); } else if (strcmp(av[optind], "qos") == 0) { if (optind >= (ac -1)) usage(av[0]); arg = atoi(av[optind + 1]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCQOS, (caddr_t)&ifr) < 0) syserr("etcqos"); } else if (strcmp(av[optind], "speed") == 0) { if (optind >= (ac -1)) usage(av[0]); if (strcmp(av[optind+1], "auto") == 0) arg = -1; else if (strcmp(av[optind+1], "10half") == 0) arg = 0; else if (strcmp(av[optind+1], "10full") == 0) arg = 1; else if (strcmp(av[optind+1], "100half") == 0) arg = 2; else if (strcmp(av[optind+1], "100full") == 0) arg = 3; else if (strcmp(av[optind+1], "1000full") == 0) arg = 5; else usage(av[0]); ifr.ifr_data = (caddr_t) &arg; if (ioctl(s, SIOCSETCSPEED, (caddr_t)&ifr) < 0) syserr("etcspeed"); } else if (strcmp(av[optind], "phyrd") == 0) { int cmd = -1; if ((ac < (optind + 2)) || (ac > (optind + 3))) { usage(av[0]); } else if (ac == (optind + 3)) { /* PHY address provided */ vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; cmd = SIOCGETCPHYRD2; } else { /* "My" PHY address implied */ vecarg[0] = strtoul(av[optind + 1], NULL, 0); cmd = SIOCGETCPHYRD; } ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, cmd, (caddr_t)&ifr) < 0) syserr("etcphyrd"); printf("0x%04x\n", vecarg[1]); } else if (strcmp(av[optind], "phywr") == 0) { int cmd = -1; if ((ac < (optind + 3)) || (ac > (optind + 4))) { usage(av[0]); } else if (ac == (optind + 4)) { vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; vecarg[1] = strtoul(av[optind + 3], NULL, 0); cmd = SIOCSETCPHYWR2; } else { vecarg[0] = strtoul(av[optind + 1], NULL, 0); vecarg[1] = strtoul(av[optind + 2], NULL, 0); cmd = SIOCSETCPHYWR; } ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, cmd, (caddr_t)&ifr) < 0) syserr("etcphywr"); } else if (strcmp(av[optind], "robord") == 0) { if ((ac != (optind + 3)) && (ac != (optind + 4))) usage(av[0]); vecarg[1] = 2; if (av[optind + 3]) vecarg[1] = strtoul(av[optind + 3], NULL, 0); /* only 1, 2, 4, 6, and 8 bytes are valid */ if ((vecarg[1] != 1) && (vecarg[1] != 8) && (0xF9 & vecarg[1])) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, SIOCGETCROBORD, (caddr_t)&ifr) < 0) syserr("etcrobord"); /* For SPI mode, the length can only be 1, 2, and 4 bytes */ if (vecarg[1] == -1) printf("Invalid length. For SPI mode, the length can only be 1, 2, and 4 bytes.\n"); else printf("0x%0.*llx\n", (2*vecarg[1]), *((unsigned long long *)&vecarg[2])); } else if (strcmp(av[optind], "robowr") == 0) { if ((ac != (optind + 4)) && (ac != (optind + 5))) usage(av[0]); vecarg[1] = 2; if (av[optind + 4]) vecarg[1] = strtoul(av[optind + 4], NULL, 0); /* only 1, 2, 4, 6, and 8 bytes are valid */ if ((vecarg[1] != 1) && (vecarg[1] != 8) && (0xF9 & vecarg[1])) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0) << 16; vecarg[0] |= strtoul(av[optind + 2], NULL, 0) & 0xffff; *((unsigned long long *)&vecarg[2]) = strtoull(av[optind + 3], NULL, 0); ifr.ifr_data = (caddr_t) vecarg; if (ioctl(s, SIOCSETCROBOWR, (caddr_t)&ifr) < 0) syserr("etcrobowr"); /* For SPI mode, the length can only be 1, 2, and 4 bytes */ if (vecarg[1] == -1) printf("Invalid length. For SPI mode, the length can only be 1, 2, and 4 bytes.\n"); } else if (strcmp(av[optind], "clear_dump") == 0) { if ((ac > (optind + 2))) usage(av[0]); var.set = 1; var.cmd = IOV_ET_CLEAR_DUMP; var.buf = NULL; ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etccleardump"); } else if ((strcmp(av[optind], "pktc") == 0) || (strcmp(av[optind], "pktcbnd") == 0)) { /* Get pktc or pktcbnd */ if (ac == (optind + 1)) var.set = 0; else { var.set = 1; vecarg[0] = strtoul(av[optind + 1], NULL, 0); } var.len = sizeof(int); var.cmd = strcmp(av[optind], "pktc") == 0 ? IOV_PKTC : IOV_PKTCBND; var.buf = &vecarg; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("pktc"); if (!var.set) printf("%d\n", vecarg[0]); } else if ((strcmp(av[optind], "counters") == 0)) { if (ac == (optind + 1)) var.set = 0; else syserr("counters"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_COUNTERS; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("counters"); } printf("%s\n", dbuf); DUMP_BUF_FREE(dbuf_alloc, dbuf); } else if ((strcmp(av[optind], "dump") == 0) && (ac > 2)) { if (strcmp(av[optind + 1], "ctf") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump ctf"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP_CTF; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump ctf"); } printf("%s\n", dbuf); } else if (strcmp(av[optind + 1], "ctrace") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump ctrace"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_DUMP_CTRACE; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump ctrace"); } printf("%s\n", dbuf); } else if (strcmp(av[optind + 1], "fa") == 0) { if (ac == (optind + 2)) var.set = 0; else syserr("dump fa"); DUMP_BUF_ALLOC(dbuf_alloc, dbuf, dbuf_len); var.cmd = IOV_FA_DUMP; var.buf = dbuf; var.len = dbuf_len; ifr.ifr_data = (caddr_t)&var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) { DUMP_BUF_FREE(dbuf_alloc, dbuf); syserr("dump fa"); } printf("%s\n", dbuf); } DUMP_BUF_FREE(dbuf_alloc, dbuf); } else { if (strcmp(av[optind], "switch_mode") == 0) { int all = 0; /* GET case */ if (ac == (optind + 1)) { var.set = 0; vecarg[0] = VECLEN; all = 1; } else if (ac == (optind + 2)) { var.set = 0; vecarg[0] = strtoul(av[optind + 1], NULL, 0); all = (int)(vecarg[0] == VECLEN); } else { if (ac != (optind + 3)) usage(av[0]); vecarg[0] = strtoul(av[optind + 1], NULL, 0); vecarg[1] = strtoul(av[optind + 2], NULL, 0); if (vecarg[1] > 3) usage(av[0]); var.set = 1; } var.len = VECLEN * sizeof(int); var.cmd = IOV_ET_POWER_SAVE_MODE; var.buf = &vecarg; ifr.ifr_data = (caddr_t) &var; if (ioctl(s, SIOCSETGETVAR, (caddr_t)&ifr) < 0) syserr("etcswitchmode"); if (!var.set) { if (all) printf("phy power save mode for all phys:" " %d %d %d %d %d \n", vecarg[0], vecarg[1], vecarg[2], vecarg[3], vecarg[4]); else printf("phy power save mode for phy %d mode %d\n", vecarg[0], vecarg[1]); } } else { usage(av[0]); } } return (0); }