SSB-15114: Add new GSCAN attributes for Android-M

Added new GSCAN attributes for Android-M

Change-Id: Ic94cae8418a819e8729f3552a4280484e15c7f10
SCSC-Bug-Id: SSB-15114
Signed-off-by: Debasish Das <d.das@samsung.com>
diff --git a/gscan.cpp b/gscan.cpp
index 2de10a6..a0e7313 100755
--- a/gscan.cpp
+++ b/gscan.cpp
@@ -38,6 +38,7 @@
     GSCAN_ATTRIBUTE_NUM_AP_PER_SCAN,

     GSCAN_ATTRIBUTE_REPORT_THRESHOLD,

     GSCAN_ATTRIBUTE_NUM_SCANS_TO_CACHE,

+    GSCAN_ATTRIBUTE_REPORT_THRESHOLD_NUM_SCANS,

     GSCAN_ATTRIBUTE_BAND = GSCAN_ATTRIBUTE_BUCKETS_BAND,

 

     GSCAN_ATTRIBUTE_ENABLE_FEATURE = 20,

@@ -49,6 +50,8 @@
     GSCAN_ATTRIBUTE_SCAN_RESULTS,                       /* flat array of wifi_scan_result */

     GSCAN_ATTRIBUTE_NUM_CHANNELS,

     GSCAN_ATTRIBUTE_CHANNEL_LIST,

+    GSCAN_ATTRIBUTE_SCAN_ID,

+    GSCAN_ATTRIBUTE_SCAN_FLAGS,

 

     /* remaining reserved for additional attributes */

 

@@ -307,6 +310,11 @@
             return result;

         }

 

+        result = request.put_u32(GSCAN_ATTRIBUTE_REPORT_THRESHOLD_NUM_SCANS, mParams->report_threshold_num_scans);

+        if (result < 0) {

+            return result;

+        }

+

         result = request.put_u32(GSCAN_ATTRIBUTE_NUM_BUCKETS, mParams->num_buckets);

         if (result < 0) {

             return result;

@@ -531,16 +539,19 @@
 }

 

 class GetScanResultsCommand : public WifiCommand {

-    wifi_cached_scan_results *mResults;

+    wifi_cached_scan_results *mScans;

     int mMax;

     int *mNum;

     int mRetrieved;

     byte mFlush;

     int mCompleted;

+    static const int MAX_RESULTS = 320;

+    wifi_scan_result mScanResults[MAX_RESULTS];

+    int mNextScanResult;

 public:

     GetScanResultsCommand(wifi_interface_handle iface, byte flush,

             wifi_cached_scan_results *results, int max, int *num)

-        : WifiCommand(iface, -1), mResults(results), mMax(max), mNum(num),

+        : WifiCommand(iface, -1), mScans(results), mMax(max), mNum(num),

                 mRetrieved(0), mFlush(flush), mCompleted(0)

     { }

 

@@ -619,12 +630,26 @@
                 mCompleted = it.get_u8();

                 ALOGD("retrieved mCompleted flag : %d", mCompleted);

             } else if (it.get_type() == GSCAN_ATTRIBUTE_SCAN_RESULTS || it.get_type() == 0) {

+                int scan_id = 0, flags = 0, num = 0;

                 for (nl_iterator it2(it.get()); it2.has_next(); it2.next()) {

-                    int num = 0;

-                    if (it2.get_type() == GSCAN_ATTRIBUTE_SCAN_RESULTS) {

+                    if (it2.get_type() == GSCAN_ATTRIBUTE_SCAN_ID) {

+                        scan_id = it2.get_u32();

+                        ALOGD("retrieved scan_id : 0x%0x", scan_id);

+                    } else if (it2.get_type() == GSCAN_ATTRIBUTE_SCAN_FLAGS) {

+                        flags = it2.get_u8();

+                        ALOGD("retrieved scan_flags : 0x%0x", flags);

+                    } else if (it2.get_type() == GSCAN_ATTRIBUTE_NUM_OF_RESULTS) {

+                        num = it2.get_u32();

+                        ALOGD("retrieved num_results: %d", num);

+                    } else if (it2.get_type() == GSCAN_ATTRIBUTE_SCAN_RESULTS) {

+                        if (mRetrieved >= mMax) {

+                            ALOGW("Stored %d scans, ignoring excess results", mRetrieved);

+                            break;

+                        }

                         num = it2.get_len() / sizeof(wifi_scan_result);

-                        num = min(*mNum - mRetrieved, num);

-                        memcpy(mResults + mRetrieved, it2.get_data(),

+                        num = min(MAX_RESULTS - mNextScanResult, num);

+                        num = min((int)MAX_AP_CACHE_PER_SCAN, num);

+                        memcpy(mScanResults + mNextScanResult, it2.get_data(),

                                 sizeof(wifi_scan_result) * num);

                         ALOGD("Retrieved %d scan results", num);

                         wifi_scan_result *results = (wifi_scan_result *)it2.get_data();

@@ -635,7 +660,14 @@
                                 result->bssid[3], result->bssid[4], result->bssid[5],

                                 result->rssi);

                         }

-                        mRetrieved += num;

+                        mScans[mRetrieved].scan_id = scan_id;

+                        mScans[mRetrieved].flags = flags;

+                        mScans[mRetrieved].num_results = num;

+                        ALOGD("Setting result of scan_id : 0x%0x", mScans[mRetrieved].scan_id);

+                        memcpy(mScans[mRetrieved].results,

+                                &(mScanResults[mNextScanResult]), num * sizeof(wifi_scan_result));

+                        mNextScanResult += num;

+                        mRetrieved++;

                     } else {

                         ALOGW("Ignoring invalid attribute type = %d, size = %d",

                                 it.get_type(), it.get_len());