[APR-1563][9610][7885] wlbt: changes as per FAPI 7
[GitHub/MotorolaMobilityLLC/hardware-samsung_slsi-scsc_wifibt-wifi_hal.git] / wifi_nan.cpp
CommitLineData
d3a587e8
JPS
1
2#include <stdint.h>
3#include <stddef.h>
4#include <fcntl.h>
5#include <sys/socket.h>
6#include <netlink/genl/genl.h>
7#include <netlink/genl/family.h>
8#include <netlink/genl/ctrl.h>
9#include <linux/rtnetlink.h>
10#include <netpacket/packet.h>
11#include <linux/filter.h>
12#include <linux/errqueue.h>
13#include <linux/pkt_sched.h>
14#include <netlink/object-api.h>
15#include <netlink/netlink.h>
16#include <netlink/socket.h>
17#include <netlink/handlers.h>
18
19#include "sync.h"
20
21#include <utils/Log.h>
22
23#include "wifi_hal.h"
24#include "common.h"
25#include "cpp_bindings.h"
26
27#define SLSI_WIFI_HAL_NAN_VERSION 1
28
29#define CHECK_WIFI_STATUS_RETURN_FAIL(result, LOGSTR) \
30 if (result != WIFI_SUCCESS) {\
31 ALOGE(LOGSTR" [result:%d]", result);\
32 return result;\
33 }
34
35#define CHECK_CONFIG_PUT_8_RETURN_FAIL(config, val, nan_attribute, request, result, FAIL_STR) \
36 if (config) {\
37 result = request.put_u8(nan_attribute, val); \
38 if (result != WIFI_SUCCESS) {\
39 ALOGE(FAIL_STR" [result:%d]", result);\
40 return result;\
41 }\
42 }
43
44#define CHECK_CONFIG_PUT_16_RETURN_FAIL(config, val, nan_attribute, request, result, FAIL_STR) \
45 if (config) {\
46 result = request.put_u16(nan_attribute, val); \
47 if (result != WIFI_SUCCESS) {\
48 ALOGE(FAIL_STR" [result:%d]", result);\
49 return result;\
50 }\
51 }
52
53
54#define CHECK_CONFIG_PUT_32_RETURN_FAIL(config, val, nan_attribute, request, result, FAIL_STR) \
55 if (config) {\
56 result = request.put_u32(nan_attribute, val); \
57 if (result != WIFI_SUCCESS) {\
58 ALOGE(FAIL_STR" [result:%d]", result);\
59 return result;\
60 }\
61 }
62
63#define CHECK_CONFIG_PUT_RETURN_FAIL(config, valptr, len, nan_attribute, request, result, FAIL_STR) \
64 if (config) {\
65 result = request.put(nan_attribute, valptr, len); \
66 if (result != WIFI_SUCCESS) {\
67 ALOGE(FAIL_STR" [result:%d]", result);\
68 return result;\
69 }\
70 }
71
72typedef enum {
73 NAN_REQ_ATTR_MASTER_PREF,
74 NAN_REQ_ATTR_CLUSTER_LOW,
75 NAN_REQ_ATTR_CLUSTER_HIGH,
76 NAN_REQ_ATTR_HOP_COUNT_LIMIT_VAL,
77 NAN_REQ_ATTR_SID_BEACON_VAL,
78
79 NAN_REQ_ATTR_SUPPORT_2G4_VAL,
80 NAN_REQ_ATTR_SUPPORT_5G_VAL,
81
82 NAN_REQ_ATTR_RSSI_CLOSE_2G4_VAL,
83 NAN_REQ_ATTR_RSSI_MIDDLE_2G4_VAL,
84 NAN_REQ_ATTR_RSSI_PROXIMITY_2G4_VAL,
85 NAN_REQ_ATTR_BEACONS_2G4_VAL,
86 NAN_REQ_ATTR_SDF_2G4_VAL,
87 NAN_REQ_ATTR_CHANNEL_2G4_MHZ_VAL,
88 NAN_REQ_ATTR_RSSI_PROXIMITY_VAL,
89
90
91 NAN_REQ_ATTR_RSSI_CLOSE_5G_VAL,
92 NAN_REQ_ATTR_RSSI_CLOSE_PROXIMITY_5G_VAL,
93 NAN_REQ_ATTR_RSSI_MIDDLE_5G_VAL,
94 NAN_REQ_ATTR_RSSI_PROXIMITY_5G_VAL,
95 NAN_REQ_ATTR_BEACON_5G_VAL,
96 NAN_REQ_ATTR_SDF_5G_VAL,
97 NAN_REQ_ATTR_CHANNEL_5G_MHZ_VAL,
98
99 NAN_REQ_ATTR_RSSI_WINDOW_SIZE_VAL,
100 NAN_REQ_ATTR_OUI_VAL,
101 NAN_REQ_ATTR_MAC_ADDR_VAL,
102 NAN_REQ_ATTR_CLUSTER_VAL,
103 NAN_REQ_ATTR_SOCIAL_CH_SCAN_DWELL_TIME,
104 NAN_REQ_ATTR_SOCIAL_CH_SCAN_PERIOD,
105 NAN_REQ_ATTR_RANDOM_FACTOR_FORCE_VAL,
106 NAN_REQ_ATTR_HOP_COUNT_FORCE_VAL,
107 NAN_REQ_ATTR_CONN_CAPABILITY_PAYLOAD_TX,
108 NAN_REQ_ATTR_CONN_CAPABILITY_IBSS,
109 NAN_REQ_ATTR_CONN_CAPABILITY_WFD,
110 NAN_REQ_ATTR_CONN_CAPABILITY_WFDS,
111 NAN_REQ_ATTR_CONN_CAPABILITY_TDLS,
112 NAN_REQ_ATTR_CONN_CAPABILITY_MESH,
113 NAN_REQ_ATTR_CONN_CAPABILITY_WLAN_INFRA,
114 NAN_REQ_ATTR_DISCOVERY_ATTR_NUM_ENTRIES,
115 NAN_REQ_ATTR_DISCOVERY_ATTR_VAL,
116 NAN_REQ_ATTR_CONN_TYPE,
117 NAN_REQ_ATTR_NAN_ROLE,
118 NAN_REQ_ATTR_TRANSMIT_FREQ,
119 NAN_REQ_ATTR_AVAILABILITY_DURATION,
120 NAN_REQ_ATTR_AVAILABILITY_INTERVAL,
121 NAN_REQ_ATTR_MESH_ID_LEN,
122 NAN_REQ_ATTR_MESH_ID,
123 NAN_REQ_ATTR_INFRASTRUCTURE_SSID_LEN,
124 NAN_REQ_ATTR_INFRASTRUCTURE_SSID,
125 NAN_REQ_ATTR_FURTHER_AVAIL_NUM_ENTRIES,
126 NAN_REQ_ATTR_FURTHER_AVAIL_VAL,
127 NAN_REQ_ATTR_FURTHER_AVAIL_ENTRY_CTRL,
128 NAN_REQ_ATTR_FURTHER_AVAIL_CHAN_CLASS,
129 NAN_REQ_ATTR_FURTHER_AVAIL_CHAN,
130 NAN_REQ_ATTR_FURTHER_AVAIL_CHAN_MAPID,
131 NAN_REQ_ATTR_FURTHER_AVAIL_INTERVAL_BITMAP,
132 NAN_REQ_ATTR_PUBLISH_ID,
133 NAN_REQ_ATTR_PUBLISH_TTL,
134 NAN_REQ_ATTR_PUBLISH_PERIOD,
135 NAN_REQ_ATTR_PUBLISH_TYPE,
136 NAN_REQ_ATTR_PUBLISH_TX_TYPE,
137 NAN_REQ_ATTR_PUBLISH_COUNT,
138 NAN_REQ_ATTR_PUBLISH_SERVICE_NAME_LEN,
139 NAN_REQ_ATTR_PUBLISH_SERVICE_NAME,
140 NAN_REQ_ATTR_PUBLISH_MATCH_ALGO,
141 NAN_REQ_ATTR_PUBLISH_SERVICE_INFO_LEN,
142 NAN_REQ_ATTR_PUBLISH_SERVICE_INFO,
143 NAN_REQ_ATTR_PUBLISH_RX_MATCH_FILTER_LEN,
144 NAN_REQ_ATTR_PUBLISH_RX_MATCH_FILTER,
145 NAN_REQ_ATTR_PUBLISH_TX_MATCH_FILTER_LEN,
146 NAN_REQ_ATTR_PUBLISH_TX_MATCH_FILTER,
147 NAN_REQ_ATTR_PUBLISH_RSSI_THRESHOLD_FLAG,
148 NAN_REQ_ATTR_PUBLISH_CONN_MAP,
149 NAN_REQ_ATTR_PUBLISH_RECV_IND_CFG,
150 NAN_REQ_ATTR_SUBSCRIBE_ID,
151 NAN_REQ_ATTR_SUBSCRIBE_TTL,
152 NAN_REQ_ATTR_SUBSCRIBE_PERIOD,
153 NAN_REQ_ATTR_SUBSCRIBE_TYPE,
154 NAN_REQ_ATTR_SUBSCRIBE_RESP_FILTER_TYPE,
155 NAN_REQ_ATTR_SUBSCRIBE_RESP_INCLUDE,
156 NAN_REQ_ATTR_SUBSCRIBE_USE_RESP_FILTER,
157 NAN_REQ_ATTR_SUBSCRIBE_SSI_REQUIRED,
158 NAN_REQ_ATTR_SUBSCRIBE_MATCH_INDICATOR,
159 NAN_REQ_ATTR_SUBSCRIBE_COUNT,
160 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_NAME_LEN,
161 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_NAME,
162 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_INFO_LEN,
163 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_INFO,
164 NAN_REQ_ATTR_SUBSCRIBE_RX_MATCH_FILTER_LEN,
165 NAN_REQ_ATTR_SUBSCRIBE_RX_MATCH_FILTER,
166 NAN_REQ_ATTR_SUBSCRIBE_TX_MATCH_FILTER_LEN,
167 NAN_REQ_ATTR_SUBSCRIBE_TX_MATCH_FILTER,
168 NAN_REQ_ATTR_SUBSCRIBE_RSSI_THRESHOLD_FLAG,
169 NAN_REQ_ATTR_SUBSCRIBE_CONN_MAP,
170 NAN_REQ_ATTR_SUBSCRIBE_NUM_INTF_ADDR_PRESENT,
171 NAN_REQ_ATTR_SUBSCRIBE_INTF_ADDR,
172 NAN_REQ_ATTR_SUBSCRIBE_RECV_IND_CFG,
173 NAN_REQ_ATTR_FOLLOWUP_ID,
174 NAN_REQ_ATTR_FOLLOWUP_REQUESTOR_ID,
175 NAN_REQ_ATTR_FOLLOWUP_ADDR,
176 NAN_REQ_ATTR_FOLLOWUP_PRIORITY,
177 NAN_REQ_ATTR_FOLLOWUP_SERVICE_NAME_LEN,
178 NAN_REQ_ATTR_FOLLOWUP_SERVICE_NAME,
179 NAN_REQ_ATTR_FOLLOWUP_TX_WINDOW,
180 NAN_REQ_ATTR_FOLLOWUP_RECV_IND_CFG,
f8c9e3bb
JPS
181 NAN_REQ_ATTR_SUBSCRIBE_SID_BEACON_VAL,
182 NAN_REQ_ATTR_DW_2G4_INTERVAL,
183 NAN_REQ_ATTR_DW_5G_INTERVAL,
184 NAN_REQ_ATTR_DISC_MAC_ADDR_RANDOM_INTERVAL,
185 NAN_REQ_ATTR_PUBLISH_SDEA_LEN,
186 NAN_REQ_ATTR_PUBLISH_SDEA
187
d3a587e8
JPS
188} NAN_REQ_ATTRIBUTES;
189
190typedef enum {
f8c9e3bb
JPS
191 NAN_REPLY_ATTR_STATUS_TYPE,
192 NAN_REPLY_ATTR_VALUE,
193 NAN_REPLY_ATTR_RESPONSE_TYPE,
194 NAN_REPLY_ATTR_PUBLISH_SUBSCRIBE_TYPE,
195 NAN_REPLY_ATTR_CAP_MAX_CONCURRENT_CLUSTER,
196 NAN_REPLY_ATTR_CAP_MAX_PUBLISHES,
197 NAN_REPLY_ATTR_CAP_MAX_SUBSCRIBES,
198 NAN_REPLY_ATTR_CAP_MAX_SERVICE_NAME_LEN,
199 NAN_REPLY_ATTR_CAP_MAX_MATCH_FILTER_LEN,
200 NAN_REPLY_ATTR_CAP_MAX_TOTAL_MATCH_FILTER_LEN,
201 NAN_REPLY_ATTR_CAP_MAX_SERVICE_SPECIFIC_INFO_LEN,
202 NAN_REPLY_ATTR_CAP_MAX_VSA_DATA_LEN,
203 NAN_REPLY_ATTR_CAP_MAX_MESH_DATA_LEN,
204 NAN_REPLY_ATTR_CAP_MAX_NDI_INTERFACES,
205 NAN_REPLY_ATTR_CAP_MAX_NDP_SESSIONS,
206 NAN_REPLY_ATTR_CAP_MAX_APP_INFO_LEN,
d3a587e8
JPS
207} NAN_RESP_ATTRIBUTES;
208
209typedef enum {
210 NAN_EVT_ATTR_MATCH_PUBLISH_SUBSCRIBE_ID,
211 NAN_EVT_ATTR_MATCH_REQUESTOR_INSTANCE_ID,
212 NAN_EVT_ATTR_MATCH_ADDR,
213 NAN_EVT_ATTR_MATCH_SERVICE_SPECIFIC_INFO_LEN,
214 NAN_EVT_ATTR_MATCH_SERVICE_SPECIFIC_INFO,
215 NAN_EVT_ATTR_MATCH_SDF_MATCH_FILTER_LEN,
216 NAN_EVT_ATTR_MATCH_SDF_MATCH_FILTER,
217 NAN_EVT_ATTR_MATCH_MATCH_OCCURED_FLAG,
218 NAN_EVT_ATTR_MATCH_OUT_OF_RESOURCE_FLAG,
219 NAN_EVT_ATTR_MATCH_RSSI_VALUE,
220/*CONN_CAPABILITY*/
221 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_WFD_SUPPORTED,
222 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_WFDS_SUPPORTED,
223 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_TDLS_SUPPORTED,
224 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_IBSS_SUPPORTED,
225 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_MESH_SUPPORTED,
226 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_WLAN_INFRA_FIELD,
227 NAN_EVT_ATTR_MATCH_NUM_RX_DISCOVERY_ATTR,
228 NAN_EVT_ATTR_MATCH_RX_DISCOVERY_ATTR,
229/*NANRECEIVEPOSTDISCOVERY DISCOVERY_ATTR,*/
230 NAN_EVT_ATTR_MATCH_DISC_ATTR_TYPE,
231 NAN_EVT_ATTR_MATCH_DISC_ATTR_ROLE,
232 NAN_EVT_ATTR_MATCH_DISC_ATTR_DURATION,
233 NAN_EVT_ATTR_MATCH_DISC_ATTR_AVAIL_INTERVAL_BITMAP,
234 NAN_EVT_ATTR_MATCH_DISC_ATTR_MAPID,
235 NAN_EVT_ATTR_MATCH_DISC_ATTR_ADDR,
236 NAN_EVT_ATTR_MATCH_DISC_ATTR_MESH_ID_LEN,
237 NAN_EVT_ATTR_MATCH_DISC_ATTR_MESH_ID,
238 NAN_EVT_ATTR_MATCH_DISC_ATTR_INFRASTRUCTURE_SSID_LEN,
239 NAN_EVT_ATTR_MATCH_DISC_ATTR_INFRASTRUCTURE_SSID_VAL,
240
241 NAN_EVT_ATTR_MATCH_NUM_CHANS,
242 NAN_EVT_ATTR_MATCH_FAMCHAN,
243/*FAMCHAN[32],*/
244 NAN_EVT_ATTR_MATCH_FAM_ENTRY_CONTROL,
245 NAN_EVT_ATTR_MATCH_FAM_CLASS_VAL,
246 NAN_EVT_ATTR_MATCH_FAM_CHANNEL,
247 NAN_EVT_ATTR_MATCH_FAM_MAPID,
248 NAN_EVT_ATTR_MATCH_FAM_AVAIL_INTERVAL_BITMAP,
249 NAN_EVT_ATTR_MATCH_CLUSTER_ATTRIBUTE_LEN,
250 NAN_EVT_ATTR_MATCH_CLUSTER_ATTRIBUTE,
251 NAN_EVT_ATTR_PUBLISH_ID,
252 NAN_EVT_ATTR_PUBLISH_REASON,
253 NAN_EVT_ATTR_SUBSCRIBE_ID,
254 NAN_EVT_ATTR_SUBSCRIBE_REASON,
255 NAN_EVT_ATTR_DISABLED_REASON,
256 NAN_EVT_ATTR_FOLLOWUP_PUBLISH_SUBSCRIBE_ID,
257 NAN_EVT_ATTR_FOLLOWUP_REQUESTOR_INSTANCE_ID,
258 NAN_EVT_ATTR_FOLLOWUP_ADDR,
259 NAN_EVT_ATTR_FOLLOWUP_DW_OR_FAW,
260 NAN_EVT_ATTR_FOLLOWUP_SERVICE_SPECIFIC_INFO_LEN,
261 NAN_EVT_ATTR_FOLLOWUP_SERVICE_SPECIFIC_INFO,
f8c9e3bb 262 NAN_EVT_ATTR_DISCOVERY_ENGINE_EVT_TYPE ,
d3a587e8 263 NAN_EVT_ATTR_DISCOVERY_ENGINE_MAC_ADDR,
f8c9e3bb
JPS
264 NAN_EVT_ATTR_DISCOVERY_ENGINE_CLUSTER,
265 NAN_EVT_ATTR_SDEA,
266 NAN_EVT_ATTR_SDEA_LEN
d3a587e8
JPS
267} NAN_EVT_ATTRIBUTES;
268
269class NanCommand : public WifiCommand {
270 static NanCallbackHandler callbackEventHandler;
271 int subscribeID[2];
272 int publishID[2];
273 int followupID[2];
274 int version;
275 NanCapabilities capabilities;
276
277 void registerNanEvents(void) {
278 registerVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_PUBLISH_TERMINATED);
279 registerVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_MATCH);
280 registerVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_MATCH_EXPIRED);
281 registerVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_SUBSCRIBE_TERMINATED);
282 registerVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_FOLLOWUP);
283 registerVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_DISCOVERY_ENGINE);
284 }
285
286 void unregisterNanEvents(void) {
287 unregisterVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_PUBLISH_TERMINATED);
288 unregisterVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_MATCH);
289 unregisterVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_MATCH_EXPIRED);
290 unregisterVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_SUBSCRIBE_TERMINATED);
291 unregisterVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_FOLLOWUP);
292 unregisterVendorHandler(GOOGLE_OUI, SLSI_NAN_EVENT_DISCOVERY_ENGINE);
293 }
294
295 int processResponse(WifiEvent &reply, NanResponseMsg *response) {
296 NanCapabilities *capabilities = &response->body.nan_capabilities;
297 nlattr *vendor_data = reply.get_attribute(NL80211_ATTR_VENDOR_DATA);
d3a587e8
JPS
298 unsigned int val;
299
300 for(nl_iterator nl_itr(vendor_data); nl_itr.has_next(); nl_itr.next()) {
301 switch(nl_itr.get_type()) {
302 case NAN_REPLY_ATTR_STATUS_TYPE:
303 response->status = NanStatusType(nl_itr.get_u32());
304 break;
305 case NAN_REPLY_ATTR_VALUE:
306 val = nl_itr.get_u32();
307 if (val) {
308 strncpy(response->nan_error, "Lower_layer_error",NAN_ERROR_STR_LEN);
309 }
310 break;
311 case NAN_REPLY_ATTR_RESPONSE_TYPE:
312 response->response_type = NanResponseType(nl_itr.get_u32());
313 break;
314 case NAN_REPLY_ATTR_PUBLISH_SUBSCRIBE_TYPE:
315 response->body.publish_response.publish_id = nl_itr.get_u16();
316 break;
317 case NAN_REPLY_ATTR_CAP_MAX_CONCURRENT_CLUSTER:
318 capabilities->max_concurrent_nan_clusters = nl_itr.get_u32();
319 break;
320 case NAN_REPLY_ATTR_CAP_MAX_PUBLISHES:
321 capabilities->max_publishes = nl_itr.get_u32();
322 break;
323 case NAN_REPLY_ATTR_CAP_MAX_SUBSCRIBES:
324 capabilities->max_subscribes = nl_itr.get_u32();
325 break;
326 case NAN_REPLY_ATTR_CAP_MAX_SERVICE_NAME_LEN:
327 capabilities->max_service_name_len = nl_itr.get_u32();
328 break;
329 case NAN_REPLY_ATTR_CAP_MAX_MATCH_FILTER_LEN:
330 capabilities->max_match_filter_len = nl_itr.get_u32();
331 break;
332 case NAN_REPLY_ATTR_CAP_MAX_TOTAL_MATCH_FILTER_LEN:
333 capabilities->max_total_match_filter_len = nl_itr.get_u32();
334 break;
335 case NAN_REPLY_ATTR_CAP_MAX_SERVICE_SPECIFIC_INFO_LEN:
336 capabilities->max_service_specific_info_len = nl_itr.get_u32();
337 break;
338 case NAN_REPLY_ATTR_CAP_MAX_VSA_DATA_LEN:
339 capabilities->max_vsa_data_len = nl_itr.get_u32();
340 break;
341 case NAN_REPLY_ATTR_CAP_MAX_MESH_DATA_LEN:
342 capabilities->max_mesh_data_len = nl_itr.get_u32();
343 break;
344 case NAN_REPLY_ATTR_CAP_MAX_NDI_INTERFACES:
345 capabilities->max_ndi_interfaces = nl_itr.get_u32();
346 break;
347 case NAN_REPLY_ATTR_CAP_MAX_NDP_SESSIONS:
348 capabilities->max_ndp_sessions = nl_itr.get_u32();
349 break;
350 case NAN_REPLY_ATTR_CAP_MAX_APP_INFO_LEN:
351 capabilities->max_app_info_len = nl_itr.get_u32();
352 break;
353 default :
354 ALOGE("received unknown type(%d) in response", nl_itr.get_type());
355 return NL_SKIP;
356 }
357 }
358 this->capabilities = *capabilities;
359 return NL_OK;
360 }
361
362 int processMatchEvent(WifiEvent &event) {
363 NanMatchInd ind;
364 memset(&ind,0,sizeof(NanMatchInd));
365 int famchan_idx = 0, disc_idx = 0;
366 nlattr *vendor_data = event.get_attribute(NL80211_ATTR_VENDOR_DATA);
367
368 for(nl_iterator nl_itr(vendor_data); nl_itr.has_next(); nl_itr.next()) {
369 switch(nl_itr.get_type()) {
370 case NAN_EVT_ATTR_MATCH_PUBLISH_SUBSCRIBE_ID:
371 ind.publish_subscribe_id = nl_itr.get_u16();
372 break;
373 case NAN_EVT_ATTR_MATCH_REQUESTOR_INSTANCE_ID:
374 ind.requestor_instance_id = nl_itr.get_u32();
375 break;
376 case NAN_EVT_ATTR_MATCH_ADDR:
377 memcpy(ind.addr, nl_itr.get_data(), NAN_MAC_ADDR_LEN);
378 break;
379 case NAN_EVT_ATTR_MATCH_SERVICE_SPECIFIC_INFO_LEN:
380 ind.service_specific_info_len = nl_itr.get_u16();
381 break;
382 case NAN_EVT_ATTR_MATCH_SERVICE_SPECIFIC_INFO:
383 memcpy(ind.service_specific_info, nl_itr.get_data(), ind.service_specific_info_len);
384 break;
385 case NAN_EVT_ATTR_MATCH_SDF_MATCH_FILTER_LEN:
386 ind.sdf_match_filter_len = nl_itr.get_u16();
387 break;
388 case NAN_EVT_ATTR_MATCH_SDF_MATCH_FILTER:
389 memcpy(ind.sdf_match_filter, nl_itr.get_data(), ind.sdf_match_filter_len);
390 break;
391 case NAN_EVT_ATTR_MATCH_MATCH_OCCURED_FLAG:
392 ind.match_occured_flag = nl_itr.get_u8();
393 break;
394 case NAN_EVT_ATTR_MATCH_OUT_OF_RESOURCE_FLAG:
395 ind.out_of_resource_flag = nl_itr.get_u8();
396 break;
397 case NAN_EVT_ATTR_MATCH_RSSI_VALUE:
398 ind.rssi_value = nl_itr.get_u8();
399 break;
400 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_IBSS_SUPPORTED:
401 ind.conn_capability.is_ibss_supported = nl_itr.get_u8();
402 break;
403 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_WFD_SUPPORTED:
404 ind.conn_capability.is_wfd_supported = nl_itr.get_u8();
405 break;
406 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_WFDS_SUPPORTED:
407 ind.conn_capability.is_wfds_supported = nl_itr.get_u8();
408 break;
409 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_TDLS_SUPPORTED:
410 ind.conn_capability.is_tdls_supported = nl_itr.get_u8();
411 break;
412 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_MESH_SUPPORTED:
413 ind.conn_capability.is_mesh_supported= nl_itr.get_u8();
414 break;
415 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_WLAN_INFRA_FIELD:
416 ind.conn_capability.wlan_infra_field = nl_itr.get_u8();
417 break;
418 case NAN_EVT_ATTR_MATCH_NUM_RX_DISCOVERY_ATTR:
419 ind.num_rx_discovery_attr = nl_itr.get_u8();
420 break;
421 case NAN_EVT_ATTR_MATCH_RX_DISCOVERY_ATTR:
422 NanReceivePostDiscovery *disc_attr;
423 disc_attr = &ind.discovery_attr[disc_idx];
424 disc_idx++;
425 for(nl_iterator nl_nested_itr((struct nlattr *)nl_itr.get_data()); nl_nested_itr.has_next(); nl_nested_itr.next()) {
426 switch(nl_nested_itr.get_type()) {
427 case NAN_EVT_ATTR_MATCH_DISC_ATTR_TYPE:
428 disc_attr->type = (NanConnectionType)nl_nested_itr.get_u8();
429 break;
430 case NAN_EVT_ATTR_MATCH_DISC_ATTR_ROLE:
431 disc_attr->role = (NanDeviceRole)nl_nested_itr.get_u8();
432 break;
433 case NAN_EVT_ATTR_MATCH_DISC_ATTR_DURATION:
434 disc_attr->duration = (NanAvailDuration)nl_nested_itr.get_u8();
435 break;
436 case NAN_EVT_ATTR_MATCH_DISC_ATTR_AVAIL_INTERVAL_BITMAP:
437 disc_attr->avail_interval_bitmap = nl_nested_itr.get_u32();
438 break;
439 case NAN_EVT_ATTR_MATCH_DISC_ATTR_MAPID:
440 disc_attr->mapid = nl_nested_itr.get_u8();
441 break;
442 case NAN_EVT_ATTR_MATCH_DISC_ATTR_ADDR:
443 memcpy(disc_attr->addr, nl_nested_itr.get_data(), NAN_MAC_ADDR_LEN);
444 break;
445 case NAN_EVT_ATTR_MATCH_DISC_ATTR_MESH_ID_LEN:
446 disc_attr->mesh_id_len = nl_nested_itr.get_u8();
447 break;
448 case NAN_EVT_ATTR_MATCH_DISC_ATTR_MESH_ID:
449 memcpy(disc_attr->mesh_id, nl_nested_itr.get_data(), disc_attr->mesh_id_len);
450 break;
451 case NAN_EVT_ATTR_MATCH_DISC_ATTR_INFRASTRUCTURE_SSID_LEN:
452 disc_attr->infrastructure_ssid_len = nl_nested_itr.get_u16();
453 break;
454 case NAN_EVT_ATTR_MATCH_DISC_ATTR_INFRASTRUCTURE_SSID_VAL:
455 memcpy(disc_attr->infrastructure_ssid_val, nl_nested_itr.get_data(), disc_attr->infrastructure_ssid_len);
456 break;
457 }
458 }
459 break;
460 case NAN_EVT_ATTR_MATCH_NUM_CHANS:
461 ind.num_chans = nl_itr.get_u8();
462 break;
463 case NAN_EVT_ATTR_MATCH_FAMCHAN:
464 NanFurtherAvailabilityChannel *famchan;
465 famchan = &ind.famchan[famchan_idx];
466 famchan_idx++;
467 for(nl_iterator nl_nested_itr((struct nlattr *)nl_itr.get_data()); nl_nested_itr.has_next(); nl_nested_itr.next()) {
468 switch(nl_nested_itr.get_type()) {
469 case NAN_EVT_ATTR_MATCH_FAM_ENTRY_CONTROL:
470 famchan->entry_control = (NanAvailDuration)nl_nested_itr.get_u8();
471 break;
472 case NAN_EVT_ATTR_MATCH_FAM_CLASS_VAL:
473 famchan->class_val = nl_nested_itr.get_u8();
474 break;
475 case NAN_EVT_ATTR_MATCH_FAM_CHANNEL:
476 famchan->channel = nl_nested_itr.get_u8();
477 break;
478 case NAN_EVT_ATTR_MATCH_FAM_MAPID:
479 famchan->mapid = nl_nested_itr.get_u8();
480 break;
481 case NAN_EVT_ATTR_MATCH_FAM_AVAIL_INTERVAL_BITMAP:
482 famchan->avail_interval_bitmap = nl_nested_itr.get_u32();
483 break;
484 }
485 }
45011ff7 486 break;
d3a587e8
JPS
487 case NAN_EVT_ATTR_MATCH_CLUSTER_ATTRIBUTE_LEN:
488 ind.cluster_attribute_len = nl_itr.get_u8();
489 break;
490 case NAN_EVT_ATTR_MATCH_CLUSTER_ATTRIBUTE:
491 memcpy(ind.cluster_attribute, nl_itr.get_data(), ind.cluster_attribute_len);
492 break;
f8c9e3bb
JPS
493 case NAN_EVT_ATTR_SDEA_LEN:
494 ind.sdea_service_specific_info_len = nl_itr.get_u16();
495 break;
496 case NAN_EVT_ATTR_SDEA:
497 memcpy(ind.sdea_service_specific_info, nl_itr.get_data(), ind.sdea_service_specific_info_len);
498 break;
d3a587e8
JPS
499 }
500 }
45011ff7 501
d3a587e8
JPS
502 if (this->callbackEventHandler.EventMatch)
503 this->callbackEventHandler.EventMatch(&ind);
504 return NL_OK;
505 }
506
507 int processMatchExpiredEvent(WifiEvent &event) {
508 NanMatchExpiredInd ind;
509 memset(&ind,0,sizeof(NanMatchExpiredInd));
510
511 for(nl_iterator nl_itr((struct nlattr *)event.get_vendor_data()); nl_itr.has_next(); nl_itr.next()) {
512 switch(nl_itr.get_type()) {
513 case NAN_EVT_ATTR_MATCH_PUBLISH_SUBSCRIBE_ID:
514 ind.publish_subscribe_id = nl_itr.get_u16();
515 break;
516 case NAN_EVT_ATTR_MATCH_REQUESTOR_INSTANCE_ID:
517 ind.requestor_instance_id = nl_itr.get_u32();
518 break;
519 default :
520 ALOGE("processMatchExpiredEvent: unknown attribute(%d)", nl_itr.get_type());
521 return NL_SKIP;
522 }
523 }
524
525 if (callbackEventHandler.EventMatchExpired)
526 callbackEventHandler.EventMatchExpired(&ind);
527
528 return NL_OK;
529 }
530
531 int processPublishTerminatedEvent(WifiEvent &event) {
532 NanPublishTerminatedInd ind;
533 memset(&ind,0,sizeof(ind));
534
535 for(nl_iterator nl_itr((struct nlattr *)event.get_vendor_data()); nl_itr.has_next(); nl_itr.next()) {
536 switch(nl_itr.get_type()) {
537 case NAN_EVT_ATTR_PUBLISH_ID:
538 ind.publish_id = nl_itr.get_u16();
539 break;
540 case NAN_EVT_ATTR_PUBLISH_REASON:
541 ind.reason = (NanStatusType)nl_itr.get_u32();
542 break;
543 default :
544 ALOGE("processPublishTerminatedEvent: unknown attribute(%d)", nl_itr.get_type());
545 return NL_SKIP;
546 }
547 }
548
549 if (callbackEventHandler.EventPublishTerminated)
550 callbackEventHandler.EventPublishTerminated(&ind);
551
552 return NL_OK;
553
554 }
555
556 int processSubscribeTerminatedEvent(WifiEvent &event) {
557 NanSubscribeTerminatedInd ind;
558 memset(&ind,0,sizeof(ind));
559
560 for(nl_iterator nl_itr((struct nlattr *)event.get_vendor_data()); nl_itr.has_next(); nl_itr.next()) {
561 switch(nl_itr.get_type()) {
562 case NAN_EVT_ATTR_SUBSCRIBE_ID:
563 ind.subscribe_id = nl_itr.get_u16();
564 break;
565 case NAN_EVT_ATTR_SUBSCRIBE_REASON:
566 ind.reason = (NanStatusType)nl_itr.get_u32();
567 break;
568 default :
569 ALOGE("processSubscribeTerminatedEvent: unknown attribute(%d)", nl_itr.get_type());
570 return NL_SKIP;
571 }
572 }
573
574 if (callbackEventHandler.EventSubscribeTerminated)
575 callbackEventHandler.EventSubscribeTerminated(&ind);
576
577 return NL_OK;
578 }
579
580 int processFollowupEvent(WifiEvent &event) {
581 NanFollowupInd ind;
f8c9e3bb 582 nlattr *vendor_data = event.get_attribute(NL80211_ATTR_VENDOR_DATA);
d3a587e8
JPS
583 memset(&ind,0,sizeof(ind));
584
f8c9e3bb 585 for(nl_iterator nl_itr(vendor_data); nl_itr.has_next(); nl_itr.next()) {
d3a587e8
JPS
586 switch(nl_itr.get_type()) {
587 case NAN_EVT_ATTR_FOLLOWUP_PUBLISH_SUBSCRIBE_ID:
588 ind.publish_subscribe_id = nl_itr.get_u16();
589 break;
590 case NAN_EVT_ATTR_FOLLOWUP_REQUESTOR_INSTANCE_ID:
591 ind.requestor_instance_id = nl_itr.get_u32();
592 break;
593 case NAN_EVT_ATTR_FOLLOWUP_ADDR:
594 memcpy(ind.addr, nl_itr.get_data(), NAN_MAC_ADDR_LEN);
595 break;
596 case NAN_EVT_ATTR_FOLLOWUP_DW_OR_FAW:
597 ind.dw_or_faw = nl_itr.get_u8();
598 break;
599 case NAN_EVT_ATTR_FOLLOWUP_SERVICE_SPECIFIC_INFO_LEN:
600 ind.service_specific_info_len = nl_itr.get_u16();
601 break;
602 case NAN_EVT_ATTR_FOLLOWUP_SERVICE_SPECIFIC_INFO:
603 memcpy(ind.service_specific_info, nl_itr.get_data(), ind.service_specific_info_len);
604 break;
f8c9e3bb
JPS
605 case NAN_EVT_ATTR_SDEA_LEN:
606 ind.sdea_service_specific_info_len = nl_itr.get_u16();
607 break;
608 case NAN_EVT_ATTR_SDEA:
609 memcpy(ind.sdea_service_specific_info, nl_itr.get_data(), ind.sdea_service_specific_info_len);
610 break;
d3a587e8
JPS
611 default :
612 ALOGE("processNanDisabledEvent: unknown attribute(%d)", nl_itr.get_type());
613 return NL_SKIP;
614 }
615 }
616
617 if (callbackEventHandler.EventFollowup)
618 callbackEventHandler.EventFollowup(&ind);
619
620 return NL_OK;
621 }
622
623 int processNanDisabledEvent(WifiEvent &event) {
624 NanDisabledInd ind;
625 memset(&ind,0,sizeof(ind));
f8c9e3bb
JPS
626 nlattr *vendor_data = event.get_attribute(NL80211_ATTR_VENDOR_DATA);
627 for(nl_iterator nl_itr(vendor_data); nl_itr.has_next(); nl_itr.next()) {
d3a587e8
JPS
628 switch(nl_itr.get_type()) {
629 case NAN_EVT_ATTR_DISABLED_REASON:
630 ind.reason = (NanStatusType)nl_itr.get_u32();
631 break;
632 default :
633 ALOGE("processNanDisabledEvent: unknown attribute(%d)", nl_itr.get_type());
634 return NL_SKIP;
635 }
636 }
637
638 if (callbackEventHandler.EventDisabled)
639 callbackEventHandler.EventDisabled(&ind);
640
641 return NL_OK;
642 }
643
644 int processNanDiscoveryEvent(WifiEvent &event) {
645 NanDiscEngEventInd ind;
646 memset(&ind,0,sizeof(ind));
cdcc8b21 647 u8 *addr = NULL;
f8c9e3bb
JPS
648 nlattr *vendor_data = event.get_attribute(NL80211_ATTR_VENDOR_DATA);
649 for(nl_iterator nl_itr(vendor_data); nl_itr.has_next(); nl_itr.next()) {
d3a587e8
JPS
650 switch(nl_itr.get_type()) {
651 case NAN_EVT_ATTR_DISCOVERY_ENGINE_EVT_TYPE:
652 ind.event_type = (NanDiscEngEventType)nl_itr.get_u16();
653 break;
654 case NAN_EVT_ATTR_DISCOVERY_ENGINE_MAC_ADDR:
655 addr = (u8 *)nl_itr.get_data();
656 break;
657 default :
658 ALOGE("processNanDiscoveryEvent: unknown attribute(%d)", nl_itr.get_type());
659 return NL_SKIP;
660 }
661 }
cdcc8b21
JPS
662 if (addr) {
663 if (ind.event_type == NAN_EVENT_ID_DISC_MAC_ADDR)
664 memcpy(ind.data.mac_addr.addr, addr, NAN_MAC_ADDR_LEN);
665 else
666 memcpy(ind.data.cluster.addr, addr, NAN_MAC_ADDR_LEN);
667 } else {
668 ALOGE("processNanDiscoveryEvent: No Mac/cluster Address");
669 }
d3a587e8
JPS
670
671 if (callbackEventHandler.EventDiscEngEvent)
672 callbackEventHandler.EventDiscEngEvent(&ind);
673
674 return NL_OK;
675 }
676
677public:
678 NanCommand(wifi_interface_handle iface, int id)
679 : WifiCommand(iface, id)
680 {
681 subscribeID[0] = 0;
682 subscribeID[1] = 0;
683 publishID[0] = 0;
684 publishID[1] = 0;
685 followupID[0] = 0;
686 followupID[0] = 0;
687 version = 0;
688 memset(&capabilities, 0, sizeof(capabilities));
689 }
690
691 int enable(NanEnableRequest *msg) {
692 ALOGD("Start NAN...");
693 WifiRequest request(familyId(), ifaceId());
694
695 int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_NAN_ENABLE);
696 CHECK_WIFI_STATUS_RETURN_FAIL(result, "enable:Failed to create WifiRequest");
697
698 nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
699 if (!data) {
700 ALOGE("enable: request.attr_start fail");
701 return WIFI_ERROR_OUT_OF_MEMORY;
702 }
49e66671
JPS
703 /* Valid master pref values are 2-254 */
704 int master_pref;
705 if (msg->master_pref < 2)
706 master_pref = 2;
707 else if (msg->master_pref > 254)
708 master_pref = 254;
709 else
710 master_pref = msg->master_pref;
711 result = request.put_u8(NAN_REQ_ATTR_MASTER_PREF, master_pref);
d3a587e8
JPS
712 CHECK_WIFI_STATUS_RETURN_FAIL(result, "enable:Failed to put master_pref");
713
714 result = request.put_u16(NAN_REQ_ATTR_CLUSTER_LOW, msg->cluster_low);
715 CHECK_WIFI_STATUS_RETURN_FAIL(result, "enable:Failed to put cluster_low");
716
717 result = request.put_u16(NAN_REQ_ATTR_CLUSTER_HIGH, msg->cluster_high);
718 CHECK_WIFI_STATUS_RETURN_FAIL(result, "enable:Failed to put cluster_high");
719
720 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_support_5g, msg->support_5g_val,
721 NAN_REQ_ATTR_SUPPORT_5G_VAL, request, result, "enable:Failed to put support_5g_val");
722
723 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_sid_beacon, msg->sid_beacon_val,
724 NAN_REQ_ATTR_SID_BEACON_VAL, request, result, "enable:Failed to put sid_beacon_val");
725
726 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_2dot4g_rssi_close, msg->rssi_close_2dot4g_val,
727 NAN_REQ_ATTR_RSSI_CLOSE_2G4_VAL, request, result, "enable:Failed to put rssi_close_2dot4g_val");
728
729 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_2dot4g_rssi_middle, msg->rssi_middle_2dot4g_val,
730 NAN_REQ_ATTR_RSSI_MIDDLE_2G4_VAL, request, result, "enable:Failed to put rssi_middle_2dot4g_val");
731
732 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_2dot4g_rssi_proximity, msg->rssi_proximity_2dot4g_val,
733 NAN_REQ_ATTR_RSSI_PROXIMITY_2G4_VAL, request, result, "enable:Failed to put rssi_proximity_2dot4g_val");
734
735 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_hop_count_limit, msg->hop_count_limit_val,
736 NAN_REQ_ATTR_HOP_COUNT_LIMIT_VAL, request, result, "enable:Failed to put hop_count_limit_val");
737
738 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_2dot4g_support, msg->support_2dot4g_val,
739 NAN_REQ_ATTR_SUPPORT_2G4_VAL, request, result, "enable:Failed to put support_2dot4g_val");
740
741 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_2dot4g_beacons, msg->beacon_2dot4g_val,
742 NAN_REQ_ATTR_BEACONS_2G4_VAL, request, result, "enable:Failed to put beacon_2dot4g_val");
743
744 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_2dot4g_sdf, msg->sdf_2dot4g_val,
745 NAN_REQ_ATTR_SDF_2G4_VAL, request, result, "enable:Failed to put sdf_2dot4g_val");
746
747 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_5g_beacons, msg->beacon_5g_val,
748 NAN_REQ_ATTR_BEACON_5G_VAL, request, result, "enable:Failed to put beacon_5g_val");
749
750 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_5g_sdf, msg->sdf_5g_val,
751 NAN_REQ_ATTR_SDF_5G_VAL, request, result, "enable:Failed to put sdf_5g_val");
752
753 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_5g_rssi_close, msg->rssi_close_5g_val,
754 NAN_REQ_ATTR_RSSI_CLOSE_5G_VAL, request, result, "enable:Failed to put rssi_close_5g_val");
755
756 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_5g_rssi_middle, msg->rssi_middle_5g_val,
757 NAN_REQ_ATTR_RSSI_MIDDLE_5G_VAL, request, result, "enable:Failed to put rssi_middle_5g_val");
758
759 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_5g_rssi_close_proximity, msg->rssi_close_proximity_5g_val,
760 NAN_REQ_ATTR_RSSI_CLOSE_PROXIMITY_5G_VAL, request, result, "enable:Failed to put rssi_close_proximity_5g_val");
761
762 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_rssi_window_size, msg->rssi_window_size_val,
763 NAN_REQ_ATTR_RSSI_WINDOW_SIZE_VAL, request, result, "enable:Failed to put rssi_window_size_val");
764
765 CHECK_CONFIG_PUT_32_RETURN_FAIL(msg->config_oui, msg->oui_val,
766 NAN_REQ_ATTR_OUI_VAL, request, result, "enable:Failed to put oui_val");
767
768 CHECK_CONFIG_PUT_RETURN_FAIL(msg->config_intf_addr, msg->intf_addr_val, NAN_MAC_ADDR_LEN,
769 NAN_REQ_ATTR_MAC_ADDR_VAL, request, result, "enable:Failed to put intf_addr_val");
770
771 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->config_cluster_attribute_val,
772 NAN_REQ_ATTR_CLUSTER_VAL, request, result, "enable:Failed to put config_cluster_attribute_val");
773
774 CHECK_CONFIG_PUT_RETURN_FAIL(msg->config_scan_params, msg->scan_params_val.dwell_time, sizeof(msg->scan_params_val.dwell_time),
775 NAN_REQ_ATTR_SOCIAL_CH_SCAN_DWELL_TIME, request, result, "enable:Failed to put scan_params_val.dwell_time");
776
777 CHECK_CONFIG_PUT_RETURN_FAIL(msg->config_scan_params, msg->scan_params_val.scan_period, sizeof(msg->scan_params_val.scan_period),
778 NAN_REQ_ATTR_SOCIAL_CH_SCAN_PERIOD, request, result, "enable:Failed to put scan_params_val.scan_period");
779
780 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_random_factor_force, msg->random_factor_force_val,
781 NAN_REQ_ATTR_RANDOM_FACTOR_FORCE_VAL, request, result, "enable:Failed to put random_factor_force_val");
782
783 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_hop_count_force, msg->hop_count_force_val,
784 NAN_REQ_ATTR_HOP_COUNT_FORCE_VAL, request, result, "enable:Failed to put hop_count_force_val");
785
786 CHECK_CONFIG_PUT_32_RETURN_FAIL(msg->config_24g_channel, msg->channel_24g_val,
787 NAN_REQ_ATTR_CHANNEL_2G4_MHZ_VAL, request, result, "enable:Failed to put channel_24g_val");
788
789 CHECK_CONFIG_PUT_32_RETURN_FAIL(msg->config_5g_channel, msg->channel_5g_val,
790 NAN_REQ_ATTR_CHANNEL_5G_MHZ_VAL, request, result, "enable:Failed to put channel_5g_val");
791
f8c9e3bb
JPS
792 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_subscribe_sid_beacon, msg->subscribe_sid_beacon_val,
793 NAN_REQ_ATTR_SUBSCRIBE_SID_BEACON_VAL, request, result, "enable:Failed to put subscribe_sid_beacon_val");
794
795 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_dw.config_2dot4g_dw_band, msg->config_dw.dw_2dot4g_interval_val,
796 NAN_REQ_ATTR_DW_2G4_INTERVAL, request, result, "enable:Failed to put dw_2dot4g_interval_val");
797
798 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_dw.config_5g_dw_band, msg->config_dw.dw_5g_interval_val,
799 NAN_REQ_ATTR_DW_5G_INTERVAL, request, result, "enable:Failed to put dw_5g_interval_val");
800
801 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_disc_mac_addr_randomization, msg->disc_mac_addr_rand_interval_sec,
802 NAN_REQ_ATTR_DISC_MAC_ADDR_RANDOM_INTERVAL, request, result, "enable:Failed to put disc_mac_addr_rand_interval_sec");
803
d3a587e8
JPS
804 request.attr_end(data);
805
806 registerNanEvents();
807
808 result = requestResponse(request);
809 if (result != WIFI_SUCCESS) {
810 ALOGE("failed to NAN; result = %d", result);
811 unregisterNanEvents();
812 } else {
813 ALOGD("Start NAN...success");
814 }
815 return result;
816 }
817
818 int disable()
819 {
820 ALOGD("Stop NAN...");
821 WifiRequest request(familyId(), ifaceId());
822
823 unregisterNanEvents();
824
825 int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_NAN_DISABLE);
826 CHECK_WIFI_STATUS_RETURN_FAIL(result, "disable:Failed to create WifiRequest");
827 result = requestResponse(request);
828 CHECK_WIFI_STATUS_RETURN_FAIL(result, "disable:Failed to requestResponse");
829 return result;
830 }
831
832 int config(NanConfigRequest *msg) {
49e66671 833 ALOGD("NAN config...");
d3a587e8
JPS
834 WifiRequest request(familyId(), ifaceId());
835
836 int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_NAN_CONFIG);
837 CHECK_WIFI_STATUS_RETURN_FAIL(result, "config:Failed to create WifiRequest");
838
839 nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
840 if (!data) {
841 ALOGE("config: request.attr_start fail");
842 return WIFI_ERROR_OUT_OF_MEMORY;
843 }
844
845 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_sid_beacon, msg->sid_beacon,
846 NAN_REQ_ATTR_SID_BEACON_VAL, request, result, "config:Failed to put sid_beacon");
847
848 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_rssi_proximity, msg->rssi_proximity,
849 NAN_REQ_ATTR_RSSI_PROXIMITY_2G4_VAL, request, result, "config:Failed to put rssi_proximity");
850
851 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_master_pref, msg->master_pref,
852 NAN_REQ_ATTR_MASTER_PREF, request, result, "config:Failed to put master_pref");
853
854 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_5g_rssi_close_proximity, msg->rssi_close_proximity_5g_val,
855 NAN_REQ_ATTR_RSSI_CLOSE_PROXIMITY_5G_VAL, request, result, "config:Failed to put rssi_close_proximity_5g_val");
856
857 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_rssi_window_size, msg->rssi_window_size_val,
858 NAN_REQ_ATTR_RSSI_WINDOW_SIZE_VAL, request, result, "config:Failed to put rssi_window_size_val");
859
860 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->config_cluster_attribute_val,
861 NAN_REQ_ATTR_CLUSTER_VAL, request, result, "config:Failed to put config_cluster_attribute_val");
862
863 CHECK_CONFIG_PUT_RETURN_FAIL(msg->config_scan_params, msg->scan_params_val.dwell_time, sizeof(msg->scan_params_val.dwell_time),
864 NAN_REQ_ATTR_SOCIAL_CH_SCAN_DWELL_TIME, request, result, "config:Failed to put scan_params_val.dwell_time");
865
866 CHECK_CONFIG_PUT_RETURN_FAIL(msg->config_scan_params, msg->scan_params_val.scan_period, sizeof(msg->scan_params_val.scan_period),
867 NAN_REQ_ATTR_SOCIAL_CH_SCAN_PERIOD, request, result, "config:Failed to put scan_params_val.scan_period");
868
869 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_random_factor_force, msg->random_factor_force_val,
870 NAN_REQ_ATTR_RANDOM_FACTOR_FORCE_VAL, request, result, "config:Failed to put random_factor_force_val");
871
872 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_hop_count_force, msg->hop_count_force_val,
873 NAN_REQ_ATTR_HOP_COUNT_FORCE_VAL, request, result, "config:Failed to put hop_count_force_val");
874
875 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_conn_capability, msg->conn_capability_val.payload_transmit_flag,
876 NAN_REQ_ATTR_CONN_CAPABILITY_PAYLOAD_TX, request, result, "config:Failed to put payload_transmit_flag");
877
878 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_conn_capability, msg->conn_capability_val.is_wfd_supported,
879 NAN_REQ_ATTR_CONN_CAPABILITY_WFD, request, result, "config:Failed to put is_wfd_supported");
880
881 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_conn_capability, msg->conn_capability_val.is_wfds_supported,
882 NAN_REQ_ATTR_CONN_CAPABILITY_WFDS, request, result, "config:Failed to put is_wfds_supported");
883
884 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_conn_capability, msg->conn_capability_val.is_tdls_supported,
885 NAN_REQ_ATTR_CONN_CAPABILITY_TDLS, request, result, "config:Failed to put is_tdls_supported");
886
887 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_conn_capability, msg->conn_capability_val.is_ibss_supported,
888 NAN_REQ_ATTR_CONN_CAPABILITY_IBSS, request, result, "config:Failed to put is_ibss_supported");
889
890 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_conn_capability, msg->conn_capability_val.is_mesh_supported,
891 NAN_REQ_ATTR_CONN_CAPABILITY_MESH, request, result, "config:Failed to put is_mesh_supported");
892
893 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_conn_capability, msg->conn_capability_val.wlan_infra_field,
894 NAN_REQ_ATTR_CONN_CAPABILITY_WLAN_INFRA, request, result, "config:Failed to put wlan_infra_field");
895
896 if (msg->num_config_discovery_attr) {
897 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->num_config_discovery_attr,
898 NAN_REQ_ATTR_DISCOVERY_ATTR_NUM_ENTRIES, request, result, "config:Failed to put msg->num_config_discovery_attr");
899 for (int i = 0; i < msg->num_config_discovery_attr; i++) {
900 nlattr *nl_disc_attribute = request.attr_start(NAN_REQ_ATTR_DISCOVERY_ATTR_VAL);
901 NanTransmitPostDiscovery *discovery_attr = &msg->discovery_attr_val[i];
902 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, discovery_attr->type,
903 NAN_REQ_ATTR_CONN_TYPE, request, result, "config:Failed to put discovery_attr->type");
904 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, discovery_attr->role,
905 NAN_REQ_ATTR_NAN_ROLE, request, result, "config:Failed to put discovery_attr->role");
906 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, discovery_attr->transmit_freq,
907 NAN_REQ_ATTR_TRANSMIT_FREQ, request, result, "config:Failed to put discovery_attr->transmit_freq");
908 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, discovery_attr->duration,
909 NAN_REQ_ATTR_AVAILABILITY_DURATION, request, result, "config:Failed to put discovery_attr->duration");
910 CHECK_CONFIG_PUT_32_RETURN_FAIL(1, discovery_attr->avail_interval_bitmap,
911 NAN_REQ_ATTR_AVAILABILITY_INTERVAL, request, result, "config:Failed to put discovery_attr->avail_interval_bitmap");
912 CHECK_CONFIG_PUT_RETURN_FAIL(1, discovery_attr->addr, NAN_MAC_ADDR_LEN,
913 NAN_REQ_ATTR_MAC_ADDR_VAL, request, result, "config:Failed to put discovery_attr->addr");
914 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, discovery_attr->mesh_id_len,
915 NAN_REQ_ATTR_MESH_ID_LEN, request, result, "config:Failed to put discovery_attr->mesh_id");
916 CHECK_CONFIG_PUT_RETURN_FAIL(discovery_attr->mesh_id_len, discovery_attr->mesh_id, discovery_attr->mesh_id_len,
917 NAN_REQ_ATTR_MESH_ID, request, result, "config:Failed to put discovery_attr->mesh_id");
918 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, discovery_attr->infrastructure_ssid_len,
919 NAN_REQ_ATTR_INFRASTRUCTURE_SSID_LEN, request, result, "config:Failed to put discovery_attr->infrastructure_ssid_val");
920 CHECK_CONFIG_PUT_RETURN_FAIL(discovery_attr->infrastructure_ssid_len, discovery_attr->infrastructure_ssid_val, discovery_attr->infrastructure_ssid_len,
921 NAN_REQ_ATTR_INFRASTRUCTURE_SSID, request, result, "config:Failed to put discovery_attr->infrastructure_ssid_val");
922 request.attr_end(nl_disc_attribute);
923 }
924 }
925
926 if (msg->config_fam) {
927 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->fam_val.numchans,
928 NAN_REQ_ATTR_FURTHER_AVAIL_NUM_ENTRIES, request, result, "config:Failed to put msg->fam_val.numchans");
929 for (int i = 0; i < msg->fam_val.numchans; i++) {
930 nlattr *nl_fam_attribute = request.attr_start(NAN_REQ_ATTR_FURTHER_AVAIL_VAL);
931 NanFurtherAvailabilityChannel *further_avail_chan = &msg->fam_val.famchan[i];
932 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, further_avail_chan->entry_control,
933 NAN_REQ_ATTR_FURTHER_AVAIL_ENTRY_CTRL, request, result, "config:Failed to put further_avail_chan->entry_control");
934 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, further_avail_chan->class_val,
935 NAN_REQ_ATTR_FURTHER_AVAIL_CHAN_CLASS, request, result, "config:Failed to put further_avail_chan->class_val");
936 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, further_avail_chan->channel,
937 NAN_REQ_ATTR_FURTHER_AVAIL_CHAN, request, result, "config:Failed to put further_avail_chan->channel");
938 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, further_avail_chan->mapid,
939 NAN_REQ_ATTR_FURTHER_AVAIL_CHAN_MAPID, request, result, "config:Failed to put further_avail_chan->mapid");
940 CHECK_CONFIG_PUT_32_RETURN_FAIL(1, further_avail_chan->avail_interval_bitmap,
941 NAN_REQ_ATTR_FURTHER_AVAIL_INTERVAL_BITMAP, request, result, "config:Failed to put further_avail_chan->avail_interval_bitmap");
942 request.attr_end(nl_fam_attribute);
943 }
944 }
945
f8c9e3bb
JPS
946 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_subscribe_sid_beacon, msg->subscribe_sid_beacon_val,
947 NAN_REQ_ATTR_SUBSCRIBE_SID_BEACON_VAL, request, result, "config:Failed to put subscribe_sid_beacon_val");
948
949 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_dw.config_2dot4g_dw_band, msg->config_dw.dw_2dot4g_interval_val,
950 NAN_REQ_ATTR_DW_2G4_INTERVAL, request, result, "config:Failed to put dw_2dot4g_interval_val");
951
952 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_dw.config_5g_dw_band, msg->config_dw.dw_5g_interval_val,
953 NAN_REQ_ATTR_DW_5G_INTERVAL, request, result, "config:Failed to put dw_5g_interval_val");
954
955 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->config_disc_mac_addr_randomization, msg->disc_mac_addr_rand_interval_sec,
956 NAN_REQ_ATTR_DISC_MAC_ADDR_RANDOM_INTERVAL, request, result, "config:Failed to put disc_mac_addr_rand_interval_sec");
957
d3a587e8
JPS
958 request.attr_end(data);
959 result = requestResponse(request);
960 if (result != WIFI_SUCCESS) {
961 ALOGE("failed to set_config; result = %d", result);
962 } else {
49e66671 963 ALOGD("NAN config...success");
d3a587e8
JPS
964 }
965 return result;
966 }
967
968 static int setCallbackHandler(NanCallbackHandler handlers) {
969 callbackEventHandler = handlers;
970 return WIFI_SUCCESS;
971 }
972
973 static int getVersion(NanVersion *version) {
974 *version = SLSI_WIFI_HAL_NAN_VERSION;
975 return WIFI_SUCCESS;
976 }
977
978 int publish(NanPublishRequest *msg) {
49e66671 979 ALOGD("NAN publish...");
d3a587e8
JPS
980 WifiRequest request(familyId(), ifaceId());
981
982 int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_NAN_PUBLISH);
983 CHECK_WIFI_STATUS_RETURN_FAIL(result, "publish:Failed to create WifiRequest");
984
985 nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
986 if (!data) {
987 ALOGE("publish: request.attr_start fail");
988 return WIFI_ERROR_OUT_OF_MEMORY;
989 }
990
991 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->publish_id, msg->publish_id,
992 NAN_REQ_ATTR_PUBLISH_ID, request, result, "publish:Failed to put msg->publish_id");
993
994 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->ttl, msg->ttl,
995 NAN_REQ_ATTR_PUBLISH_TTL, request, result, "publish:Failed to put msg->ttl");
996
997 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg->period,
998 NAN_REQ_ATTR_PUBLISH_PERIOD, request, result, "publish:Failed to put msg->period");
999
1000 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->publish_type,
1001 NAN_REQ_ATTR_PUBLISH_TYPE, request, result, "publish:Failed to put msg->publish_type");
1002
1003 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->tx_type,
1004 NAN_REQ_ATTR_PUBLISH_TX_TYPE, request, result, "publish:Failed to put msg->tx_type");
1005
1006 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->publish_count,
1007 NAN_REQ_ATTR_PUBLISH_COUNT, request, result, "publish:Failed to put msg->publish_count");
1008
1009 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->service_name_len, msg->service_name_len,
1010 NAN_REQ_ATTR_PUBLISH_SERVICE_NAME_LEN, request, result, "publish:Failed to put msg->service_name_len");
1011
1012 CHECK_CONFIG_PUT_RETURN_FAIL(msg->service_name_len, msg->service_name, msg->service_name_len,
1013 NAN_REQ_ATTR_PUBLISH_SERVICE_NAME, request, result, "publish:Failed to put msg->service_name");
1014
1015 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->publish_match_indicator,
1016 NAN_REQ_ATTR_PUBLISH_MATCH_ALGO, request, result, "publish:Failed to put msg->publish_match_indicator");
1017
1018 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->service_specific_info_len, msg->service_specific_info_len,
1019 NAN_REQ_ATTR_PUBLISH_SERVICE_INFO_LEN, request, result, "publish:Failed to put msg->service_specific_info_len");
1020
1021 CHECK_CONFIG_PUT_RETURN_FAIL(msg->service_specific_info_len, msg->service_specific_info, msg->service_specific_info_len,
1022 NAN_REQ_ATTR_PUBLISH_SERVICE_INFO, request, result, "publish:Failed to put msg->service_specific_info");
1023
1024 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->rx_match_filter_len, msg->rx_match_filter_len,
1025 NAN_REQ_ATTR_PUBLISH_RX_MATCH_FILTER_LEN, request, result, "publish:Failed to put msg->rx_match_filter_len");
1026
1027 CHECK_CONFIG_PUT_RETURN_FAIL(msg->rx_match_filter_len, msg->rx_match_filter, msg->rx_match_filter_len,
1028 NAN_REQ_ATTR_PUBLISH_RX_MATCH_FILTER, request, result, "publish:Failed to put msg->rx_match_filter");
1029
1030 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->tx_match_filter_len, msg->tx_match_filter_len,
1031 NAN_REQ_ATTR_PUBLISH_TX_MATCH_FILTER_LEN, request, result, "publish:Failed to put msg->tx_match_filter_len");
1032
1033 CHECK_CONFIG_PUT_RETURN_FAIL(msg->tx_match_filter_len, msg->tx_match_filter, msg->tx_match_filter_len,
1034 NAN_REQ_ATTR_PUBLISH_TX_MATCH_FILTER, request, result, "publish:Failed to put msg->tx_match_filter");
1035
1036 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->rssi_threshold_flag,
1037 NAN_REQ_ATTR_PUBLISH_RSSI_THRESHOLD_FLAG, request, result, "publish:Failed to put msg->rssi_threshold_flag");
1038
1039 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->connmap,
1040 NAN_REQ_ATTR_PUBLISH_CONN_MAP, request, result, "publish:Failed to put msg->connmap");
1041
1042 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->recv_indication_cfg,
1043 NAN_REQ_ATTR_PUBLISH_RECV_IND_CFG, request, result, "publish:Failed to put msg->recv_indication_cfg");
1044
f8c9e3bb
JPS
1045 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg->sdea_service_specific_info_len,
1046 NAN_REQ_ATTR_PUBLISH_SDEA_LEN, request, result, "publish:Failed to put msg->sdea_service_specific_info_len");
1047
1048 CHECK_CONFIG_PUT_RETURN_FAIL(msg->sdea_service_specific_info_len, msg->sdea_service_specific_info, msg->sdea_service_specific_info_len,
1049 NAN_REQ_ATTR_PUBLISH_SDEA, request, result, "publish:Failed to put msg->sdea_service_specific_info");
1050
d3a587e8
JPS
1051 request.attr_end(data);
1052 result = requestResponse(request);
1053 if (result != WIFI_SUCCESS) {
1054 ALOGE("failed to publish; result = %d", result);
1055 } else {
49e66671 1056 ALOGD("NAN publish...success");
d3a587e8
JPS
1057 }
1058 return result;
1059 }
1060
1061 int publishCancel(NanPublishCancelRequest *msg) {
49e66671 1062 ALOGD("NAN publishCancel...");
d3a587e8
JPS
1063 WifiRequest request(familyId(), ifaceId());
1064
1065 int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_NAN_PUBLISHCANCEL);
1066 CHECK_WIFI_STATUS_RETURN_FAIL(result, "publishCancel:Failed to create WifiRequest");
1067
1068 nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
1069 if (!data) {
1070 ALOGE("publishCancel: request.attr_start fail");
1071 return WIFI_ERROR_OUT_OF_MEMORY;
1072 }
1073
1074 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg->publish_id,
1075 NAN_REQ_ATTR_PUBLISH_ID, request, result, "publishCancel:Failed to put msg->publish_id");
1076
1077 request.attr_end(data);
1078 result = requestResponse(request);
1079 if (result != WIFI_SUCCESS) {
1080 ALOGE("failed to publishCancel; result = %d", result);
1081 } else {
49e66671 1082 ALOGD("NAN publishCancel...success");
d3a587e8
JPS
1083 }
1084 return result;
1085
1086 }
1087
1088 int subscribe(NanSubscribeRequest *msg) {
49e66671 1089 ALOGD("NAN subscribe...");
d3a587e8
JPS
1090 WifiRequest request(familyId(), ifaceId());
1091
1092 int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_NAN_SUBSCRIBE);
1093 CHECK_WIFI_STATUS_RETURN_FAIL(result, "subscribe:Failed to create WifiRequest");
1094
1095 nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
1096 if (!data) {
1097 ALOGE("subscribe: request.attr_start fail");
1098 return WIFI_ERROR_OUT_OF_MEMORY;
1099 }
1100
1101 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->subscribe_id, msg->subscribe_id,
1102 NAN_REQ_ATTR_SUBSCRIBE_ID, request, result, "subscribe:Failed to put msg->publish_id");
1103
1104 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg->ttl,
1105 NAN_REQ_ATTR_SUBSCRIBE_TTL, request, result, "subscribe:Failed to put msg->ttl");
1106
1107 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg->period,
1108 NAN_REQ_ATTR_SUBSCRIBE_PERIOD, request, result, "subscribe:Failed to put msg->period");
1109
1110 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->subscribe_type,
1111 NAN_REQ_ATTR_SUBSCRIBE_TYPE, request, result, "subscribe:Failed to put msg->subscribe_type");
1112
1113 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->serviceResponseFilter,
1114 NAN_REQ_ATTR_SUBSCRIBE_RESP_FILTER_TYPE, request, result, "subscribe:Failed to put msg->serviceResponseFilter");
1115
1116 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->serviceResponseInclude,
1117 NAN_REQ_ATTR_SUBSCRIBE_RESP_INCLUDE, request, result, "subscribe:Failed to put msg->serviceResponseInclude");
1118
1119 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->useServiceResponseFilter,
1120 NAN_REQ_ATTR_SUBSCRIBE_USE_RESP_FILTER, request, result, "subscribe:Failed to put msg->useServiceResponseFilter");
1121
1122 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->ssiRequiredForMatchIndication,
1123 NAN_REQ_ATTR_SUBSCRIBE_SSI_REQUIRED, request, result, "subscribe:Failed to put msg->ssiRequiredForMatchIndication");
1124
1125 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->subscribe_match_indicator,
1126 NAN_REQ_ATTR_SUBSCRIBE_MATCH_INDICATOR, request, result, "subscribe:Failed to put msg->subscribe_match_indicator");
1127
1128 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->subscribe_count,
1129 NAN_REQ_ATTR_SUBSCRIBE_COUNT, request, result, "subscribe:Failed to put msg->subscribe_count");
1130
1131 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->service_name_len, msg->service_name_len,
1132 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_NAME_LEN, request, result, "subscribe:Failed to put msg->service_name_len");
1133
1134 CHECK_CONFIG_PUT_RETURN_FAIL(msg->service_name_len, msg->service_name, msg->service_name_len,
1135 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_NAME, request, result, "subscribe:Failed to put msg->service_name");
1136
1137 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->service_specific_info_len, msg->service_specific_info_len,
1138 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_INFO_LEN, request, result, "subscribe:Failed to put msg->service_specific_info_len");
1139
1140 CHECK_CONFIG_PUT_RETURN_FAIL(msg->service_specific_info_len, msg->service_specific_info, msg->service_specific_info_len,
1141 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_INFO, request, result, "subscribe:Failed to put msg->service_specific_info");
1142
1143 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->rx_match_filter_len, msg->rx_match_filter_len,
1144 NAN_REQ_ATTR_SUBSCRIBE_RX_MATCH_FILTER_LEN, request, result, "subscribe:Failed to put msg->rx_match_filter_len");
1145
1146 CHECK_CONFIG_PUT_RETURN_FAIL(msg->rx_match_filter_len, msg->rx_match_filter, msg->rx_match_filter_len,
1147 NAN_REQ_ATTR_SUBSCRIBE_RX_MATCH_FILTER, request, result, "subscribe:Failed to put msg->rx_match_filter");
1148
1149 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->tx_match_filter_len, msg->tx_match_filter_len,
1150 NAN_REQ_ATTR_SUBSCRIBE_TX_MATCH_FILTER_LEN, request, result, "subscribe:Failed to put msg->tx_match_filter_len");
1151
1152 CHECK_CONFIG_PUT_RETURN_FAIL(msg->tx_match_filter_len, msg->tx_match_filter, msg->tx_match_filter_len,
1153 NAN_REQ_ATTR_SUBSCRIBE_TX_MATCH_FILTER, request, result, "subscribe:Failed to put msg->tx_match_filter");
1154
1155 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->rssi_threshold_flag,
1156 NAN_REQ_ATTR_SUBSCRIBE_RSSI_THRESHOLD_FLAG, request, result, "subscribe:Failed to put msg->rssi_threshold_flag");
1157
1158 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->connmap,
1159 NAN_REQ_ATTR_SUBSCRIBE_CONN_MAP, request, result, "subscribe:Failed to put msg->connmap");
1160
1161 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg->num_intf_addr_present, msg->num_intf_addr_present,
1162 NAN_REQ_ATTR_SUBSCRIBE_NUM_INTF_ADDR_PRESENT, request, result, "subscribe:Failed to put msg->num_intf_addr_present");
1163
1164 CHECK_CONFIG_PUT_RETURN_FAIL(msg->num_intf_addr_present, msg->intf_addr, NAN_MAC_ADDR_LEN * msg->num_intf_addr_present,
1165 NAN_REQ_ATTR_SUBSCRIBE_INTF_ADDR, request, result, "subscribe:Failed to put msg->intf_addr");
1166
1167 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->recv_indication_cfg,
1168 NAN_REQ_ATTR_SUBSCRIBE_RECV_IND_CFG, request, result, "subscribe:Failed to put msg->recv_indication_cfg");
1169
f8c9e3bb
JPS
1170 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg->sdea_service_specific_info_len,
1171 NAN_REQ_ATTR_PUBLISH_SDEA_LEN, request, result, "subscribe:Failed to put msg->sdea_service_specific_info_len");
1172
1173 CHECK_CONFIG_PUT_RETURN_FAIL(msg->sdea_service_specific_info_len, msg->sdea_service_specific_info, msg->sdea_service_specific_info_len,
1174 NAN_REQ_ATTR_PUBLISH_SDEA, request, result, "subscribe:Failed to put msg->sdea_service_specific_info");
1175
1176
d3a587e8
JPS
1177 request.attr_end(data);
1178 result = requestResponse(request);
1179 if (result != WIFI_SUCCESS) {
1180 ALOGE("failed to subscribe; result = %d", result);
1181 } else {
49e66671 1182 ALOGD("NAN subscribe...success");
d3a587e8
JPS
1183 }
1184 return result;
1185
1186 }
1187
1188 int subscribeCancel(NanSubscribeCancelRequest *msg) {
49e66671 1189 ALOGD("NAN subscribeCancel...");
d3a587e8
JPS
1190 WifiRequest request(familyId(), ifaceId());
1191
1192 int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_NAN_SUBSCRIBECANCEL);
1193 CHECK_WIFI_STATUS_RETURN_FAIL(result, "subscribeCancel:Failed to create WifiRequest");
1194
1195 nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
1196 if (!data) {
1197 ALOGE("subscribeCancel: request.attr_start fail");
1198 return WIFI_ERROR_OUT_OF_MEMORY;
1199 }
1200
1201 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg->subscribe_id,
1202 NAN_REQ_ATTR_SUBSCRIBE_ID, request, result, "subscribeCancel:Failed to put msg->subscribe_id");
1203
1204 request.attr_end(data);
1205 result = requestResponse(request);
1206 if (result != WIFI_SUCCESS) {
1207 ALOGE("failed to subscribeCancel; result = %d", result);
1208 } else {
49e66671 1209 ALOGD("NAN subscribeCancel...success");
d3a587e8
JPS
1210 }
1211 return result;
1212 }
1213
1214 int followup(NanTransmitFollowupRequest *msg) {
49e66671 1215 ALOGD("NAN followup...");
d3a587e8
JPS
1216 WifiRequest request(familyId(), ifaceId());
1217
1218 int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_NAN_TXFOLLOWUP);
1219 CHECK_WIFI_STATUS_RETURN_FAIL(result, "followup:Failed to create WifiRequest");
1220
1221 nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
1222 if (!data) {
1223 ALOGE("followup: request.attr_start fail");
1224 return WIFI_ERROR_OUT_OF_MEMORY;
1225 }
1226
1227 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg->publish_subscribe_id,
1228 NAN_REQ_ATTR_FOLLOWUP_ID, request, result, "followup:Failed to put msg->publish_subscribe_id");
1229
1230 CHECK_CONFIG_PUT_32_RETURN_FAIL(1, msg->requestor_instance_id,
1231 NAN_REQ_ATTR_FOLLOWUP_REQUESTOR_ID, request, result, "followup:Failed to put msg->requestor_instance_id");
1232
1233 CHECK_CONFIG_PUT_RETURN_FAIL(1, msg->addr, NAN_MAC_ADDR_LEN,
1234 NAN_REQ_ATTR_FOLLOWUP_ADDR, request, result, "followup:Failed to put msg->addr");
1235
1236 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->priority,
1237 NAN_REQ_ATTR_FOLLOWUP_PRIORITY, request, result, "followup:Failed to put msg->priority");
1238
1239 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->dw_or_faw,
1240 NAN_REQ_ATTR_FOLLOWUP_TX_WINDOW, request, result, "followup:Failed to put msg->dw_or_faw");
1241
1242 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg->service_specific_info_len, msg->service_specific_info_len,
1243 NAN_REQ_ATTR_FOLLOWUP_SERVICE_NAME_LEN, request, result, "followup:Failed to put msg->service_specific_info_len");
1244
1245 CHECK_CONFIG_PUT_RETURN_FAIL(msg->service_specific_info_len, msg->service_specific_info, msg->service_specific_info_len,
1246 NAN_REQ_ATTR_FOLLOWUP_SERVICE_NAME, request, result, "followup:Failed to put msg->service_specific_info");
1247
1248 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg->recv_indication_cfg,
1249 NAN_REQ_ATTR_FOLLOWUP_RECV_IND_CFG, request, result, "followup:Failed to put msg->recv_indication_cfg");
1250
f8c9e3bb
JPS
1251 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg->sdea_service_specific_info_len,
1252 NAN_REQ_ATTR_PUBLISH_SDEA_LEN, request, result, "publish:Failed to put msg->sdea_service_specific_info_len");
1253
1254 CHECK_CONFIG_PUT_RETURN_FAIL(msg->sdea_service_specific_info_len, msg->sdea_service_specific_info, msg->sdea_service_specific_info_len,
1255 NAN_REQ_ATTR_PUBLISH_SDEA, request, result, "publish:Failed to put msg->sdea_service_specific_info");
1256
d3a587e8
JPS
1257 request.attr_end(data);
1258 result = requestResponse(request);
1259 if (result != WIFI_SUCCESS) {
1260 ALOGE("failed to followup; result = %d", result);
1261 } else {
49e66671 1262 ALOGD("NAN followup...success");
d3a587e8
JPS
1263 }
1264 return result;
1265
1266 }
1267
1268 int getCapabilities(void) {
49e66671 1269 ALOGD("NAN getCapabilities...");
d3a587e8
JPS
1270 WifiRequest request(familyId(), ifaceId());
1271
1272 int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_NAN_CAPABILITIES);
1273 CHECK_WIFI_STATUS_RETURN_FAIL(result, "getCapabilities:Failed to create WifiRequest");
1274
1275 result = requestResponse(request);
1276 if (result != WIFI_SUCCESS) {
1277 ALOGE("failed to getCapabilities; result = %d", result);
1278 } else {
49e66671 1279 ALOGD("NAN getCapabilities...success");
d3a587e8
JPS
1280 }
1281 return result;
1282 }
1283
1284 int handleEvent(WifiEvent &event) {
1285 int ret;
49e66671 1286 ALOGD("NAN handleEvent...");
d3a587e8
JPS
1287
1288 if (event.get_cmd() != NL80211_CMD_VENDOR) {
1289 ALOGD("Ignoring event with cmd = %d", event.get_cmd());
1290 return NL_SKIP;
1291 }
1292
1293 int id = event.get_vendor_id();
1294 int subcmd = event.get_vendor_subcmd();
1295
1296 ALOGI("Id = %0x, subcmd = %d", id, subcmd);
1297
1298 switch(subcmd) {
1299 case SLSI_NAN_EVENT_MATCH:
1300 ret = processMatchEvent(event);
1301 break;
1302 case SLSI_NAN_EVENT_MATCH_EXPIRED:
1303 ret = processMatchExpiredEvent(event);
1304 break;
1305 case SLSI_NAN_EVENT_PUBLISH_TERMINATED:
1306 ret = processPublishTerminatedEvent(event);
1307 break;
1308 case SLSI_NAN_EVENT_SUBSCRIBE_TERMINATED:
1309 ret = processSubscribeTerminatedEvent(event);
1310 break;
1311 case SLSI_NAN_EVENT_FOLLOWUP:
1312 ret = processFollowupEvent(event);
1313 break;
1314 case SLSI_NAN_EVENT_DISABLED:
1315 ret = processNanDisabledEvent(event);
1316 break;
1317 case SLSI_NAN_EVENT_DISCOVERY_ENGINE:
1318 ret = processNanDiscoveryEvent(event);
1319 break;
1320
1321 }
1322
1323 return NL_OK;
1324 }
1325
1326 int handleResponse(WifiEvent &reply) {
49e66671 1327 ALOGD("NAN handleResponse...");
d3a587e8
JPS
1328
1329 if (reply.get_cmd() != NL80211_CMD_VENDOR) {
1330 ALOGD("Ignoring reply with cmd = %d", reply.get_cmd());
1331 return NL_SKIP;
1332 }
1333
d3a587e8
JPS
1334 NanResponseMsg response;
1335 memset(&response, 0, sizeof(response));
1336
1337 if (processResponse(reply, &response) == NL_SKIP)
1338 return NL_SKIP;
1339
1340 if (callbackEventHandler.NotifyResponse)
1341 callbackEventHandler.NotifyResponse(id(), &response);
1342 return NL_OK;
1343 }
1344};
1345
1346NanCallbackHandler NanCommand::callbackEventHandler;
1347
1348NanCommand *nan_get_object(transaction_id id,
1349 wifi_interface_handle iface) {
1350 wifi_handle handle = getWifiHandle(iface);
1351 NanCommand *nanRequest = (NanCommand *)wifi_get_cmd(handle, id);
1352 if (!nanRequest) {
1353 nanRequest = new NanCommand(iface, id);
1354 if (!nanRequest){
1355 ALOGE("Could not alloc NanCommand");
1356 return NULL;
1357 }
1358 }
1359 return nanRequest;
1360}
1361
1362wifi_error nan_enable_request(transaction_id id,
1363 wifi_interface_handle iface,
1364 NanEnableRequest *msg) {
1365 wifi_handle handle = getWifiHandle(iface);
1366 wifi_error ret;
1367
1368 NanCommand *nanRequest = new NanCommand(iface, id);
1369 if (!nanRequest) {
1370 ALOGE("nan_enable_request:: Unable to create NanCommand");
1371 return WIFI_ERROR_OUT_OF_MEMORY;
1372 }
1373
1374 wifi_register_cmd(handle, id, nanRequest);
1375 ret = (wifi_error)nanRequest->enable(msg);
1376 if (ret != WIFI_SUCCESS) {
1377 wifi_unregister_cmd(handle, id);
1378 delete nanRequest;
1379 }
1380 return ret;
1381}
1382
1383/* Disable NAN functionality. */
1384wifi_error nan_disable_request(transaction_id id, wifi_interface_handle iface) {
1385 NanCommand *nanRequest = nan_get_object(id, iface);
1386 wifi_error ret;
1387
1388 if (!nanRequest) {
1389 return WIFI_ERROR_OUT_OF_MEMORY;
1390 }
1391 ret = (wifi_error)nanRequest->disable();
1392 delete nanRequest;
1393 return ret;
1394}
1395
1396/* Publish request to advertize a service. */
1397wifi_error nan_publish_request(transaction_id id,
1398 wifi_interface_handle iface,
1399 NanPublishRequest *msg) {
1400 NanCommand *nanRequest = nan_get_object(id, iface);
1401 if (!nanRequest) {
1402 return WIFI_ERROR_OUT_OF_MEMORY;
1403 }
1404 return (wifi_error)nanRequest->publish(msg);
1405}
1406
1407/* Cancel previous publish requests. */
1408wifi_error nan_publish_cancel_request(transaction_id id,
1409 wifi_interface_handle iface,
1410 NanPublishCancelRequest *msg) {
1411 NanCommand *nanRequest = nan_get_object(id, iface);
1412 if (!nanRequest) {
1413 return WIFI_ERROR_OUT_OF_MEMORY;
1414 }
1415 return (wifi_error)nanRequest->publishCancel(msg);
1416}
1417
1418/* Subscribe request to search for a service. */
1419wifi_error nan_subscribe_request(transaction_id id,
1420 wifi_interface_handle iface,
1421 NanSubscribeRequest *msg) {
1422 NanCommand *nanRequest = nan_get_object(id, iface);
1423 if (!nanRequest) {
1424 return WIFI_ERROR_OUT_OF_MEMORY;
1425 }
1426 return (wifi_error)nanRequest->subscribe(msg);
1427}
1428
1429/* Cancel previous subscribe requests. */
1430wifi_error nan_subscribe_cancel_request(transaction_id id,
1431 wifi_interface_handle iface,
1432 NanSubscribeCancelRequest *msg) {
1433 NanCommand *nanRequest = nan_get_object(id, iface);
1434 if (!nanRequest) {
1435 return WIFI_ERROR_OUT_OF_MEMORY;
1436 }
1437 return (wifi_error)nanRequest->subscribeCancel(msg);
1438}
1439
1440/* NAN transmit follow up request. */
1441wifi_error nan_transmit_followup_request(transaction_id id,
1442 wifi_interface_handle iface,
1443 NanTransmitFollowupRequest *msg) {
1444 NanCommand *nanRequest = nan_get_object(id, iface);
1445 if (!nanRequest) {
1446 return WIFI_ERROR_OUT_OF_MEMORY;
1447 }
1448 return (wifi_error)nanRequest->followup(msg);
1449}
1450
1451/* NAN configuration request. */
1452wifi_error nan_config_request(transaction_id id,
1453 wifi_interface_handle iface,
1454 NanConfigRequest *msg) {
1455 NanCommand *nanRequest = nan_get_object(id, iface);
1456 if (!nanRequest) {
1457 return WIFI_ERROR_OUT_OF_MEMORY;
1458 }
1459 return (wifi_error)nanRequest->config(msg);
1460}
1461
1462/* Register NAN callbacks. */
1463wifi_error nan_register_handler(wifi_interface_handle iface,
1464 NanCallbackHandler handlers) {
1465 return (wifi_error)NanCommand::setCallbackHandler(handlers);
1466}
1467
1468/* Get NAN HAL version. */
1469wifi_error nan_get_version(wifi_handle handle,
1470 NanVersion *version) {
1471 return (wifi_error)NanCommand::getVersion(version);
1472}
1473
1474/* Get NAN capabilities. */
1475wifi_error nan_get_capabilities(transaction_id id,
1476 wifi_interface_handle iface) {
1477 NanCommand *nanRequest = nan_get_object(id, iface);
1478 if (!nanRequest) {
1479 return WIFI_ERROR_OUT_OF_MEMORY;
1480 }
1481 return (wifi_error)nanRequest->getCapabilities();
1482}
1483