/* *************************************************************************** * Ralink Tech Inc. * 4F, No. 2 Technology 5th Rd. * Science-based Industrial Park * Hsin-chu, Taiwan, R.O.C. * * (c) Copyright 2002-2006, Ralink Technology, Inc. * * All rights reserved. Ralink's source code is an unpublished work and the * use of a copyright notice does not imply otherwise. This source code * contains confidential trade secret material of Ralink Tech. Any attemp * or participation in deciphering, decoding, reverse engineering or in any * way altering the source code is stricitly prohibited, unless the prior * written consent of Ralink Technology, Inc. is obtained. *************************************************************************** Module Name: ap_apcli.c Abstract: Support AP-Client function. Note: 1. Call RT28xx_ApCli_Init() in init function and call RT28xx_ApCli_Remove() in close function 2. MAC of ApCli-interface is initialized in RT28xx_ApCli_Init() 3. ApCli index (0) of different rx packet is got in APHandleRxDoneInterrupt() by using FromWhichBSSID = pEntry->apidx; Or FromWhichBSSID = BSS0; 4. ApCli index (0) of different tx packet is assigned in MBSS_VirtualIF_PacketSend() by using RTMP_SET_PACKET_NET_DEVICE_MBSSID() 5. ApCli index (0) of different interface is got in APHardTransmit() by using RTMP_GET_PACKET_IF() 6. ApCli index (0) of IOCTL command is put in pAd->OS_Cookie->ioctl_if 8. The number of ApCli only can be 1 9. apcli convert engine subroutines, we should just take care data packet. Revision History: Who When What -------------- ---------- ---------------------------------------------- Shiang, Fonchi 02-13-2007 created */ #define RTMP_MODULE_OS #ifdef APCLI_SUPPORT /*#include "rt_config.h" */ #include "rtmp_comm.h" #include "rt_os_util.h" #include "rt_os_net.h" /* ======================================================================== Routine Description: Init AP-Client function. Arguments: pAd points to our adapter main_dev_p points to the main BSS network interface Return Value: None Note: 1. Only create and initialize virtual network interfaces. 2. No main network interface here. ======================================================================== */ VOID RT28xx_ApCli_Init( IN VOID *pAd, IN PNET_DEV main_dev_p) { RTMP_OS_NETDEV_OP_HOOK netDevOpHook; /* init operation functions */ NdisZeroMemory(&netDevOpHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); netDevOpHook.open = ApCli_VirtualIF_Open; netDevOpHook.stop = ApCli_VirtualIF_Close; netDevOpHook.xmit = ApCli_VirtualIF_PacketSend; netDevOpHook.ioctl = ApCli_VirtualIF_Ioctl; RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_INIT, 0, &netDevOpHook, 0); } /* ======================================================================== Routine Description: Open a virtual network interface. Arguments: dev_p which WLAN network interface Return Value: 0: open successfully otherwise: open fail Note: ======================================================================== */ INT ApCli_VirtualIF_Open( IN PNET_DEV dev_p) { /* UCHAR ifIndex; */ VOID *pAd; pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAd); DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); if (VIRTUAL_IF_UP(pAd) != 0) return -1; /* increase MODULE use count */ RT_MOD_INC_USE_COUNT(); RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_OPEN, 0, dev_p, 0); return 0; } /* End of ApCli_VirtualIF_Open */ /* ======================================================================== Routine Description: Close a virtual network interface. Arguments: dev_p which WLAN network interface Return Value: 0: close successfully otherwise: close fail Note: ======================================================================== */ INT ApCli_VirtualIF_Close( IN PNET_DEV dev_p) { /* UCHAR ifIndex; */ VOID *pAd; pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAd); DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_CLOSE, 0, dev_p, 0); VIRTUAL_IF_DOWN(pAd); RT_MOD_DEC_USE_COUNT(); return 0; } /* End of ApCli_VirtualIF_Close */ /* ======================================================================== Routine Description: Send a packet to WLAN. Arguments: skb_p points to our adapter dev_p which WLAN network interface Return Value: 0: transmit successfully otherwise: transmit fail Note: ======================================================================== */ INT ApCli_VirtualIF_PacketSend( IN PNDIS_PACKET pPktSrc, IN PNET_DEV pDev) { MEM_DBG_PKT_ALLOC_INC(pPktSrc); if(!(RTMP_OS_NETDEV_STATE_RUNNING(pDev))) { /* the interface is down */ RELEASE_NDIS_PACKET(NULL, pPktSrc, NDIS_STATUS_FAILURE); return 0; } /* End of if */ return APC_PacketSend(pPktSrc, pDev, rt28xx_packet_xmit); } /* End of ApCli_VirtualIF_PacketSend */ /* ======================================================================== Routine Description: IOCTL to WLAN. Arguments: dev_p which WLAN network interface rq_p command information cmd command ID Return Value: 0: IOCTL successfully otherwise: IOCTL fail Note: SIOCETHTOOL 8946 New drivers use this ETHTOOL interface to report link failure activity. ======================================================================== */ INT ApCli_VirtualIF_Ioctl( IN PNET_DEV dev_p, IN OUT VOID *rq_p, IN INT cmd) { VOID *pAd; pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAd); /* if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */ if (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS) return -ENETDOWN; /* do real IOCTL */ return (rt28xx_ioctl(dev_p, rq_p, cmd)); } /* End of ApCli_VirtualIF_Ioctl */ /* ======================================================================== Routine Description: Remove ApCli-BSS network interface. Arguments: pAd points to our adapter Return Value: None Note: ======================================================================== */ VOID RT28xx_ApCli_Remove( IN VOID *pAd) { /* UINT index; */ RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_REMOVE, 0, NULL, 0); } #endif /* APCLI_SUPPORT */