1 #include "p2p_precomp.h"
5 p2pStateInit_IDLE(IN P_ADAPTER_T prAdapter
,
6 IN P_P2P_FSM_INFO_T prP2pFsmInfo
,
7 IN P_BSS_INFO_T prP2pBssInfo
, OUT P_ENUM_P2P_STATE_T peNextState
)
9 BOOLEAN fgIsTransOut
= FALSE
;
10 /* P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T)NULL; */
13 ASSERT_BREAK((prAdapter
!= NULL
) &&
14 (prP2pFsmInfo
!= NULL
) &&
15 (prP2pBssInfo
!= NULL
) && (peNextState
!= NULL
));
17 if ((prP2pBssInfo
->eIntendOPMode
== OP_MODE_ACCESS_POINT
)
18 && IS_NET_PWR_STATE_ACTIVE(prAdapter
, NETWORK_TYPE_P2P_INDEX
)) {
19 P_P2P_CHNL_REQ_INFO_T prChnlReqInfo
= &(prP2pFsmInfo
->rChnlReqInfo
);
22 prChnlReqInfo
->eChannelReqType
= CHANNEL_REQ_TYPE_GO_START_BSS
;
23 *peNextState
= P2P_STATE_REQING_CHANNEL
;
28 if (IS_NET_PWR_STATE_ACTIVE(prAdapter
, NETWORK_TYPE_P2P_INDEX
)) {
30 ASSERT((prP2pBssInfo
->eCurrentOPMode
== OP_MODE_ACCESS_POINT
) ||
31 (prP2pBssInfo
->eCurrentOPMode
== OP_MODE_INFRASTRUCTURE
));
33 prChnlReqInfo
= &prP2pFsmInfo
->rChnlReqInfo
;
35 if (prChnlReqInfo
->fgIsChannelRequested
) {
36 /* Start a timer for return channel. */
37 DBGLOG(P2P
, TRACE
, ("start a GO channel timer.\n"));
42 cnmTimerStartTimer(prAdapter
, &(prP2pFsmInfo
->rP2pFsmTimeoutTimer
), 5000);
48 } /* p2pStateInit_IDLE */
52 p2pStateAbort_IDLE(IN P_ADAPTER_T prAdapter
,
53 IN P_P2P_FSM_INFO_T prP2pFsmInfo
, IN ENUM_P2P_STATE_T eNextState
)
56 P_P2P_CHNL_REQ_INFO_T prChnlReqInfo
= (P_P2P_CHNL_REQ_INFO_T
) NULL
;
59 ASSERT_BREAK((prAdapter
!= NULL
) && (prP2pFsmInfo
!= NULL
));
61 prChnlReqInfo
= &prP2pFsmInfo
->rChnlReqInfo
;
64 if (prChnlReqInfo
->fgIsChannelRequested
) {
65 /* Release channel before timeout. */
66 p2pFuncReleaseCh(prAdapter
, prChnlReqInfo
);
70 /* Stop timer for leaving this state. */
71 cnmTimerStopTimer(prAdapter
, &(prP2pFsmInfo
->rP2pFsmTimeoutTimer
));
76 } /* p2pStateAbort_IDLE */
81 p2pStateInit_CHNL_ON_HAND(IN P_ADAPTER_T prAdapter
,
82 IN P_BSS_INFO_T prP2pBssInfo
, IN P_P2P_FSM_INFO_T prP2pFsmInfo
)
84 P_P2P_CHNL_REQ_INFO_T prChnlReqInfo
= (P_P2P_CHNL_REQ_INFO_T
) NULL
;
87 ASSERT_BREAK((prAdapter
!= NULL
) && (prP2pFsmInfo
!= NULL
));
89 prChnlReqInfo
= &(prP2pFsmInfo
->rChnlReqInfo
);
91 /* Store the original channel info. */
92 prChnlReqInfo
->ucOriChnlNum
= prP2pBssInfo
->ucPrimaryChannel
;
93 prChnlReqInfo
->eOriBand
= prP2pBssInfo
->eBand
;
94 prChnlReqInfo
->eOriChnlSco
= prP2pBssInfo
->eBssSCO
;
96 /* RX Probe Request would check primary channel. */
97 prP2pBssInfo
->ucPrimaryChannel
= prChnlReqInfo
->ucReqChnlNum
;
98 prP2pBssInfo
->eBand
= prChnlReqInfo
->eBand
;
99 prP2pBssInfo
->eBssSCO
= prChnlReqInfo
->eChnlSco
;
102 DBGLOG(P2P
, TRACE
, ("start a channel on hand timer.\n"));
103 cnmTimerStartTimer(prAdapter
,
104 &(prP2pFsmInfo
->rP2pFsmTimeoutTimer
),
105 prChnlReqInfo
->u4MaxInterval
);
107 kalP2PIndicateChannelReady(prAdapter
->prGlueInfo
,
108 prChnlReqInfo
->u8Cookie
,
109 prChnlReqInfo
->ucReqChnlNum
,
110 prChnlReqInfo
->eBand
,
111 prChnlReqInfo
->eChnlSco
, prChnlReqInfo
->u4MaxInterval
);
116 } /* p2pStateInit_CHNL_ON_HAND */
120 p2pStateAbort_CHNL_ON_HAND(IN P_ADAPTER_T prAdapter
,
121 IN P_P2P_FSM_INFO_T prP2pFsmInfo
,
122 IN P_BSS_INFO_T prP2pBssInfo
, IN ENUM_P2P_STATE_T eNextState
)
124 P_P2P_CHNL_REQ_INFO_T prChnlReqInfo
= (P_P2P_CHNL_REQ_INFO_T
) NULL
;
128 ASSERT_BREAK((prAdapter
!= NULL
) && (prP2pFsmInfo
!= NULL
));
130 prChnlReqInfo
= &(prP2pFsmInfo
->rChnlReqInfo
);
132 cnmTimerStopTimer(prAdapter
, &(prP2pFsmInfo
->rP2pFsmTimeoutTimer
));
134 /* Restore the original channel info. */
135 prP2pBssInfo
->ucPrimaryChannel
= prChnlReqInfo
->ucOriChnlNum
;
136 prP2pBssInfo
->eBand
= prChnlReqInfo
->eOriBand
;
137 prP2pBssInfo
->eBssSCO
= prChnlReqInfo
->eOriChnlSco
;
139 if (eNextState
!= P2P_STATE_CHNL_ON_HAND
) {
140 /* Indicate channel return. */
141 kalP2PIndicateChannelExpired(prAdapter
->prGlueInfo
,
142 &prP2pFsmInfo
->rChnlReqInfo
);
144 /* Return Channel. */
145 p2pFuncReleaseCh(prAdapter
, &(prP2pFsmInfo
->rChnlReqInfo
));
150 } /* p2pStateAbort_CHNL_ON_HAND */
154 p2pStateAbort_REQING_CHANNEL(IN P_ADAPTER_T prAdapter
,
155 IN P_P2P_FSM_INFO_T prP2pFsmInfo
, IN ENUM_P2P_STATE_T eNextState
)
157 P_BSS_INFO_T prP2pBssInfo
= (P_BSS_INFO_T
) NULL
;
158 P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo
= (P_P2P_SPECIFIC_BSS_INFO_T
) NULL
;
162 ASSERT_BREAK((prAdapter
!= NULL
) &&
163 (prP2pFsmInfo
!= NULL
) && (eNextState
< P2P_STATE_NUM
));
165 prP2pBssInfo
= &(prAdapter
->rWifiVar
.arBssInfo
[NETWORK_TYPE_P2P_INDEX
]);
166 prP2pSpecificBssInfo
= prAdapter
->rWifiVar
.prP2pSpecificBssInfo
;
168 if (eNextState
== P2P_STATE_IDLE
) {
169 if (prP2pBssInfo
->eIntendOPMode
== OP_MODE_ACCESS_POINT
) {
170 /* Intend to be AP. */
171 /* Setup for AP mode. */
173 p2pFuncStartGO(prAdapter
,
175 prP2pSpecificBssInfo
->aucGroupSsid
,
176 prP2pSpecificBssInfo
->u2GroupSsidLen
,
177 prP2pSpecificBssInfo
->ucPreferredChannel
,
178 prP2pSpecificBssInfo
->eRfBand
,
179 prP2pSpecificBssInfo
->eRfSco
,
180 prP2pFsmInfo
->fgIsApMode
);
183 /* Return Channel. */
184 p2pFuncReleaseCh(prAdapter
, &(prP2pFsmInfo
->rChnlReqInfo
));
193 } /* p2pStateInit_AP_CHANNEL_DETECT */
197 p2pStateAbort_AP_CHANNEL_DETECT(IN P_ADAPTER_T prAdapter
,
198 IN P_P2P_FSM_INFO_T prP2pFsmInfo
,
199 IN P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo
,
200 IN ENUM_P2P_STATE_T eNextState
)
202 P_P2P_CHNL_REQ_INFO_T prChnlReqInfo
= (P_P2P_CHNL_REQ_INFO_T
) NULL
;
203 P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings
= (P_P2P_CONNECTION_SETTINGS_T
) NULL
;
207 if (eNextState
== P2P_STATE_REQING_CHANNEL
) {
208 UINT_8 ucPreferedChnl
= 0;
209 ENUM_BAND_T eBand
= BAND_NULL
;
210 ENUM_CHNL_EXT_T eSco
= CHNL_EXT_SCN
;
212 prChnlReqInfo
= &(prP2pFsmInfo
->rChnlReqInfo
);
214 /* Determine the channel for AP. */
215 if (cnmPreferredChannel(prAdapter
, &eBand
, &ucPreferedChnl
, &eSco
) == FALSE
) {
217 prP2pConnSettings
= prAdapter
->rWifiVar
.prP2PConnSettings
;
219 ucPreferedChnl
= prP2pConnSettings
->ucOperatingChnl
;
220 if ((ucPreferedChnl
) == 0) {
222 if (scnQuerySparseChannel
223 (prAdapter
, &eBand
, &ucPreferedChnl
) == FALSE
) {
227 /* TODO: Pick up a valid channel from channel list. */
234 prChnlReqInfo
->eChannelReqType
= CHANNEL_REQ_TYPE_GO_START_BSS
;
235 prChnlReqInfo
->ucReqChnlNum
= prP2pSpecificBssInfo
->ucPreferredChannel
=
237 prChnlReqInfo
->eBand
= prP2pSpecificBssInfo
->eRfBand
= eBand
;
238 prChnlReqInfo
->eChnlSco
= prP2pSpecificBssInfo
->eRfSco
= eSco
;
240 /* p2pFuncCancelScan(prAdapter, &(prP2pFsmInfo->rScanReqInfo)); */
247 } /* p2pStateAbort_AP_CHANNEL_DETECT */
257 /*----------------------------------------------------------------------------*/
259 * @brief Process of JOIN Abort. Leave JOIN State & Abort JOIN.
265 /*----------------------------------------------------------------------------*/
267 p2pStateAbort_GC_JOIN(IN P_ADAPTER_T prAdapter
,
268 IN P_P2P_FSM_INFO_T prP2pFsmInfo
,
269 IN P_P2P_JOIN_INFO_T prJoinInfo
, IN ENUM_P2P_STATE_T eNextState
)
271 P_MSG_JOIN_ABORT_T prJoinAbortMsg
= (P_MSG_JOIN_ABORT_T
) NULL
;
275 ASSERT_BREAK((prAdapter
!= NULL
) && (prP2pFsmInfo
!= NULL
) && (prJoinInfo
!= NULL
));
277 if (prJoinInfo
->fgIsJoinComplete
== FALSE
) {
280 (P_MSG_JOIN_ABORT_T
) cnmMemAlloc(prAdapter
, RAM_TYPE_MSG
,
281 sizeof(MSG_JOIN_ABORT_T
));
282 if (!prJoinAbortMsg
) {
284 ("Fail to allocate join abort message buffer\n"));
289 prJoinAbortMsg
->rMsgHdr
.eMsgId
= MID_P2P_SAA_FSM_ABORT
;
290 prJoinAbortMsg
->ucSeqNum
= prJoinInfo
->ucSeqNumOfReqMsg
;
291 prJoinAbortMsg
->prStaRec
= prJoinInfo
->prTargetStaRec
;
293 mboxSendMsg(prAdapter
,
294 MBOX_ID_0
, (P_MSG_HDR_T
) prJoinAbortMsg
, MSG_SEND_METHOD_BUF
);
298 /* Stop Join Timer. */
299 cnmTimerStopTimer(prAdapter
, &(prP2pFsmInfo
->rP2pFsmTimeoutTimer
));
301 /* Release channel requested. */
302 p2pFuncReleaseCh(prAdapter
, &(prP2pFsmInfo
->rChnlReqInfo
));
308 } /* p2pStateAbort_GC_JOIN */