PNET_DEV RtmpPhyNetDevInit( IN RTMP_ADAPTER *pAd, IN RTMP_OS_NETDEV_OP_HOOK *pNetDevHook) { struct net_device *net_dev = NULL; // NDIS_STATUS Status; net_dev = RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER), INF_MAIN_DEV_NAME); if (net_dev == NULL) { printk("RtmpPhyNetDevInit(): creation failed for main physical net device!\n"); return NULL; } NdisZeroMemory((unsigned char *)pNetDevHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); pNetDevHook->netdev_ops = &rt3090_netdev_ops; pNetDevHook->priv_flags = INT_MAIN; pNetDevHook->needProtcted = FALSE; RTMP_OS_NETDEV_SET_PRIV(net_dev, pAd); //net_dev->priv = (PVOID)pAd; pAd->net_dev = net_dev; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(net_dev); #endif netif_stop_queue(net_dev); return net_dev; }
/* ======================================================================== Routine Description: Init AP-Client function. Arguments: ad_p 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 PRTMP_ADAPTER ad_p, IN PNET_DEV main_dev_p) { #define APCLI_MAX_DEV_NUM 32 PNET_DEV new_dev_p; // VIRTUAL_ADAPTER *apcli_ad_p; INT apcli_index; RTMP_OS_NETDEV_OP_HOOK netDevOpHook; APCLI_STRUCT *pApCliEntry; /* sanity check to avoid redundant virtual interfaces are created */ if (ad_p->flg_apcli_init != FALSE) return; /* init */ for(apcli_index = 0; apcli_index < MAX_APCLI_NUM; apcli_index++) ad_p->ApCfg.ApCliTab[apcli_index].dev = NULL; /* create virtual network interface */ for(apcli_index = 0; apcli_index < MAX_APCLI_NUM; apcli_index++) { new_dev_p = RtmpOSNetDevCreate(ad_p, INT_APCLI, apcli_index, sizeof(PRTMP_ADAPTER), INF_APCLI_DEV_NAME); RTMP_OS_NETDEV_SET_PRIV(new_dev_p, ad_p); pApCliEntry = &ad_p->ApCfg.ApCliTab[apcli_index]; /* init MAC address of virtual network interface */ COPY_MAC_ADDR(pApCliEntry->CurrentAddress, ad_p->CurrentAddress); pApCliEntry->CurrentAddress[ETH_LENGTH_OF_ADDRESS - 1] = (pApCliEntry->CurrentAddress[ETH_LENGTH_OF_ADDRESS - 1] + ad_p->ApCfg.BssidNum + MAX_MESH_NUM) & 0xFF; /* 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; netDevOpHook.priv_flags = INT_APCLI; /* we are virtual interface */ netDevOpHook.needProtcted = TRUE; NdisMoveMemory(&netDevOpHook.devAddr[0], &pApCliEntry->CurrentAddress[0], MAC_ADDR_LEN); /* register this device to OS */ RtmpOSNetDevAttach(new_dev_p, &netDevOpHook); /* backup our virtual network interface */ pApCliEntry->dev = new_dev_p; #ifdef WSC_AP_SUPPORT pApCliEntry->WscControl.pAd = ad_p; if (pApCliEntry->WscControl.WscEnrolleePinCode == 0) pApCliEntry->WscControl.WscEnrolleePinCode = GenerateWpsPinCode(ad_p, TRUE, 0); NdisZeroMemory(pApCliEntry->WscControl.EntryAddr, MAC_ADDR_LEN); WscInit(ad_p, TRUE, apcli_index); #endif // WSC_AP_SUPPORT // } /* End of for */ ad_p->flg_apcli_init = TRUE; }
VOID WDS_Init( IN PRTMP_ADAPTER pAd, IN RTMP_OS_NETDEV_OP_HOOK *pNetDevOps) { INT index; PNET_DEV pWdsNetDev; /* sanity check to avoid redundant virtual interfaces are created */ if (pAd->flg_wds_init != FALSE) return; for(index = 0; index < MAX_WDS_ENTRY; index++) { UINT32 MC_RowID = 0, IoctlIF = 0; #ifdef MULTIPLE_CARD_SUPPORT MC_RowID = pAd->MC_RowID; #endif /* MULTIPLE_CARD_SUPPORT */ #ifdef HOSTAPD_SUPPORT IoctlIF = pAd->IoctlIF; #endif /* HOSTAPD_SUPPORT */ pWdsNetDev = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_WDS, index, sizeof(PRTMP_ADAPTER), INF_WDS_DEV_NAME); #ifdef HOSTAPD_SUPPORT pAd->IoctlIF = IoctlIF; #endif /* HOSTAPD_SUPPORT */ if (pWdsNetDev == NULL) { /* allocation fail, exit */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (WDS)...\n")); break; } else { PMAC_TABLE_ENTRY pWdsEntry; pWdsEntry = &pAd->MacTab.Content[pAd->WdsTab.WdsEntry[index].MacTabMatchWCID]; DBGPRINT(RT_DEBUG_TRACE, ("The new WDS interface MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", PRINT_MAC(pWdsEntry->Addr))); } NdisZeroMemory(&pAd->WdsTab.WdsEntry[index].WdsCounter, sizeof(WDS_COUNTER)); RTMP_OS_NETDEV_SET_PRIV(pWdsNetDev, pAd); pAd->WdsTab.WdsEntry[index].PhyMode = 0xff; pAd->WdsTab.WdsEntry[index].dev = pWdsNetDev; pNetDevOps->priv_flags = INT_WDS; /* we are virtual interface */ pNetDevOps->needProtcted = TRUE; /* Register this device */ RtmpOSNetDevAttach(pAd->OpMode, pWdsNetDev, pNetDevOps); pAd->WdsTab.WdsEntry[index].PhyMode = 0xff; pAd->WdsTab.WdsEntry[index].dev = pWdsNetDev; } pAd->flg_wds_init = TRUE; DBGPRINT(RT_DEBUG_TRACE, ("Total Allocate %d WDS interfaces!\n", index)); }
PNET_DEV RtmpPhyNetDevInit( IN RTMP_ADAPTER *pAd, IN RTMP_OS_NETDEV_OP_HOOK *pNetDevHook) { struct net_device *net_dev = NULL; // NDIS_STATUS Status; net_dev = RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER), INF_MAIN_DEV_NAME); if (net_dev == NULL) { printk("RtmpPhyNetDevInit(): creation failed for main physical net device!\n"); return NULL; } NdisZeroMemory((unsigned char *)pNetDevHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); pNetDevHook->open = MainVirtualIF_open; pNetDevHook->stop = MainVirtualIF_close; pNetDevHook->xmit = rt28xx_send_packets; #ifdef IKANOS_VX_1X0 pNetDevHook->xmit = IKANOS_DataFramesTx; #endif // IKANOS_VX_1X0 // pNetDevHook->ioctl = rt28xx_ioctl; pNetDevHook->priv_flags = INT_MAIN; pNetDevHook->get_stats = RT28xx_get_ether_stats; pNetDevHook->needProtcted = FALSE; #if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12) pNetDevHook->get_wstats = rt28xx_get_wireless_stats; #endif #ifdef CONFIG_APSTA_MIXED_SUPPORT #if WIRELESS_EXT >= 12 if (pAd->OpMode == OPMODE_AP) { pNetDevHook->iw_handler = &rt28xx_ap_iw_handler_def; } #endif //WIRELESS_EXT >= 12 #endif // CONFIG_APSTA_MIXED_SUPPORT // RTMP_OS_NETDEV_SET_PRIV(net_dev, pAd); pAd->net_dev = net_dev; #ifdef CONFIG_AP_SUPPORT pAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev = net_dev; #endif // CONFIG_AP_SUPPORT // #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(net_dev); #endif netif_stop_queue(net_dev); return net_dev; }
// Register WDS interface VOID RT28xx_WDS_Init( IN PRTMP_ADAPTER pAd, IN PNET_DEV net_dev) { INT index; PNET_DEV pWdsNetDev; RTMP_OS_NETDEV_OP_HOOK netDevOpHook; /* sanity check to avoid redundant virtual interfaces are created */ if (pAd->flg_wds_init != FALSE) return; for(index = 0; index < MAX_WDS_ENTRY; index++) { pWdsNetDev = RtmpOSNetDevCreate(pAd, INT_WDS, index, sizeof(PRTMP_ADAPTER), INF_WDS_DEV_NAME); if (pWdsNetDev == NULL) { /* allocation fail, exit */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (WDS)...\n")); break; } else { PMAC_TABLE_ENTRY pWdsEntry; pWdsEntry = &pAd->MacTab.Content[pAd->WdsTab.WdsEntry[index].MacTabMatchWCID]; DBGPRINT(RT_DEBUG_TRACE, ("The new WDS interface MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", PRINT_MAC(pWdsEntry->Addr))); } NdisZeroMemory(&pAd->WdsTab.WdsEntry[index].WdsCounter, sizeof(WDS_COUNTER)); RTMP_OS_NETDEV_SET_PRIV(pWdsNetDev, pAd); pAd->WdsTab.WdsEntry[index].PhyMode = 0xff; pAd->WdsTab.WdsEntry[index].dev = pWdsNetDev; NdisZeroMemory((PUCHAR)&netDevOpHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); netDevOpHook.open = WdsVirtualIF_open; netDevOpHook.stop = WdsVirtualIF_close; netDevOpHook.xmit = WdsVirtualIFSendPackets; netDevOpHook.ioctl = WdsVirtualIF_ioctl; netDevOpHook.priv_flags = INT_WDS; /* we are virtual interface */ netDevOpHook.needProtcted = TRUE; netDevOpHook.get_stats = RT28xx_get_wds_ether_stats; NdisMoveMemory(&netDevOpHook.devAddr[0], RTMP_OS_NETDEV_GET_PHYADDR(net_dev), MAC_ADDR_LEN); DBGPRINT(RT_DEBUG_TRACE, ("The new WDS interface MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", PRINT_MAC(netDevOpHook.devAddr))); // Register this device RtmpOSNetDevAttach(pWdsNetDev, &netDevOpHook); pAd->WdsTab.WdsEntry[index].PhyMode = 0xff; pAd->WdsTab.WdsEntry[index].dev = pWdsNetDev; } pAd->flg_wds_init = TRUE; DBGPRINT(RT_DEBUG_TRACE, ("Total Allocate %d WDS interfaces!\n", index)); }
PNET_DEV RtmpPhyNetDevInit( IN RTMP_ADAPTER *pAd, IN RTMP_OS_NETDEV_OP_HOOK *pNetDevHook) { struct net_device *net_dev = NULL; // NDIS_STATUS Status; net_dev = RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER), INF_MAIN_DEV_NAME); if (net_dev == NULL) { printk("RtmpPhyNetDevInit(): creation failed for main physical net device!\n"); return NULL; } NdisZeroMemory((unsigned char *)pNetDevHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); pNetDevHook->netdev_ops = &rt2870_netdev_ops; /* pNetDevHook->open = MainVirtualIF_open; pNetDevHook->stop = MainVirtualIF_close; pNetDevHook->xmit = rt28xx_send_packets; #ifdef IKANOS_VX_1X0 pNetDevHook->xmit = IKANOS_DataFramesTx; #endif // IKANOS_VX_1X0 // pNetDevHook->ioctl = rt28xx_ioctl; pNetDevHook->priv_flags = INT_MAIN; pNetDevHook->get_stats = RT28xx_get_ether_stats; pNetDevHook->needProtcted = FALSE; */ RTMP_OS_NETDEV_SET_PRIV(net_dev, pAd); //net_dev->priv = (PVOID)pAd; pAd->net_dev = net_dev; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(net_dev); #endif netif_stop_queue(net_dev); return net_dev; }
VOID RTMP_CFG80211_DummyP2pIf_Init( IN VOID *pAdSrc) { #define INF_CFG80211_DUMMY_P2P_NAME "p2p" PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; CFG80211_CB *p80211CB = pAd->pCfg80211_CB; PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; RTMP_OS_NETDEV_OP_HOOK netDevHook, *pNetDevOps; PNET_DEV new_dev_p; UINT32 MC_RowID = 0, IoctlIF = 0, Inf = INT_P2P; UINT preIfIndex = 0; struct wireless_dev *pWdev; DBGPRINT(RT_DEBUG_TRACE, (" %s =====> \n", __FUNCTION__)); if (cfg80211_ctrl->flg_cfg_dummy_p2p_init != FALSE) return; #if RT_CFG80211_P2P_SUPPORT cfg80211_ctrl->bP2pCliPmEnable = FALSE; cfg80211_ctrl->bPreKeepSlient = FALSE; cfg80211_ctrl->bKeepSlient = FALSE; cfg80211_ctrl->NoAIndex = MAX_LEN_OF_MAC_TABLE; cfg80211_ctrl->MyGOwcid = MAX_LEN_OF_MAC_TABLE; cfg80211_ctrl->CTWindows=0; /* CTWindows and OppPS parameter field */ #endif /* RT_CFG80211_P2P_SUPPORT */ pNetDevOps=&netDevHook; /* init operation functions and flags */ NdisZeroMemory(&netDevHook, sizeof(netDevHook)); netDevHook.open = CFG80211_DummyP2pIf_Open; /* device opem hook point */ netDevHook.stop = CFG80211_DummyP2pIf_Close; /* device close hook point */ netDevHook.xmit = CFG80211_DummyP2pIf_PacketSend; /* hard transmit hook point */ netDevHook.ioctl = CFG80211_DummyP2pIf_Ioctl; /* ioctl hook point */ new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, Inf, preIfIndex, sizeof(PRTMP_ADAPTER), INF_CFG80211_DUMMY_P2P_NAME); if (new_dev_p == NULL) { /* allocation fail, exit */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (CFG80211: Dummy P2P IF)...\n")); return; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register CFG80211 I/F (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); } RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); NdisMoveMemory(&pNetDevOps->devAddr[0], &pAd->CurrentAddress[0], MAC_ADDR_LEN); pNetDevOps->needProtcted = TRUE; pWdev = kzalloc(sizeof(*pWdev), GFP_KERNEL); if (unlikely(!pWdev)) { DBGPRINT(RT_DEBUG_ERROR, ("Could not allocate wireless device\n")); return; } new_dev_p->ieee80211_ptr = pWdev; pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy; SET_NETDEV_DEV(new_dev_p, wiphy_dev(pWdev->wiphy)); pWdev->netdev = new_dev_p; pWdev->iftype = RT_CMD_80211_IFTYPE_STATION; RtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps); cfg80211_ctrl->dummy_p2p_net_dev = new_dev_p; cfg80211_ctrl->flg_cfg_dummy_p2p_init = TRUE; DBGPRINT(RT_DEBUG_TRACE, (" %s <=====\n", __FUNCTION__)); }
VOID RTMP_CFG80211_VirtualIF_Init( IN VOID *pAdSrc, IN CHAR *pDevName, IN UINT32 DevType) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; RTMP_OS_NETDEV_OP_HOOK netDevHook, *pNetDevOps; PNET_DEV new_dev_p; #ifdef RT_CFG80211_P2P_SUPPORT APCLI_STRUCT *pApCliEntry; #endif /* RT_CFG80211_P2P_SUPPORT */ struct wifi_dev *wdev; CHAR preIfName[12]; UINT devNameLen = strlen(pDevName); UINT preIfIndex = pDevName[devNameLen-1] - 48; CFG80211_CB *p80211CB = pAd->pCfg80211_CB; struct wireless_dev *pWdev; UINT32 MC_RowID = 0, IoctlIF = 0, Inf = INT_P2P; memset(preIfName, 0, sizeof(preIfName)); NdisCopyMemory(preIfName, pDevName, devNameLen-1); pNetDevOps=&netDevHook; DBGPRINT(RT_DEBUG_TRACE, ("%s ---> (%s, %s, %d)\n", __FUNCTION__, pDevName, preIfName, preIfIndex)); /* init operation functions and flags */ NdisZeroMemory(&netDevHook, sizeof(netDevHook)); netDevHook.open = CFG80211_VirtualIF_Open; /* device opem hook point */ netDevHook.stop = CFG80211_VirtualIF_Close; /* device close hook point */ netDevHook.xmit = CFG80211_VirtualIF_PacketSend; /* hard transmit hook point */ netDevHook.ioctl = CFG80211_VirtualIF_Ioctl; /* ioctl hook point */ #if WIRELESS_EXT >= 12 //netDevHook.iw_handler = (void *)&rt28xx_ap_iw_handler_def; #endif /* WIRELESS_EXT >= 12 */ new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, Inf, preIfIndex, sizeof(PRTMP_ADAPTER), preIfName); if (new_dev_p == NULL) { /* allocation fail, exit */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (CFG80211)...\n")); return; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register CFG80211 I/F (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); } new_dev_p->destructor = free_netdev; RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); pNetDevOps->needProtcted = TRUE; NdisMoveMemory(&pNetDevOps->devAddr[0], &pAd->CurrentAddress[0], MAC_ADDR_LEN); //CFG_TODO /* Bit1 of MAC address Byte0 is local administration bit and should be set to 1 in extended multiple BSSIDs' Bit3~ of MAC address Byte0 is extended multiple BSSID index. */ if (pAd->chipCap.MBSSIDMode == MBSSID_MODE1) pNetDevOps->devAddr[0] += 2; /* NEW BSSID */ else { #ifdef P2P_ODD_MAC_ADJUST if (pNetDevOps->devAddr[5] & 0x01 == 0x01) pNetDevOps->devAddr[5] -= 1; else #endif /* P2P_ODD_MAC_ADJUST */ pNetDevOps->devAddr[5] += FIRST_MBSSID; } switch (DevType) { case RT_CMD_80211_IFTYPE_MONITOR: DBGPRINT(RT_DEBUG_ERROR, ("CFG80211 I/F Monitor Type\n")); //RTMP_OS_NETDEV_SET_TYPE_MONITOR(new_dev_p); break; #ifdef RT_CFG80211_P2P_SUPPORT case RT_CMD_80211_IFTYPE_P2P_CLIENT: pApCliEntry = &pAd->ApCfg.ApCliTab[MAIN_MBSSID]; wdev = &pApCliEntry->wdev; wdev->wdev_type = WDEV_TYPE_STA; wdev->func_dev = pApCliEntry; wdev->sys_handle = (void *)pAd; wdev->if_dev = new_dev_p; wdev->tx_pkt_allowed = ApCliAllowToSendPacket; RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); RTMP_OS_NETDEV_SET_WDEV(new_dev_p, wdev); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Assign wdev idx for %s failed, free net device!\n", __FUNCTION__,RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); RtmpOSNetDevFree(new_dev_p); break; } /* init MAC address of virtual network interface */ COPY_MAC_ADDR(wdev->if_addr, pNetDevOps->devAddr); break; case RT_CMD_80211_IFTYPE_P2P_GO: pNetDevOps->priv_flags = INT_P2P; pAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev = NULL; /* The Behivaor in SetBeacon Ops */ //pAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev = new_dev_p; pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; COPY_MAC_ADDR(pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.if_addr, pNetDevOps->devAddr); COPY_MAC_ADDR(pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.bssid, pNetDevOps->devAddr); break; #endif /* RT_CFG80211_P2P_SUPPORT */ default: DBGPRINT(RT_DEBUG_ERROR, ("Unknown CFG80211 I/F Type (%d)\n", DevType)); } //CFG_TODO : should be move to VIF_CHG if ((DevType == RT_CMD_80211_IFTYPE_P2P_CLIENT) || (DevType == RT_CMD_80211_IFTYPE_P2P_GO)) { COPY_MAC_ADDR(pAd->cfg80211_ctrl.P2PCurrentAddress, pNetDevOps->devAddr); } pWdev = kzalloc(sizeof(*pWdev), GFP_KERNEL); new_dev_p->ieee80211_ptr = pWdev; pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy; SET_NETDEV_DEV(new_dev_p, wiphy_dev(pWdev->wiphy)); pWdev->netdev = new_dev_p; pWdev->iftype = DevType; RtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps); AsicSetBssid(pAd, pAd->CurrentAddress); /* Record the pNetDevice to Cfg80211VifDevList */ RTMP_CFG80211_AddVifEntry(pAd, new_dev_p, DevType); DBGPRINT(RT_DEBUG_TRACE, ("%s <---\n", __FUNCTION__)); }
VOID RTMP_CFG80211_DummyP2pIf_Init( IN struct rtmp_adapter *pAd) { #define INF_CFG80211_DUMMY_P2P_NAME "p2p" struct mt7612u_cfg80211_cb *p80211CB = pAd->pCfg80211_CB; PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; struct RTMP_OS_NETDEV_OP_HOOK netDevHook, *pNetDevOps; struct net_device *new_dev_p; uint32_t MC_RowID = 0, IoctlIF = 0, Inf = INT_P2P; UINT preIfIndex = 0; struct wireless_dev *pWdev; DBGPRINT(RT_DEBUG_TRACE, (" %s =====> \n", __FUNCTION__)); if (cfg80211_ctrl->flg_cfg_dummy_p2p_init != false) return; pNetDevOps=&netDevHook; /* init operation functions and flags */ memset(&netDevHook, 0, sizeof(netDevHook)); netDevHook.open = CFG80211_DummyP2pIf_Open; /* device opem hook point */ netDevHook.stop = CFG80211_DummyP2pIf_Close; /* device close hook point */ netDevHook.xmit = CFG80211_DummyP2pIf_PacketSend; /* hard transmit hook point */ netDevHook.ioctl = CFG80211_DummyP2pIf_Ioctl; /* ioctl hook point */ new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, Inf, preIfIndex, sizeof(struct rtmp_adapter *), INF_CFG80211_DUMMY_P2P_NAME); if (new_dev_p == NULL) { /* allocation fail, exit */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (CFG80211: Dummy P2P IF)...\n")); return; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register CFG80211 I/F (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); } RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); memmove(&pNetDevOps->devAddr[0], &pAd->CurrentAddress[0], MAC_ADDR_LEN); pNetDevOps->needProtcted = true; pWdev = kzalloc(sizeof(*pWdev), GFP_KERNEL); if (unlikely(!pWdev)) { DBGPRINT(RT_DEBUG_ERROR, ("Could not allocate wireless device\n")); return; } new_dev_p->ieee80211_ptr = pWdev; pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy; SET_NETDEV_DEV(new_dev_p, wiphy_dev(pWdev->wiphy)); pWdev->netdev = new_dev_p; pWdev->iftype = RT_CMD_80211_IFTYPE_STATION; RtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps); cfg80211_ctrl->dummy_p2p_net_dev = new_dev_p; cfg80211_ctrl->flg_cfg_dummy_p2p_init = true; DBGPRINT(RT_DEBUG_TRACE, (" %s <=====\n", __FUNCTION__)); }
VOID RTMP_CFG80211_VirtualIF_Init( IN struct rtmp_adapter *pAd, IN CHAR *pDevName, IN uint32_t DevType) { struct RTMP_OS_NETDEV_OP_HOOK netDevHook, *pNetDevOps; struct net_device *new_dev_p; struct rtmp_wifi_dev *wdev; CHAR preIfName[12]; UINT devNameLen = strlen(pDevName); UINT preIfIndex = pDevName[devNameLen-1] - 48; struct mt7612u_cfg80211_cb *p80211CB = pAd->pCfg80211_CB; struct wireless_dev *pWdev; uint32_t MC_RowID = 0, IoctlIF = 0, Inf = INT_P2P; memset(preIfName, 0, sizeof(preIfName)); memcpy(preIfName, pDevName, devNameLen-1); pNetDevOps=&netDevHook; DBGPRINT(RT_DEBUG_TRACE, ("%s ---> (%s, %s, %d)\n", __FUNCTION__, pDevName, preIfName, preIfIndex)); /* init operation functions and flags */ memset(&netDevHook, 0, sizeof(netDevHook)); netDevHook.open = CFG80211_VirtualIF_Open; /* device opem hook point */ netDevHook.stop = CFG80211_VirtualIF_Close; /* device close hook point */ netDevHook.xmit = CFG80211_VirtualIF_PacketSend; /* hard transmit hook point */ netDevHook.ioctl = CFG80211_VirtualIF_Ioctl; /* ioctl hook point */ #if WIRELESS_EXT >= 12 //netDevHook.iw_handler = (void *)&rt28xx_ap_iw_handler_def; #endif /* WIRELESS_EXT >= 12 */ new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, Inf, preIfIndex, sizeof(struct rtmp_adapter *), preIfName); if (new_dev_p == NULL) { /* allocation fail, exit */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (CFG80211)...\n")); return; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register CFG80211 I/F (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); } #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,9)) new_dev_p->needs_free_netdev = true; #else new_dev_p->destructor = free_netdev; #endif RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); pNetDevOps->needProtcted = true; memmove(&pNetDevOps->devAddr[0], &pAd->CurrentAddress[0], MAC_ADDR_LEN); //CFG_TODO /* Bit1 of MAC address Byte0 is local administration bit and should be set to 1 in extended multiple BSSIDs' Bit3~ of MAC address Byte0 is extended multiple BSSID index. */ if (pAd->chipCap.MBSSIDMode == MBSSID_MODE1) pNetDevOps->devAddr[0] += 2; /* NEW BSSID */ else { #ifdef P2P_ODD_MAC_ADJUST if (pNetDevOps->devAddr[5] & 0x01 == 0x01) pNetDevOps->devAddr[5] -= 1; else #endif /* P2P_ODD_MAC_ADJUST */ pNetDevOps->devAddr[5] += FIRST_MBSSID; } switch (DevType) { case RT_CMD_80211_IFTYPE_MONITOR: DBGPRINT(RT_DEBUG_ERROR, ("CFG80211 I/F Monitor Type\n")); //RTMP_OS_NETDEV_SET_TYPE_MONITOR(new_dev_p); break; default: DBGPRINT(RT_DEBUG_ERROR, ("Unknown CFG80211 I/F Type (%d)\n", DevType)); } //CFG_TODO : should be move to VIF_CHG if ((DevType == RT_CMD_80211_IFTYPE_P2P_CLIENT) || (DevType == RT_CMD_80211_IFTYPE_P2P_GO)) { COPY_MAC_ADDR(pAd->cfg80211_ctrl.P2PCurrentAddress, pNetDevOps->devAddr); } pWdev = kzalloc(sizeof(*pWdev), GFP_KERNEL); new_dev_p->ieee80211_ptr = pWdev; pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy; SET_NETDEV_DEV(new_dev_p, wiphy_dev(pWdev->wiphy)); pWdev->netdev = new_dev_p; pWdev->iftype = DevType; RtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps); AsicSetBssid(pAd, pAd->CurrentAddress); /* Record the pNetDevice to Cfg80211VifDevList */ RTMP_CFG80211_AddVifEntry(pAd, new_dev_p, DevType); DBGPRINT(RT_DEBUG_TRACE, ("%s <---\n", __FUNCTION__)); }
VOID MBSS_Init( IN PRTMP_ADAPTER pAd, IN RTMP_OS_NETDEV_OP_HOOK *pNetDevOps) { #define MBSS_MAX_DEV_NUM 32 PNET_DEV pDevNew; INT32 IdBss, MaxNumBss; int status; RTMP_OS_NETDEV_OP_HOOK netDevHook; /* sanity check to avoid redundant virtual interfaces are created */ if (pAd->FlgMbssInit != FALSE) return; /* init */ MaxNumBss = pAd->ApCfg.BssidNum; if (MaxNumBss > MAX_MBSSID_NUM(pAd)) MaxNumBss = MAX_MBSSID_NUM(pAd); /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ for(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM(pAd); IdBss++) pAd->ApCfg.MBSSID[IdBss].MSSIDDev = NULL; /* create virtual network interface */ for(IdBss=FIRST_MBSSID; IdBss<MaxNumBss; IdBss++) { UINT32 MC_RowID = 0, IoctlIF = 0; #ifdef MULTIPLE_CARD_SUPPORT MC_RowID = pAd->MC_RowID; #endif /* MULTIPLE_CARD_SUPPORT */ #ifdef HOSTAPD_SUPPORT IoctlIF = pAd->IoctlIF; #endif /* HOSTAPD_SUPPORT */ pDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MBSSID, IdBss, sizeof(PRTMP_ADAPTER), INF_MBSSID_DEV_NAME); #ifdef HOSTAPD_SUPPORT pAd->IoctlIF = IoctlIF; #endif /* HOSTAPD_SUPPORT */ if (pDevNew == NULL) { /* allocation fail, exit */ pAd->ApCfg.BssidNum = IdBss; /* re-assign new MBSS number */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (MBSS)...\n")); break; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register MBSSID IF (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); } RTMP_OS_NETDEV_SET_PRIV(pDevNew, pAd); /* init operation functions and flags */ NdisCopyMemory(&netDevHook, pNetDevOps, sizeof(netDevHook)); netDevHook.priv_flags = INT_MBSSID; /* We are virtual interface */ netDevHook.needProtcted = TRUE; /* Init MAC address of virtual network interface */ NdisMoveMemory(&netDevHook.devAddr[0], &pAd->ApCfg.MBSSID[IdBss].Bssid[0], MAC_ADDR_LEN); /* backup our virtual network interface */ pAd->ApCfg.MBSSID[IdBss].MSSIDDev = pDevNew; /* register this device to OS */ status = RtmpOSNetDevAttach(pAd->OpMode, pDevNew, &netDevHook); } pAd->FlgMbssInit = TRUE; }
BOOLEAN CFG80211DRV_OpsBeaconAdd(VOID *pAdOrg, VOID *pData) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CMD_RTPRIV_IOCTL_80211_BEACON *pBeacon; // BOOLEAN Cancelled; UINT i = 0; #ifdef RT_CFG80211_P2P_SUPPORT UINT apidx = CFG_GO_BSSID_IDX; #else UINT apidx = MAIN_MBSSID; #endif /*RT_CFG80211_P2P_SUPPORT*/ BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx]; struct wifi_dev *wdev = &pMbss->wdev; CHAR tr_tb_idx = MAX_LEN_OF_MAC_TABLE + apidx; /* for Concurrent, AP/P2P GO use HW_BSSID 1 */ //wdev->hw_bssid_idx = CFG_GO_BSSID_IDX; wdev->hw_bssid_idx = apidx; #ifdef RT_CFG80211_SUPPORT #ifdef RT_CFG80211_P2P_SUPPORT if (!RTMP_CFG80211_VIF_P2P_GO_ON(pAd)) #endif /* RT_CFG80211_P2P_SUPPORT */ wdev->Hostapd=Hostapd_CFG; #endif /* RT_CFG80211_SUPPORT */ CFG80211DBG(RT_DEBUG_TRACE, ("80211> %s ==>\n", __FUNCTION__)); #ifdef CONFIG_AP_SUPPORT #endif /* CONFIG_AP_SUPPORT */ pBeacon = (CMD_RTPRIV_IOCTL_80211_BEACON *)pData; #ifdef UAPSD_SUPPORT wdev->UapsdInfo.bAPSDCapable = TRUE; pMbss->CapabilityInfo |= 0x0800; #endif /* UAPSD_SUPPORT */ CFG80211DRV_UpdateApSettingFromBeacon(pAd, apidx, pBeacon); AsicSetRxFilter(pAd); /* Start from 0 & MT_MAC using HW_BSSID 1, TODO */ #ifdef RT_CFG80211_P2P_SUPPORT pAd->ApCfg.BssidNum = (CFG_GO_BSSID_IDX + 1); #else pAd->ApCfg.BssidNum = (MAIN_MBSSID + 1); #endif /*RT_CFG80211_P2P_SUPPORT*/ pAd->MacTab.MsduLifeTime = 20; /* pEntry's UAPSD Q Idle Threshold */ /* CFG_TODO */ pAd->ApCfg.MBSSID[apidx].bcn_buf.BcnBufIdx = 0 ; for(i = 0; i < WLAN_MAX_NUM_OF_TIM; i++) pAd->ApCfg.MBSSID[apidx].TimBitmaps[i] = 0; pMbss->bcn_buf.bBcnSntReq = TRUE; /* For GO Timeout */ #ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT pAd->ApCfg.StaIdleTimeout = 300; pMbss->StationKeepAliveTime = 60; #else pAd->ApCfg.StaIdleTimeout = 300; pMbss->StationKeepAliveTime = 0; #endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ AsicDisableSync(pAd); if (pAd->CommonCfg.Channel > 14) pAd->CommonCfg.PhyMode = (WMODE_A | WMODE_AN); else pAd->CommonCfg.PhyMode = (WMODE_B | WMODE_G |WMODE_GN); /* cfg_todo */ wdev->bWmmCapable = TRUE; wdev->wdev_type = WDEV_TYPE_AP; wdev->func_dev = (void *)&pAd->ApCfg.MBSSID[apidx]; wdev->sys_handle = (void *)pAd; wdev->func_idx = apidx; //NEW #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE /* Using netDev ptr from VifList if VifDevList Exist */ PNET_DEV pNetDev = NULL; if ((pAd->cfg80211_ctrl.Cfg80211VifDevSet.vifDevList.size > 0) && ((pNetDev = RTMP_CFG80211_FindVifEntry_ByType(pAd, RT_CMD_80211_IFTYPE_P2P_GO)) != NULL)) { wdev->if_dev = pNetDev; COPY_MAC_ADDR(wdev->bssid, pNetDev->dev_addr); COPY_MAC_ADDR(wdev->if_addr, pNetDev->dev_addr); RTMP_OS_NETDEV_SET_WDEV(pNetDev, wdev); RTMP_OS_NETDEV_SET_PRIV(pNetDev, pAd); } else #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ { wdev->if_dev = pAd->net_dev; COPY_MAC_ADDR(wdev->bssid, pAd->CurrentAddress); COPY_MAC_ADDR(wdev->if_addr, pAd->CurrentAddress); /* assoc to MBSSID's wdev */ RTMP_OS_NETDEV_SET_WDEV(pAd->net_dev, wdev); RTMP_OS_NETDEV_SET_PRIV(pAd->net_dev, pAd); //reset to INT_MAIN , because SET_PRIV would clear priv_flag RT_DEV_PRIV_FLAGS_SET(pAd->net_dev,INT_MAIN); } /* BC/MC Handling */ wdev->tr_tb_idx = tr_tb_idx; tr_tb_set_mcast_entry(pAd, tr_tb_idx, wdev); /* TX */ wdev->tx_pkt_allowed = ApAllowToSendPacket; wdev->wdev_hard_tx = APHardTransmit; wdev->tx_pkt_handle = APSendPacket; /* RX */ wdev->rx_pkt_allowed = ap_rx_pkt_allow; wdev->rx_pkt_foward = ap_rx_foward_handle; wdev->rx_ps_handle = ap_rx_ps_handle; wdev_bcn_buf_init(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_TRACE, ("%s(): register wdev fail\n", __FUNCTION__)); } wdev->allow_data_tx = TRUE; AsicSetBssid(pAd, wdev->if_addr, 0x1); AsicSetDevMac(pAd, wdev->if_addr, 0x1); DBGPRINT(RT_DEBUG_TRACE, ("New AP BSSID %02x:%02x:%02x:%02x:%02x:%02x (%d)\n", PRINT_MAC(wdev->bssid), pAd->CommonCfg.PhyMode)); RTMPSetPhyMode(pAd, pAd->CommonCfg.PhyMode); #ifdef DOT11_N_SUPPORT if (WMODE_CAP_N(pAd->CommonCfg.PhyMode) && (pAd->Antenna.field.TxPath == 2)) bbp_set_txdac(pAd, 2); else #endif /* DOT11_N_SUPPORT */ bbp_set_txdac(pAd, 0); /* Receiver Antenna selection */ bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath); if(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) { if (WMODE_CAP_N(pAd->CommonCfg.PhyMode) || wdev->bWmmCapable) { /* EDCA parameters used for AP's own transmission */ if (pAd->CommonCfg.APEdcaParm.bValid == FALSE) set_default_ap_edca_param(pAd); /* EDCA parameters to be annouced in outgoing BEACON, used by WMM STA */ if (pAd->ApCfg.BssEdcaParm.bValid == FALSE) set_default_sta_edca_param(pAd); AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm); } else AsicSetEdcaParm(pAd, NULL); } #ifdef DOT11_N_SUPPORT #ifndef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT if (WMODE_CAP_N(pAd->CommonCfg.PhyMode)) pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = BW_20; /* Patch UI */ #endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ AsicSetRDG(pAd, pAd->CommonCfg.bRdg); AsicSetRalinkBurstMode(pAd, pAd->CommonCfg.bRalinkBurstMode); #endif /* DOT11_N_SUPPORT */ //AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s():Reset WCID Table\n", __FUNCTION__)); AsicDelWcidTab(pAd, WCID_ALL); pAd->MacTab.Content[0].Addr[0] = 0x01; pAd->MacTab.Content[0].HTPhyMode.field.MODE = MODE_OFDM; pAd->MacTab.Content[0].HTPhyMode.field.MCS = 3; #ifdef DOT11_N_SUPPORT SetCommonHT(pAd); #endif /* DOT11_N_SUPPORT */ /*In MCC & p2p GO not support VHT now, */ /*change here for support P2P GO 40 BW*/ /* pAd->CommonCfg.vht_bw = 0;*/ if(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_BELOW) pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2; else if (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE) pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2; else pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel,FALSE); AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); #ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT bbp_set_bw(pAd, wdev->bw); #else bbp_set_bw(pAd, pAd->CommonCfg.RegTransmitSetting.field.BW); #endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ AsicBBPAdjust(pAd); //MlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble); //MlmeUpdateTxRates(pAd, FALSE, MIN_NET_DEVICE_FOR_MBSSID); #ifdef RT_CFG80211_P2P_SUPPORT MlmeUpdateTxRates(pAd, FALSE, MIN_NET_DEVICE_FOR_CFG80211_VIF_P2P_GO + apidx); #else MlmeUpdateTxRates(pAd, FALSE, apidx); #endif /*RT_CFG80211_P2P_SUPPORT*/ #ifdef DOT11_N_SUPPORT if (WMODE_CAP_N(pAd->CommonCfg.PhyMode)) MlmeUpdateHtTxRates(pAd, MIN_NET_DEVICE_FOR_MBSSID); #endif /* DOT11_N_SUPPORT */ /* Disable Protection first. */ if (!INFRA_ON(pAd)) AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE); APUpdateCapabilityAndErpIe(pAd); #ifdef DOT11_N_SUPPORT APUpdateOperationMode(pAd); #endif /* DOT11_N_SUPPORT */ CFG80211_UpdateBeacon(pAd, pBeacon->beacon_head, pBeacon->beacon_head_len, pBeacon->beacon_tail, pBeacon->beacon_tail_len, TRUE); #ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT if (INFRA_ON(pAd)) { ULONG BPtoJiffies; LONG timeDiff; INT starttime= pAd->Mlme.channel_1st_staytime; NdisGetSystemUpTime(&pAd->Mlme.BeaconNow32); timeDiff = (pAd->Mlme.BeaconNow32 - pAd->StaCfg.LastBeaconRxTime) % (pAd->CommonCfg.BeaconPeriod); DBGPRINT(RT_DEBUG_TRACE, ("#####pAd->Mlme.Now32 %d pAd->StaCfg.LastBeaconRxTime %d \n",pAd->Mlme.BeaconNow32,pAd->StaCfg.LastBeaconRxTime)); DBGPRINT(RT_DEBUG_TRACE, ("#### timeDiff %d \n",timeDiff)); if (starttime > timeDiff) { OS_WAIT((starttime - timeDiff)); } else{ OS_WAIT((starttime + (pAd->CommonCfg.BeaconPeriod - timeDiff))); } } #endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ /* Enable BSS Sync*/ #ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT if (INFRA_ON(pAd)) { ULONG BPtoJiffies; LONG timeDiff; INT starttime= pAd->Mlme.channel_1st_staytime; NdisGetSystemUpTime(&pAd->Mlme.BeaconNow32); timeDiff = (pAd->Mlme.BeaconNow32 - pAd->StaCfg.LastBeaconRxTime) % (pAd->CommonCfg.BeaconPeriod); DBGPRINT(RT_DEBUG_TRACE, ("#####pAd->Mlme.Now32 %d pAd->StaCfg.LastBeaconRxTime %d \n",pAd->Mlme.BeaconNow32,pAd->StaCfg.LastBeaconRxTime)); DBGPRINT(RT_DEBUG_TRACE, ("#### timeDiff %d \n",timeDiff)); if (starttime > timeDiff) { OS_WAIT((starttime - timeDiff)); } else{ OS_WAIT((starttime + (pAd->CommonCfg.BeaconPeriod - timeDiff))); } } #endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ AsicEnableApBssSync(pAd, pAd->CommonCfg.BeaconPeriod); //pAd->P2pCfg.bSentProbeRSP = TRUE; AsicSetPreTbtt(pAd, TRUE); OPSTATUS_SET_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); RTMP_IndicateMediaState(pAd, NdisMediaStateConnected); return TRUE; }
VOID WDS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps) { INT index; PNET_DEV pWdsNetDev; /* sanity check to avoid redundant virtual interfaces are created */ if (pAd->flg_wds_init != FALSE) return; for(index = 0; index < MAX_WDS_ENTRY; index++) { UINT32 MC_RowID = 0, IoctlIF = 0; RT_802_11_WDS_ENTRY *wds_entry; struct wifi_dev *wdev; char *dev_name; #ifdef MULTIPLE_CARD_SUPPORT MC_RowID = pAd->MC_RowID; #endif /* MULTIPLE_CARD_SUPPORT */ #ifdef HOSTAPD_SUPPORT IoctlIF = pAd->IoctlIF; #endif /* HOSTAPD_SUPPORT */ dev_name = get_dev_name_prefix(pAd, INT_WDS); pWdsNetDev = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_WDS, index, sizeof(struct mt_dev_priv), dev_name); #ifdef HOSTAPD_SUPPORT pAd->IoctlIF = IoctlIF; #endif /* HOSTAPD_SUPPORT */ wds_entry = &pAd->WdsTab.WdsEntry[index]; wdev = &wds_entry->wdev; if (pWdsNetDev == NULL) { /* allocation fail, exit */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (WDS)...\n")); break; } DBGPRINT(RT_DEBUG_TRACE, ("The new WDS interface MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", PRINT_MAC(pAd->MacTab.Content[wds_entry->MacTabMatchWCID].Addr))); NdisZeroMemory(&wds_entry->WdsCounter, sizeof(WDS_COUNTER)); wdev->wdev_type = WDEV_TYPE_WDS; wdev->func_dev = wds_entry; wdev->func_idx = index; wdev->sys_handle = (void *)pAd; wdev->if_dev = pWdsNetDev; wdev->tx_pkt_allowed = ApWdsAllowToSendPacket; // TODO: shiang-usw, modify this to WDSSendPacket wdev->tx_pkt_handle = APSendPacket; wdev->wdev_hard_tx = APHardTransmit; wdev->rx_pkt_allowed = ap_rx_pkt_allow; wdev->rx_pkt_foward = wds_rx_foward_handle; wdev->PhyMode = 0xff; wdev->allow_data_tx = TRUE; // let tx_pkt_allowed() to check it! wdev->PortSecured = WPA_802_1X_PORT_SECURED; NdisMoveMemory(&wdev->if_addr[0], &pNetDevOps->devAddr[0], MAC_ADDR_LEN); RTMP_OS_NETDEV_SET_PRIV(pWdsNetDev, pAd); RTMP_OS_NETDEV_SET_WDEV(pWdsNetDev, wdev); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("Assign wdev idx for %s failed, free net device!\n", RTMP_OS_NETDEV_GET_DEVNAME(pWdsNetDev))); RtmpOSNetDevFree(pWdsNetDev); break; } pNetDevOps->priv_flags = INT_WDS; pNetDevOps->needProtcted = TRUE; pNetDevOps->wdev = wdev; /* Register this device */ RtmpOSNetDevAttach(pAd->OpMode, pWdsNetDev, pNetDevOps); } if (index > 0) pAd->flg_wds_init = TRUE; NdisAllocateSpinLock(pAd, &pAd->WdsTabLock); DBGPRINT(RT_DEBUG_TRACE, ("Total allocated %d WDS interfaces!\n", index)); }
static int usb_rtusb_probe (struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *dev = interface_to_usbdev(intf); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; int i; struct net_device *netdev; int res = -ENOMEM; DBGPRINT(RT_DEBUG_TRACE, "%s-->\n", __FUNCTION__); usb_get_dev(dev); for (i = 0; i < rtusb_usb_id_len; i++) { if (dev->descriptor.idVendor == rtusb_usb_id[i].idVendor && dev->descriptor.idProduct == rtusb_usb_id[i].idProduct) { printk("idVendor = 0x%x, idProduct = 0x%x \n",dev->descriptor.idVendor, dev->descriptor.idProduct); break; } } if (i == rtusb_usb_id_len) { printk("Device Descriptor not matching\n"); return res; } netdev = alloc_etherdev(sizeof(PRTMP_ADAPTER)); if(!netdev) { printk("alloc_etherdev failed\n"); return res; } RTMP_OS_NETDEV_SET_PRIV(netdev,(PVOID)vmalloc(sizeof(RTMP_ADAPTER))); pAd=RTMP_OS_NETDEV_GET_PRIV(netdev); //netdev->priv = (PVOID)vmalloc(sizeof(RTMP_ADAPTER)); //pAd = netdev->priv; if(!pAd) { free_netdev(netdev); printk("vmalloc failed\n"); return res; } NdisZeroMemory(pAd, sizeof(RTMP_ADAPTER)); pAd->net_dev = netdev; netif_stop_queue(netdev); pAd->config = &dev->config->desc; pAd->pUsb_Dev = dev; //--> Benson add 20080505, for Linux_kernel > 2,6,24 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(pAd->net_dev); #endif //<-- Benson end 20080505 ether_setup(pAd->net_dev); netdev->priv_flags = INT_MAIN; netdev->open = usb_rtusb_open; netdev->stop = usb_rtusb_close; //netdev->priv = pAd; netdev->hard_start_xmit = usb_rtusb_sendpkt; netdev->get_stats = rt73_get_ether_stats; #if (WIRELESS_EXT >= 12) #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) netdev->get_wireless_stats = rt73_get_wireless_stats; #endif netdev->wireless_handlers = (struct iw_handler_def *) &rt73_iw_handler_def; #endif netdev->do_ioctl = rt73_ioctl; pAd->net_dev->hard_header_len = 14; pAd->net_dev->mtu = 1500; pAd->net_dev->addr_len = 6; //--> Benson add 20080505, for Linux_kernel > 2,6,24 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) pAd->net_dev->weight = 64; #endif //<-- Benson end 20080505 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); pAd->MLMEThr_pid= THREAD_PID_INIT_VALUE; pAd->RTUSBCmdThr_pid= THREAD_PID_INIT_VALUE; #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) SET_ETHTOOL_OPS(pAd->net_dev, &rt73_ethtool_ops); #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) SET_NETDEV_DEV(pAd->net_dev, &(intf->dev)); #endif {// find available int i=0; char slot_name[IFNAMSIZ]; struct usb_host_interface *iface_desc; struct usb_endpoint_descriptor *endpoint; struct net_device *device; for (i = 0; i < 8; i++) { sprintf(slot_name, "rausb%d", i); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) device = dev_get_by_name(dev_net(netdev), slot_name); #else device = dev_get_by_name(netdev->nd_net, slot_name); #endif #else device = dev_get_by_name(slot_name); #endif if (device == NULL) break; /* fine, the RA name is not used */ else { /* every time dev_get_by_name is called, and it has returned a valid struct net_device*, dev_put should be called afterwards, because otherwise the machine hangs when the device is unregistered (since dev->refcnt > 1). */ dev_put(device); } } if(i == 8) { DBGPRINT(RT_DEBUG_ERROR, "No available slot name\n"); return res; } sprintf(pAd->net_dev->name, "rausb%d", i); DBGPRINT(RT_DEBUG_ERROR, "usb device name %s\n", pAd->net_dev->name); /* get the active interface descriptor */ iface_desc = intf->cur_altsetting; /* check out the endpoint: it has to be Interrupt & IN */ endpoint = &iface_desc->endpoint[i].desc; /* get Max Packet Size from endpoint */ pAd->BulkOutMaxPacketSize = (USHORT)endpoint->wMaxPacketSize; DBGPRINT(RT_DEBUG_TRACE, "BulkOutMaxPacketSize %d\n", pAd->BulkOutMaxPacketSize); } res = register_netdev(pAd->net_dev); if (res) goto out; usb_set_intfdata(intf, pAd); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); if (usb_rtusb_init_device(pAd->net_dev)!=NDIS_STATUS_SUCCESS) goto out; pAd->ProbeFinish = TRUE; //RTUSBBulkReceive(pAd); DBGPRINT(RT_DEBUG_TRACE, "%s<--\n", __FUNCTION__); return 0; out: printk("register_netdev failed err=%d\n",res); free_netdev(netdev); return -1; }
VOID RTMP_CFG80211_VirtualIF_Init( IN VOID *pAdSrc, IN CHAR *pDevName, IN UINT32 DevType) { #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE return; #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; RTMP_OS_NETDEV_OP_HOOK netDevHook, *pNetDevOps; PNET_DEV new_dev_p; APCLI_STRUCT *pApCliEntry; struct wifi_dev *wdev; #ifdef RT_CFG80211_P2P_SUPPORT UINT apidx = CFG_GO_BSSID_IDX; #else UINT apidx = MAIN_MBSSID; #endif /*RT_CFG80211_P2P_SUPPORT*/ CHAR tr_tb_idx = MAX_LEN_OF_MAC_TABLE + apidx; CHAR preIfName[12]; UINT devNameLen = strlen(pDevName); UINT preIfIndex = pDevName[devNameLen-1] - 48; CFG80211_CB *p80211CB = pAd->pCfg80211_CB; struct wireless_dev *pWdev; UINT32 MC_RowID = 0, IoctlIF = 0, Inf = INT_P2P; memset(preIfName, 0, sizeof(preIfName)); NdisCopyMemory(preIfName, pDevName, devNameLen-1); pNetDevOps=&netDevHook; DBGPRINT(RT_DEBUG_TRACE, ("%s ---> (%s, %s, %d)\n", __FUNCTION__, pDevName, preIfName, preIfIndex)); /* init operation functions and flags */ NdisZeroMemory(&netDevHook, sizeof(netDevHook)); netDevHook.open = CFG80211_VirtualIF_Open; /* device opem hook point */ netDevHook.stop = CFG80211_VirtualIF_Close; /* device close hook point */ netDevHook.xmit = CFG80211_VirtualIF_PacketSend; /* hard transmit hook point */ netDevHook.ioctl = CFG80211_VirtualIF_Ioctl; /* ioctl hook point */ #if WIRELESS_EXT >= 12 //netDevHook.iw_handler = (void *)&rt28xx_ap_iw_handler_def; #endif /* WIRELESS_EXT >= 12 */ new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, Inf, preIfIndex, sizeof(PRTMP_ADAPTER), preIfName); if (new_dev_p == NULL) { /* allocation fail, exit */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (CFG80211)...\n")); return; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register CFG80211 I/F (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); } new_dev_p->destructor = free_netdev; RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); pNetDevOps->needProtcted = TRUE; NdisMoveMemory(&pNetDevOps->devAddr[0], &pAd->CurrentAddress[0], MAC_ADDR_LEN); #ifdef MT_MAC INT32 Value; UCHAR MacByte = 0; //TODO: shall we make choosing which byte to be selectable??? Value = 0x00000000L; RTMP_IO_READ32(pAd, LPON_BTEIR, &Value);//read BTEIR bit[31:29] for determine to choose which byte to extend BSSID mac address. Value = Value | (0x2 << 29);//Note: Carter, make default will use byte4 bit[31:28] to extend Mac Address RTMP_IO_WRITE32(pAd, LPON_BTEIR, Value); MacByte = Value >> 29; pNetDevOps->devAddr[0] |= 0x2; switch (MacByte) { case 0x1: /* choose bit[23:20]*/ pNetDevOps->devAddr[2] = (pNetDevOps->devAddr[2] = pNetDevOps->devAddr[2] & 0x0f); break; case 0x2: /* choose bit[31:28]*/ pNetDevOps->devAddr[3] = (pNetDevOps->devAddr[3] = pNetDevOps->devAddr[3] & 0x0f); break; case 0x3: /* choose bit[39:36]*/ pNetDevOps->devAddr[4] = (pNetDevOps->devAddr[4] = pNetDevOps->devAddr[4] & 0x0f); break; case 0x4: /* choose bit [47:44]*/ pNetDevOps->devAddr[5] = (pNetDevOps->devAddr[5] = pNetDevOps->devAddr[5] & 0x0f); break; default: /* choose bit[15:12]*/ pNetDevOps->devAddr[1] = (pNetDevOps->devAddr[1] = pNetDevOps->devAddr[1] & 0x0f); break; } AsicSetDevMac(pAd, pNetDevOps->devAddr, 0x1);//set own_mac to HWBSSID1 #else //CFG_TODO /* Bit1 of MAC address Byte0 is local administration bit and should be set to 1 in extended multiple BSSIDs' Bit3~ of MAC address Byte0 is extended multiple BSSID index. */ if (pAd->chipCap.MBSSIDMode == MBSSID_MODE1) pNetDevOps->devAddr[0] += 2; /* NEW BSSID */ else { #ifdef P2P_ODD_MAC_ADJUST if (pNetDevOps->devAddr[5] & 0x01 == 0x01) pNetDevOps->devAddr[5] -= 1; else #endif /* P2P_ODD_MAC_ADJUST */ pNetDevOps->devAddr[5] += FIRST_MBSSID; } #endif /* MT_MAC */ switch (DevType) { #ifdef CONFIG_STA_SUPPORT case RT_CMD_80211_IFTYPE_MONITOR: DBGPRINT(RT_DEBUG_TRACE, ("CFG80211 I/F Monitor Type\n")); //RTMP_OS_NETDEV_SET_TYPE_MONITOR(new_dev_p); break; case RT_CMD_80211_IFTYPE_P2P_CLIENT: case RT_CMD_80211_IFTYPE_STATION: pApCliEntry = &pAd->ApCfg.ApCliTab[MAIN_MBSSID]; wdev = &pApCliEntry->wdev; wdev->wdev_type = WDEV_TYPE_STA; wdev->func_dev = pApCliEntry; wdev->func_idx = MAIN_MBSSID; wdev->sys_handle = (void *)pAd; wdev->if_dev = new_dev_p; /* TX */ wdev->tx_pkt_allowed = ApCliAllowToSendPacket; wdev->wdev_hard_tx = APHardTransmit; wdev->tx_pkt_handle = APSendPacket; /* RX */ wdev->rx_pkt_allowed = sta_rx_pkt_allow; wdev->rx_pkt_foward = sta_rx_fwd_hnd; RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); RTMP_OS_NETDEV_SET_WDEV(new_dev_p, wdev); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Assign wdev idx for %s failed, free net device!\n", __FUNCTION__,RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); RtmpOSNetDevFree(new_dev_p); break; } /* init MAC address of virtual network interface */ COPY_MAC_ADDR(wdev->if_addr, pNetDevOps->devAddr); break; #endif /*CONFIG_STA_SUPPORT*/ case RT_CMD_80211_IFTYPE_P2P_GO: /* Only ForceGO init from here, Nego as GO init on AddBeacon Ops. */ pNetDevOps->priv_flags = INT_P2P; /* The Behivaor in SetBeacon Ops */ pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; wdev = &pAd->ApCfg.MBSSID[apidx].wdev; wdev->wdev_type = WDEV_TYPE_AP; wdev->func_dev = &pAd->ApCfg.MBSSID[apidx]; wdev->func_idx = apidx; wdev->sys_handle = (void *)pAd; wdev->if_dev = new_dev_p; /* BC/MC Handling */ wdev->tr_tb_idx = tr_tb_idx; tr_tb_set_mcast_entry(pAd, tr_tb_idx, wdev); /* TX */ wdev->tx_pkt_allowed = ApAllowToSendPacket; wdev->wdev_hard_tx = APHardTransmit; wdev->tx_pkt_handle = APSendPacket; /* RX */ wdev->rx_pkt_allowed = ap_rx_pkt_allow; wdev->rx_pkt_foward = ap_rx_foward_handle; wdev->rx_ps_handle = ap_rx_ps_handle; /* for concurrent purpose */ wdev->hw_bssid_idx = CFG_GO_BSSID_IDX; wdev_bcn_buf_init(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); RTMP_OS_NETDEV_SET_WDEV(new_dev_p, wdev); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Assign wdev idx for %s failed, free net device!\n", __FUNCTION__,RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); RtmpOSNetDevFree(new_dev_p); break; } COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.if_addr, pNetDevOps->devAddr); COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.bssid, pNetDevOps->devAddr); break; default: DBGPRINT(RT_DEBUG_ERROR, ("Unknown CFG80211 I/F Type (%d)\n", DevType)); } //CFG_TODO : should be move to VIF_CHG if ((DevType == RT_CMD_80211_IFTYPE_P2P_CLIENT) || (DevType == RT_CMD_80211_IFTYPE_P2P_GO)) { COPY_MAC_ADDR(pAd->cfg80211_ctrl.P2PCurrentAddress, pNetDevOps->devAddr); } pWdev = kzalloc(sizeof(*pWdev), GFP_KERNEL); new_dev_p->ieee80211_ptr = pWdev; pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy; SET_NETDEV_DEV(new_dev_p, wiphy_dev(pWdev->wiphy)); pWdev->netdev = new_dev_p; pWdev->iftype = DevType; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)) COPY_MAC_ADDR(pWdev->address, pNetDevOps->devAddr); #endif /* LINUX_VERSION_CODE: 3.7.0 */ RtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps); //AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); //AsicSetBssid(pAd, wdev->if_addr, 0x1); /* Record the pNetDevice to Cfg80211VifDevList */ RTMP_CFG80211_AddVifEntry(pAd, new_dev_p, DevType); DBGPRINT(RT_DEBUG_TRACE, ("%s <---\n", __FUNCTION__)); }
BOOLEAN CFG80211DRV_OpsChgVirtualInf(RTMP_ADAPTER *pAd, VOID *pData) { PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; UINT newType, oldType; CMD_RTPRIV_IOCTL_80211_VIF_PARM *pVifParm; pVifParm = (CMD_RTPRIV_IOCTL_80211_VIF_PARM *)pData; newType = pVifParm->newIfType; oldType = pVifParm->oldIfType; #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE APCLI_STRUCT *pApCliEntry; struct wifi_dev *wdev; PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; UINT apidx = 1; CHAR tr_tb_idx = MAX_LEN_OF_MAC_TABLE + apidx; printk(" CFG80211DRV_OpsChgVirtualInf newType %d oldType %d \n",newType,oldType); if (strcmp(pVifParm->net_dev->name, "p2p0") == 0) { switch (newType) { case RT_CMD_80211_IFTYPE_MONITOR: DBGPRINT(RT_DEBUG_TRACE, ("CFG80211 I/F Monitor Type\n")); //RTMP_OS_NETDEV_SET_TYPE_MONITOR(new_dev_p); break; case RT_CMD_80211_IFTYPE_STATION: RTMP_CFG80211_RemoveVifEntry(pAd,cfg80211_ctrl->dummy_p2p_net_dev); RTMP_CFG80211_AddVifEntry(pAd, cfg80211_ctrl->dummy_p2p_net_dev, newType); AsicSetBssid(pAd, pAd->cfg80211_ctrl.P2PCurrentAddress, 0x1); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); break; case RT_CMD_80211_IFTYPE_P2P_CLIENT: pAd->ApCfg.ApCliTab[MAIN_MBSSID].wdev.if_dev = NULL; pApCliEntry = &pAd->ApCfg.ApCliTab[MAIN_MBSSID]; pApCliEntry->wdev.if_dev= cfg80211_ctrl->dummy_p2p_net_dev; wdev = &pApCliEntry->wdev; wdev->wdev_type = WDEV_TYPE_STA; wdev->func_dev = pApCliEntry; wdev->sys_handle = (void *)pAd; DBGPRINT(RT_DEBUG_TRACE, ("ApCli_Open\n")); RTMP_CFG80211_RemoveVifEntry(pAd,cfg80211_ctrl->dummy_p2p_net_dev); /* TX */ RTMP_CFG80211_AddVifEntry(pAd, cfg80211_ctrl->dummy_p2p_net_dev, newType); wdev->tx_pkt_allowed = ApCliAllowToSendPacket; wdev->wdev_hard_tx = APHardTransmit; wdev->tx_pkt_handle = APSendPacket; /* RX */ wdev->rx_pkt_allowed = sta_rx_pkt_allow; wdev->rx_pkt_foward = sta_rx_fwd_hnd; RTMP_OS_NETDEV_SET_PRIV(cfg80211_ctrl->dummy_p2p_net_dev, pAd); RTMP_OS_NETDEV_SET_WDEV(cfg80211_ctrl->dummy_p2p_net_dev, wdev); COPY_MAC_ADDR(wdev->if_addr,pAd->cfg80211_ctrl.P2PCurrentAddress); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Assign wdev idx for %s failed, free net device!\n", __FUNCTION__,RTMP_OS_NETDEV_GET_DEVNAME(cfg80211_ctrl->dummy_p2p_net_dev))); RtmpOSNetDevFree(cfg80211_ctrl->dummy_p2p_net_dev); break; } pAd->flg_apcli_init = TRUE; ApCli_Open(pAd, cfg80211_ctrl->dummy_p2p_net_dev); // COPY_MAC_ADDR(wdev->if_addr,pAd->cfg80211_ctrl.P2PCurrentAddress); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); break; case RT_CMD_80211_IFTYPE_P2P_GO: // pNetDevOps->priv_flags = INT_P2P; /* The Behivaor in SetBeacon Ops */ pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; wdev = &pAd->ApCfg.MBSSID[apidx].wdev; wdev->wdev_type = WDEV_TYPE_AP; wdev->func_dev = &pAd->ApCfg.MBSSID[apidx]; wdev->func_idx = apidx; wdev->sys_handle = (void *)pAd; wdev->if_dev = cfg80211_ctrl->dummy_p2p_net_dev; /* BC/MC Handling */ wdev->tr_tb_idx = tr_tb_idx; tr_tb_set_mcast_entry(pAd, tr_tb_idx, wdev); RTMP_CFG80211_RemoveVifEntry(pAd,cfg80211_ctrl->dummy_p2p_net_dev); /* TX */ RTMP_CFG80211_AddVifEntry(pAd, cfg80211_ctrl->dummy_p2p_net_dev, newType); // RT_MOD_INC_USE_COUNT(); /* TX */ wdev->tx_pkt_allowed = ApAllowToSendPacket; wdev->wdev_hard_tx = APHardTransmit; wdev->tx_pkt_handle = APSendPacket; /* RX */ wdev->rx_pkt_allowed = ap_rx_pkt_allow; wdev->rx_pkt_foward = ap_rx_foward_handle; wdev->rx_ps_handle = ap_rx_ps_handle; // RTMP_OS_NETDEV_START_QUEUE(cfg80211_ctrl->dummy_p2p_net_dev); RTMP_OS_NETDEV_SET_PRIV(cfg80211_ctrl->dummy_p2p_net_dev, pAd); RTMP_OS_NETDEV_SET_WDEV(cfg80211_ctrl->dummy_p2p_net_dev, wdev); wdev_bcn_buf_init(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); RTMP_OS_NETDEV_SET_PRIV(cfg80211_ctrl->dummy_p2p_net_dev, pAd); RTMP_OS_NETDEV_SET_WDEV(cfg80211_ctrl->dummy_p2p_net_dev, wdev); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Assign wdev idx for %s failed, free net device!\n", __FUNCTION__,RTMP_OS_NETDEV_GET_DEVNAME(cfg80211_ctrl->dummy_p2p_net_dev))); RtmpOSNetDevFree(cfg80211_ctrl->dummy_p2p_net_dev); break; } COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.if_addr, pAd->cfg80211_ctrl.P2PCurrentAddress); COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.bssid, pAd->cfg80211_ctrl.P2PCurrentAddress); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); break; default: DBGPRINT(RT_DEBUG_ERROR, ("Unknown CFG80211 I/F Type (%d)\n", newType)); } } if ((newType == RT_CMD_80211_IFTYPE_STATION) && (oldType == RT_CMD_80211_IFTYPE_P2P_CLIENT) && (pAd->flg_apcli_init == TRUE)) { DBGPRINT(RT_DEBUG_TRACE, ("ApCli_Close\n")); CFG80211OS_ScanEnd(pAd->pCfg80211_CB, TRUE); // RT_MOD_DEC_USE_COUNT(); pAd->flg_apcli_init = FALSE; RT_MOD_INC_USE_COUNT(); printk("iverson ApCli_Close \n"); AsicSetBssid(pAd, pAd->cfg80211_ctrl.P2PCurrentAddress, 0x1); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_STATION; return ApCli_Close(pAd, cfg80211_ctrl->dummy_p2p_net_dev); } else if ((newType == RT_CMD_80211_IFTYPE_STATION) && (oldType == RT_CMD_80211_IFTYPE_P2P_GO)) { DBGPRINT(RT_DEBUG_TRACE, ("GOi_Close\n")); wdev_bcn_buf_deinit(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); AsicSetBssid(pAd, pAd->cfg80211_ctrl.P2PCurrentAddress, 0x1); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); // rtmp_wdev_idx_unreg(pAd, Wdev); // Wdev->if_dev = NULL; } #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE #ifndef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE /* After P2P NEGO phase, the device type may be change from GC to GO or no change. We remove the GC in VIF list if nego as GO case. */ if ((newType == RT_CMD_80211_IFTYPE_P2P_GO) && (oldType == RT_CMD_80211_IFTYPE_P2P_CLIENT)) { RTMP_CFG80211_VirtualIF_CancelP2pClient(pAd); } #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ #ifdef RT_CFG80211_P2P_SINGLE_DEVICE CFG80211DBG(RT_DEBUG_TRACE, ("80211> @@@ Change from %u to %u Mode\n",oldType,newType)); pCfg80211_ctrl->P2POpStatusFlags = CFG_P2P_DISABLE; if (newType == RT_CMD_80211_IFTYPE_P2P_CLIENT) { pCfg80211_ctrl->P2POpStatusFlags = CFG_P2P_CLI_UP; } else if (newType == RT_CMD_80211_IFTYPE_P2P_GO) { pCfg80211_ctrl->P2POpStatusFlags = CFG_P2P_GO_UP; } #endif /* RT_CFG80211_P2P_SINGLE_DEVICE */ /* Change Device Type */ #ifdef CONFIG_STA_SUPPORT if (newType == RT_CMD_80211_IFTYPE_ADHOC) { #ifdef DOT11_N_SUPPORT SetCommonHT(pAd); #endif /* DOT11_N_SUPPORT */ pAd->StaCfg.BssType = BSS_ADHOC; } else #endif /* CONFIG_STA_SUPPORT */ if ((newType == RT_CMD_80211_IFTYPE_STATION) || (newType == RT_CMD_80211_IFTYPE_P2P_CLIENT)) { CFG80211DBG(RT_DEBUG_TRACE, ("80211> Change the Interface to STA Mode\n")); #ifdef CONFIG_STA_SUPPORT if ((oldType == RT_CMD_80211_IFTYPE_ADHOC) && (newType == RT_CMD_80211_IFTYPE_STATION)) { /* DeviceType Change from adhoc to infra, only in StaCfg. CFG Todo: It should not bind by device. */ pAd->StaCfg.BssType = BSS_INFRA; } #endif /* CONFIG_STA_SUPPORT */ #ifdef CONFIG_AP_SUPPORT if (pAd->cfg80211_ctrl.isCfgInApMode == RT_CMD_80211_IFTYPE_AP) CFG80211DRV_DisableApInterface(pAd); #endif /* CONFIG_AP_SUPPORT */ pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_STATION; } else if ((newType == RT_CMD_80211_IFTYPE_AP) || (newType == RT_CMD_80211_IFTYPE_P2P_GO)) { CFG80211DBG(RT_DEBUG_TRACE, ("80211> Change the Interface to AP Mode\n")); pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; } #ifdef CONFIG_STA_SUPPORT else if (newType == RT_CMD_80211_IFTYPE_MONITOR) { /* set packet filter */ Set_NetworkType_Proc(pAd, "Monitor"); if (pVifParm->MonFilterFlag != 0) { UINT32 Filter = 0; #ifndef MT_MAC if (pAd->chipCap.hif_type != HIF_MT) { RTMP_IO_READ32(pAd, RX_FILTR_CFG, &Filter); if ((pVifParm->MonFilterFlag & RT_CMD_80211_FILTER_FCSFAIL) == RT_CMD_80211_FILTER_FCSFAIL) { Filter = Filter & (~0x01); } else { Filter = Filter | 0x01; } if ((pVifParm->MonFilterFlag & RT_CMD_80211_FILTER_PLCPFAIL) == RT_CMD_80211_FILTER_PLCPFAIL) { Filter = Filter & (~0x02); } else { Filter = Filter | 0x02; } if ((pVifParm->MonFilterFlag & RT_CMD_80211_FILTER_CONTROL) == RT_CMD_80211_FILTER_CONTROL) { Filter = Filter & (~0xFF00); } else { Filter = Filter | 0xFF00; } if ((pVifParm->MonFilterFlag & RT_CMD_80211_FILTER_OTHER_BSS) == RT_CMD_80211_FILTER_OTHER_BSS) { Filter = Filter & (~0x08); } else { Filter = Filter | 0x08; } RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Filter); } #endif /* MT_MAC */ pVifParm->MonFilterFlag = Filter; } } #endif /*CONFIG_STA_SUPPORT*/ if ((newType == RT_CMD_80211_IFTYPE_P2P_CLIENT) || (newType == RT_CMD_80211_IFTYPE_P2P_GO)) { COPY_MAC_ADDR(pAd->cfg80211_ctrl.P2PCurrentAddress, pVifParm->net_dev->dev_addr); } else { #ifdef RT_CFG80211_P2P_SUPPORT pCfg80211_ctrl->bP2pCliPmEnable = FALSE; pCfg80211_ctrl->bPreKeepSlient = FALSE; pCfg80211_ctrl->bKeepSlient = FALSE; pCfg80211_ctrl->NoAIndex = MAX_LEN_OF_MAC_TABLE; pCfg80211_ctrl->MyGOwcid = MAX_LEN_OF_MAC_TABLE; pCfg80211_ctrl->CTWindows= 0; /* CTWindows and OppPS parameter field */ #endif /* RT_CFG80211_P2P_SUPPORT */ } if(pCfg80211_ctrl == NULL) CFG80211DBG(RT_DEBUG_TRACE, ("(%s)pCfg80211_ctrl is null",__FUNCTION__)); return TRUE; }
/* ======================================================================== Routine Description: Initialize Multi-BSS function. Arguments: pAd points to our adapter pDevMain 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. 3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat, it will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again. ======================================================================== */ VOID RT28xx_MBSS_Init( IN PRTMP_ADAPTER pAd, IN PNET_DEV pDevMain) { #define MBSS_MAX_DEV_NUM 32 PNET_DEV pDevNew; INT32 IdBss, MaxNumBss; INT status; RTMP_OS_NETDEV_OP_HOOK netDevHook; /* sanity check to avoid redundant virtual interfaces are created */ if (pAd->FlgMbssInit != FALSE) return; /* End of if */ /* init */ MaxNumBss = pAd->ApCfg.BssidNum; if (MaxNumBss > MAX_MBSSID_NUM) MaxNumBss = MAX_MBSSID_NUM; /* End of if */ /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ for(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM; IdBss++) pAd->ApCfg.MBSSID[IdBss].MSSIDDev = NULL; /* End of for */ /* create virtual network interface */ for(IdBss=FIRST_MBSSID; IdBss<MaxNumBss; IdBss++) { pDevNew = RtmpOSNetDevCreate(pAd, INT_MBSSID, IdBss, sizeof(PRTMP_ADAPTER), INF_MBSSID_DEV_NAME); if (pDevNew == NULL) { /* allocation fail, exit */ pAd->ApCfg.BssidNum = IdBss; /* re-assign new MBSS number */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (MBSS)...\n")); break; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register MBSSID IF (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); } RTMP_OS_NETDEV_SET_PRIV(pDevNew, pAd); /* init operation functions and flags */ NdisZeroMemory(&netDevHook, sizeof(netDevHook)); netDevHook.open = MBSS_VirtualIF_Open; // device opem hook point netDevHook.stop = MBSS_VirtualIF_Close; // device close hook point netDevHook.xmit = MBSS_VirtualIF_PacketSend; // hard transmit hook point netDevHook.ioctl = MBSS_VirtualIF_Ioctl; // ioctl hook point netDevHook.priv_flags = INT_MBSSID; // We are virtual interface netDevHook.needProtcted = TRUE; /* Init MAC address of virtual network interface */ NdisMoveMemory(&netDevHook.devAddr[0], &pAd->ApCfg.MBSSID[IdBss].Bssid[0], MAC_ADDR_LEN); /* backup our virtual network interface */ pAd->ApCfg.MBSSID[IdBss].MSSIDDev = pDevNew; /* register this device to OS */ status = RtmpOSNetDevAttach(pDevNew, &netDevHook); } pAd->FlgMbssInit = TRUE; }
/* ======================================================================== Routine Description: Initialize Multi-BSS function. Arguments: pAd points to our adapter pDevMain 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. 3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat, it will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again. ======================================================================== */ VOID MBSS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps) { #define MBSS_MAX_DEV_NUM 32 PNET_DEV pDevNew; INT32 IdBss, MaxNumBss; INT status; RTMP_OS_NETDEV_OP_HOOK netDevHook; /* sanity check to avoid redundant virtual interfaces are created */ if (pAd->FlgMbssInit != FALSE) return; MaxNumBss = pAd->ApCfg.BssidNum; if (MaxNumBss > MAX_MBSSID_NUM(pAd)) MaxNumBss = MAX_MBSSID_NUM(pAd); /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ for(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM(pAd); IdBss++) pAd->ApCfg.MBSSID[IdBss].wdev.if_dev = NULL; /* create virtual network interface */ for(IdBss=FIRST_MBSSID; IdBss<MaxNumBss; IdBss++) { struct wifi_dev *wdev; UINT32 MC_RowID = 0, IoctlIF = 0; char *dev_name; #ifdef MULTIPLE_CARD_SUPPORT MC_RowID = pAd->MC_RowID; #endif /* MULTIPLE_CARD_SUPPORT */ #ifdef HOSTAPD_SUPPORT IoctlIF = pAd->IoctlIF; #endif /* HOSTAPD_SUPPORT */ dev_name = get_dev_name_prefix(pAd, INT_MBSSID); pDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MBSSID, IdBss, sizeof(struct mt_dev_priv), dev_name); #ifdef HOSTAPD_SUPPORT pAd->IoctlIF = IoctlIF; #endif /* HOSTAPD_SUPPORT */ if (pDevNew == NULL) { pAd->ApCfg.BssidNum = IdBss; /* re-assign new MBSS number */ break; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register MBSSID IF (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); } wdev = &pAd->ApCfg.MBSSID[IdBss].wdev; wdev->wdev_type = WDEV_TYPE_AP; wdev->func_dev = &pAd->ApCfg.MBSSID[IdBss]; wdev->sys_handle = (void *)pAd; wdev->if_dev = pDevNew; if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("Assign wdev idx for %s failed, free net device!\n", RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); RtmpOSNetDevFree(pDevNew); break; } wdev->tx_pkt_allowed = ApAllowToSendPacket; RTMP_OS_NETDEV_SET_PRIV(pDevNew, pAd); RTMP_OS_NETDEV_SET_WDEV(pDevNew, wdev); /* init operation functions and flags */ NdisCopyMemory(&netDevHook, pNetDevOps, sizeof(netDevHook)); netDevHook.priv_flags = INT_MBSSID; netDevHook.needProtcted = TRUE; netDevHook.wdev = wdev; /* Init MAC address of virtual network interface */ NdisMoveMemory(&netDevHook.devAddr[0], &wdev->bssid[0], MAC_ADDR_LEN); /* register this device to OS */ status = RtmpOSNetDevAttach(pAd->OpMode, pDevNew, &netDevHook); } pAd->FlgMbssInit = TRUE; }