software/drivers/sd8887/src/wlan/mapp/mlanutl/mlanroamagent.c
/**
 *  @brief          Issue getra scanperiod command
 *
 *  @param argc     number of arguments
 *  @param argv     A pointer to arguments array
 *
 *  @return         MLAN_STATUS_SUCCESS--success, otherwise--fail
 */
@brief          Issue getra scanperiod command
@param argc     number of arguments
@param argv     A pointer to arguments array


@brief Issue getra scanperiod command @param argc number of arguments @param argv A pointer to arguments array
static int
roamGetScanPeriod(int argc, char *argv[])
{
	int ret = MLAN_STATUS_SUCCESS;
	int state = 0, scanmode = 0, cmdresplen;
	struct ifreq ifr;
	t_u8 *buffer = NULL, *pos = NULL, *tlvptr = NULL;
	t_u16 tlv;
	t_u32 cmd_len = 0, cmd_header_len;
	struct eth_priv_cmd *cmd = NULL;
	HostCmd_DS_GEN *hostcmd;
	HostCmd_DS_CMD_ROAMAGENT_NEIGHBOR_SCANPERIOD_RSP *scanPeriodInfo;
	MrvlIEtypes_NeighborScanPeriod_t *pscanperiod;
	const char *states[] = { "Stable", "Degrading", "Unacceptable" };
	const char *scanmodes[] = { "Discovery", "Tracking" };
	t_u32 values[3][2];
	cmd_header_len = strlen(CMD_NXP) + strlen(HOSTCMD);
	buffer = (t_u8 *)malloc(BUFFER_LENGTH);
	if (buffer == NULL) {
		fprintf(stderr, "Cannot alloc memory\n");
		ret = ENOMEM;
		goto done;
	}
	memset(buffer, 0, BUFFER_LENGTH);
	cmd = (struct eth_priv_cmd *)malloc(sizeof(struct eth_priv_cmd));
	if (!cmd) {
		printf("ERR:Cannot allocate buffer for command!\n");
		free(buffer);
		ret = ENOMEM;
		goto done;
	}
#ifdef USERSPACE_32BIT_OVER_KERNEL_64BIT
	memset(cmd, 0, sizeof(struct eth_priv_cmd));
	memcpy(&cmd->buf, &buffer, sizeof(buffer));
#else
	cmd->buf = buffer;
#endif
	cmd->used_len = 0;
	cmd->total_len = BUFFER_LENGTH;
	strncpy((char *)buffer, CMD_NXP, strlen(CMD_NXP));
	strncpy((char *)buffer + strlen(CMD_NXP), HOSTCMD, strlen(HOSTCMD));
	hostcmd = (HostCmd_DS_GEN *)(buffer + cmd_header_len + sizeof(t_u32));
	pos = (t_u8 *)hostcmd + S_DS_GEN;
	scanPeriodInfo =
		(HostCmd_DS_CMD_ROAMAGENT_NEIGHBOR_SCANPERIOD_RSP *)pos;
	cmd_len = S_DS_GEN + sizeof(scanPeriodInfo->action);
	scanPeriodInfo->action = cpu_to_le16(HostCmd_ACT_GEN_GET);
	hostcmd->command =
		cpu_to_le16(HostCmd_CMD_ROAMAGENT_NEIGHBOR_SCAN_PERIOD);
	hostcmd->size = cpu_to_le16(cmd_len);
	hostcmd->seq_num = 0;
	hostcmd->result = 0;
	memcpy(buffer + cmd_header_len, &cmd_len, sizeof(t_u32));
	memset(&ifr, 0, sizeof(ifr));
	strncpy(ifr.ifr_ifrn.ifrn_name, dev_name, strlen(dev_name));
	ifr.ifr_ifru.ifru_data = (void *)cmd;
	if (ioctl(sockfd, MLAN_ETH_PRIV, &ifr)) {
		perror("ioctl[roamscanperiod]");
		printf("ERR:Command sending failed!\n");
		ret = -EFAULT;
		goto done;
	}
	cmdresplen = le16_to_cpu(hostcmd->size);
	cmdresplen -= cmd_len + sizeof(scanPeriodInfo->Reserved);
	tlvptr = scanPeriodInfo->TlvBuffer;
	while (cmdresplen > 2) {
		tlv = le16_to_cpu(*((t_u16 *)(tlvptr)));
		switch (tlv) {
		case TLV_TYPE_NEIGHBOR_SCANPERIOD:
			pscanperiod =
				(MrvlIEtypes_NeighborScanPeriod_t *)(tlvptr);
			pscanperiod->SearchMode =
				le16_to_cpu(pscanperiod->SearchMode);
			pscanperiod->State = le16_to_cpu(pscanperiod->State);
			pscanperiod->ScanPeriod =
				le32_to_cpu(pscanperiod->ScanPeriod);
			state = pscanperiod->State;
			scanmode = pscanperiod->SearchMode;
			if ((state < STATE_STABLE) ||
			    (state > STATE_UNACCEPTABLE)) {
				puts("\nIncorrect state in response.\n");
			}
			if ((scanmode < DISCOVERY_MODE) ||
			    (scanmode > TRACKING_MODE)) {
				puts("\nIncorrect scanmode in response.\n");
			}
			values[state - 1][scanmode - 1] =
				pscanperiod->ScanPeriod;
			tlvptr +=
				(le16_to_cpu(pscanperiod->Header.len) +
				 sizeof(MrvlIEtypesHeader_t));
			cmdresplen -=
				(le16_to_cpu(pscanperiod->Header.len) +
				 sizeof(MrvlIEtypesHeader_t));
			break;
		default:
			puts("\nIncorrect response.\n");
			break;
		}
	}
	for (state = STATE_STABLE - 1; state < STATE_UNACCEPTABLE; state++) {
		printf("\nState: %-14s  ", states[state]);
		for (scanmode = DISCOVERY_MODE - 1;
		     scanmode < TRACKING_MODE; scanmode++) {
			printf("%s = %6d ms\t",
			       scanmodes[scanmode],
			       (int)values[state][scanmode]);
		}
	}
	printf("\n");
done:
	if (buffer)
		free(buffer);
	if (cmd)
		free(cmd);
	return ret;
}
static int roamGetScanPeriod ( int argc , char * argv [ ] ) { int ret = MLAN_STATUS_SUCCESS ; int state = 0 , scanmode = 0 , cmdresplen ; struct ifreq ifr ; t_u8 * buffer = NULL , * pos = NULL , * tlvptr = NULL ; t_u16 tlv ; t_u32 cmd_len = 0 , cmd_header_len ; struct eth_priv_cmd * cmd = NULL ; HostCmd_DS_GEN * hostcmd ; HostCmd_DS_CMD_ROAMAGENT_NEIGHBOR_SCANPERIOD_RSP * scanPeriodInfo ; MrvlIEtypes_NeighborScanPeriod_t * pscanperiod ; const char * states [ ] = { " " , " " , " " } ; const char * scanmodes [ ] = { " " , " " } ; t_u32 values [ 3 ] [ 2 ] ; cmd_header_len = strlen ( CMD_NXP ) + strlen ( HOSTCMD ) ; buffer = ( t_u8 * ) malloc ( BUFFER_LENGTH ) ; if ( buffer == NULL ) { fprintf ( stderr , " \n " ) ; ret = ENOMEM ; goto done ; } memset ( buffer , 0 , BUFFER_LENGTH ) ; cmd = ( struct eth_priv_cmd * ) malloc ( sizeof ( struct eth_priv_cmd ) ) ; if ( ! cmd ) { printf ( " \n " ) ; free ( buffer ) ; ret = ENOMEM ; goto done ; } #ifdef USERSPACE_32BIT_OVER_KERNEL_64BIT memset ( cmd , 0 , sizeof ( struct eth_priv_cmd ) ) ; memcpy ( & cmd -> buf , & buffer , sizeof ( buffer ) ) ; #else cmd -> buf = buffer ; #endif cmd -> used_len = 0 ; cmd -> total_len = BUFFER_LENGTH ; strncpy ( ( char * ) buffer , CMD_NXP , strlen ( CMD_NXP ) ) ; strncpy ( ( char * ) buffer + strlen ( CMD_NXP ) , HOSTCMD , strlen ( HOSTCMD ) ) ; hostcmd = ( HostCmd_DS_GEN * ) ( buffer + cmd_header_len + sizeof ( t_u32 ) ) ; pos = ( t_u8 * ) hostcmd + S_DS_GEN ; scanPeriodInfo = ( HostCmd_DS_CMD_ROAMAGENT_NEIGHBOR_SCANPERIOD_RSP * ) pos ; cmd_len = S_DS_GEN + sizeof ( scanPeriodInfo -> action ) ; scanPeriodInfo -> action = cpu_to_le16 ( HostCmd_ACT_GEN_GET ) ; hostcmd -> command = cpu_to_le16 ( HostCmd_CMD_ROAMAGENT_NEIGHBOR_SCAN_PERIOD ) ; hostcmd -> size = cpu_to_le16 ( cmd_len ) ; hostcmd -> seq_num = 0 ; hostcmd -> result = 0 ; memcpy ( buffer + cmd_header_len , & cmd_len , sizeof ( t_u32 ) ) ; memset ( & ifr , 0 , sizeof ( ifr ) ) ; strncpy ( ifr . ifr_ifrn . ifrn_name , dev_name , strlen ( dev_name ) ) ; ifr . ifr_ifru . ifru_data = ( void * ) cmd ; if ( ioctl ( sockfd , MLAN_ETH_PRIV , & ifr ) ) { perror ( " " ) ; printf ( " \n " ) ; ret = - EFAULT ; goto done ; } cmdresplen = le16_to_cpu ( hostcmd -> size ) ; cmdresplen -= cmd_len + sizeof ( scanPeriodInfo -> Reserved ) ; tlvptr = scanPeriodInfo -> TlvBuffer ; while ( cmdresplen > 2 ) { tlv = le16_to_cpu ( * ( ( t_u16 * ) ( tlvptr ) ) ) ; switch ( tlv ) { case TLV_TYPE_NEIGHBOR_SCANPERIOD : pscanperiod = ( MrvlIEtypes_NeighborScanPeriod_t * ) ( tlvptr ) ; pscanperiod -> SearchMode = le16_to_cpu ( pscanperiod -> SearchMode ) ; pscanperiod -> State = le16_to_cpu ( pscanperiod -> State ) ; pscanperiod -> ScanPeriod = le32_to_cpu ( pscanperiod -> ScanPeriod ) ; state = pscanperiod -> State ; scanmode = pscanperiod -> SearchMode ; if ( ( state < STATE_STABLE ) || ( state > STATE_UNACCEPTABLE ) ) { puts ( " \n \n " ) ; } if ( ( scanmode < DISCOVERY_MODE ) || ( scanmode > TRACKING_MODE ) ) { puts ( " \n \n " ) ; } values [ state - 1 ] [ scanmode - 1 ] = pscanperiod -> ScanPeriod ; tlvptr += ( le16_to_cpu ( pscanperiod -> Header . len ) + sizeof ( MrvlIEtypesHeader_t ) ) ; cmdresplen -= ( le16_to_cpu ( pscanperiod -> Header . len ) + sizeof ( MrvlIEtypesHeader_t ) ) ; break ; default : puts ( " \n \n " ) ; break ; } } for ( state = STATE_STABLE - 1 ; state < STATE_UNACCEPTABLE ; state ++ ) { printf ( " \n " , states [ state ] ) ; for ( scanmode = DISCOVERY_MODE - 1 ; scanmode < TRACKING_MODE ; scanmode ++ ) { printf ( " \t " , scanmodes [ scanmode ] , ( int ) values [ state ] [ scanmode ] ) ; } } printf ( " \n " ) ; done : if ( buffer ) free ( buffer ) ; if ( cmd ) free ( cmd ) ; return ret ; }
@brief          Issue getra scanperiod command
  @param argc     number of arguments
  @param argv     A pointer to arguments array
@brief Issue getra scanperiod command @param argc number of arguments @param argv A pointer to arguments array
/* scanperiodValues[state][scanmode] */ /*
	 * NEIGHBOR_SCANPERIOD
	 */ /* Fill up buffer */ /* buffer = MRVL_CMD<cmd> */ /* buffer = MRVL_CMD<cmd><hostcmd_size><HostCmd_DS_GEN><CMD_DS> */ /* Point after host command header */ /* Put buffer length */ /* Initialize the ifr structure */ /* Perform ioctl */ /*
		 * ENDIANNESS for Response
		 */