1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#ifdef BLOCK_NET_IF
28
29#include "../rt_config.h"
30#include "../netif_block.h"
31
32
33static NETIF_ENTRY freeNetIfEntryPool[FREE_NETIF_POOL_SIZE];
34static LIST_HEADER freeNetIfEntryList;
35
36void initblockQueueTab(
37 IN PRTMP_ADAPTER pAd)
38{
39 int i;
40
41 initList(&freeNetIfEntryList);
42 for (i = 0; i < FREE_NETIF_POOL_SIZE; i++)
43 insertTailList(&freeNetIfEntryList, (PLIST_ENTRY)&freeNetIfEntryPool[i]);
44
45 for (i=0; i < NUM_OF_TX_RING; i++)
46 initList(&pAd->blockQueueTab[i].NetIfList);
47
48 return;
49}
50
51BOOLEAN blockNetIf(
52 IN PBLOCK_QUEUE_ENTRY pBlockQueueEntry,
53 IN PNET_DEV pNetDev)
54{
55 PNETIF_ENTRY pNetIfEntry = NULL;
56
57 if ((pNetIfEntry = (PNETIF_ENTRY)removeHeadList(&freeNetIfEntryList)) != NULL)
58 {
59 RTMP_OS_NETDEV_STOP_QUEUE(pNetDev);
60 pNetIfEntry->pNetDev = pNetDev;
61 insertTailList(&pBlockQueueEntry->NetIfList, (PLIST_ENTRY)pNetIfEntry);
62
63 pBlockQueueEntry->SwTxQueueBlockFlag = TRUE;
64 DBGPRINT(RT_DEBUG_TRACE, ("RTMP_OS_NETDEV_STOP_QUEUE(%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pNetDev)));
65 }
66 else
67 return FALSE;
68
69 return TRUE;
70}
71
72VOID releaseNetIf(
73 IN PBLOCK_QUEUE_ENTRY pBlockQueueEntry)
74{
75 PNETIF_ENTRY pNetIfEntry = NULL;
76 PLIST_HEADER pNetIfList = &pBlockQueueEntry->NetIfList;
77
78 while((pNetIfEntry = (PNETIF_ENTRY)removeHeadList(pNetIfList)) != NULL)
79 {
80 PNET_DEV pNetDev = pNetIfEntry->pNetDev;
81 RTMP_OS_NETDEV_WAKE_QUEUE(pNetDev);
82 insertTailList(&freeNetIfEntryList, (PLIST_ENTRY)pNetIfEntry);
83
84 DBGPRINT(RT_DEBUG_TRACE, ("RTMP_OS_NETDEV_WAKE_QUEUE(%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pNetDev)));
85 }
86 pBlockQueueEntry->SwTxQueueBlockFlag = FALSE;
87 return;
88}
89
90
91VOID StopNetIfQueue(
92 IN PRTMP_ADAPTER pAd,
93 IN UCHAR QueIdx,
94 IN PNDIS_PACKET pPacket)
95{
96 PNET_DEV NetDev = NULL;
97 UCHAR IfIdx = 0;
98 BOOLEAN valid = FALSE;
99
100#ifdef APCLI_SUPPORT
101 if (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_APCLI)
102 {
103 IfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_APCLI) % MAX_APCLI_NUM;
104 NetDev = pAd->ApCfg.ApCliTab[IfIdx].dev;
105 }
106 else
107#endif
108#ifdef WDS_SUPPORT
109 if (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_WDS)
110 {
111 IfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_WDS) % MAX_WDS_ENTRY;
112 NetDev = pAd->WdsTab.WdsEntry[IfIdx].dev;
113 }
114 else
115#endif
116 {
117#ifdef MBSS_SUPPORT
118 if (pAd->OpMode == OPMODE_AP)
119 {
120 IfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_MBSSID) % MAX_MBSSID_NUM;
121 NetDev = pAd->ApCfg.MBSSID[IfIdx].MSSIDDev;
122 }
123 else
124 {
125 IfIdx = MAIN_MBSSID;
126 NetDev = pAd->net_dev;
127 }
128#else
129 IfIdx = MAIN_MBSSID;
130 NetDev = pAd->net_dev;
131#endif
132 }
133
134
135
136
137#ifdef CONFIG_STA_SUPPORT
138 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
139 valid = (pAd->CommonCfg.bWmmCapable == TRUE) ? FALSE : TRUE;
140#endif
141
142 if (valid)
143 blockNetIf(&pAd->blockQueueTab[QueIdx], NetDev);
144 return;
145}
146
147#endif
148