#include #include #include #include #include #include #include #include #include #include #include #define PRINT_FLAG_ALL 1 #define PRINT_FLAG_INACTIVE 2 int f; struct rtwlan_cmd cmd; void help(void) { fprintf(stderr, "Usage:\n" "\trtiwconfig --help\n" "\trtiwconfig []\n" "\trtiwconfig bitrate <2|4|11|22|12|18|24|36|48|72|96|108>\n" "\trtiwconfig channel <1-13>\n" "\rrtiwconfig retry <0-255>\n" "\trtiwconfig txpower <0-100>\n" "\trtiwconfig bbpsens <0-127>\n" "\trtiwconfig mode \n" "\trtiwconfig autoresponder <0|1>\n" "\trtiwconfig dropbcast <0|1>\n" "\trtiwconfig dropmcast <0|1>\n" "\t-- WARNING: Direct register access may cause system hang ! --\n" "\trtiwconfig regdump\n" "\trtiwconfig regread \n" "\trtiwconfig regwrite \n" "\trtiwconfig bbpwrite \n" ); exit(1); } void print_dev(void) { printf("\n"); printf("%s\n", cmd.head.if_name); printf("bitrate: %d\t\t", cmd.args.info.bitrate); printf("txpower: %d\n", cmd.args.info.txpower); printf("channel: %d\t\t", cmd.args.info.channel); printf("retry: %d\n", cmd.args.info.retry); printf("autoresponder: %d\t", cmd.args.info.autoresponder); printf("bbp sensibility: %d\n", cmd.args.info.bbpsens); printf("drop broadcast: %d\t", cmd.args.info.dropbcast); printf("rx packets: %5d\n", cmd.args.info.rx_packets); printf("drop multicast: %d\t", cmd.args.info.dropmcast); printf("tx packets: %5d\n", cmd.args.info.tx_packets); printf("tx mode: "); switch(cmd.args.info.mode) { case RTWLAN_TXMODE_RAW: printf("raw"); break; case RTWLAN_TXMODE_ACK: printf("ack"); break; case RTWLAN_TXMODE_MCAST: printf("mcast"); break; default: printf("unknown"); } printf("\t\ttx retry: %7d\n", cmd.args.info.tx_retry); } void do_display(int print_flags) { int i; int ret; if ((print_flags & PRINT_FLAG_ALL) != 0) for (i = 1; i <= MAX_RT_DEVICES; i++) { cmd.args.info.ifindex = i; ret = ioctl(f, IOC_RTWLAN_IFINFO, &cmd); if (ret == 0) { if (((print_flags & PRINT_FLAG_INACTIVE) != 0) || ((cmd.args.info.flags & IFF_RUNNING) != 0)) print_dev(); } else if (ret == -ENORTWLANDEV) { continue; } else if (errno != ENODEV) { perror("ioctl"); exit(1); } } else { cmd.args.info.ifindex = 0; ret = ioctl(f, IOC_RTWLAN_IFINFO, &cmd); if(ret == -ENORTWLANDEV) { printf("Device %s has no wireless extensions !\n", cmd.head.if_name); exit(1); } else if (ret < 0) { perror("ioctl"); exit(1); } print_dev(); } printf("\n"); exit(0); } int main(int argc, char * argv[]) { int offset, ret = 0; if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) help(); f = open("/dev/rtnet", O_RDWR); if (f < 0) { perror("/dev/rtnet"); exit(1); } if(argc > 1) strncpy(cmd.head.if_name, argv[1], IFNAMSIZ); switch(argc) { case 1: do_display(PRINT_FLAG_ALL); break; case 2: do_display(0); break; case 3: if(strcmp(argv[2], "regdump") == 0) { for(offset=0x0; offset <= 0x0174; offset+=0x04) { cmd.args.reg.address = offset; ret = ioctl(f, IOC_RTWLAN_REGREAD, &cmd); printf("rtiwconfig: offset=%3x reg=%8x\n", cmd.args.reg.address, cmd.args.reg.value); } } else help(); break; case 4: if (strcmp(argv[2], "channel") == 0) { cmd.args.set.channel = atoi(argv[3]); ret = ioctl(f, IOC_RTWLAN_CHANNEL, &cmd); } else if(strcmp(argv[2], "bitrate") == 0) { cmd.args.set.bitrate = atoi(argv[3]); ret = ioctl(f, IOC_RTWLAN_BITRATE, &cmd); } else if(strcmp(argv[2], "txpower") == 0) { cmd.args.set.txpower = atoi(argv[3]); ret = ioctl(f, IOC_RTWLAN_TXPOWER, &cmd); } else if(strcmp(argv[2], "retry") == 0) { cmd.args.set.retry = atoi(argv[3]); ret = ioctl(f, IOC_RTWLAN_RETRY, &cmd); } else if(strcmp(argv[2], "regread") == 0) { sscanf(argv[3], "%x", &cmd.args.reg.address); ret = ioctl(f, IOC_RTWLAN_REGREAD, &cmd); printf("rtiwconfig: regread: address=%3x value=%8x\n", cmd.args.reg.address, cmd.args.reg.value); } else if(strcmp(argv[2], "bbpread") == 0) { sscanf(argv[3], "%x", &cmd.args.reg.address); ret = ioctl(f, IOC_RTWLAN_BBPREAD, &cmd); printf("rtiwconfig: bbpread: address=%3x value=%4x\n", cmd.args.reg.address, cmd.args.reg.value); } else if(strcmp(argv[2], "dropbcast") == 0) { cmd.args.set.dropbcast = atoi(argv[3]); ret = ioctl(f, IOC_RTWLAN_DROPBCAST, &cmd); } else if(strcmp(argv[2], "dropmcast") == 0) { cmd.args.set.dropmcast = atoi(argv[3]); ret = ioctl(f, IOC_RTWLAN_DROPMCAST, &cmd); } else if(strcmp(argv[2], "mode") == 0) { if(strcmp(argv[3], "raw") == 0) cmd.args.set.mode = RTWLAN_TXMODE_RAW; else if(strcmp(argv[3], "ack") == 0) cmd.args.set.mode = RTWLAN_TXMODE_ACK; else if(strcmp(argv[3], "mcast") == 0) cmd.args.set.mode = RTWLAN_TXMODE_MCAST; ret = ioctl(f, IOC_RTWLAN_TXMODE, &cmd); } else if(strcmp(argv[2], "bbpsens") == 0) { cmd.args.set.bbpsens = atoi(argv[3]); ret = ioctl(f, IOC_RTWLAN_BBPSENS, &cmd); } else if(strcmp(argv[2], "autoresponder") == 0) { cmd.args.set.autoresponder = atoi(argv[3]); ret = ioctl(f, IOC_RTWLAN_AUTORESP, &cmd); } else help(); break; case 5: if(strcmp(argv[2], "regwrite") == 0) { sscanf(argv[3], "%x", &cmd.args.reg.address); printf("regwrite: address=%x\n", cmd.args.reg.address); sscanf(argv[4], "%x", &cmd.args.reg.value); printf("regwrite: value=%x\n", cmd.args.reg.value); ret = ioctl(f, IOC_RTWLAN_REGWRITE, &cmd); } else if(strcmp(argv[2], "bbpwrite") == 0) { sscanf(argv[3], "%x", &cmd.args.reg.address); sscanf(argv[4], "%x", &cmd.args.reg.value); ret = ioctl(f, IOC_RTWLAN_BBPWRITE, &cmd); } break; default: help(); } if(ret) { perror("ioctl"); exit(1); } return ret; }