Beispiel #1
0
void receiveWlanMsg(struct net_device *dev, struct sk_buff *skb, UINT32 rssi, BOOLEAN stationpacket)
{
	struct wlprivate *priv = NETDEV_PRIV_P(struct wlprivate, dev);
	vmacApInfo_t *vmacSta_p = priv->vmacSta_p;
	//	MIB_802DOT11 *mib=vmacSta_p->Mib802dot11;
	//	macmgmtQ_SmeCmd_t *SmeCmd_p;
	//	struct sk_buff *mgmtBuff_p;
	IEEEtypes_Frame_t *wlanMsg_p;

	wlanMsg_p = (IEEEtypes_Frame_t *) ((UINT8 *)skb->data -2);

	wlanMsg_p->Hdr.FrmBodyLen = skb->len;

#ifdef SOC_W8764
    dispTxBf((macmgmtQ_MgmtMsg3_t *)wlanMsg_p);
#endif

	switch (wlanMsg_p->Hdr.FrmCtl.Type)
	{
	case IEEE_TYPE_DATA:
		break;
	case IEEE_TYPE_MANAGEMENT:
		{
			WLDBG_INFO(DBG_LEVEL_11, "IEEE_TYPE_MANAGEMENT message received. \n");
			switch (wlanMsg_p->Hdr.FrmCtl.Subtype)
			{
			case 0xf:	//fw debug type
				printk("FW: %s\n", (UINT8 *)((UINT32)wlanMsg_p+6));
				/*WLDBG_INFO(DBG_LEVEL_11,"%s\n", (UINT8 *)((UINT32)wlanMsg_p+2+sizeof(IEEEtypes_MgmtHdr2_t)));*/
				break;
#ifndef INTEROP
			case IEEE_MSG_QOS_ACTION:

				WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_QOS_ACTION message received. \n");
				break;
#endif
			case IEEE_MSG_PROBE_RQST:
				macMgmtMlme_ProbeRqst(vmacSta_p,(macmgmtQ_MgmtMsg3_t *)wlanMsg_p);
				break;
#ifdef CLIENT_SUPPORT
				/* Intercept beacon here for AP.
				* Client beacon will be handled later.
				*/
			case IEEE_MSG_BEACON:
				RxBeacon(vmacSta_p,wlanMsg_p, skb->len);
#endif //CLIENT_SUPPORT
			default:
				/* 802.11 Management frame::feed MLME State Machines */
#ifdef CLIENT_SUPPORT
				{
#define SK_BUF_RESERVED_PAD     6
					if(stationpacket)
					{
						vmacEntry_t *targetVMacEntry_p = NULL;
						IEEEtypes_MgmtHdr_t *Hdr_p;
						if( (wlanMsg_p->Hdr.FrmCtl.Subtype == IEEE_MSG_BEACON )
                            	|| (wlanMsg_p->Hdr.FrmCtl.Subtype == IEEE_MSG_QOS_ACTION ))						
{
							targetVMacEntry_p = sme_GetParentVMacEntry(vmacSta_p->VMacEntry.phyHwMacIndx) ;
						}
						else
						{
							targetVMacEntry_p = vmacGetVMacEntryByAddr((UINT8 *)&wlanMsg_p->Hdr.Addr1) ;
						}
						if( targetVMacEntry_p )
						{
							curRxInfo_g.RSSI = (UINT8)rssi;
							//printk("****** client process dot11 rssi=%d\n",curRxInfo_g.RSSI);
							//skb_push(skb, SK_BUF_RESERVED_PAD);
							skb_push(skb, 2); /* For UINT16 FrmBodyLen */
							Hdr_p = (IEEEtypes_MgmtHdr_t *)(skb->data);
							Hdr_p->FrmBodyLen = skb->len;
							skb_push(skb, 4); /* For UINT32 priv_p pointer */
							targetVMacEntry_p->dot11MsgEvt(skb->data, (UINT8 *)&curRxInfo_g, targetVMacEntry_p->info_p);
							skb_pull(skb, SK_BUF_RESERVED_PAD);
						}
					}
					else
					{
						evtDot11MgtMsg(vmacSta_p,(UINT8 *)wlanMsg_p, skb);
					}
				}
#else /* CLIENT_SUPPORT */
				evtDot11MgtMsg(vmacSta_p,(UINT8 *)wlanMsg_p, skb);
#endif /* CLIENT_SUPPORT */
				break;
			}
			break;
		}
	case IEEE_TYPE_CONTROL:
		{
			WLDBG_INFO(DBG_LEVEL_11, "IEEE_TYPE_CONTROL message received. \n");
			{
				switch (wlanMsg_p->Hdr.FrmCtl.Subtype)
				{
				case PS_POLL:
				case RTS:
				case CTS:
				case ACK:
				case CF_END:
				case CF_END_CF_ACK:
					break;
				default:
					break;
				}
			} /* end if */

			break;
		}
	default:
		/* Uknown Type */
		break;
	}
	dev_kfree_skb_any(skb);    
}
Beispiel #2
0
/*************************************************************************
* Function: childSrv_StartSession
*
* Description: Establish a Child session with Root AP
*
* Input:
*
* Output:
*
**************************************************************************/
extern vmacEntry_t *childSrv_StartSession(UINT8 macIndex, 
								          UINT8 *macAddr,
										  void *callBack_fp,
                                          UINT32 controlParam)
{
	vmacId_t idAssigned;
	halMacId_t macId;
	vmacEntry_t *childVMacEntry_p;
	vmacStaInfo_t *childStaInfo_p;

	if((childVMacEntry_p = vmacGetVMacEntryByAddr(macAddr)) != NULL)
	{
        #ifdef ETH_DEBUG
		eprintf("Child old Entry\n");
        #endif /* ETH_DEBUG */
		childStaInfo_p = (vmacStaInfo_t *)childVMacEntry_p->info_p;
		childStaInfo_p->AssociatedFlag = 0;
		childStaInfo_p->IBssStartFlag = 0;
		childStaInfo_p->Adhoc_Active = 0;
		childStaInfo_p->smeMain_State = STATE_IDLE;
		childStaInfo_p->macMgmtMain_State   = STATE_IDLE;
		childStaInfo_p->macMgmtMain_PostScanState = STATE_IDLE;
		childStaInfo_p->PostScanState = STATE_IDLE;
        childSrv_VmacStaInfoInit(childStaInfo_p);
		return childVMacEntry_p;
	}
    #ifdef ETH_DEBUG
	eprintf("Child new Entry\n");
    #endif /* ETH_DEBUG */
	if((childVMacEntry_p =childSrv_GetEntry(macAddr)) == NULL)
	{
		return NULL;
	}
	childStaInfo_p = (vmacStaInfo_t *)childVMacEntry_p->info_p;
	childStaInfo_p->childControlParam = controlParam;
	if(childStaInfo_p->childControlParam & MLME_CHILD_SET_ADDR_TO_HW)
	{
		if((macId = mlmeApiAddMacAddr(childStaInfo_p, macIndex, macAddr, 0)) == -1)
	    {
		    childSrv_PutEntry(macAddr);
		    return NULL;
	    }
	}
	else
	{
		if((childBlockAddr_mask[macIndex] == 0)
		   || (childBlockAddrMacId[macIndex] == -1))
	    {
		    return NULL;
	    }
		macId = childBlockAddrMacId[macIndex];
	}
	childVMacEntry_p->phyHwMacIndx = macIndex;
	childVMacEntry_p->macId = macId;
	/* Init Station MLME Information Structure */
	if(childSrv_CopyParentSessionParam(childStaInfo_p,
									  macIndex) == MLME_FAILURE) 
	{
		if(childStaInfo_p->childControlParam & MLME_CHILD_SET_ADDR_TO_HW)
		{
			mlmeApiDelMacAddr(childStaInfo_p, macId);
		}
		childSrv_PutEntry(macAddr);
		return NULL;
	}
    #ifdef STA_ADHOC_SUPPORTED
	/* Beacon Buffer Pointer */
	childStaInfo_p->BcnTxInfo_p = (txBcnInfo_t *)&txbcnbuf[macid2index(macId)];
	childStaInfo_p->BcnBuffer_p = (macmgmtQ_MgmtMsg_t *)&(txbcnbuf[macid2index(macId)].Bcn);  	
	/* Probe Response Pointer */
	childStaInfo_p->PrbRspTxInfo_p = (txBcnInfo_t *)&txprbrspbuf[macid2index(macId)];
	childStaInfo_p->PrbRspBuf_p = (macmgmtQ_MgmtMsg_t *)&(txprbrspbuf[macid2index(macId)].Bcn);
    #endif /* STA_ADHOC_SUPPORTED */
	/* Set it as a child session */
	childStaInfo_p->isParentSession = FALSE;
	/* Record the callBack Function */
	childStaInfo_p->mlmeCallBack_fp = callBack_fp;
    /* Record the parent vMacEntry address */
    childStaInfo_p->vMacEntry_p = (UINT8 *)childVMacEntry_p;
	/* Init default Parameters */
	childSrv_VmacStaInfoInit((vmacStaInfo_t *)childVMacEntry_p->info_p);
	/* Lastly register the station id and information structure */
	if((idAssigned = vmacRegister(childVMacEntry_p)) < 0 )
	{
		if(childStaInfo_p->childControlParam & MLME_CHILD_SET_ADDR_TO_HW)
		{
			mlmeApiDelMacAddr(childStaInfo_p, macId);
		}
		childSrv_PutEntry(macAddr);
		return NULL;
	}
	childVMacEntry_p->id = idAssigned;
	return childVMacEntry_p;
}