OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / system / wlan / ti / wilink_6_1 / stad / src / AirLink_Managment / spectrumMngmntMgr.c
1 /*
2  * spectrumMngmntMgr.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 spectrumMngmntMgr.c
35  *  
36  *
37  *  \see spectrumMngmntMgr.h
38  */
39
40 /****************************************************************************************************/
41 /*                                                                                                                                                                                                      */
42 /*              MODULE:         spectrumMngmntMgr.c                                                                                                                             */
43 /*              PURPOSE:                                                                                                                        */
44 /*                                                                                                                                                                                                      */
45 /****************************************************************************************************/
46
47 #define __FILE_ID__  FILE_ID_6
48 #include "report.h"
49 #include "osApi.h"
50 #include "siteMgrApi.h"
51 #include "regulatoryDomainApi.h"
52 #include "mlmeBuilder.h"
53 #include "Ctrl.h"
54 #include "spectrumMngmntMgr.h"
55
56 #define RADAR_THRESHOLD_IN_PRECENTS               (5)
57 #define DOT11H_REQUEST_IE_HDR_LEN          3
58 #define DOT11H_REQUEST_IE_LEN              7
59 #define DOT11_MEASUREMENT_REQUEST_ELE_ID (38)
60
61
62 /********************************************************************************/
63 /*                                              Internal functions prototypes.                                                  */
64 /********************************************************************************/
65
66 /* The following function uses features from the old Measurement module. */
67 /* It will have to be adapted to using the new Measurement Manager. */
68 #if 0
69
70 static void buildMapSubFieldForBasicReport(TI_HANDLE hMeasurementMgr, TI_UINT8* map);
71
72 #endif
73
74
75 /********************************************************************************/
76 /*                                              Internal Structures.                                                            */
77 /********************************************************************************/
78 typedef struct
79 {
80     TI_UINT8   dialogToken;
81     TI_UINT8   activatioDelay;
82     TI_UINT8   measurementOffset;
83 } dot11hFrameReqHdr_t;
84
85 typedef struct
86 {
87     TI_UINT8  IeId;
88     TI_UINT8  Length;
89     TI_UINT8  Token;
90 } dot11hReqIEHdr_t;
91
92 /********************************************************************************/
93 /*                                              Interface functions Implementation.                                             */
94 /********************************************************************************/
95
96 /***************************************************************************
97  * NOTE: The next 3 functions represent the following situations: Receiving
98  *       of TPC request, receving Quite IE and receiving Switch Channel IE.
99  *       The Measurement SM should be updated to handle this states.
100  ***************************************************************************/
101
102
103 /***********************************************************************
104  *                   measurementMgr_getBasicMeasurementParam                                                                    
105  ***********************************************************************
106 DESCRIPTION:    
107                                 
108                                 
109 INPUT:      hMeasurementMgr         -   MeasurementMgr Handle
110                         
111 OUTPUT:         pAcxStatisitics     -   
112             pMediumOccupancy    -   
113
114 RETURN:     TI_OK on success, TI_NOK otherwise
115 ************************************************************************/
116
117 /* The following function uses features from the old Measurement module. */
118 /* It will have to be adapted to using the new Measurement Manager. */
119 #if 0
120
121 TI_STATUS measurementMgr_getBasicMeasurementParam(TI_HANDLE hMeasurementMgr,
122                                                                                   acxStatisitcs_t*      pAcxStatisitics,
123                                                                                   mediumOccupancy_t* pMediumOccupancy)
124 {
125
126         whalParamInfo_t whalParam;
127     measurementMgr_t *pMeasurementMgr = (measurementMgr_t*)hMeasurementMgr;
128
129         /* getting the ACX statisitc counters by calling the HAL */ 
130         whalParam.paramType = HAL_CTRL_ACX_STATISTICS_PARAM;
131         if( (status = whalCtrl_GetParam(pMeasurementMgr->hHalCtrl,&whalParam)) == TI_OK)
132         {
133                 pAcxStatisitics->FWpacketReceived = whalParam.content.acxStatisitics.FWpacketReceived;  
134                 pAcxStatisitics->HALpacketReceived      = whalParam.content.acxStatisitics.HALpacketReceived;
135         }
136         
137         /*FIXME*/
138         WLAN_OS_REPORT(("-------------- FW total---------------, %d\n\n", 
139                     pAcxStatisitics->FWpacketReceived));
140         WLAN_OS_REPORT(("-------------- Driver Total---------------, %d\n\n", 
141                     pAcxStatisitics->HALpacketReceived));
142
143     /*******************************************************
144     * NOTE: If not using a call back function the required *
145     *       information will not be received               *
146     *******************************************************/
147         /* getting the Medium Occupancy by calling the HAL */ 
148         whalParam.paramType = HAL_CTRL_MEDIUM_OCCUPANCY_PARAM;
149     whalParam.content.interogateCmdCBParams.CB_Func = NULL;
150     whalParam.content.interogateCmdCBParams.CB_handle = hMeasurementMgr;
151     whalParam.content.interogateCmdCBParams.CB_buf = NULL;
152
153         if( (status = whalCtrl_GetParam(pMeasurementMgr->hHalCtrl,&whalParam)) == TI_OK)
154         {
155         return status;
156         }
157
158         return status;
159 }
160
161 #endif
162
163 /***********************************************************************
164  * NOTE: The next 4 functions (dot11h...) should be corrected according 
165  *       to the 802.11h standered.
166  ***********************************************************************/
167
168 /************************************************************************
169 *                                       measurementMgr_dot11hParserFrameReq                                     *
170 ************************************************************************
171 DESCRIPTION: Frame Request Parser function, called by the Measurement 
172              object when a measurement request frame is received. 
173                                 performs the following:
174                                 -       Parsers the received frame request.
175                                         
176 INPUT:      hMeasurementMgr - MeasurementMgr Handle
177                         pData                   - The frame request
178             dataLen         - The frame'sa length
179
180 OUTPUT:         fraemReq        - The Parsered Frame Request
181
182 RETURN:     TI_OK on success, TI_NOK otherwise
183
184 ************************************************************************/
185 TI_STATUS measurementMgr_dot11hParseFrameReq(TI_HANDLE hMeasurementMgr, 
186                                            TI_UINT8 *pData, TI_INT32 dataLen,
187                                            TMeasurementFrameRequest *frameReq)
188 {
189     dot11hFrameReqHdr_t     *dot11hFrameReqHdr;
190
191     dot11hFrameReqHdr = (dot11hFrameReqHdr_t*)pData;
192     
193     frameReq->hdr->dialogToken = (TI_UINT16)dot11hFrameReqHdr->dialogToken;
194     frameReq->hdr->activatioDelay = dot11hFrameReqHdr->activatioDelay;
195     frameReq->hdr->measurementOffset = dot11hFrameReqHdr->measurementOffset;
196
197     frameReq->requests = pData + DOT11H_REQUEST_IE_HDR_LEN;
198     frameReq->requestsLen = dataLen - DOT11H_REQUEST_IE_HDR_LEN;
199
200     return TI_OK;
201 }
202
203 /************************************************************************
204  *                                      measurementMgr_dot11hParserRequestIEHdr                         *
205  ************************************************************************
206 DESCRIPTION: Spectrom Manager Request IE Header Parser function, 
207              called by the Request Handler object when inserting 
208              a request IE to the queue. 
209                                 performs the following:
210                                 -       Parsers the received request IE hdr.
211                                         
212 INPUT:      hRequestHandler     -       Request Handler handle
213                         pData                   -       The request IE
214
215 OUTPUT:         reqestLen           - The Request length
216             measurementToken    - The Request IE token
217
218 RETURN:     TI_OK on success, TI_NOK otherwise
219
220 ************************************************************************/
221 TI_STATUS measurementMgr_dot11hParseRequestIEHdr(TI_UINT8 *pData, TI_UINT16 *reqestHdrLen,
222                                                TI_UINT16 *measurementToken)
223 {
224     dot11hReqIEHdr_t *dot11hReqIEHdr;
225     
226     dot11hReqIEHdr = (dot11hReqIEHdr_t*)pData;
227     
228     /* checking if received the correct information element ID */
229     if(dot11hReqIEHdr->IeId != DOT11_MEASUREMENT_REQUEST_ELE_ID)
230         return TI_NOK;
231         
232     /* checking that len is valid */
233     if(dot11hReqIEHdr->Length != DOT11H_REQUEST_IE_LEN)
234         return TI_NOK;
235     
236     *measurementToken = (TI_UINT16)dot11hReqIEHdr->Token;
237     
238     *reqestHdrLen = DOT11H_REQUEST_IE_HDR_LEN;
239     
240     return TI_OK;
241 }
242
243 /************************************************************************
244  *                                      measurementMgr_dot11hIsTypeValid                                        *
245  ************************************************************************
246 DESCRIPTION: Spectrom Manager function that checks if the given 
247              measurement type is valid. 
248                                         
249 INPUT:      hMeasurementMgr -   MeasurementMgr Handle
250             type                        -       The measurement type.
251             scanMode        -   The Measurement scan Mode.
252
253 OUTPUT:         
254
255 RETURN:     TI_TRUE if type is valid, TI_FALSE otherwise
256
257 ************************************************************************/
258 TI_BOOL measurementMgr_dot11hIsTypeValid(TI_HANDLE hMeasurementMgr, 
259                                          EMeasurementType type, 
260                                          EMeasurementScanMode scanMode)
261 {
262     if(type != MSR_TYPE_BASIC_MEASUREMENT)
263         return TI_FALSE;
264
265     return TI_TRUE;
266 }
267
268 /***********************************************************************
269  *                  measurementMgr_dot11hBuildRejectReport                                                      
270  ***********************************************************************
271 DESCRIPTION:    Send reject measurement report frame Function.
272                 The function does the following:
273                                 -       checking the reason for reject.
274                                 -       builds measurement report Frame.
275                                 -       Calls the mlmeBuolder to allocate a mangement frame
276                                         and to transmit it.
277                                 
278 INPUT:      hMeasurementMgr -   MeasurementMgr Handle
279                         pRequestArr             -       Array of pointer to all measurement 
280                                                                 request that should be rejected.
281                         numOfRequestsInParallel - indicates the number of 
282                                                                 request that should be rejected.
283                         rejectReason    -       Indicated the rejection reason.
284
285 OUTPUT:         None
286
287 RETURN:     TI_OK on success, TI_NOK otherwise
288 ************************************************************************/
289 TI_STATUS measurementMgr_dot11hBuildRejectReport(TI_HANDLE hMeasurementMgr,
290                                                                                         MeasurementRequest_t* pRequestArr[],
291                                                                                         TI_UINT8        numOfRequestsInParallel,
292                                                                                         EMeasurementRejectReason        rejectReason)
293 {
294         measurementMgr_t        *pMeasurementMgr         = (measurementMgr_t*)hMeasurementMgr;
295         MeasurementReportFrame_t        measurementReport;
296         TI_UINT8                                                measurementMode = 0;
297
298         /* Building the measurement report frame contents */
299         measurementReport.actionField[0] = CATAGORY_SPECTRUM_MANAGEMENT;
300         measurementReport.actionField[1] = MEASUREMENT_REPORT;
301         measurementReport.dialogToken = (TI_UINT8)pRequestArr[0]->frameToken;
302
303         measurementReport.hdr[0] = DOT11_MEASUREMENT_REPORT_ELE_ID;
304         measurementReport.hdr[1] = DOT11_MIN_MEASUREMENT_REPORT_IE_LEN;
305         measurementReport.measurementToken = (TI_UINT8)pRequestArr[0]->measurementToken;
306         measurementReport.measurementType = pRequestArr[0]->Type;
307         
308         /* Building the measurement mode bit field */
309
310         /* setting Parallel Bit */
311         if(numOfRequestsInParallel > 0 )
312                 measurementMode |= 0x1;
313         
314         /* setting Incapable and Refused bits */
315         switch(rejectReason)
316         {
317                 case MSR_REJECT_DTIM_OVERLAP:
318                 case MSR_REJECT_DURATION_EXCEED_MAX_DURATION:
319                 case MSR_REJECT_TRAFFIC_INTENSITY_TOO_HIGH:
320                 case MSR_REJECT_SCR_UNAVAILABLE:
321                 case MSR_REJECT_INVALID_CHANNEL:
322                 case MSR_REJECT_NOISE_HIST_FAIL:
323                 case MSR_REJECT_CHANNEL_LOAD_FAIL:
324                 case MSR_REJECT_EMPTY_REPORT:
325                 case MSR_REJECT_MAX_DELAY_PASSED:
326                 case MSR_REJECT_INVALID_MEASUREMENT_TYPE:
327                 {
328                         /* Setting the Refused bit */
329                         measurementMode |= 0x4;
330                         break;
331                 }
332         
333                 default:
334                 {
335 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "Reject reason is not supported, %d\n\n", rejectReason);
336
337                         break;
338                 }
339         }
340         
341         measurementReport.measurementMode = measurementMode;
342 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_WARNING, "Measurement was rejected due to %d,\n\n", rejectReason);
343
344         /* Note: The Measurement report reject frame body includes 8 TI_UINT8 */
345         return mlmeBuilder_sendFrame(pMeasurementMgr->hMlme,ACTION,(TI_UINT8*)&measurementReport,8,0);
346 }
347
348
349 /***********************************************************************
350  *                        measurementMgr_dot11hBuildReport                                                      
351  ***********************************************************************
352 DESCRIPTION:    build measurement report Function.
353                 The function does the following:
354                                 -       builds measurement report IE.
355                                 
356 INPUT:      hMeasurementMgr -   MeasurementMgr Handle
357                         pRequestArr             -       Array of pointer to all measurement 
358                                                                 request that should be reported.
359                         numOfRequestsInParallel - indicates the number of 
360                                                                 request that should be reported.
361                         
362 OUTPUT:         None
363
364 RETURN:     TI_OK on success, TI_NOK otherwise
365 ************************************************************************/
366 TI_STATUS measurementMgr_dot11hBuildReport(TI_HANDLE hMeasurementMgr, MeasurementRequest_t request, TMeasurementTypeReply * reply)
367 {
368         /*measurementMgr_t                              *pMeasurement    = (measurementMgr_t*)hMeasurementMgr;*/
369         MeasurementReportFrame_t        measurementReport;
370         TI_UINT8                                                totalReportLen = 0;
371         TI_UINT8                                                map = 0;
372         TI_UINT8*                                               pMeasurReport = (TI_UINT8 *)&(measurementReport.measurementReports[0]);
373
374         /* Building the measurement report frame contents */
375         measurementReport.actionField[0] = CATAGORY_SPECTRUM_MANAGEMENT;
376         measurementReport.actionField[1] = MEASUREMENT_REPORT;
377         measurementReport.dialogToken = (TI_UINT8)request.frameToken;
378
379         measurementReport.hdr[0] = DOT11_MEASUREMENT_REPORT_ELE_ID;
380         measurementReport.measurementToken = (TI_UINT8)request.measurementToken;
381         
382         /* setting Parallel Bit in the measurement mode */
383         if(request.isParallel)
384                 measurementReport.measurementMode = 0x1;
385         
386         measurementReport.measurementType = request.Type;
387         
388         
389         /* Building the reports included in the current measurement report IE */
390         /* Note: The current implementation supports only Basic Report */
391         if(request.Type == MSR_TYPE_BASIC_MEASUREMENT)
392         {               
393                         *pMeasurReport++ = request.channelNumber;
394                         *pMeasurReport++ = (TI_UINT8)request.DurationTime;
395
396 /* The following function uses features from the old Measurement module. */
397 /* It will have to be adapted to using the new Measurement Manager. */
398 #if 0
399                         /* building the map subfield */
400                         buildMapSubFieldForBasicReport(hMeasurementMgr,&map);
401 #endif /* 0 */
402
403                         *pMeasurReport++ = map;
404                         totalReportLen += 3;
405         }
406         return TI_OK;
407 }
408
409 /***********************************************************************
410  *                   measurementMgr_dot11hSendReportAndCleanObject                                                      
411  ***********************************************************************
412 DESCRIPTION:    Send measurement report frame Function.
413                 The function does the following:
414                                 -       Calls the mlmeBuilder to allocate a mangement frame
415                                         and to transmit it.
416                                 -       Cleans the Measurement Object and reset its Params.
417                                 
418 INPUT:      hMeasurementMgr -   MeasurementMgr Handle
419                         
420 OUTPUT:         None
421
422 RETURN:     TI_OK on success, TI_NOK otherwise
423 ************************************************************************/
424 TI_STATUS measurementMgr_dot11hSendReportAndCleanObject(TI_HANDLE hMeasurementMgr)
425 {
426     measurementMgr_t    *pMeasurementMgr = (measurementMgr_t*)hMeasurementMgr;
427         TI_STATUS               status;
428
429         /* Building the Report Frame Header */
430         /* TO DO */
431
432     if(pMeasurementMgr->frameLength != 0)
433     {
434         /* Setting the IE Length field */
435         /* TO DO */
436
437         /* Sending the Rport Frame */
438         status =  mlmeBuilder_sendFrame(pMeasurementMgr->hMlme,ACTION,
439                                         (TI_UINT8*)&pMeasurementMgr->dot11hFrameReport,
440                                         sizeof(dot11_ACTION_FIELD_t) + sizeof(TI_UINT8) + 
441                                         sizeof(dot11_eleHdr_t) + 
442                                         DOT11_MIN_MEASUREMENT_REPORT_IE_LEN + 
443                                         pMeasurementMgr->frameLength,0);
444         if(status != TI_OK)
445             return status;
446         
447         /* clearing reports data base */
448         os_memoryZero(pMeasurementMgr->hOs,&(pMeasurementMgr->dot11hFrameReport),
449             sizeof(MeasurementReportFrame_t));
450         pMeasurementMgr->frameLength = 0;
451                 pMeasurementMgr->nextEmptySpaceInReport = 0;
452         }
453
454         /* Reset the Measurement Object Params */
455         pMeasurementMgr->currentFrameType = MSR_FRAME_TYPE_NO_ACTIVE;
456         requestHandler_clearRequests(pMeasurementMgr->hRequestH);
457
458         return TI_OK;
459 }
460
461
462 /********************************************************************************/
463 /*                                              Internal functions Implementation.                                              */
464 /********************************************************************************/
465
466
467
468 /***********************************************************************
469  *                     buildMapSubFieldForBasicReport                                                                   
470  ***********************************************************************
471 DESCRIPTION:    
472                                 
473                                 
474 INPUT:      hMeasurementMgr -   MeasurementMgr Handle
475
476 OUTPUT:         map             -   
477
478 RETURN:     None
479 ************************************************************************/
480
481 /* The following function uses features from the old Measurement module. */
482 /* It will have to be adapted to using the new Measurement Manager. */
483 #if 0
484
485 static void buildMapSubFieldForBasicReport(TI_HANDLE hMeasurementMgr,TI_UINT8* map)
486 {
487
488
489         TI_INT32        deltaHALReceivedPacked;
490         TI_INT32        deltaFWReceivedPacked;
491         TI_INT32        deltaFCSError;
492         TI_INT32        periodTimeDelta;
493         TI_INT32        occupancyDelta;
494     measurementMgr_t* pMeasurementMgr = (measurementMgr_t*)hMeasurementMgr;
495         
496         /* getting the AcxStatisitcs from the FW */
497     /* NOTE: The medium occupancy will not be updated - FIX */
498
499 /* The following function uses features from the old Measurement module. */
500 /* It will have to be adapted to using the new Measurement Manager. */
501 #if 0
502         measurementMgr_getBasicMeasurementParam(hMeasurementMgr, &pMeasurementMgr->acxStatisticEnd,
503                                          &pMeasurementMgr->mediumOccupancyEnd);
504 #endif
505
506         /* Calculating the delta for packetReceived from the HAL*/
507         deltaHALReceivedPacked = pMeasurementMgr->acxStatisticEnd.HALpacketReceived - 
508                              pMeasurementMgr->acxStatisticStart.HALpacketReceived; 
509         
510         if(deltaHALReceivedPacked < 0)
511 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "HAL delta packets is negative , %d\n\n", deltaHALReceivedPacked);
512         
513         if(deltaHALReceivedPacked != 0 )
514                 *map = DOT11_BSS_ONLY;
515         else
516         {
517                 /* Calculating the delta for FCS Error*/
518                 deltaFWReceivedPacked = pMeasurementMgr->acxStatisticEnd.FWpacketReceived - 
519                                 pMeasurementMgr->acxStatisticStart.FWpacketReceived;
520                 
521                 if(deltaFWReceivedPacked < 0)
522         {
523 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "FW delta packets is negative , %d\n\n", deltaFWReceivedPacked);
524         }
525
526                 deltaFCSError = deltaFWReceivedPacked - deltaHALReceivedPacked;
527                 
528                 if(deltaFCSError < 0)
529         {
530 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "FCS error is negative , %d\n\n", deltaFCSError);
531         }
532
533                 if(deltaFCSError != 0 )
534                         *map = DOT11_OFDM_ONLY;
535                 else
536                 {
537                         /* Calculating the delta for Medium occupancy */
538                         occupancyDelta = pMeasurementMgr->mediumOccupancyEnd.MediumUsage - 
539                              pMeasurementMgr->mediumOccupancyStart.MediumUsage;
540
541                         if(occupancyDelta < 0)
542             {
543 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "Medium Occupancy is negative , %d\n\n", occupancyDelta);
544             }
545
546                         periodTimeDelta = pMeasurementMgr->mediumOccupancyEnd.Period - 
547                               pMeasurementMgr->mediumOccupancyStart.Period;
548                         
549                         if(periodTimeDelta < 0)
550             {
551 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "Period time delta is negative , %d\n\n", periodTimeDelta);
552             }
553                         
554                         if( ((occupancyDelta * 100) / periodTimeDelta)  > RADAR_THRESHOLD_IN_PRECENTS )
555                                 *map = DOT11_RADAR_AND_UNIDENTIFIED;
556                         else
557                                 *map = 0;
558                 }
559         }
560
561         return;
562 }
563
564 #endif /* 0 */