📄 wlan_config.c
字号:
{
n = getchar();
if (n == EOF)
break;
cmd.KeyData[i] = n;
}
cmd.KeyDataLen = i;
strncpy(iwr.ifr_name, DevName, IFNAMSIZ);
iwr.u.data.pointer = (caddr_t) &cmd;
iwr.u.data.length = sizeof(cmd);
if (IOCTL_CIPHER_TEST <= 0)
return -EOPNOTSUPP;
if (SUBIOCTL_CIPHER_TEST > 0)
iwr.u.data.flags = SUBIOCTL_CIPHER_TEST;
if (ioctl(sockfd, IOCTL_CIPHER_TEST, &iwr) < 0)
return -1;
for(i = 0; i < cmd.KeyDataLen; i++)
putchar(cmd.KeyData[i]);
return 0;
}
#endif
int main(int argc, char *argv[])
{
int cmd;
int PrivateCmds;
if (argc < 3) {
fprintf(stderr, "Invalid number of parameters!\n");
display_usage();
exit(1);
}
strncpy(DevName, argv[1], IFNAMSIZ);
/*
* create a socket
*/
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
fprintf(stderr, "wlanconfig: Cannot open socket.\n");
exit(1);
}
PrivateCmds = get_private_info(DevName);
marvell_init_ioctl_numbers(DevName);
switch ((cmd = findcommand(MAX_COMMANDS, commands, argv[2]))) {
case CMD_RDMAC:
case CMD_RDBBP:
case CMD_RDRF:
if (argc < 4) {
fprintf(stderr,
"Register offset required!\n");
display_usage();
exit(1);
}
if (process_read_register(cmd, argv[3])) {
fprintf(stderr,
"Read command failed!\n");
exit(1);
}
break;
case CMD_WRMAC:
case CMD_WRBBP:
case CMD_WRRF:
if (argc < 5) {
fprintf(stderr,
"Register offset required &"
"value!\n");
display_usage();
exit(1);
}
if (process_write_register(cmd, argv[3],
argv[4])) {
fprintf(stderr,
"Write command failed!\n");
exit(1);
}
break;
case CMD_CMD52R:
process_sdcmd52r(argc,argv);
break;
case CMD_CMD52W:
process_sdcmd52w(argc,argv);
break;
case CMD_CMD53R:
process_sdcmd53r();
break;
#ifdef SUBSCRIBE_EVENT_CTRL
case CMD_SUB_EVENT:
process_event_subscribe(argc, argv);
break;
#endif
#ifdef BG_SCAN
case CMD_BG_SCAN_CONFIG:
process_bg_scan_config(argc, argv);
break;
#endif /* BG_SCAN */
#ifdef WMM
case CMD_WMM_ACK_POLICY:
process_wmm_ack_policy(argc, argv);
break;
case CMD_WMM_TSPEC:
case CMD_WMM_AC_WPAIE:
process_wmm_para_conf(argc, argv, cmd);
break;
#endif /* WMM */
#ifdef CAL_DATA
case CMD_CAL_DATA_EXT:
process_cal_data_ext(argc, argv);
break;
#endif
case CMD_CFREGR:
printf("process read cfreg\n");
if (argc < 4) {
fprintf(stderr, "Register offset required!\n");
display_usage();
exit(1);
}
if (process_read_cfreg(argv[3])) {
fprintf(stderr, "Read CF register failed\n");
display_usage();
exit(1);
}
break;
case CMD_CFREGW:
printf("process write cfreg\n");
if (argc < 5) {
fprintf(stderr, "Register offset required!\n");
display_usage();
exit(1);
}
if (process_write_cfreg(argv[3], argv[4])) {
fprintf(stderr, "Read CF register failed\n");
display_usage();
exit(1);
}
break;
case CMD_RDEEPROM:
printf("proces read eeprom\n");
if(argc < 5) {
fprintf(stderr, "Register offset, number of bytes required\n");
display_usage();
exit(1);
}
if(process_read_eeprom(argv[3], argv[4])) {
fprintf(stderr, "EEPROM Read failed\n");
display_usage();
exit(1);
}
break;
case CMD_GETRATE:
if (process_get_rate()) {
fprintf(stderr, "Get Rate Failed\n");
display_usage();
exit(1);
}
break;
case CMD_SLEEPPARAMS:
if (process_sleep_params(argc, argv)) {
fprintf(stderr, "Sleep Params Failed\n");
display_usage();
exit(1);
}
break;
case CMD_BCA_TS:
if (process_bca_ts(argc, argv)) {
fprintf(stderr, "SetBcaTs Failed\n");
display_usage();
exit(1);
}
break;
case CMD_REASSOCIATE:
if (process_reassociation(argc, argv))
{
exit(1);
}
break;
case CMD_SCAN_BSSID:
if (process_scan_bssid(argc, argv)) {
fprintf(stderr, "ScanBssid Failed\n");
display_usage();
exit(1);
}
break;
case CMD_SETADHOCCH:
if (process_setadhocch(argc, argv)) {
fprintf(stderr, "SetAdhocCh Failed\n");
display_usage();
exit(1);
}
break;
case CMD_GETADHOCCH:
if (process_getadhocch(argc, argv)) {
fprintf(stderr, "GetAdhocCh Failed\n");
display_usage();
exit(1);
}
break;
#ifdef EXTSCAN
case CMD_EXTSCAN:
if (process_extscan(argc, argv)) {
fprintf(stderr, "ExtScan Failed\n");
display_usage();
exit(1);
}
break;
case CMD_SCAN_LIST:
if (process_scan_results(argc, argv)) {
fprintf(stderr, "getscanlist Failed\n");
display_usage();
exit(1);
}
break;
#endif
#ifdef CIPHER_TEST
case CMD_CIPHER_TEST:
if (process_cipher_test(argc, argv)) {
fprintf(stderr, "cipher_test Failed\n");
display_usage();
exit(1);
}
break;
#endif
default:
fprintf(stderr, "Invalid command specified!\n");
display_usage();
exit(1);
}
return 0;
}
int process_read_eeprom(char *stroffset, char *strnob)
{
char buffer[MAX_EEPROM_DATA];
struct ifreq userdata;
wlan_ioctl_regrdwr *reg = (wlan_ioctl_regrdwr *)buffer;
memset(buffer, 0, sizeof(buffer));
reg->WhichReg = REG_EEPROM;
reg->Action = 0;
if (!strncasecmp(stroffset, "0x", 2))
reg->Offset = a2hex((stroffset + 2));
else
reg->Offset = atoi(stroffset);
if (!strncasecmp(strnob, "0x", 2))
reg->NOB = a2hex((strnob + 2));
else
reg->NOB = atoi(strnob);
if (reg->NOB > MAX_EEPROM_DATA) {
fprintf(stderr, "Number of bytes exceeds MAX EEPROM Read size\n");
return -1;
}
strncpy(userdata.ifr_name, DevName, IFNAMSIZ);
userdata.ifr_data = buffer;
if (ioctl(sockfd, WLANREGRDWR, &userdata)) {
perror("wlanconfig");
fprintf(stderr,
"wlanconfig: EEPROM read not possible "
"by interface %s\n", DevName);
return -1;
}
hexdump("RD EEPROM", ®->Value, reg->NOB, ' ');
return 0;
}
static char *usage[] = {
"Usage: wlanconfig <ethX> <cmd> [...]",
"where",
" ethX : wireless network interface",
" cmd : rdmac, wrmac, rdbbp, wrbbp, rdrf, wrrf,\n"
" : sdcmd52r, sdcmd52w, sdcmd53r,\n"
" : caldataext, rdcfreg, wrcfreg, rdeeprom, bgscanconfig,\n"
" : sleepparams, bca-ts, scanbssid,\n"
" : requesttpc, setadhocch, getadhocch,\n"
" : wmmparaie, wmm_ack_policy, wmmtspec\n"
" : reassociate\n",
#ifdef SUBSCRIBE_EVENT_CTRL
" : subevent\n"
#endif
" [...] : additional parameters for read registers are",
" : <offset>",
" : additional parameters for write registers are",
" : <offset> <value>",
" : addition parameters for caldataext",
" : < filename >",
#ifdef SUBSCRIBE_EVENT_CTRL
" : additonal parameter for subevent",
" : < filename >",
#endif
" : additional parameters for reassociate are:",
" : XX:XX:XX:XX:XX:XX YY:YY:YY:YY:YY:YY < string max 32>",
" : < Current BSSID > < Desired BSSID > < Desired SSID >",
};
void display_usage(void)
{
int i;
for (i = 0; i < (sizeof(usage) / sizeof(usage[0])); i++)
fprintf(stderr, "%s\n", usage[i]);
}
int findcommand(int maxcmds, char *cmds[], char *cmd)
{
int i;
for (i = 0; i < maxcmds; i++) {
if (!strcasecmp(cmds[i], cmd)) {
return i;
}
}
return -1;
}
int process_sdcmd52r(int argc, char *argv[])
{
struct ifreq userdata;
unsigned char buf[6];
unsigned int tmp;
buf[0] = 0; //CMD52 read
if (argc == 5) {
buf[1] = atoval(argv[3]); //func
tmp = atoval(argv[4]); //reg
buf[2] = tmp & 0xff;
buf[3] = (tmp >> 8) & 0xff;
buf[4] = (tmp >> 16) & 0xff;
buf[5] = (tmp >> 24) & 0xff;
} else {
fprintf(stderr, "Invalid number of parameters!\n");
return -1;
}
strncpy(userdata.ifr_name, DevName, IFNAMSIZ);
userdata.ifr_data = buf;
if (ioctl(sockfd, WLANCMD52RDWR, &userdata)) {
perror("wlanconfig");
fprintf(stderr,
"wlanconfig: CMD52 R/W not supported by "
"interface %s\n", DevName);
return -1;
}
printf("sdcmd52r returns 0x%02X\n", buf[0]);
return 0;
}
int process_sdcmd52w(int argc, char *argv[])
{
struct ifreq userdata;
unsigned char buf[7];
unsigned int tmp;
buf[0] = 1; //CMD52 write
if (argc == 6) {
buf[1] = atoval(argv[3]); //func
tmp = atoval(argv[4]); //reg
buf[2] = tmp & 0xff;
buf[3] = (tmp >> 8) & 0xff;
buf[4] = (tmp >> 16) & 0xff;
buf[5] = (tmp >> 24) & 0xff;
buf[6] = atoval(argv[5]); //dat
} else {
fprintf(stderr, "Invalid number of parameters!\n");
return -1;
}
strncpy(userdata.ifr_name, DevName, IFNAMSIZ);
userdata.ifr_data = buf;
if (ioctl(sockfd, WLANCMD52RDWR, &userdata)) {
perror("wlanconfig");
fprintf(stderr,
"wlanconfig: CMD52 R/W not supported by "
"interface %s\n", DevName);
return -1;
}
printf("sdcmd52w returns 0x%02X\n",buf[0]);
return 0;
}
int process_sdcmd53r(void)
{
struct ifreq userdata;
char buf[CMD53BUFLEN];
int i;
strncpy(userdata.ifr_name, DevName, IFNAMSIZ);
userdata.ifr_data = buf;
for(i=0; i < sizeof(buf); i++)
buf[i] = i & 0xff;
if (ioctl(sockfd, WLANCMD53RDWR, &userdata)) {
perror("wlanconfig");
fprintf(stderr,
"wlanconfig: CMD53 R/W not supported by "
"interface %s\n", DevName);
return -1;
}
for(i=0; i < sizeof(buf); i++) {
if (buf[i] != (i ^ 0xff))
printf("i=%02X %02X\n",i,buf[i]);
}
return 0;
}
#ifdef WMM
int process_wmm_ack_policy(int argc, char *argv[])
{
unsigned char buf[(WMM_ACK_POLICY_PRIO * 2) + 3];
int count, i;
struct ifreq userdata;
if ((argc != 3) && (argc != 5)) {
printf("Error: invalid no of arguments\n");
printf("Syntax: ./wlanconfig eth1 wmm_ack_policy\n");
printf("Syntax: ./wlanconfig eth1 wmm_ack_policy <AC> <POLICY>\n");
exit(1);
}
memset(buf, 0, (WMM_ACK_POLICY_PRIO * 2) + 3);
buf[0] = WMM_ACK_POLICY;
if (argc == 5) {
buf[1] = HostCmd_ACT_SET;
buf[2] = 0;
buf[3] = atoi(argv[3]);
if (buf[3] > WMM_ACK_POLICY_PRIO - 1) {
printf("Invalid Priority. Should be between 0 and %d\n",
WMM_ACK_POLICY_PRIO - 1);
exit(1);
}
buf[4] = atoi(argv[4]);
if(buf[4] > 1) {
printf("Invalid Ack Policy. Should be 1 or 0\n");
exit(1);
}
count = 5;
} else {
count = 2;
buf[1] = HostCmd_ACT_GET;
}
strncpy(userdata.ifr_name, DevName, IFNAMSIZ);
userdata.ifr_data = buf;
if (ioctl(sockfd, WLAN_SETCONF_GETCONF, &userdata)) {
fprintf(stderr, "wlanconfig: %s not supported by %s\n",
argv[2], DevName);
return -1;
}
if (buf[1] == HostCmd_ACT_GET) {
printf("AC Value Priority\n");
for (i=0; i < WMM_ACK_POLICY_PRIO; ++i) {
count = SKIP_TYPE_ACTION + (i*2);
printf("%4x %5x\n", buf[count], buf[count+1]);
}
}
return 0;
}
int process_wmm_para_conf(int argc, char *argv[], int cmd)
{
int count;
FILE *fp;
char buf[256];
char filename[48] = "";
struct ifreq userdata;
if (argc != 4) {
printf("Error: invalid no of arguments\n");
printf("Syntax: ./wlanconfig eth1 %s <filename>\n",argv[2]);
exit(1);
}
strncpy(filename, argv[3], MIN(sizeof(filename)-1, strlen(argv[3])));
if ((fp = fopen(filename, "r")) == NULL) {
fprintf(stderr, "Cannot open file %s\n", argv[3]);
exit(1);
}
count = fparse_for_cmd_and_hex(fp, buf + SKIP_TYPE, argv[2]);
if(count < 0) {
printf("Invalid command parsing failed !!!\n");
return -EINVAL;
}
/* This will set the type of command sent */
buf[0] = (cmd - CMD_WMM_TSPEC) + WMM_TSPEC;
hexdump(argv[2], buf, count + SKIP_TYPE, ' ');
strncpy(userdata.ifr_name, DevName, IFNAMSIZ);
userdata.ifr_data = buf;
if (ioctl(sockfd, WLAN_SETCONF_GETCONF, &userdata)) {
fprintf(stderr, "wlanconfig: %s not supported by %s\n",
argv[2], DevName);
return -1;
}
hexdump(argv[2], buf, count + SKIP_TYPE, ' ');
return 0;
}
#endif /* WMM */
static int hex2num(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return -1;
}
static int hex2byte(const char *hex)
{
int a, b;
a = hex2num(*hex++);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -