Ejemplo n.º 1
0
void RemoveRemoteAPFw(UINT8 *apMacAddr_p, vmacEntry_t *clientVMacEntry_p)
{
	struct net_device *pStaDev   = (struct net_device *) clientVMacEntry_p->privInfo_p;
	struct wlprivate  *wlpptrSta = NETDEV_PRIV_P(struct wlprivate, pStaDev);
	extStaDb_StaInfo_t *StaInfo_p = NULL;

	if (!clientVMacEntry_p->active)
		wlFwRemoveMacAddr(pStaDev, &clientVMacEntry_p->vmacAddr[0]);			

	if ((StaInfo_p = extStaDb_GetStaInfo(wlpptrSta->vmacSta_p,(IEEEtypes_MacAddr_t *)apMacAddr_p, 1)) != NULL)
	{
		extStaDb_DelSta(wlpptrSta->vmacSta_p,(IEEEtypes_MacAddr_t *)apMacAddr_p, 0);
		wlFwSetNewStn(wlpptrSta->master,(u_int8_t *)apMacAddr_p, StaInfo_p->Aid, StaInfo_p->StnId, 2, NULL, 0, 0);
	}

	return;
}
Ejemplo n.º 2
0
void DeleteClientInfo(UINT8 *macAddr_p, vmacEntry_t *clientVMacEntry_p)
{
	struct net_device *pStaDev   = (struct net_device *) clientVMacEntry_p->privInfo_p;
	struct wlprivate  *wlpptrSta = NETDEV_PRIV_P(struct wlprivate, pStaDev);    
	extStaDb_StaInfo_t *StaInfo_p = NULL;


	if ((StaInfo_p = extStaDb_GetStaInfo(wlpptrSta->vmacSta_p,(IEEEtypes_MacAddr_t *)macAddr_p, 1)) != NULL)
	{
		FreeAid(StaInfo_p->Aid);
		ResetAid(StaInfo_p->StnId, StaInfo_p->Aid);
		FreeStnId(StaInfo_p->StnId);
		extStaDb_DelSta(wlpptrSta->vmacSta_p,(IEEEtypes_MacAddr_t *)macAddr_p, 0);
		wlFwSetNewStn(wlpptrSta->master,(u_int8_t *)macAddr_p, StaInfo_p->Aid, StaInfo_p->StnId, 2, NULL,0, 0);
		//only remove local address, when there is a BSSID entry.
		extStaDb_DelSta(wlpptrSta->vmacSta_p,(IEEEtypes_MacAddr_t *)clientVMacEntry_p->vmacAddr, 0);
	}
}
Ejemplo n.º 3
0
extern extStaDb_StaInfo_t *macMgtStaDbInit(vmacApInfo_t *vmacSta_p,IEEEtypes_MacAddr_t *staMacAddr, IEEEtypes_MacAddr_t *apMacAddr)
{
    MIB_802DOT11 *mib=vmacSta_p->Mib802dot11;
    extStaDb_StaInfo_t StaInfo;
    extStaDb_StaInfo_t *StaInfo_p = NULL;
    struct wlprivate *wlpptr = NETDEV_PRIV_P(struct wlprivate, vmacSta_p->dev);
    PeerInfo_t PeerInfo;

#ifdef DEBUG_PRINT
    printf("macMgtStaDbInit:: entered\n");
#endif
    WLDBG_ENTER(DBG_LEVEL_11);

    /* Station not in Stn table, hence add */
    memcpy(&StaInfo.Addr, staMacAddr, sizeof(IEEEtypes_MacAddr_t));
    memcpy(&StaInfo.Bssid, apMacAddr, sizeof(IEEEtypes_MacAddr_t));

    StaInfo.State = UNAUTHENTICATED;
    StaInfo.PwrMode = PWR_MODE_ACTIVE;
    StaInfo.StnId = AssignStnId();
    StaInfo.Aid = 0;
    StaInfo.AP = FALSE;
#ifdef WDS_FEATURE
    StaInfo.wdsInfo = NULL;
    StaInfo.wdsPortInfo = NULL;
#endif
#ifdef CLIENT_SUPPORT
    StaInfo.Client = FALSE;
#endif
#ifdef APCFGUR
    StaInfo.UR = 0;
#endif
#ifdef STA_INFO_DB
    StaInfo.Sq1 = 0;
    StaInfo.Sq2 = 0;
    StaInfo.RSSI= 0;
    StaInfo.Rate= 0;
#endif
    StaInfo.ClientMode = 0;
    StaInfo.mib_p= mib;
    StaInfo.dev = vmacSta_p->dev;
    if(*(mib->mib_ApMode)==AP_MODE_AandG)
    {
        if(memcmp(apMacAddr,vmacSta_p->macBssId,sizeof(IEEEtypes_MacAddr_t)))
        {
            StaInfo.ApMode=MIXED_MODE;
        }
        else
        {
            StaInfo.ApMode=AONLY_MODE;
        }
    }
#ifdef AP_URPTR
    if (!mib_wbMode)
#endif
    {
        if (extStaDb_AddSta(vmacSta_p,&StaInfo) != ADD_SUCCESS)
        {
            return NULL;
        }

#ifdef NEW_OSIF_POWERSAVE
        psProcessNewStn(staMacAddr, StaInfo.StnId);
#else
        NotifyNewStn(staMacAddr, StaInfo.StnId);
#endif

        if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,staMacAddr, 1)) == NULL)
        {
            return NULL;
        }
        setStaPeerInfoApMode(wlpptr, StaInfo_p, &PeerInfo, *(wlpptr->vmacSta_p->Mib802dot11->mib_ApMode), NULL);
        StaInfo_p->FwStaPtr = wlFwSetNewStn(vmacSta_p->dev, (u_int8_t *)staMacAddr, StaInfo_p->Aid, StaInfo_p->StnId, 0, &PeerInfo,0,0);  //add new station
        wlFwSetSecurity(vmacSta_p->dev,( u_int8_t *)staMacAddr);
        /* Init the state machines */
        /* Init Auth Request Srv SM */
        AuthReqSrvApCtor((AuthReqSrvAp *)&StaInfo_p->mgtAuthReq);
        mhsm_initialize(&StaInfo_p->mgtAuthReq.super,&StaInfo_p->mgtAuthReq.sTop);

        /* Init Auth Response Srv SM */
        AuthRspSrvApCtor((AuthRspSrvAp *)&StaInfo_p->mgtAuthRsp);
        mhsm_initialize(&StaInfo_p->mgtAuthRsp.super,&StaInfo_p->mgtAuthRsp.sTop);

        /* Init Association Srv SM */
        AssocSrvApCtor((AssocSrvAp *)&StaInfo_p->mgtAssoc);
        mhsm_initialize(&StaInfo_p->mgtAssoc.super,&StaInfo_p->mgtAssoc.sTop);


#ifdef APCFGUR
        /* Init remote control Srv SM */
        RemoteCtrlSrvCtor(&StaInfo_p->rmSrv);
        mhsm_initialize(&StaInfo_p->rmSrv.super,&StaInfo_p->rmSrv.sTop);
        StaInfo_p->rmSrv.userdata_p = (unsigned char *)StaInfo_p;
#endif
    }
    StaInfo_p->mgtAssoc.userdata_p = (unsigned char *)StaInfo_p;
    StaInfo_p->mgtAuthReq.userdata_p = (unsigned char *)StaInfo_p;
    StaInfo_p->mgtAuthRsp.userdata_p = (unsigned char *)StaInfo_p;
    WLDBG_EXIT(DBG_LEVEL_11);

    return StaInfo_p;
}
Ejemplo n.º 4
0
/*************************************************************************
* Function:
*
* Description:
*
* Input:
*
* Output:
*
**************************************************************************/
extern SINT8 evtSmeCmdMsg(vmacApInfo_t *vmacSta_p,UINT8 *message)
{
    MhsmEvent_t smMsg;
    macmgmtQ_SmeCmd_t * smeCmd_p;
    extStaDb_StaInfo_t *StaInfo_p;

    WLDBG_ENTER(DBG_CLASS_INFO);
    if (message == NULL)
    {
        return 1;
    }
#ifdef AP_MAC_LINUX
    smMsg.devinfo = (void *) vmacSta_p;
#endif
    smeCmd_p = (macmgmtQ_SmeCmd_t *)message;
    switch (smeCmd_p->CmdType)
    {

    case SME_CMD_DISASSOCIATE:
    {
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_DISASSOCIATE message received. \n");
        if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,&smeCmd_p->Body.AssocCmd.PeerStaAddr, 1)) == NULL)
        {
            return 1;
        }
        smMsg.event = MlmeDisAssoc_Req;
        smMsg.pBody = (UINT8 *)&(smeCmd_p->Body.AssocCmd);
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAssoc.super, &smMsg);
    }
    break;

    case SME_CMD_START:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_START message received. \n");
        syncMsg.opMode = infrastructure;
        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.StartCmd);
        smMsg.event = MlmeStart_Req;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;

    case SME_CMD_RESET:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_RESET message received. \n");
        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.ResetCmd);
        smMsg.event = ResetMAC;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;

#if defined(AP_SITE_SURVEY) || defined(AUTOCHANNEL)
    case SME_CMD_SCAN:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_SCAN message received. \n");
        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.ScanCmd);
        smMsg.event = MlmeScan_Req;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;
#endif /* AP_SITE_SURVEY */

#ifdef IEEE80211H
    case SME_CMD_MREQUEST:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_MREQUEST message received. \n");
        if (!IS_BROADCAST(&smeCmd_p->Body.MrequestCmd.PeerStaAddr))
        {
            if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,&smeCmd_p->Body.MrequestCmd.PeerStaAddr, 1)) == NULL)
            {
                WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_MREQUEST - no station found %x:%x:%x:%x:%x:%x] \n",
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[0],
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[1],
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[2],
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[3],
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[4],
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[5]);
                return 1;
            }
        }
        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.MrequestCmd);
        smMsg.event = MlmeMrequest_Req;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;

    case SME_CMD_MREPORT:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_MREPORT message received. \n");

        if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,&smeCmd_p->Body.MrequestCmd.PeerStaAddr, 1)) == NULL)
        {
            WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_MREPORT - no station found %x:%x:%x:%x:%x:%x] \n",
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[0],
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[1],
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[2],
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[3],
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[4],
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[5]);

            return 1;
        }

        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.MreportCmd);
        smMsg.event = MlmeMreport_Req;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;

    case SMC_CMD_CHANNELSWITCH_REQ:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SMC_CMD_CHANNELSWITCH_REQ message received. \n");
        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.ChannelSwitchCmd);
        smMsg.event = MlmeChannelSwitch_Req;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;
#endif /* IEEE80211H */
    default:
        break;
    }
    WLDBG_EXIT(DBG_CLASS_INFO);
    return 0;
}
Ejemplo n.º 5
0
extern SINT8 evtDot11MgtMsg(vmacApInfo_t *vmacSta_p,UINT8 *message, struct sk_buff *skb)
#endif
{
    MIB_AUTH_ALG  *mib_AuthAlg_p=vmacSta_p->Mib802dot11->AuthAlg;
    MhsmEvent_t smMsg;
    macmgmtQ_MgmtMsg3_t *MgmtMsg_p;
    extStaDb_StaInfo_t *StaInfo_p;

    if (message == NULL)
    {
        return 1;
    }
    WLDBG_ENTER(DBG_LEVEL_11);
    MgmtMsg_p = (macmgmtQ_MgmtMsg3_t *)message;

#ifdef FILTER_BSSID
    if ( ( memcmp(MgmtMsg_p->Hdr.DestAddr, vmacSta_p->macStaAddr,sizeof(IEEEtypes_MacAddr_t)) ||
            memcmp(MgmtMsg_p->Hdr.BssId, vmacSta_p->macBssId,sizeof(IEEEtypes_MacAddr_t)) )
            && ( MgmtMsg_p->Hdr.FrmCtl.Subtype != IEEE_MSG_PROBE_RQST ) )
#else
    if (memcmp(MgmtMsg_p->Hdr.DestAddr, vmacSta_p->macStaAddr,sizeof(IEEEtypes_MacAddr_t)) &&
            memcmp(MgmtMsg_p->Hdr.DestAddr, vmacSta_p->macStaAddr2,sizeof(IEEEtypes_MacAddr_t)) &&
            (MgmtMsg_p->Hdr.FrmCtl.Subtype != IEEE_MSG_PROBE_RQST) )
#endif
    {
        WLDBG_ENTER_INFO(DBG_LEVEL_11,"mgt frame %d rxved %2x-%2x-%2x-%2x-%2x-%2x\n",MgmtMsg_p->Hdr.FrmCtl.Subtype,
                         MgmtMsg_p->Hdr.DestAddr[0],
                         MgmtMsg_p->Hdr.DestAddr[1],
                         MgmtMsg_p->Hdr.DestAddr[2],
                         MgmtMsg_p->Hdr.DestAddr[3],
                         MgmtMsg_p->Hdr.DestAddr[4],
                         MgmtMsg_p->Hdr.DestAddr[5]);
        return 1;
    }
    if (isMacAccessList(vmacSta_p, &(MgmtMsg_p->Hdr.SrcAddr)) != SUCCESS)
    {
        return 1;
    }
    if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,&MgmtMsg_p->Hdr.SrcAddr,  0)) == NULL)
    {
        if(MgmtMsg_p->Hdr.FrmCtl.Subtype == IEEE_MSG_AUTHENTICATE)
        {
            //added call to check other VAP's StaInfo_p
            if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,&MgmtMsg_p->Hdr.SrcAddr,  2)))
            {
                macMgmtRemoveSta(vmacSta_p, StaInfo_p);
            }
            if ((StaInfo_p = macMgtStaDbInit(vmacSta_p,&MgmtMsg_p->Hdr.SrcAddr,&MgmtMsg_p->Hdr.DestAddr)) == NULL)
            {
                WLDBG_ENTER_INFO(DBG_LEVEL_11,"init data base fail\n");
                return 1;
            }
        }
        else if ((MgmtMsg_p->Hdr.FrmCtl.Subtype != IEEE_MSG_PROBE_RQST))
        {
            if ((MgmtMsg_p->Hdr.FrmCtl.Subtype != IEEE_MSG_DEAUTHENTICATE) &&
                    (MgmtMsg_p->Hdr.FrmCtl.Subtype !=  IEEE_MSG_PROBE_RSP) )

            {

                macMgmtMlme_SendDeauthenticateMsg(vmacSta_p,&MgmtMsg_p->Hdr.SrcAddr,
                                                  0,
                                                  IEEEtypes_REASON_CLASS2_NONAUTH);

            }
            return 1;
        }
    }
#ifdef AP_MAC_LINUX
    smMsg.devinfo = (void *) vmacSta_p;
#endif

    switch (MgmtMsg_p->Hdr.FrmCtl.Subtype)
    {
    case IEEE_MSG_AUTHENTICATE:
    {
        AuthRspSrvApMsg authRspMsg;
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_AUTHENTICATE message received. \n");
        memcpy(authRspMsg.rspMac, MgmtMsg_p->Hdr.SrcAddr, 6);
        authRspMsg.arAlg_in = MgmtMsg_p->Body.Auth.AuthAlg;
        {
            if (mib_AuthAlg_p->Type == AUTH_OPEN_OR_SHARED_KEY)
            {
                authRspMsg.arAlg = authRspMsg.arAlg_in;
            }
            else
            {
                authRspMsg.arAlg = mib_AuthAlg_p->Type;
            }
        }
        authRspMsg.mgtMsg = (UINT8 *)MgmtMsg_p;
        smMsg.event = AuthOdd;
        smMsg.pBody = (unsigned char *)&authRspMsg;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAuthRsp.super, &smMsg);
    }
    break;

    case IEEE_MSG_ASSOCIATE_RQST:
    {
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_ASSOCIATE_RQST message received. \n");
        smMsg.event = AssocReq;
        smMsg.pBody = (unsigned char *)MgmtMsg_p;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAssoc.super,&smMsg);
    }
    break;

    case IEEE_MSG_REASSOCIATE_RQST:
    {
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_REASSOCIATE_RQST message received. \n");
        smMsg.event = ReAssocReq;
        smMsg.pBody = (unsigned char *)MgmtMsg_p;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAssoc.super, &smMsg);
    }
    break;

    case IEEE_MSG_DISASSOCIATE:
    {
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_DISASSOCIATE message received. \n");
        smMsg.event = DisAssoc;
        smMsg.pBody = (unsigned char *)MgmtMsg_p;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAssoc.super, &smMsg);
    }
    break;

    case IEEE_MSG_DEAUTHENTICATE:
    {
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_DEAUTHENTICATE message received. \n");
        smMsg.event = DeAuth;
        smMsg.pBody = (unsigned char *)MgmtMsg_p;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAuthRsp.super, &smMsg);
    }
    break;

    /* Could be handled by HW */
    case IEEE_MSG_PROBE_RQST:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_PROBE_RQST message received. \n");
        syncMsg.opMode = infrastructure;
        syncMsg.mgtMsg = (UINT8 *)MgmtMsg_p;
        smMsg.event = ProbeReq;
        smMsg.pBody = (unsigned char *)&syncMsg;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;

#if defined(QOS_FEATURE)||defined(IEEE80211H)
    case IEEE_MSG_QOS_ACTION:
    {
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_QOS_ACTION message received. \n");

        if(MgmtMsg_p->Body.Action.Category == HT_CATEGORY)
        {
            switch (MgmtMsg_p->Body.Action.Action)
            {
            case ACTION_SMPS:
            {
                extern int wlFwSetMimoPsHt(struct net_device *netdev, UINT8 *addr, UINT8 enable, UINT8 mode);
                IEEEtypes_SM_PwrCtl_t *p =  (IEEEtypes_SM_PwrCtl_t *)&MgmtMsg_p->Body.Act.Field.SmPwrCtl;
                WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_QOS_ACTION MIMO PS HT message received. \n");
                wlFwSetMimoPsHt(vmacSta_p->dev, (UINT8 *)MgmtMsg_p->Hdr.SrcAddr, p->Enable, p->Mode);
                break;
            }
#ifdef INTOLERANT40
            case ACTION_INFOEXCH:
            {
                extern void RecHTIntolerant(vmacApInfo_t *vmacSta_p,UINT8 enable);
                IEEEtypes_InfoExch_t *p =  (IEEEtypes_InfoExch_t *)&MgmtMsg_p->Body.Act.Field.InfoExch;
                WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_QOS_ACTION Info Exch HT message received. \n");

                RecHTIntolerant(vmacSta_p,p->FortyMIntolerant);
                break;
            }
#endif //#ifdef INTOLERANT40
            default:
                break;
            }
            break;
        }
#ifdef IEEE80211H
        if(TRUE == macMgmtMlme_80211hAct(vmacSta_p,(macmgmtQ_MgmtMsg3_t *) MgmtMsg_p)) /* if it's mine frame, then return true */
            break;
#endif /* IEEE80211H */
#ifdef COEXIST_20_40_SUPPORT
        if(TRUE == macMgmtMlme_80211PublicAction(vmacSta_p,(macmgmtQ_MgmtMsg3_t *) MgmtMsg_p)) /* if it's mine frame, then return true */
            break;
#endif
#ifdef QOS_FEATURE
        /*smMsg.event = QoSAction;
        smMsg.pBody = MgmtMsg_p;
        mhsm_send_event((Mhsm_t *)&wlpptr->vmacSta_p->mgtSync.super, &smMsg);*/
        macMgmtMlme_QoSAct(vmacSta_p,(macmgmtQ_MgmtMsg3_t *) MgmtMsg_p);
        break;
#endif /* QOS_FEATURE */
    }
#endif
    default:
        break;
    }
    WLDBG_EXIT(DBG_LEVEL_11);

    return 0;
}
Ejemplo n.º 6
0
int ieee80211_ioctl_autelan_traffic_limit(struct net_device *dev, char *param_str, char *ret_str)
{
    int ret = 0;
    struct wlprivate *priv = NETDEV_PRIV_P(struct wlprivate, dev);
    struct ieee80211vap *vap = &(priv->vap); 
    vmacApInfo_t *vmacSta_p = priv->vmacSta_p;
    extStaDb_StaInfo_t *ni = NULL;
    unsigned int rate = 0;
    struct ieee80211_autelan_traffic_limit ik;

    memset(&ik, 0x00, sizeof(ik));
    memcpy(&ik, param_str, sizeof(ik)); //sizeof(ik)!! dont use param_len

    switch (ik.type) {
        case SET_VAP_TRAFFIC_LIMIT_FLAG:
            //vap->vap_traffic_limit = ik.arg1;
            vap->iv_tl.traffic_limit_flag = ik.arg1;
            break;
        case GET_VAP_TRAFFIC_LIMIT_FLAG:
            ret = copy_to_user(ret_str, &(vap->iv_tl.traffic_limit_flag), sizeof(vap->iv_tl.traffic_limit_flag));
            break;
        case SET_VAP_TRAFFIC_LIMIT:
            //vap->vap_packet_max_number = ik.arg1 * 1024 / 8;
            vap->iv_tl.rx_traffic_limit = ik.arg1;
            if(ik.arg1)
                vap->iv_tl.rx_rate_in_us_per_byte = (1024 * (CAR_SCALE_FACTOR * 8))/(vap->iv_tl.rx_traffic_limit);
            break;
        case GET_VAP_TRAFFIC_LIMIT :
            //rate = (vap->vap_packet_max_number) * 8 / 1024;
            rate = vap->iv_tl.rx_traffic_limit;
            ret = copy_to_user(ret_str, &rate, sizeof(rate));
            break;
        case SET_VAP_TRAFFIC_LIMIT_SEND:
            //vap->vap_packet_max_number_send = ik.arg1 * 1024 / 8;         
            vap->iv_tl.tx_traffic_limit = ik.arg1;
            if(ik.arg1)
                vap->iv_tl.tx_rate_in_us_per_byte = (1024* (CAR_SCALE_FACTOR * 8))/(vap->iv_tl.tx_traffic_limit);
            break;
        case GET_VAP_TRAFFIC_LIMIT_SEND:
            rate = (vap->iv_tl.tx_traffic_limit);
            ret = copy_to_user(ret_str, &rate, sizeof(rate));
            break;

        case SET_SPECIFIC_NODE_TRAFFIC_LIMIT_FLAG:
            ni = extStaDb_GetStaInfo(vmacSta_p, (IEEEtypes_MacAddr_t *)ik.macaddr, 1);
            if (ni == NULL)
            {
                printk("%s ni is null.\n",__func__);
                return -EINVAL;
            }
            ni->ni_special_tl.traffic_limit_flag = ik.arg1;
            //printk("%s ni->ni_special_tl.traffic_limit_flag = %d\n",__func__,ni->ni_special_tl.traffic_limit_flag);
            break;

        case  GET_SPECIFIC_NODE_TRAFFIC_LIMIT_FLAG:
            ni = extStaDb_GetStaInfo(vmacSta_p, (IEEEtypes_MacAddr_t *)ik.macaddr, 1);
            if (ni == NULL)
            {
                printk("%s ni is null.\n",__func__);
                return -EINVAL; 
            }
            ret = copy_to_user(ret_str, &(ni->ni_special_tl.traffic_limit_flag), sizeof(ni->ni_special_tl.traffic_limit_flag));
            break;

        case SET_NODE_TRAFFIC_LIMIT:
            ni = extStaDb_GetStaInfo(vmacSta_p, (IEEEtypes_MacAddr_t *)ik.macaddr, 1);
            if (ni == NULL)
                return -EINVAL; 
            //ni->ni_packet_max_number = ik.arg1 * 1024 / 8;
            ni->ni_special_tl.rx_traffic_limit = ik.arg1;
            if(ik.arg1)
                ni->ni_special_tl.rx_rate_in_us_per_byte = (1024* (CAR_SCALE_FACTOR * 8))/(ni->ni_special_tl.rx_traffic_limit);
            break;

        case GET_NODE_TRAFFIC_LIMIT :
            ni = extStaDb_GetStaInfo(vmacSta_p, (IEEEtypes_MacAddr_t *)ik.macaddr, 1);
            if (ni == NULL)
                return -EINVAL; 
            //rate = (ni->ni_packet_max_number) * 8 /1024;
            rate = ni->ni_special_tl.rx_traffic_limit;
            ret = copy_to_user(ret_str, &rate, sizeof(rate));
            break;
            
        case SET_NODE_TRAFFIC_LIMIT_SEND:
            ni = extStaDb_GetStaInfo(vmacSta_p, (IEEEtypes_MacAddr_t *)ik.macaddr, 1);
            if (ni == NULL)
                return -EINVAL; 
            //ni->ni_packet_max_number_send = ik.arg1 * 1024 / 8;
            ni->ni_special_tl.tx_traffic_limit = ik.arg1;
            if(ik.arg1)
                ni->ni_special_tl.tx_rate_in_us_per_byte = (1024* (CAR_SCALE_FACTOR * 8))/(ni->ni_special_tl.tx_traffic_limit);
            break;

        case GET_NODE_TRAFFIC_LIMIT_SEND:
            ni = extStaDb_GetStaInfo(vmacSta_p, (IEEEtypes_MacAddr_t *)ik.macaddr, 1);
            if (ni == NULL)
                return -EINVAL; 
            //rate = (ni->ni_packet_max_number_send) * 8 / 1024;
            rate = ni->ni_special_tl.tx_traffic_limit;
            ret = copy_to_user(ret_str, &rate, sizeof(rate));
            break;

        case SET_EVERY_NODE_TRAFFIC_LIMIT:
            //vap->every_node_packet_max_number = ik.arg1 * 1024 / 8;
            vap->iv_everynode_tl.rx_traffic_limit = ik.arg1;
            if(ik.arg1)
                vap->iv_everynode_tl.rx_rate_in_us_per_byte = (1024 * (CAR_SCALE_FACTOR * 8))/(vap->iv_everynode_tl.rx_traffic_limit);
            //printk("%s rx_traffic_limit = %d rx_rate_in_us_per_byte = %d\n",__func__,vap->iv_everynode_tl.rx_traffic_limit,vap->iv_everynode_tl.rx_rate_in_us_per_byte);
            break;

        case GET_EVERY_NODE_TRAFFIC_LIMIT :
            //rate = (vap->every_node_packet_max_number) * 8 / 1024;
            rate = vap->iv_everynode_tl.rx_traffic_limit;
            ret = copy_to_user(ret_str, &rate, sizeof(rate));
            au_pkt = 0;
            drop_pkt = 0;
            break;

        case SET_EVERY_NODE_TRAFFIC_LIMIT_FLAG:
            //vap->every_node_traffic_limit = ik.arg1;
            vap->iv_everynode_tl.traffic_limit_flag = ik.arg1;
            break;

        case GET_EVERY_NODE_TRAFFIC_LIMIT_FLAG:
            ret = copy_to_user(ret_str, &(vap->iv_everynode_tl.traffic_limit_flag), sizeof(vap->iv_everynode_tl.traffic_limit_flag));
            #if 0
            {
                int i = 0;
                for(i = 0;i < 3 ;i++)
                {
                    printk("<<%d>> gpkt = %d drop_pkt = %d last_sec = %d last_usec = %d cur_sec = %d cur_usec = %d us_elapsed = %d us_reqd = %d rx_reqd = %d\n",i,g_pkt[i],drop[i],ls_s[i],ls_us[i],cur_s[i],cur_us[i],elapsed[i],reqd[i],rx_reqd[0]);      
                }
            }
            #endif          
            break;

        case SET_EVERY_NODE_TRAFFIC_LIMIT_SEND:
            //vap->every_node_packet_max_number_send = ik.arg1 * 1024 / 8;
            vap->iv_everynode_tl.tx_traffic_limit = ik.arg1;
            if(ik.arg1)
                vap->iv_everynode_tl.tx_rate_in_us_per_byte = (1024* (CAR_SCALE_FACTOR * 8))/(vap->iv_everynode_tl.tx_traffic_limit);
            //printk("%s tx_traffic_limit = %d tx_rate_in_us_per_byte = %d \n",__func__,vap->iv_everynode_tl.tx_traffic_limit,vap->iv_everynode_tl.tx_rate_in_us_per_byte);
            //printk("((1024*1024) * (CAR_SCALE_FACTOR * 8)) = %d (vap->iv_tl.tx_traffic_limit * 1024) = %d\n",((1024*1024) * (CAR_SCALE_FACTOR * 8)),(vap->iv_everynode_tl.tx_traffic_limit * 1024));
            break;

        case GET_EVERY_NODE_TRAFFIC_LIMIT_SEND:
            //rate = (vap->every_node_packet_max_number_send) * 8 / 1024;
            rate = vap->iv_everynode_tl.tx_traffic_limit;
            ret = copy_to_user(ret_str, &rate, sizeof(rate));
            //printk("pkt = %d drop_pkt = %d\n",au_pkt,drop_pkt);
            break;
        /*ljy--add end*/

        default :
            return -EFAULT;
    }
    switch (ik.type) {
        case SET_EVERY_NODE_TRAFFIC_LIMIT_FLAG:
        case SET_EVERY_NODE_TRAFFIC_LIMIT:
        case SET_EVERY_NODE_TRAFFIC_LIMIT_SEND: 
            {   
                extStaDb_StaInfo_t *pStaInfo;
                UCHAR *sta_buf, *show_buf;
                int i, entries;
                entries = extStaDb_entries(vmacSta_p,0);
                sta_buf = kmalloc(entries *64,GFP_KERNEL);
                if (sta_buf == NULL) 
                {
                    break; 
                }
                extStaDb_list(vmacSta_p,sta_buf, 1);
                show_buf = sta_buf;
                
                for(i=0; i<entries; i++)
                {
                    if ( (pStaInfo = extStaDb_GetStaInfo(vmacSta_p,(IEEEtypes_MacAddr_t *)show_buf, 0)) == NULL )
                    {
                        break;
                    }
                
                    pStaInfo->ni_everynode_tl.traffic_limit_flag = vap->iv_everynode_tl.traffic_limit_flag;
                    pStaInfo->ni_everynode_tl.tx_traffic_limit = vap->iv_everynode_tl.tx_traffic_limit;
                    pStaInfo->ni_everynode_tl.tx_rate_in_us_per_byte = vap->iv_everynode_tl.tx_rate_in_us_per_byte;
                    pStaInfo->ni_everynode_tl.rx_traffic_limit = vap->iv_everynode_tl.rx_traffic_limit;
                    pStaInfo->ni_everynode_tl.rx_rate_in_us_per_byte = vap->iv_everynode_tl.rx_rate_in_us_per_byte;

                    show_buf += sizeof(STA_INFO);
                }
                kfree(sta_buf);
            }
            break;
        default:
            return 0;
    }
    return ret;
}
Ejemplo n.º 7
0
void InitClientInfo(UINT8 *macAddr_p, dot11MgtFrame_t *MgmtMsg_p, vmacEntry_t *clientVMacEntry_p, BOOLEAN isApMrvl)
{

	struct net_device *pStaDev   = (struct net_device *) clientVMacEntry_p->privInfo_p;
	struct wlprivate  *wlpptrSta = NETDEV_PRIV_P(struct wlprivate, pStaDev);
	vmacApInfo_t *vmacSta_p = wlpptrSta->vmacSta_p;
	MIB_802DOT11 *mib = vmacSta_p->Mib802dot11;
	extStaDb_StaInfo_t StaInfo;
	extStaDb_StaInfo_t *StaInfo_p = NULL;
	extStaDb_StaInfo_t StaInfoRmAp;
	extStaDb_StaInfo_t *StaInfoRmAp_p = NULL;
#ifdef V6FW
	extStaDb_StaInfo_t StaInfoClient;
	extStaDb_StaInfo_t *StaInfoClient_p = NULL;
#endif 
	PeerInfo_t *pPeerInfo = NULL;
	//UINT32 Aid, StnId;
	UINT8 QosInfo = 0;
	UINT8 i = 0;
	STA_SECURITY_MIBS * pStaSecurityMibs = NULL;
	memset(&StaInfo, 0, sizeof(extStaDb_StaInfo_t));

	if (!initParentAp)
	{
		parentApAid   = AssignAid();
		parentApStnId = AssignStnId();
		initParentAp  = 1;
#ifdef V6FW
		ClientAid = AssignAid();
		ClientStnId = AssignStnId(); 
#endif
	}

	memset(&StaInfoRmAp, 0, sizeof(extStaDb_StaInfo_t));
	if ((StaInfoRmAp_p = extStaDb_GetStaInfo(wlpptrSta->vmacSta_p,(IEEEtypes_MacAddr_t *)macAddr_p, 1)) == NULL)
	{        
		memcpy(&StaInfoRmAp.Addr, macAddr_p, sizeof(IEEEtypes_MacAddr_t));
		StaInfoRmAp.StnId = parentApStnId;
		StaInfoRmAp.Aid = parentApAid;
		StaInfoRmAp.AP = FALSE;
		StaInfoRmAp.Client = TRUE;
		StaInfoRmAp.mib_p = wlpptrSta->vmacSta_p->Mib802dot11;
		StaInfoRmAp.dev = pStaDev;
		extStaDb_AddSta(wlpptrSta->vmacSta_p, &StaInfoRmAp);
		if ((StaInfoRmAp_p = extStaDb_GetStaInfo(wlpptrSta->vmacSta_p,(IEEEtypes_MacAddr_t *)macAddr_p, 1)) == NULL)
		{
			printk("InitClientInfo: ERROR - cannot add host Client Remote AP to station database. \n");
			return;
		}
	}
	StaInfo_p = StaInfoRmAp_p;

#ifdef V6FW
	memset(&StaInfoClient, 0, sizeof(extStaDb_StaInfo_t));
	if ((StaInfoClient_p = extStaDb_GetStaInfo(wlpptrSta->vmacSta_p,(IEEEtypes_MacAddr_t *)MgmtMsg_p->Hdr.DestAddr, 1)) == NULL)
	{        
		memcpy(&StaInfoClient.Addr, MgmtMsg_p->Hdr.DestAddr, sizeof(IEEEtypes_MacAddr_t));
		StaInfoClient.StnId = ClientStnId;
		StaInfoClient.Aid = ClientAid;
		StaInfoClient.AP = FALSE;
		StaInfoClient.Client = TRUE;
		StaInfoClient.mib_p = wlpptrSta->vmacSta_p->Mib802dot11;
		StaInfoClient.dev = pStaDev;
		extStaDb_AddSta(wlpptrSta->vmacSta_p, &StaInfoClient);
		if ((StaInfoClient_p = extStaDb_GetStaInfo(wlpptrSta->vmacSta_p,(IEEEtypes_MacAddr_t *)MgmtMsg_p->Hdr.DestAddr, 1)) == NULL)
		{
			printk("InitClientInfo: ERROR - Cannot add Host Client MAC to station database. \n");
			return;
		}
	}
#endif
	// Set the Peer info.
	pPeerInfo = sme_GetClientPeerInfo(clientVMacEntry_p);
	memset(pPeerInfo, 0, sizeof(PeerInfo_t));
	setClientPeerInfo(clientVMacEntry_p, MgmtMsg_p, pPeerInfo, StaInfo_p, &QosInfo, mib);
#ifdef V6FW
	setClientPeerInfo(clientVMacEntry_p, MgmtMsg_p, pPeerInfo, StaInfoClient_p, &QosInfo, mib);
#endif

#ifdef AMPDU_SUPPORT
	free_any_pending_ampdu_pck(pStaDev,StaInfo_p->Aid);
	for(i=0;i<3;i++)  /** Reset the ampdu reorder pck anyway **/
		wlpptrSta->wlpd_p->AmpduPckReorder[StaInfo_p->Aid].AddBaReceive[i]=FALSE;  /** clear Ba flag **/
#ifdef V6FW
	free_any_pending_ampdu_pck(pStaDev,StaInfoClient_p->Aid);
	for(i=0;i<3;i++)  /** Reset the ampdu reorder pck anyway **/
		wlpptrSta->wlpd_p->AmpduPckReorder[StaInfoClient_p->Aid].AddBaReceive[i]=FALSE;  /** clear Ba flag **/
#endif

	if (*wlpptrSta->vmacSta_p->Mib802dot11->mib_AmpduTx)
	{
		memset(&StaInfo_p->aggr11n.startbytid[0], 0, 8);
		memset(&StaInfo_p->aggr11n.onbytid[0], 0, 8);					
		StaInfo_p->aggr11n.type &= ~WL_WLAN_TYPE_AMPDU;
#ifdef V6FW
		memset(&StaInfoClient_p->aggr11n.startbytid[0], 0, 8);
		memset(&StaInfoClient_p->aggr11n.onbytid[0], 0, 8);					
		StaInfoClient_p->aggr11n.type &= ~WL_WLAN_TYPE_AMPDU;
#endif
		AddHT_IE(vmacSta_p,&StaInfo_p->HtElem);
	}
#endif

	if ((*(wlpptrSta->vmacSta_p->Mib802dot11->pMib_11nAggrMode)&WL_MODE_AMSDU_TX_MASK )== 0)
	{
		/* if AMSDU disabled locally then setup stainfo accordingly */
		StaInfo_p->aggr11n.threshold = 0;
		StaInfo_p->aggr11n.cap = 0;
#ifdef V6FW
		StaInfoClient_p->aggr11n.threshold = 0;
		StaInfoClient_p->aggr11n.cap = 0;
#endif
	}
	else if (*(wlpptrSta->vmacSta_p->Mib802dot11->pMib_11nAggrMode)& WL_MODE_AMSDU_TX_4K)
	{
		/* if AMSDU set to 4k locally then setup stainfo as per this*/
		StaInfo_p->aggr11n.cap = 1;
		if(!(*(wlpptrSta->vmacSta_p->Mib802dot11->pMib_11nAggrMode) & WL_MODE_AMPDU_TX))
		{
			StaInfo_p->aggr11n.type |= WL_WLAN_TYPE_AMSDU;
		}
#ifdef V6FW
		StaInfoClient_p->aggr11n.cap = 1;
		if(!(*(wlpptrSta->vmacSta_p->Mib802dot11->pMib_11nAggrMode) & WL_MODE_AMPDU_TX))
			StaInfoClient_p->aggr11n.type |= WL_WLAN_TYPE_AMSDU;
#endif
	}

	if (mib->Privacy->RSNEnabled && !mib->RSNConfigWPA2->WPA2OnlyEnabled)
	{            
		pStaSecurityMibs = sme_GetStaSecurityMibsPtr(clientVMacEntry_p);
		if ((pStaSecurityMibs->thisStaRsnIE_p->ElemId == 221 || pStaSecurityMibs->thisStaRsnIE_p->ElemId == 48)
			&&(pStaSecurityMibs->thisStaRsnIE_p->PwsKeyCipherList[3] == 2))
		{   
			// TKIP disable non -Marvell AP aggregation
			if(!isApMrvl)
			{
				StaInfo_p->aggr11n.threshold = 0;
				StaInfo_p->aggr11n.thresholdBackUp = StaInfo_p->aggr11n.threshold;
#ifdef V6FW
				StaInfoClient_p->aggr11n.threshold = 0;
				StaInfoClient_p->aggr11n.thresholdBackUp = StaInfo_p->aggr11n.threshold;
#endif
			}
		}
	}

	if(!isApMrvl && mib->Privacy->PrivInvoked)
	{
		StaInfo_p->aggr11n.threshold = 0;
		StaInfo_p->aggr11n.thresholdBackUp = StaInfo_p->aggr11n.threshold;
#ifdef V6FW
		StaInfoClient_p->aggr11n.threshold = 0;
		StaInfoClient_p->aggr11n.thresholdBackUp = StaInfo_p->aggr11n.threshold;
#endif
	}

	/* First remove station even if not added to station database. */
	/* Remove AP entry into FW STADB */        
	wlFwSetNewStn(wlpptrSta->master,(u_int8_t *)macAddr_p, parentApAid, parentApStnId, 2, pPeerInfo, QosInfo, StaInfo_p->IsStaQSTA);
#ifdef V6FW
	wlFwSetNewStn(wlpptrSta->master,(u_int8_t *)MgmtMsg_p->Hdr.DestAddr, ClientAid, ClientStnId, 2, pPeerInfo, QosInfo, StaInfoClient_p->IsStaQSTA);
#endif

	/* Add AP entry into FW STADB */     
	wlFwSetNewStn(wlpptrSta->master,(u_int8_t *)macAddr_p, parentApAid, parentApStnId, 0, pPeerInfo, QosInfo, StaInfo_p->IsStaQSTA);
#ifdef V6FW
	wlFwSetNewStn(wlpptrSta->master,(u_int8_t *)MgmtMsg_p->Hdr.DestAddr, ClientAid, ClientStnId, 0, pPeerInfo, QosInfo, StaInfoClient_p->IsStaQSTA);
#endif

	wlFwSetSecurity(pStaDev,macAddr_p);
#ifdef V6FW
	wlFwSetSecurity(pStaDev,(u_int8_t *)MgmtMsg_p->Hdr.DestAddr);
#endif

	return;
}	
Ejemplo n.º 8
0
extern void SmeMgmt(vmacApInfo_t *vmacSta_p,UINT32 eventsTriggered, UINT8 *msg)
{
	MIB_802DOT11 *mib=vmacSta_p->Mib802dot11;
	MIB_STA_CFG  *mib_StaCfg_p=vmacSta_p->Mib802dot11->StationConfig;
	smeQ_MgmtMsg_t *CfrmIndMsg_p;

	WLDBG_ENTER(DBG_LEVEL_11);
	{

		//eventsTriggered = os_EventWait(sysinfo_SME_MAIN_Q_EVENT,
		//                               SME_MAIN_EVENT_TRIGGERS,
		//                               OS_EVENT_WAITMODE_CLR_OR);

		/*------------------------------*/
		/* Check for an error condition */
		/*------------------------------*/
		if (eventsTriggered == 0)
		{
			return;
		}
		else
		{
			/*---------------------------------------------------*/
			/* Check for receipt of an 802.11 management message */
			/*---------------------------------------------------*/
			if (eventsTriggered & smeMain_MGMT_MSG_RCVD)
			{
				CfrmIndMsg_p = (smeQ_MgmtMsg_t *) msg;
				{
					switch (CfrmIndMsg_p->MsgType)
					{
					case SME_NOTIFY_START_CFRM:
						if (CfrmIndMsg_p->Msg.StartCfrm.Result ==
							START_RESULT_SUCCESS)
						{         
						}
						else if (CfrmIndMsg_p->Msg.StartCfrm.Result ==
							START_RESULT_BSS_ALREADY_STARTED_OR_JOINED)
						{
						}
						else if (CfrmIndMsg_p->Msg.StartCfrm.Result ==
							START_RESULT_INVALID_PARAMETERS)
						{
						}
						break;
					case SME_NOTIFY_RESET_CFRM:
						if (vmacSta_p->SmeState == SME_STATE_WAIT_FOR_RESET_CONFIRM)
						{
							SendStartCmd(vmacSta_p);
						}
						break;
#ifdef IEEE80211H
					case SME_NOTIFY_ASSOC_IND:
						{
							extStaDb_StaInfo_t *staInfo = NULL;

							/* 
							* AP is in A mode and doing spectrum management
							*/                                                            
							if (((*(mib->mib_ApMode) == AP_MODE_A_ONLY)||(*(mib->mib_ApMode)==AP_MODE_AandG)) &&
								(mib_StaCfg_p->SpectrumManagementRequired == TRUE))
							{      
#ifdef DEBUG_ENABLE
								printf("A new friend is coming\n\r");
#endif /* DEBUG_ENABLE */                                
								if((staInfo = extStaDb_GetStaInfo(vmacSta_p,&CfrmIndMsg_p->Msg.AssocInd.PeerStaAddr, 0)))
								{ 
									/* Station IS capable of doing spectrum management */
									if (staInfo->IsSpectrumMgmt == TRUE)
									{
#ifdef DEBUG_ENABLE
										printf("Ask him measure this channel on behalf me\n\r");
#endif /* DEBUG_ENABLE */                       
#ifdef IEEE80211H_NOTWIFI
										SendMREQUESTCmd(vmacSta_p,&staInfo->Addr, RfSwitchChanA);
#endif
									}
								}
								else
								{
#ifdef DEBUG_ENABLE
									printf("Oops! Dest station not found\n\r");
#endif /* DEBUG_ENABLE */
								} 
							}
						}

						break;

					case SME_NOTIFY_REASSOC_IND:
						{
							extStaDb_StaInfo_t *staInfo = NULL;

							/* 
							* AP is in A mode and doing spectrum management
							*/                                                            
							if (((*(mib->mib_ApMode) == AP_MODE_A_ONLY)||(*(mib->mib_ApMode)==AP_MODE_AandG)) &&
								(mib_StaCfg_p->SpectrumManagementRequired == TRUE))
							{      
#ifdef DEBUG_ENABLE
								printf("A new friend is coming\n\r");
#endif /* DEBUG_ENABLE */                                
								if((staInfo = extStaDb_GetStaInfo(vmacSta_p, &CfrmIndMsg_p->Msg.ReassocInd.PeerStaAddr, 0)))
								{ 
									/* Station IS capable of doing spectrum management */
									if (staInfo->IsSpectrumMgmt == TRUE)
									{
#ifdef DEBUG_ENABLE
										printf("Ask him measure this channel on behalf me\n\r");
#endif /* DEBUG_ENABLE */                                        
										SendMREQUESTCmd(vmacSta_p,&staInfo->Addr, RfSwitchChanA);
									}
								}
								else
								{
#ifdef DEBUG_ENABLE
									printf("Oops! Dest station not found\n\r");
#endif /* DEBUG_ENABLE */
								} 
							}
						}

						break;    
#ifdef MRVL_DFS
						/*Channel switch has been performed.*/
					case SME_NOTIFY_CHANNELSWITCH_CFRM:
						{
							DfsCmd_t    dfsCmd ;
							/* If channel change is successful, send the message to
							* the event dispatcher
							*/
							if(  CfrmIndMsg_p->Msg.ChanSwitchCfrm.result)
							{
								dfsCmd.CmdType = DFS_CMD_CHANNEL_CHANGE ;
								memcpy( &dfsCmd.Body.chInfo , 
									&CfrmIndMsg_p->Msg.ChanSwitchCfrm.chInfo, 
									sizeof (DfsChanInfo) );
								evtDFSMsg( vmacSta_p->dev, (UINT8 *)&dfsCmd );
							}
						}
						break;
						/*Radar has been detected.*/
					case SME_NOTIFY_RADAR_DETECTION_IND:
						{
							DfsCmd_t    dfsCmd ;
							/* Send the radar detection message to
							* the event dispatcher
							*/
							dfsCmd.CmdType = DFS_CMD_RADAR_DETECTION ;
							memcpy( &dfsCmd.Body.chInfo , 
								&CfrmIndMsg_p->Msg.RadarDetectionInd.chInfo, 
								sizeof (DfsChanInfo) );
							evtDFSMsg( vmacSta_p->dev, (UINT8 *)&dfsCmd );
						}
						break;
#endif //MRVL_DFS

					case SME_NOTIFY_MREQUEST_IND:
						smeMrequestIndProcess(vmacSta_p,&CfrmIndMsg_p->Msg.MrequestInd);
						break;

					case SME_NOTIFY_MREQUEST_CFRM:
						smeMrequestCfrmProcess(vmacSta_p,&CfrmIndMsg_p->Msg.MrequestCfrm);
						break;

					case SME_NOTIFY_MEASURE_CFRM:
						smeMeasureCfrmProcess(vmacSta_p,&CfrmIndMsg_p->Msg.MeasureCfrm);
						break;

					case SME_NOTIFY_MREPORT_IND:
						{
							extStaDb_StaInfo_t *staInfo = NULL;

							/* 
							* AP is in A mode and doing spectrum management
							*/                                                            
							if (((*(mib->mib_ApMode) == AP_MODE_A_ONLY)||(*(mib->mib_ApMode)==AP_MODE_AandG)) &&
								(mib_StaCfg_p->SpectrumManagementRequired == TRUE))
							{      
								staInfo = extStaDb_GetStaInfo(vmacSta_p,&CfrmIndMsg_p->Msg.MreportInd.PeerStaAddr, 0);
#ifdef DEBUG_ENABLE
								printf("SME_NOTIFY_MREPORT_IND\n\r");
#endif /* DEBUG_ENABLE */                                
								if(staInfo != NULL)
								{   
									/* Station IS capable of doing spectrum management */
									if (staInfo->IsSpectrumMgmt == TRUE)
									{ 
#ifdef DEBUG_ENABLE
										printf("Process incoming MLME-MREPORT.ind\n\r");
#endif /* DEBUG_ENABLE */                                        
										smeMreportIndProcess(vmacSta_p,(IEEEtypes_MacAddr_t *)&staInfo->Addr, &CfrmIndMsg_p->Msg.MreportInd);
									}
								}
								else
								{
#ifdef DEBUG_ENABLE
									printf("Oops! Dest station not found\n\r");
#endif /* DEBUG_ENABLE */
								} 
							}
						}

						break;

					case SME_NOTIFY_MREPORT_CFRM:
						smeMreportCfrmProcess(vmacSta_p,&CfrmIndMsg_p->Msg.MreportCfrm);
						break;

					case SME_NOTIFY_TPCADPT_CFRM:
						smeMTpcAdptCfrmdProcess(vmacSta_p,&CfrmIndMsg_p->Msg.TPCAdaptCfrm);
						break;

					case SMC_NOTIFY_CHANNELSWITCH_IND:
						smeChannelSwitchIndProcess(vmacSta_p,&CfrmIndMsg_p->Msg.ChannelSwitchInd);
						break;

					case SMC_NOTIFY_CHANNELSWITCH_CFRM:
						smeChannelSwitchCfrmProcess(vmacSta_p,&CfrmIndMsg_p->Msg.ChannelSwitchCfrm);
						break;
#endif /* IEEE80211H */

					default:
						break;
					}
					//pool_FreeBuf((char *)CfrmIndMsg_p);
				}
			}

			/*---------------------------------------*/
			/* Check for receipt of a error messages */
			/*---------------------------------------*/
		}
	}
	WLDBG_EXIT(DBG_LEVEL_11);
}