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


@brief Issue getra bcnmiss command @param argc number of arguments @param argv A pointer to arguments array
static int
roamGetPreBeaconMiss(int argc, char *argv[])
{
	int ret = MLAN_STATUS_SUCCESS;
	int bcnmiss, state = STATE_HARDROAM, i;
	struct ifreq ifr;
	t_u8 *buffer = NULL, *pos = NULL;
	t_u32 cmd_len = 0, cmd_header_len;
	struct eth_priv_cmd *cmd = NULL;
	HostCmd_DS_GEN *hostcmd;
	HostCmd_DS_CMD_ROAMAGENT_STATISTICS_THRESHOLD *statsthreshold;
	MrvlIEtypes_BeaconsMissed_t *pBeaconMissed;
	MrvlIEtypesHeader_t *pTlvHdr;
	t_u8 *tlvptr;
	const char *states[] =
		{ "Stable", "Degrading", "Unacceptable", "Hardroam" };
	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;
	statsthreshold = (HostCmd_DS_CMD_ROAMAGENT_STATISTICS_THRESHOLD *)pos;
	cmd_len =
		(S_DS_GEN +
		 sizeof(HostCmd_DS_CMD_ROAMAGENT_STATISTICS_THRESHOLD)
		 - sizeof(statsthreshold->TlvBuffer));
	for (state = STATE_HARDROAM - 1; state < STATE_HARDROAM; state++) {
		statsthreshold->State = state + 1;
		hostcmd->command =
			cpu_to_le16(HostCmd_CMD_ROAMAGENT_STATISTICS_THRESHOLD);
		hostcmd->size = cpu_to_le16(cmd_len);
		hostcmd->seq_num = 0;
		hostcmd->result = 0;
		statsthreshold->action = cpu_to_le16(HostCmd_ACT_GEN_GET);
		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[beacon miss]");
			printf("ERR:Command sending failed!\n");
			ret = -EFAULT;
			goto done;
		}
		i = le16_to_cpu(hostcmd->size);
		i -= cmd_len;
		tlvptr = statsthreshold->TlvBuffer;
		while (i > 2) {
			pTlvHdr = (MrvlIEtypesHeader_t *)tlvptr;
			switch (le16_to_cpu(pTlvHdr->type)) {
			case TLV_TYPE_PRE_BEACON_LOST:
				pBeaconMissed =
					(MrvlIEtypes_BeaconsMissed_t *)pTlvHdr;
				bcnmiss = pBeaconMissed->beacon_missed;
			}
			tlvptr += (le16_to_cpu(pTlvHdr->len)
				   + sizeof(MrvlIEtypesHeader_t));
			i -= (le16_to_cpu(pTlvHdr->len)
			      + sizeof(MrvlIEtypesHeader_t));
		}
		printf("State: %-8s. Pre Beacon missed threshold %d\n",
		       states[state], bcnmiss);
	}
done:
	if (buffer)
		free(buffer);
	if (cmd)
		free(cmd);
	return ret;
}
static int roamGetPreBeaconMiss ( int argc , char * argv [ ] ) { int ret = MLAN_STATUS_SUCCESS ; int bcnmiss , state = STATE_HARDROAM , i ; struct ifreq ifr ; t_u8 * buffer = NULL , * pos = NULL ; t_u32 cmd_len = 0 , cmd_header_len ; struct eth_priv_cmd * cmd = NULL ; HostCmd_DS_GEN * hostcmd ; HostCmd_DS_CMD_ROAMAGENT_STATISTICS_THRESHOLD * statsthreshold ; MrvlIEtypes_BeaconsMissed_t * pBeaconMissed ; MrvlIEtypesHeader_t * pTlvHdr ; t_u8 * tlvptr ; const char * states [ ] = { " " , " " , " " , " " } ; 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 ; statsthreshold = ( HostCmd_DS_CMD_ROAMAGENT_STATISTICS_THRESHOLD * ) pos ; cmd_len = ( S_DS_GEN + sizeof ( HostCmd_DS_CMD_ROAMAGENT_STATISTICS_THRESHOLD ) - sizeof ( statsthreshold -> TlvBuffer ) ) ; for ( state = STATE_HARDROAM - 1 ; state < STATE_HARDROAM ; state ++ ) { statsthreshold -> State = state + 1 ; hostcmd -> command = cpu_to_le16 ( HostCmd_CMD_ROAMAGENT_STATISTICS_THRESHOLD ) ; hostcmd -> size = cpu_to_le16 ( cmd_len ) ; hostcmd -> seq_num = 0 ; hostcmd -> result = 0 ; statsthreshold -> action = cpu_to_le16 ( HostCmd_ACT_GEN_GET ) ; 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 ; } i = le16_to_cpu ( hostcmd -> size ) ; i -= cmd_len ; tlvptr = statsthreshold -> TlvBuffer ; while ( i > 2 ) { pTlvHdr = ( MrvlIEtypesHeader_t * ) tlvptr ; switch ( le16_to_cpu ( pTlvHdr -> type ) ) { case TLV_TYPE_PRE_BEACON_LOST : pBeaconMissed = ( MrvlIEtypes_BeaconsMissed_t * ) pTlvHdr ; bcnmiss = pBeaconMissed -> beacon_missed ; } tlvptr += ( le16_to_cpu ( pTlvHdr -> len ) + sizeof ( MrvlIEtypesHeader_t ) ) ; i -= ( le16_to_cpu ( pTlvHdr -> len ) + sizeof ( MrvlIEtypesHeader_t ) ) ; } printf ( " \n " , states [ state ] , bcnmiss ) ; } done : if ( buffer ) free ( buffer ) ; if ( cmd ) free ( cmd ) ; return ret ; }
@brief          Issue getra bcnmiss command
  @param argc     number of arguments
  @param argv     A pointer to arguments array
@brief Issue getra bcnmiss command @param argc number of arguments @param argv A pointer to arguments array
/* Fill up buffer */ /* buffer = MRVL_CMD<cmd> */ /* buffer = MRVL_CMD<cmd><hostcmd_size><HostCmd_DS_GEN><CMD_DS> */ /* Point after host command header */ /* Can be extended to all states later */ /* Put buffer length */ /* Initialize the ifr structure */ /* Perform ioctl */