⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wlan_config.c

📁 marvell wifi driver GSPI-8385-LINUX-OMAP1510-5.0.10.p0-144-src.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
  {
    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", &reg->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 + -