• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * roamingMngr_manualSM.c
3  *
4  * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  *  * Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  *  * Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  *  * Neither the name Texas Instruments nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 /** \file roamingMngr_manualSM.c
35  *  \brief Roaming Manager
36  *
37  *  \see roamingMngr_manualSM.h
38  */
39 
40 /****************************************************************************
41  *                                                                          *
42  *   MODULE:  Roaming Manager                                               *
43  *   PURPOSE:                                                               *
44  *   Roaming manager is responsible to receive Roaming triggers and try
45  *      to select a better AP.
46  *      The Roaming triggers are: Low RSSI, PER, consecutive No ACK on TX,
47  *      beacon Missed or External request.
48  *      In each Internal Roaming request, scan is performed and selection for
49  *      better AP. Better AP is defined as a different AP with better RSSI,
50  *      and similar SSID and security settings.
51  *      If better AP is found, there is a check for fast-roaming via the
52  *      Supplicant. Then connection to the new AP is invoked.
53  *                                                                          *
54  ****************************************************************************/
55 
56 #define __FILE_ID__  FILE_ID_136
57 #include "osApi.h"
58 #include "paramOut.h"
59 #include "report.h"
60 #include "scanMngrApi.h"
61 #include "roamingMngrApi.h"
62 #include "roamingMngrTypes.h"
63 #include "bssTypes.h"
64 #include "DrvMainModules.h"
65 #include "TWDriver.h"
66 #include "siteMgrApi.h"
67 #include "GenSM.h"
68 #include "apConnApi.h"
69 #include "roamingMngr_manualSM.h"
70 #include "EvHandler.h"
71 #include "public_types.h"
72 
73 
74 typedef enum
75 {
76 	REASSOC_RESP_SUCCESS =0,
77 	REASSOC_RESP_FAILURE,
78     REASSOC_RESP_REJECT
79 } reassociationResp_e;
80 
81 
82 static void roamingMngr_SendReassocEvent(TI_HANDLE hRoamingMngr, reassociationResp_e ReassResp);
83 static void roamingMngr_smIdleToStart (TI_HANDLE hRoamingMngr);
84 static void roamingMngr_smSTOP (TI_HANDLE hRoamingMngr);
85 static void roamingMngr_smConnectedToScan (TI_HANDLE hRoamingMngr);
86 static void roamingMngr_smConnectedToHandover(TI_HANDLE hRoamingMngr);
87 static void roamingMngr_smScanToConnected(TI_HANDLE hRoamingMngr);
88 static void roamingMngr_smHandoverToHandoverConnectEvent (TI_HANDLE hRoamingMngr);
89 static void roamingMngr_smHandoverToHandoverFailEvent (TI_HANDLE hRoamingMngr);
90 static void roamingMngr_smHandoverToConnectedSuccessEvent(TI_HANDLE hRoamingMngr);
91 static void roamingMngr_smHandoverToConnectedRejectEvent(TI_HANDLE hRoamingMngr);
92 
93 
94 /*-----------*/
95 /* Constants */
96 /*-----------*/
97 
98 TGenSM_actionCell roamingMngrManual_matrix[ROAMING_MANUAL_NUM_STATES][ROAMING_MANUAL_NUM_EVENTS] =
99 {
100     /* next state and actions for IDLE state */
101     {
102         {ROAMING_MANUAL_STATE_CONNECTED, roamingMngr_smIdleToStart},            /* START */
103         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                   /* SCAN  */
104         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                   /*CONNECT*/
105         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                  /* STOP*/
106         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                  /* REJECT*/
107         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                  /* SUCCESS*/
108         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                  /* FAIL*/
109         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                  /* COMPLETE*/
110     },
111     /* next state and actions for CONNECTED state */
112     {
113         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},		                /* START */
114         {ROAMING_MANUAL_STATE_SCAN, roamingMngr_smConnectedToScan},                 /* SCAN  */
115         {ROAMING_MANUAL_STATE_HANDOVER, roamingMngr_smConnectedToHandover},        /*CONNECT*/
116         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smSTOP},                 	        /* STOP*/
117         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                      /* REJECT*/
118         {ROAMING_MANUAL_STATE_CONNECTED, roamingMngr_smNop},                        /* SUCCESS* retain CurrAp called */
119         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                      /* FAIL*/
120         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                      /* COMPLETE*/
121     },
122     /* next state and actions for SCAN state */
123     {
124         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},              /* START */
125         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},            /* SCAN  */
126         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},            /*CONNECT*/
127         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smSTOP},            	    /* STOP*/
128         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},              /* REJECT*/
129         {ROAMING_MANUAL_STATE_SCAN, roamingMngr_smNop},                     /* SUCCESS* retain CurrAp called */
130         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},              /* FAIL*/
131         {ROAMING_MANUAL_STATE_CONNECTED, roamingMngr_smScanToConnected},  /* COMPLETE*/
132     },
133     /* next state and actions for HANDOVER state */
134     {
135         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                      /* START */
136         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected},                    /* SCAN  */
137         {ROAMING_MANUAL_STATE_HANDOVER,roamingMngr_smHandoverToHandoverConnectEvent},    /*CONNECT*/
138         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smSTOP},                            /* STOP*/
139         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smHandoverToConnectedRejectEvent},  /* REJECT*/
140         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smHandoverToConnectedSuccessEvent},  /* SUCCESS*/
141         {ROAMING_MANUAL_STATE_HANDOVER, roamingMngr_smHandoverToHandoverFailEvent},    /* FAIL*/
142         {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected },                    /* COMPLETE*/
143     }
144 };
145 
146 TI_INT8*  ManualRoamStateDescription[] =
147 {
148     "IDLE",
149     "CONNECTED",
150     "SCAN",
151     "HANDOVER"
152 };
153 
154 TI_INT8*  ManualRoamEventDescription[] =
155 {
156     "START",
157     "SCAN",
158     "CONNECT",
159     "STOP",
160     "REJECT",
161     "SUCCESS",
162     "FAIL",
163     "COMPLETE"
164 };
165 
roamingMngr_smIdleToStart(TI_HANDLE hRoamingMngr)166 static void roamingMngr_smIdleToStart (TI_HANDLE hRoamingMngr)
167 {
168     roamingMngr_t* pRoamingMngr;
169 
170     pRoamingMngr = (roamingMngr_t*)hRoamingMngr;
171     scanMngr_startManual((TI_HANDLE)pRoamingMngr->hScanMngr);
172 }
173 
roamingMngr_smSTOP(TI_HANDLE hRoamingMngr)174 static void roamingMngr_smSTOP (TI_HANDLE hRoamingMngr)
175 {
176     roamingMngr_t* pRoamingMngr = (roamingMngr_t*)hRoamingMngr;
177 
178     //if (SCAN_ISS_IDLE != pScanMngr->immedScanState || SCAN_CSS_IDLE!= != pScanMngr->contScanState)
179     {
180         roamingMngr_smStopWhileScanning(hRoamingMngr);
181     }
182 
183     scanMngr_stopManual(pRoamingMngr->hScanMngr);
184 }
185 
186 
roamingMngr_smConnectedToScan(TI_HANDLE hRoamingMngr)187 static void roamingMngr_smConnectedToScan (TI_HANDLE hRoamingMngr)
188 {
189     roamingMngr_t  *pRoamingMngr = (roamingMngr_t*) hRoamingMngr;
190     TI_STATUS status = TI_OK;
191 
192     status= apConn_prepareToRoaming(pRoamingMngr->hAPConnection, ROAMING_TRIGGER_NONE);
193 
194     if (status  == TI_OK)
195     {
196         status = scanMngr_startImmediateScan (pRoamingMngr->hScanMngr,TI_FALSE);
197     }
198     else
199     {
200         roamingMngr_smEvent(ROAMING_MANUAL_EVENT_COMPLETE, hRoamingMngr);
201     }
202 }
203 
roamingMngr_smConnectedToHandover(TI_HANDLE hRoamingMngr)204 static void roamingMngr_smConnectedToHandover(TI_HANDLE hRoamingMngr)
205 {
206     roamingMngr_t  *pRoamingMngr = (roamingMngr_t*)hRoamingMngr;
207     TI_STATUS status = TI_OK;
208 
209     pRoamingMngr->handoverWasPerformed = TI_TRUE;
210     status= apConn_prepareToRoaming(pRoamingMngr->hAPConnection, pRoamingMngr->roamingTrigger);
211 
212     if (status  == TI_OK)
213     {
214         apConn_connectToAP(pRoamingMngr->hAPConnection, &(pRoamingMngr->targetAP.newAP), &(pRoamingMngr->targetAP.connRequest), TI_TRUE);
215     }
216     else
217     {
218         roamingMngr_smEvent(ROAMING_MANUAL_EVENT_REJECT, hRoamingMngr);
219     }
220 }
221 
roamingMngr_smScanToConnected(TI_HANDLE hRoamingMngr)222 static void roamingMngr_smScanToConnected(TI_HANDLE hRoamingMngr)
223 {
224     roamingMngr_t  *pRoamingMngr = (roamingMngr_t*) hRoamingMngr;
225     apConn_connRequest_t request;
226 
227     request.dataBufLength = 0;
228     request.requestType = AP_CONNECT_RETAIN_CURR_AP;
229     apConn_connectToAP(pRoamingMngr->hAPConnection, NULL , &request , TI_FALSE);
230 }
231 
roamingMngr_smHandoverToHandoverConnectEvent(TI_HANDLE hRoamingMngr)232 static void roamingMngr_smHandoverToHandoverConnectEvent (TI_HANDLE hRoamingMngr)
233 {
234 	roamingMngr_t  *pRoamingMngr = (roamingMngr_t*) hRoamingMngr;
235 
236     apConn_connectToAP(pRoamingMngr->hAPConnection, &(pRoamingMngr->targetAP.newAP), &(pRoamingMngr->targetAP.connRequest), TI_TRUE);
237 }
238 
roamingMngr_smHandoverToHandoverFailEvent(TI_HANDLE hRoamingMngr)239 static void roamingMngr_smHandoverToHandoverFailEvent (TI_HANDLE hRoamingMngr)
240 {
241     roamingMngr_SendReassocEvent(hRoamingMngr, REASSOC_RESP_FAILURE);
242 }
243 
roamingMngr_smHandoverToConnectedSuccessEvent(TI_HANDLE hRoamingMngr)244 static void roamingMngr_smHandoverToConnectedSuccessEvent(TI_HANDLE hRoamingMngr)
245 {
246     roamingMngr_SendReassocEvent(hRoamingMngr, REASSOC_RESP_SUCCESS);
247 }
248 
roamingMngr_smHandoverToConnectedRejectEvent(TI_HANDLE hRoamingMngr)249 static void roamingMngr_smHandoverToConnectedRejectEvent(TI_HANDLE hRoamingMngr)
250 {
251     roamingMngr_SendReassocEvent(hRoamingMngr, REASSOC_RESP_REJECT);
252 }
253 
roamingMngr_SendReassocEvent(TI_HANDLE hRoamingMngr,reassociationResp_e ReassResp)254 static void roamingMngr_SendReassocEvent(TI_HANDLE hRoamingMngr, reassociationResp_e ReassResp)
255 {
256 	roamingMngr_t  *pRoamingMngr = (roamingMngr_t*) hRoamingMngr;
257 
258     TRACE1(pRoamingMngr->hReport, REPORT_SEVERITY_INFORMATION, "roamingMngr_SendReassocEvent(): %d \n", ReassResp);
259     EvHandlerSendEvent(pRoamingMngr->hEvHandler,
260                        IPC_EVENT_REASSOCIATION_RESP,
261                        (TI_UINT8*)(&ReassResp),
262                        sizeof(reassociationResp_e));
263 }
264 
265 
266 
267