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>
21 #include <utils/Log.h>
25 #include "cpp_bindings.h"
27 #define SLSI_WIFI_HAL_NAN_VERSION 1
29 #define CHECK_WIFI_STATUS_RETURN_FAIL(result, LOGSTR) \
30 if (result != WIFI_SUCCESS) {\
31 ALOGE(LOGSTR" [result:%d]", result);\
35 #define CHECK_CONFIG_PUT_8_RETURN_FAIL(config, val, nan_attribute, request, result, FAIL_STR) \
37 result = request.put_u8(nan_attribute, val); \
38 if (result != WIFI_SUCCESS) {\
39 ALOGE(FAIL_STR" [result:%d]", result);\
44 #define CHECK_CONFIG_PUT_16_RETURN_FAIL(config, val, nan_attribute, request, result, FAIL_STR) \
46 result = request.put_u16(nan_attribute, val); \
47 if (result != WIFI_SUCCESS) {\
48 ALOGE(FAIL_STR" [result:%d]", result);\
54 #define CHECK_CONFIG_PUT_32_RETURN_FAIL(config, val, nan_attribute, request, result, FAIL_STR) \
56 result = request.put_u32(nan_attribute, val); \
57 if (result != WIFI_SUCCESS) {\
58 ALOGE(FAIL_STR" [result:%d]", result);\
63 #define CHECK_CONFIG_PUT_RETURN_FAIL(config, valptr, len, nan_attribute, request, result, FAIL_STR) \
65 result = request.put(nan_attribute, valptr, len); \
66 if (result != WIFI_SUCCESS) {\
67 ALOGE(FAIL_STR" [result:%d]", result);\
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
,
79 NAN_REQ_ATTR_SUPPORT_2G4_VAL
,
80 NAN_REQ_ATTR_SUPPORT_5G_VAL
,
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
,
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
,
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
,
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
,
188 NAN_REQ_ATTR_RANGING_AUTO_RESPONSE
,
189 NAN_REQ_ATTR_SDEA_PARAM_NDP_TYPE
,
190 NAN_REQ_ATTR_SDEA_PARAM_SECURITY_CFG
,
191 NAN_REQ_ATTR_SDEA_PARAM_RANGING_STATE
,
192 NAN_REQ_ATTR_SDEA_PARAM_RANGE_REPORT
,
193 NAN_REQ_ATTR_SDEA_PARAM_QOS_CFG
,
194 NAN_REQ_ATTR_RANGING_CFG_INTERVAL
,
195 NAN_REQ_ATTR_RANGING_CFG_INDICATION
,
196 NAN_REQ_ATTR_RANGING_CFG_INGRESS_MM
,
197 NAN_REQ_ATTR_RANGING_CFG_EGRESS_MM
,
198 NAN_REQ_ATTR_CIPHER_TYPE
,
199 NAN_REQ_ATTR_SCID_LEN
,
201 NAN_REQ_ATTR_SECURITY_KEY_TYPE
,
202 NAN_REQ_ATTR_SECURITY_PMK_LEN
,
203 NAN_REQ_ATTR_SECURITY_PMK
,
204 NAN_REQ_ATTR_SECURITY_PASSPHRASE_LEN
,
205 NAN_REQ_ATTR_SECURITY_PASSPHRASE
,
206 NAN_REQ_ATTR_RANGE_RESPONSE_CFG_PUBLISH_ID
,
207 NAN_REQ_ATTR_RANGE_RESPONSE_CFG_REQUESTOR_ID
,
208 NAN_REQ_ATTR_RANGE_RESPONSE_CFG_PEER_ADDR
,
209 NAN_REQ_ATTR_RANGE_RESPONSE_CFG_RANGING_RESPONSE
210 } NAN_REQ_ATTRIBUTES
;
213 NAN_REPLY_ATTR_STATUS_TYPE
,
214 NAN_REPLY_ATTR_VALUE
,
215 NAN_REPLY_ATTR_RESPONSE_TYPE
,
216 NAN_REPLY_ATTR_PUBLISH_SUBSCRIBE_TYPE
,
217 NAN_REPLY_ATTR_CAP_MAX_CONCURRENT_CLUSTER
,
218 NAN_REPLY_ATTR_CAP_MAX_PUBLISHES
,
219 NAN_REPLY_ATTR_CAP_MAX_SUBSCRIBES
,
220 NAN_REPLY_ATTR_CAP_MAX_SERVICE_NAME_LEN
,
221 NAN_REPLY_ATTR_CAP_MAX_MATCH_FILTER_LEN
,
222 NAN_REPLY_ATTR_CAP_MAX_TOTAL_MATCH_FILTER_LEN
,
223 NAN_REPLY_ATTR_CAP_MAX_SERVICE_SPECIFIC_INFO_LEN
,
224 NAN_REPLY_ATTR_CAP_MAX_VSA_DATA_LEN
,
225 NAN_REPLY_ATTR_CAP_MAX_MESH_DATA_LEN
,
226 NAN_REPLY_ATTR_CAP_MAX_NDI_INTERFACES
,
227 NAN_REPLY_ATTR_CAP_MAX_NDP_SESSIONS
,
228 NAN_REPLY_ATTR_CAP_MAX_APP_INFO_LEN
,
229 } NAN_RESP_ATTRIBUTES
;
232 NAN_EVT_ATTR_MATCH_PUBLISH_SUBSCRIBE_ID
= 0,
233 NAN_EVT_ATTR_MATCH_REQUESTOR_INSTANCE_ID
,
234 NAN_EVT_ATTR_MATCH_ADDR
,
235 NAN_EVT_ATTR_MATCH_SERVICE_SPECIFIC_INFO_LEN
,
236 NAN_EVT_ATTR_MATCH_SERVICE_SPECIFIC_INFO
,
237 NAN_EVT_ATTR_MATCH_SDF_MATCH_FILTER_LEN
,
238 NAN_EVT_ATTR_MATCH_SDF_MATCH_FILTER
,
239 NAN_EVT_ATTR_MATCH_MATCH_OCCURED_FLAG
,
240 NAN_EVT_ATTR_MATCH_OUT_OF_RESOURCE_FLAG
,
241 NAN_EVT_ATTR_MATCH_RSSI_VALUE
,
243 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_WFD_SUPPORTED
= 10,
244 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_WFDS_SUPPORTED
,
245 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_TDLS_SUPPORTED
,
246 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_IBSS_SUPPORTED
,
247 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_MESH_SUPPORTED
,
248 NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_WLAN_INFRA_FIELD
,
249 NAN_EVT_ATTR_MATCH_NUM_RX_DISCOVERY_ATTR
,
250 NAN_EVT_ATTR_MATCH_RX_DISCOVERY_ATTR
,
251 /*NANRECEIVEPOSTDISCOVERY DISCOVERY_ATTR,*/
252 NAN_EVT_ATTR_MATCH_DISC_ATTR_TYPE
,
253 NAN_EVT_ATTR_MATCH_DISC_ATTR_ROLE
,
254 NAN_EVT_ATTR_MATCH_DISC_ATTR_DURATION
= 20,
255 NAN_EVT_ATTR_MATCH_DISC_ATTR_AVAIL_INTERVAL_BITMAP
,
256 NAN_EVT_ATTR_MATCH_DISC_ATTR_MAPID
,
257 NAN_EVT_ATTR_MATCH_DISC_ATTR_ADDR
,
258 NAN_EVT_ATTR_MATCH_DISC_ATTR_MESH_ID_LEN
,
259 NAN_EVT_ATTR_MATCH_DISC_ATTR_MESH_ID
,
260 NAN_EVT_ATTR_MATCH_DISC_ATTR_INFRASTRUCTURE_SSID_LEN
,
261 NAN_EVT_ATTR_MATCH_DISC_ATTR_INFRASTRUCTURE_SSID_VAL
,
263 NAN_EVT_ATTR_MATCH_NUM_CHANS
,
264 NAN_EVT_ATTR_MATCH_FAMCHAN
,
266 NAN_EVT_ATTR_MATCH_FAM_ENTRY_CONTROL
= 30,
267 NAN_EVT_ATTR_MATCH_FAM_CLASS_VAL
,
268 NAN_EVT_ATTR_MATCH_FAM_CHANNEL
,
269 NAN_EVT_ATTR_MATCH_FAM_MAPID
,
270 NAN_EVT_ATTR_MATCH_FAM_AVAIL_INTERVAL_BITMAP
,
271 NAN_EVT_ATTR_MATCH_CLUSTER_ATTRIBUTE_LEN
,
272 NAN_EVT_ATTR_MATCH_CLUSTER_ATTRIBUTE
,
273 NAN_EVT_ATTR_PUBLISH_ID
,
274 NAN_EVT_ATTR_PUBLISH_REASON
,
275 NAN_EVT_ATTR_SUBSCRIBE_ID
,
276 NAN_EVT_ATTR_SUBSCRIBE_REASON
= 40,
277 NAN_EVT_ATTR_DISABLED_REASON
,
278 NAN_EVT_ATTR_FOLLOWUP_PUBLISH_SUBSCRIBE_ID
,
279 NAN_EVT_ATTR_FOLLOWUP_REQUESTOR_INSTANCE_ID
,
280 NAN_EVT_ATTR_FOLLOWUP_ADDR
,
281 NAN_EVT_ATTR_FOLLOWUP_DW_OR_FAW
,
282 NAN_EVT_ATTR_FOLLOWUP_SERVICE_SPECIFIC_INFO_LEN
,
283 NAN_EVT_ATTR_FOLLOWUP_SERVICE_SPECIFIC_INFO
,
284 NAN_EVT_ATTR_DISCOVERY_ENGINE_EVT_TYPE
,
285 NAN_EVT_ATTR_DISCOVERY_ENGINE_MAC_ADDR
,
286 NAN_EVT_ATTR_DISCOVERY_ENGINE_CLUSTER
= 50,
288 NAN_EVT_ATTR_SDEA_LEN
,
290 NAN_EVT_ATTR_SCID_LEN
,
291 NAN_EVT_ATTR_SDEA_PARAM_CONFIG_NAN_DATA_PATH
,
292 NAN_EVT_ATTR_SDEA_PARAM_NDP_TYPE
,
293 NAN_EVT_ATTR_SDEA_PARAM_SECURITY_CONFIG
,
294 NAN_EVT_ATTR_SDEA_PARAM_RANGE_STATE
,
295 NAN_EVT_ATTR_SDEA_PARAM_RANGE_REPORT
,
296 NAN_EVT_ATTR_SDEA_PARAM_QOS_CFG
= 60,
297 NAN_EVT_ATTR_RANGE_MEASUREMENT_MM
,
298 NAN_EVT_ATTR_RANGEING_EVENT_TYPE
,
299 NAN_EVT_ATTR_SECURITY_CIPHER_TYPE
,
301 } NAN_EVT_ATTRIBUTES
;
303 class NanCommand
: public WifiCommand
{
304 static NanCallbackHandler callbackEventHandler
;
308 transaction_id followupTid
;
309 transaction_id publishTid
;
310 transaction_id publishCancelTid
;
311 transaction_id subscribeTid
;
312 transaction_id subscribeCancelTid
;
313 transaction_id enableTid
;
314 transaction_id disableTid
;
315 transaction_id configTid
;
316 transaction_id capabilitiesTid
;
318 NanCapabilities capabilities
;
320 void registerNanEvents(void) {
321 registerVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_PUBLISH_TERMINATED
);
322 registerVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_MATCH
);
323 registerVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_MATCH_EXPIRED
);
324 registerVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_SUBSCRIBE_TERMINATED
);
325 registerVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_FOLLOWUP
);
326 registerVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_DISCOVERY_ENGINE
);
327 registerVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_TRANSMIT_FOLLOWUP_STATUS
);
330 void unregisterNanEvents(void) {
331 unregisterVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_PUBLISH_TERMINATED
);
332 unregisterVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_MATCH
);
333 unregisterVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_MATCH_EXPIRED
);
334 unregisterVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_SUBSCRIBE_TERMINATED
);
335 unregisterVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_FOLLOWUP
);
336 unregisterVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_DISCOVERY_ENGINE
);
337 unregisterVendorHandler(GOOGLE_OUI
, SLSI_NAN_EVENT_TRANSMIT_FOLLOWUP_STATUS
);
340 int processResponse(WifiEvent
&reply
, NanResponseMsg
*response
) {
341 NanCapabilities
*capabilities
= &response
->body
.nan_capabilities
;
342 nlattr
*vendor_data
= reply
.get_attribute(NL80211_ATTR_VENDOR_DATA
);
345 for(nl_iterator
nl_itr(vendor_data
); nl_itr
.has_next(); nl_itr
.next()) {
346 switch(nl_itr
.get_type()) {
347 case NAN_REPLY_ATTR_STATUS_TYPE
:
348 response
->status
= NanStatusType(nl_itr
.get_u32());
350 case NAN_REPLY_ATTR_VALUE
:
351 val
= nl_itr
.get_u32();
353 strncpy(response
->nan_error
, "Lower_layer_error",NAN_ERROR_STR_LEN
);
356 case NAN_REPLY_ATTR_RESPONSE_TYPE
:
357 response
->response_type
= NanResponseType(nl_itr
.get_u32());
359 case NAN_REPLY_ATTR_PUBLISH_SUBSCRIBE_TYPE
:
360 response
->body
.publish_response
.publish_id
= nl_itr
.get_u16();
362 case NAN_REPLY_ATTR_CAP_MAX_CONCURRENT_CLUSTER
:
363 capabilities
->max_concurrent_nan_clusters
= nl_itr
.get_u32();
365 case NAN_REPLY_ATTR_CAP_MAX_PUBLISHES
:
366 capabilities
->max_publishes
= nl_itr
.get_u32();
368 case NAN_REPLY_ATTR_CAP_MAX_SUBSCRIBES
:
369 capabilities
->max_subscribes
= nl_itr
.get_u32();
371 case NAN_REPLY_ATTR_CAP_MAX_SERVICE_NAME_LEN
:
372 capabilities
->max_service_name_len
= nl_itr
.get_u32();
374 case NAN_REPLY_ATTR_CAP_MAX_MATCH_FILTER_LEN
:
375 capabilities
->max_match_filter_len
= nl_itr
.get_u32();
377 case NAN_REPLY_ATTR_CAP_MAX_TOTAL_MATCH_FILTER_LEN
:
378 capabilities
->max_total_match_filter_len
= nl_itr
.get_u32();
380 case NAN_REPLY_ATTR_CAP_MAX_SERVICE_SPECIFIC_INFO_LEN
:
381 capabilities
->max_service_specific_info_len
= nl_itr
.get_u32();
383 case NAN_REPLY_ATTR_CAP_MAX_VSA_DATA_LEN
:
384 capabilities
->max_vsa_data_len
= nl_itr
.get_u32();
386 case NAN_REPLY_ATTR_CAP_MAX_MESH_DATA_LEN
:
387 capabilities
->max_mesh_data_len
= nl_itr
.get_u32();
389 case NAN_REPLY_ATTR_CAP_MAX_NDI_INTERFACES
:
390 capabilities
->max_ndi_interfaces
= nl_itr
.get_u32();
392 case NAN_REPLY_ATTR_CAP_MAX_NDP_SESSIONS
:
393 capabilities
->max_ndp_sessions
= nl_itr
.get_u32();
395 case NAN_REPLY_ATTR_CAP_MAX_APP_INFO_LEN
:
396 capabilities
->max_app_info_len
= nl_itr
.get_u32();
399 ALOGE("received unknown type(%d) in response", nl_itr
.get_type());
403 this->capabilities
= *capabilities
;
407 int processMatchEvent(WifiEvent
&event
) {
409 memset(&ind
,0,sizeof(NanMatchInd
));
410 int famchan_idx
= 0, disc_idx
= 0;
411 nlattr
*vendor_data
= event
.get_attribute(NL80211_ATTR_VENDOR_DATA
);
413 for(nl_iterator
nl_itr(vendor_data
); nl_itr
.has_next(); nl_itr
.next()) {
414 switch(nl_itr
.get_type()) {
415 case NAN_EVT_ATTR_MATCH_PUBLISH_SUBSCRIBE_ID
:
416 ind
.publish_subscribe_id
= nl_itr
.get_u16();
418 case NAN_EVT_ATTR_MATCH_REQUESTOR_INSTANCE_ID
:
419 ind
.requestor_instance_id
= nl_itr
.get_u32();
421 case NAN_EVT_ATTR_MATCH_ADDR
:
422 memcpy(ind
.addr
, nl_itr
.get_data(), NAN_MAC_ADDR_LEN
);
424 case NAN_EVT_ATTR_MATCH_SERVICE_SPECIFIC_INFO_LEN
:
425 ind
.service_specific_info_len
= nl_itr
.get_u16();
427 case NAN_EVT_ATTR_MATCH_SERVICE_SPECIFIC_INFO
:
428 memcpy(ind
.service_specific_info
, nl_itr
.get_data(), ind
.service_specific_info_len
);
430 case NAN_EVT_ATTR_MATCH_SDF_MATCH_FILTER_LEN
:
431 ind
.sdf_match_filter_len
= nl_itr
.get_u16();
433 case NAN_EVT_ATTR_MATCH_SDF_MATCH_FILTER
:
434 memcpy(ind
.sdf_match_filter
, nl_itr
.get_data(), ind
.sdf_match_filter_len
);
436 case NAN_EVT_ATTR_MATCH_MATCH_OCCURED_FLAG
:
437 ind
.match_occured_flag
= nl_itr
.get_u8();
439 case NAN_EVT_ATTR_MATCH_OUT_OF_RESOURCE_FLAG
:
440 ind
.out_of_resource_flag
= nl_itr
.get_u8();
442 case NAN_EVT_ATTR_MATCH_RSSI_VALUE
:
443 ind
.rssi_value
= nl_itr
.get_u8();
445 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_IBSS_SUPPORTED
:
446 ind
.conn_capability
.is_ibss_supported
= nl_itr
.get_u8();
448 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_WFD_SUPPORTED
:
449 ind
.conn_capability
.is_wfd_supported
= nl_itr
.get_u8();
451 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_WFDS_SUPPORTED
:
452 ind
.conn_capability
.is_wfds_supported
= nl_itr
.get_u8();
454 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_TDLS_SUPPORTED
:
455 ind
.conn_capability
.is_tdls_supported
= nl_itr
.get_u8();
457 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_IS_MESH_SUPPORTED
:
458 ind
.conn_capability
.is_mesh_supported
= nl_itr
.get_u8();
460 case NAN_EVT_ATTR_MATCH_CONN_CAPABILITY_WLAN_INFRA_FIELD
:
461 ind
.conn_capability
.wlan_infra_field
= nl_itr
.get_u8();
463 case NAN_EVT_ATTR_MATCH_NUM_RX_DISCOVERY_ATTR
:
464 ind
.num_rx_discovery_attr
= nl_itr
.get_u8();
466 case NAN_EVT_ATTR_MATCH_RX_DISCOVERY_ATTR
:
467 NanReceivePostDiscovery
*disc_attr
;
468 disc_attr
= &ind
.discovery_attr
[disc_idx
];
470 for(nl_iterator
nl_nested_itr((struct nlattr
*)nl_itr
.get_data()); nl_nested_itr
.has_next(); nl_nested_itr
.next()) {
471 switch(nl_nested_itr
.get_type()) {
472 case NAN_EVT_ATTR_MATCH_DISC_ATTR_TYPE
:
473 disc_attr
->type
= (NanConnectionType
)nl_nested_itr
.get_u8();
475 case NAN_EVT_ATTR_MATCH_DISC_ATTR_ROLE
:
476 disc_attr
->role
= (NanDeviceRole
)nl_nested_itr
.get_u8();
478 case NAN_EVT_ATTR_MATCH_DISC_ATTR_DURATION
:
479 disc_attr
->duration
= (NanAvailDuration
)nl_nested_itr
.get_u8();
481 case NAN_EVT_ATTR_MATCH_DISC_ATTR_AVAIL_INTERVAL_BITMAP
:
482 disc_attr
->avail_interval_bitmap
= nl_nested_itr
.get_u32();
484 case NAN_EVT_ATTR_MATCH_DISC_ATTR_MAPID
:
485 disc_attr
->mapid
= nl_nested_itr
.get_u8();
487 case NAN_EVT_ATTR_MATCH_DISC_ATTR_ADDR
:
488 memcpy(disc_attr
->addr
, nl_nested_itr
.get_data(), NAN_MAC_ADDR_LEN
);
490 case NAN_EVT_ATTR_MATCH_DISC_ATTR_MESH_ID_LEN
:
491 disc_attr
->mesh_id_len
= nl_nested_itr
.get_u8();
493 case NAN_EVT_ATTR_MATCH_DISC_ATTR_MESH_ID
:
494 memcpy(disc_attr
->mesh_id
, nl_nested_itr
.get_data(), disc_attr
->mesh_id_len
);
496 case NAN_EVT_ATTR_MATCH_DISC_ATTR_INFRASTRUCTURE_SSID_LEN
:
497 disc_attr
->infrastructure_ssid_len
= nl_nested_itr
.get_u16();
499 case NAN_EVT_ATTR_MATCH_DISC_ATTR_INFRASTRUCTURE_SSID_VAL
:
500 memcpy(disc_attr
->infrastructure_ssid_val
, nl_nested_itr
.get_data(), disc_attr
->infrastructure_ssid_len
);
505 case NAN_EVT_ATTR_MATCH_NUM_CHANS
:
506 ind
.num_chans
= nl_itr
.get_u8();
508 case NAN_EVT_ATTR_MATCH_FAMCHAN
:
509 NanFurtherAvailabilityChannel
*famchan
;
510 famchan
= &ind
.famchan
[famchan_idx
];
512 for(nl_iterator
nl_nested_itr((struct nlattr
*)nl_itr
.get_data()); nl_nested_itr
.has_next(); nl_nested_itr
.next()) {
513 switch(nl_nested_itr
.get_type()) {
514 case NAN_EVT_ATTR_MATCH_FAM_ENTRY_CONTROL
:
515 famchan
->entry_control
= (NanAvailDuration
)nl_nested_itr
.get_u8();
517 case NAN_EVT_ATTR_MATCH_FAM_CLASS_VAL
:
518 famchan
->class_val
= nl_nested_itr
.get_u8();
520 case NAN_EVT_ATTR_MATCH_FAM_CHANNEL
:
521 famchan
->channel
= nl_nested_itr
.get_u8();
523 case NAN_EVT_ATTR_MATCH_FAM_MAPID
:
524 famchan
->mapid
= nl_nested_itr
.get_u8();
526 case NAN_EVT_ATTR_MATCH_FAM_AVAIL_INTERVAL_BITMAP
:
527 famchan
->avail_interval_bitmap
= nl_nested_itr
.get_u32();
532 case NAN_EVT_ATTR_MATCH_CLUSTER_ATTRIBUTE_LEN
:
533 ind
.cluster_attribute_len
= nl_itr
.get_u8();
535 case NAN_EVT_ATTR_MATCH_CLUSTER_ATTRIBUTE
:
536 memcpy(ind
.cluster_attribute
, nl_itr
.get_data(), ind
.cluster_attribute_len
);
538 case NAN_EVT_ATTR_SDEA_LEN
:
539 ind
.sdea_service_specific_info_len
= nl_itr
.get_u16();
541 case NAN_EVT_ATTR_SDEA
:
542 memcpy(ind
.sdea_service_specific_info
, nl_itr
.get_data(), ind
.sdea_service_specific_info_len
);
544 case NAN_EVT_ATTR_SCID_LEN
:
545 ind
.scid_len
= nl_itr
.get_u32();
547 case NAN_EVT_ATTR_SCID
:
548 memcpy(ind
.scid
, nl_itr
.get_data(), ind
.scid_len
);
550 case NAN_EVT_ATTR_SDEA_PARAM_CONFIG_NAN_DATA_PATH
:
551 ind
.peer_sdea_params
.config_nan_data_path
= nl_itr
.get_u8();
553 case NAN_EVT_ATTR_SDEA_PARAM_NDP_TYPE
:
554 ind
.peer_sdea_params
.ndp_type
= (NdpType
)nl_itr
.get_u8();
556 case NAN_EVT_ATTR_SDEA_PARAM_SECURITY_CONFIG
:
557 ind
.peer_sdea_params
.security_cfg
= (NanDataPathSecurityCfgStatus
)nl_itr
.get_u8();
559 case NAN_EVT_ATTR_SDEA_PARAM_RANGE_STATE
:
560 ind
.peer_sdea_params
.ranging_state
= (NanRangingState
)nl_itr
.get_u8();
562 case NAN_EVT_ATTR_SDEA_PARAM_RANGE_REPORT
:
563 ind
.peer_sdea_params
.range_report
= (NanRangeReport
)nl_itr
.get_u8();
565 case NAN_EVT_ATTR_SDEA_PARAM_QOS_CFG
:
566 ind
.peer_sdea_params
.qos_cfg
= (NanQosCfgStatus
)nl_itr
.get_u8();
568 case NAN_EVT_ATTR_RANGE_MEASUREMENT_MM
:
569 ind
.range_info
.range_measurement_mm
= nl_itr
.get_u32();
571 case NAN_EVT_ATTR_RANGEING_EVENT_TYPE
:
572 ind
.range_info
.ranging_event_type
= nl_itr
.get_u32();
577 if (this->callbackEventHandler
.EventMatch
)
578 this->callbackEventHandler
.EventMatch(&ind
);
582 int processMatchExpiredEvent(WifiEvent
&event
) {
583 NanMatchExpiredInd ind
;
584 memset(&ind
,0,sizeof(NanMatchExpiredInd
));
586 for(nl_iterator
nl_itr((struct nlattr
*)event
.get_vendor_data()); nl_itr
.has_next(); nl_itr
.next()) {
587 switch(nl_itr
.get_type()) {
588 case NAN_EVT_ATTR_MATCH_PUBLISH_SUBSCRIBE_ID
:
589 ind
.publish_subscribe_id
= nl_itr
.get_u16();
591 case NAN_EVT_ATTR_MATCH_REQUESTOR_INSTANCE_ID
:
592 ind
.requestor_instance_id
= nl_itr
.get_u32();
595 ALOGE("processMatchExpiredEvent: unknown attribute(%d)", nl_itr
.get_type());
600 if (callbackEventHandler
.EventMatchExpired
)
601 callbackEventHandler
.EventMatchExpired(&ind
);
606 int processPublishTerminatedEvent(WifiEvent
&event
) {
607 NanPublishTerminatedInd ind
;
608 memset(&ind
,0,sizeof(ind
));
610 for(nl_iterator
nl_itr((struct nlattr
*)event
.get_vendor_data()); nl_itr
.has_next(); nl_itr
.next()) {
611 switch(nl_itr
.get_type()) {
612 case NAN_EVT_ATTR_PUBLISH_ID
:
613 ind
.publish_id
= nl_itr
.get_u16();
615 case NAN_EVT_ATTR_PUBLISH_REASON
:
616 ind
.reason
= (NanStatusType
)nl_itr
.get_u32();
619 ALOGE("processPublishTerminatedEvent: unknown attribute(%d)", nl_itr
.get_type());
624 if (callbackEventHandler
.EventPublishTerminated
)
625 callbackEventHandler
.EventPublishTerminated(&ind
);
631 int processSubscribeTerminatedEvent(WifiEvent
&event
) {
632 NanSubscribeTerminatedInd ind
;
633 memset(&ind
,0,sizeof(ind
));
635 for(nl_iterator
nl_itr((struct nlattr
*)event
.get_vendor_data()); nl_itr
.has_next(); nl_itr
.next()) {
636 switch(nl_itr
.get_type()) {
637 case NAN_EVT_ATTR_SUBSCRIBE_ID
:
638 ind
.subscribe_id
= nl_itr
.get_u16();
640 case NAN_EVT_ATTR_SUBSCRIBE_REASON
:
641 ind
.reason
= (NanStatusType
)nl_itr
.get_u32();
644 ALOGE("processSubscribeTerminatedEvent: unknown attribute(%d)", nl_itr
.get_type());
649 if (callbackEventHandler
.EventSubscribeTerminated
)
650 callbackEventHandler
.EventSubscribeTerminated(&ind
);
655 int processFollowupEvent(WifiEvent
&event
) {
657 nlattr
*vendor_data
= event
.get_attribute(NL80211_ATTR_VENDOR_DATA
);
658 memset(&ind
,0,sizeof(ind
));
660 for(nl_iterator
nl_itr(vendor_data
); nl_itr
.has_next(); nl_itr
.next()) {
661 switch(nl_itr
.get_type()) {
662 case NAN_EVT_ATTR_FOLLOWUP_PUBLISH_SUBSCRIBE_ID
:
663 ind
.publish_subscribe_id
= nl_itr
.get_u16();
665 case NAN_EVT_ATTR_FOLLOWUP_REQUESTOR_INSTANCE_ID
:
666 ind
.requestor_instance_id
= nl_itr
.get_u32();
668 case NAN_EVT_ATTR_FOLLOWUP_ADDR
:
669 memcpy(ind
.addr
, nl_itr
.get_data(), NAN_MAC_ADDR_LEN
);
671 case NAN_EVT_ATTR_FOLLOWUP_DW_OR_FAW
:
672 ind
.dw_or_faw
= nl_itr
.get_u8();
674 case NAN_EVT_ATTR_FOLLOWUP_SERVICE_SPECIFIC_INFO_LEN
:
675 ind
.service_specific_info_len
= nl_itr
.get_u16();
677 case NAN_EVT_ATTR_FOLLOWUP_SERVICE_SPECIFIC_INFO
:
678 memcpy(ind
.service_specific_info
, nl_itr
.get_data(), ind
.service_specific_info_len
);
680 case NAN_EVT_ATTR_SDEA_LEN
:
681 ind
.sdea_service_specific_info_len
= nl_itr
.get_u16();
683 case NAN_EVT_ATTR_SDEA
:
684 memcpy(ind
.sdea_service_specific_info
, nl_itr
.get_data(), ind
.sdea_service_specific_info_len
);
687 ALOGE("processNanDisabledEvent: unknown attribute(%d)", nl_itr
.get_type());
692 if (callbackEventHandler
.EventFollowup
)
693 callbackEventHandler
.EventFollowup(&ind
);
698 int processNanDisabledEvent(WifiEvent
&event
) {
700 memset(&ind
,0,sizeof(ind
));
701 nlattr
*vendor_data
= event
.get_attribute(NL80211_ATTR_VENDOR_DATA
);
702 for(nl_iterator
nl_itr(vendor_data
); nl_itr
.has_next(); nl_itr
.next()) {
703 switch(nl_itr
.get_type()) {
704 case NAN_EVT_ATTR_DISABLED_REASON
:
705 ind
.reason
= (NanStatusType
)nl_itr
.get_u32();
708 ALOGE("processNanDisabledEvent: unknown attribute(%d)", nl_itr
.get_type());
713 if (callbackEventHandler
.EventDisabled
)
714 callbackEventHandler
.EventDisabled(&ind
);
719 int processNanDiscoveryEvent(WifiEvent
&event
) {
720 NanDiscEngEventInd ind
;
721 memset(&ind
,0,sizeof(ind
));
723 nlattr
*vendor_data
= event
.get_attribute(NL80211_ATTR_VENDOR_DATA
);
724 for(nl_iterator
nl_itr(vendor_data
); nl_itr
.has_next(); nl_itr
.next()) {
725 switch(nl_itr
.get_type()) {
726 case NAN_EVT_ATTR_DISCOVERY_ENGINE_EVT_TYPE
:
727 ind
.event_type
= (NanDiscEngEventType
)nl_itr
.get_u16();
729 case NAN_EVT_ATTR_DISCOVERY_ENGINE_MAC_ADDR
:
730 addr
= (u8
*)nl_itr
.get_data();
733 ALOGE("processNanDiscoveryEvent: unknown attribute(%d)", nl_itr
.get_type());
738 if (ind
.event_type
== NAN_EVENT_ID_DISC_MAC_ADDR
)
739 memcpy(ind
.data
.mac_addr
.addr
, addr
, NAN_MAC_ADDR_LEN
);
741 memcpy(ind
.data
.cluster
.addr
, addr
, NAN_MAC_ADDR_LEN
);
743 ALOGE("processNanDiscoveryEvent: No Mac/cluster Address");
746 if (callbackEventHandler
.EventDiscEngEvent
)
747 callbackEventHandler
.EventDiscEngEvent(&ind
);
752 int processNanFollowupStatus(WifiEvent
&event
) {
753 NanTransmitFollowupInd ind
;
754 memset(&ind
,0,sizeof(ind
));
755 ind
.id
= followupTid
;
757 nlattr
*vendor_data
= event
.get_attribute(NL80211_ATTR_VENDOR_DATA
);
758 for(nl_iterator
nl_itr(vendor_data
); nl_itr
.has_next(); nl_itr
.next()) {
759 if (nl_itr
.get_type() == NAN_EVT_ATTR_STATUS
) {
760 ind
.reason
= (NanStatusType
)nl_itr
.get_u16();
762 ALOGE("processNanFollowupStatus: unknown attribute(%d)", nl_itr
.get_type());
767 if (callbackEventHandler
.EventTransmitFollowup
)
768 callbackEventHandler
.EventTransmitFollowup(&ind
);
773 int putSdeaParams(NanSdeaCtrlParams
*sdea_params
, WifiRequest
*request
)
777 if (!sdea_params
->config_nan_data_path
)
780 result
= request
->put_u8(NAN_REQ_ATTR_SDEA_PARAM_NDP_TYPE
, sdea_params
->ndp_type
);
781 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put SDEA PARAM ndp_type");
783 result
= request
->put_u8(NAN_REQ_ATTR_SDEA_PARAM_SECURITY_CFG
, sdea_params
->security_cfg
);
784 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put SDEA PARAM security_cfg");
786 result
= request
->put_u8(NAN_REQ_ATTR_SDEA_PARAM_RANGING_STATE
, sdea_params
->ranging_state
);
787 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put SDEA PARAM ranging_state");
789 result
= request
->put_u8(NAN_REQ_ATTR_SDEA_PARAM_RANGE_REPORT
, sdea_params
->range_report
);
790 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put SDEA PARAM range_report");
792 result
= request
->put_u8(NAN_REQ_ATTR_SDEA_PARAM_QOS_CFG
, sdea_params
->qos_cfg
);
793 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put SDEA PARAM qos_cfg");
798 int putRangingCfg(NanRangingCfg
*ranging_cfg
, WifiRequest
*request
)
802 result
= request
->put_u32(NAN_REQ_ATTR_RANGING_CFG_INTERVAL
, ranging_cfg
->ranging_interval_msec
);
803 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put Ranging CFG ranging_interval_msec");
805 result
= request
->put_u32(NAN_REQ_ATTR_RANGING_CFG_INDICATION
, ranging_cfg
->config_ranging_indications
);
806 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put Ranging CFG config_ranging_indications");
808 result
= request
->put_u32(NAN_REQ_ATTR_RANGING_CFG_INGRESS_MM
, ranging_cfg
->distance_ingress_mm
);
809 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put Ranging CFG distance_ingress_mm");
811 result
= request
->put_u32(NAN_REQ_ATTR_RANGING_CFG_EGRESS_MM
, ranging_cfg
->distance_egress_mm
);
812 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put Ranging CFG distance_egress_mm");
817 int putRangeResponseCfg(NanRangeResponseCfg
*range_resp_cfg
, WifiRequest
*request
)
821 result
= request
->put_u16(NAN_REQ_ATTR_RANGE_RESPONSE_CFG_PUBLISH_ID
, range_resp_cfg
->publish_id
);
822 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "Failed to put range response cfg::publish_id");
824 result
= request
->put_u32(NAN_REQ_ATTR_RANGE_RESPONSE_CFG_REQUESTOR_ID
, range_resp_cfg
->requestor_instance_id
);
825 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "Failed to put range response cfg::requestor_instance_id");
827 result
= request
->put_addr(NAN_REQ_ATTR_RANGE_RESPONSE_CFG_PEER_ADDR
, range_resp_cfg
->peer_addr
);
828 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "Failed to put range response cfg::peer_addr");
830 result
= request
->put_u16(NAN_REQ_ATTR_RANGE_RESPONSE_CFG_RANGING_RESPONSE
, range_resp_cfg
->ranging_response
);
831 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "Failed to put range response cfg::ranging_response");
836 int putSecurityInfo(u32 cipher
, NanSecurityKeyInfo
*key_info
, u32 scid_len
, u8
*scid
, WifiRequest
*request
)
840 result
= request
->put_u32(NAN_REQ_ATTR_CIPHER_TYPE
, cipher
);
841 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put cipher_type");
843 result
= request
->put_u32(NAN_REQ_ATTR_SECURITY_KEY_TYPE
, key_info
->key_type
);
844 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put cipher_type");
846 if (key_info
->key_type
== NAN_SECURITY_KEY_INPUT_PMK
) {
847 result
= request
->put_u32(NAN_REQ_ATTR_SECURITY_PMK_LEN
, key_info
->body
.pmk_info
.pmk_len
);
848 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put key_info->body.pmk_info.pmk_len");
849 result
= request
->put(NAN_REQ_ATTR_SECURITY_PMK
, key_info
->body
.pmk_info
.pmk
, key_info
->body
.pmk_info
.pmk_len
);
850 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put key_info->body.pmk_info.pmk");
852 result
= request
->put_u32(NAN_REQ_ATTR_SECURITY_PASSPHRASE_LEN
, key_info
->body
.passphrase_info
.passphrase_len
);
853 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put key_info->body.passphrase_info.passphrase_len");
854 result
= request
->put(NAN_REQ_ATTR_SECURITY_PASSPHRASE
, key_info
->body
.passphrase_info
.passphrase
,
855 key_info
->body
.passphrase_info
.passphrase_len
);
856 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put key_info->body.passphrase_info.passphrase");
859 result
= request
->put_u32(NAN_REQ_ATTR_SCID_LEN
, scid_len
);
860 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put scid_len");
862 result
= request
->put(NAN_REQ_ATTR_SCID
, scid
, scid_len
);
863 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put scid");
869 NanCommand(wifi_interface_handle iface
, int id
)
870 : WifiCommand(iface
, id
)
881 publishCancelTid
= 0;
883 subscribeCancelTid
= 0;
890 memset(&capabilities
, 0, sizeof(capabilities
));
893 int enable(transaction_id id
, NanEnableRequest
*msg
) {
894 ALOGD("NAN enable id:%d", id
);
895 WifiRequest
request(familyId(), ifaceId());
897 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_NAN_ENABLE
);
898 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to create WifiRequest");
900 nlattr
*data
= request
.attr_start(NL80211_ATTR_VENDOR_DATA
);
902 ALOGE("enable: request.attr_start fail");
903 return WIFI_ERROR_OUT_OF_MEMORY
;
905 /* Valid master pref values are 2-254 */
907 if (msg
->master_pref
< 2)
909 else if (msg
->master_pref
> 254)
912 master_pref
= msg
->master_pref
;
913 result
= request
.put_u8(NAN_REQ_ATTR_MASTER_PREF
, master_pref
);
914 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put master_pref");
916 result
= request
.put_u16(NAN_REQ_ATTR_CLUSTER_LOW
, msg
->cluster_low
);
917 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put cluster_low");
919 result
= request
.put_u16(NAN_REQ_ATTR_CLUSTER_HIGH
, msg
->cluster_high
);
920 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put cluster_high");
922 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_support_5g
, msg
->support_5g_val
,
923 NAN_REQ_ATTR_SUPPORT_5G_VAL
, request
, result
, "enable:Failed to put support_5g_val");
925 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_sid_beacon
, msg
->sid_beacon_val
,
926 NAN_REQ_ATTR_SID_BEACON_VAL
, request
, result
, "enable:Failed to put sid_beacon_val");
928 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_2dot4g_rssi_close
, msg
->rssi_close_2dot4g_val
,
929 NAN_REQ_ATTR_RSSI_CLOSE_2G4_VAL
, request
, result
, "enable:Failed to put rssi_close_2dot4g_val");
931 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_2dot4g_rssi_middle
, msg
->rssi_middle_2dot4g_val
,
932 NAN_REQ_ATTR_RSSI_MIDDLE_2G4_VAL
, request
, result
, "enable:Failed to put rssi_middle_2dot4g_val");
934 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_2dot4g_rssi_proximity
, msg
->rssi_proximity_2dot4g_val
,
935 NAN_REQ_ATTR_RSSI_PROXIMITY_2G4_VAL
, request
, result
, "enable:Failed to put rssi_proximity_2dot4g_val");
937 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_hop_count_limit
, msg
->hop_count_limit_val
,
938 NAN_REQ_ATTR_HOP_COUNT_LIMIT_VAL
, request
, result
, "enable:Failed to put hop_count_limit_val");
940 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_2dot4g_support
, msg
->support_2dot4g_val
,
941 NAN_REQ_ATTR_SUPPORT_2G4_VAL
, request
, result
, "enable:Failed to put support_2dot4g_val");
943 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_2dot4g_beacons
, msg
->beacon_2dot4g_val
,
944 NAN_REQ_ATTR_BEACONS_2G4_VAL
, request
, result
, "enable:Failed to put beacon_2dot4g_val");
946 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_2dot4g_sdf
, msg
->sdf_2dot4g_val
,
947 NAN_REQ_ATTR_SDF_2G4_VAL
, request
, result
, "enable:Failed to put sdf_2dot4g_val");
949 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_5g_beacons
, msg
->beacon_5g_val
,
950 NAN_REQ_ATTR_BEACON_5G_VAL
, request
, result
, "enable:Failed to put beacon_5g_val");
952 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_5g_sdf
, msg
->sdf_5g_val
,
953 NAN_REQ_ATTR_SDF_5G_VAL
, request
, result
, "enable:Failed to put sdf_5g_val");
955 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_5g_rssi_close
, msg
->rssi_close_5g_val
,
956 NAN_REQ_ATTR_RSSI_CLOSE_5G_VAL
, request
, result
, "enable:Failed to put rssi_close_5g_val");
958 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_5g_rssi_middle
, msg
->rssi_middle_5g_val
,
959 NAN_REQ_ATTR_RSSI_MIDDLE_5G_VAL
, request
, result
, "enable:Failed to put rssi_middle_5g_val");
961 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_5g_rssi_close_proximity
, msg
->rssi_close_proximity_5g_val
,
962 NAN_REQ_ATTR_RSSI_CLOSE_PROXIMITY_5G_VAL
, request
, result
, "enable:Failed to put rssi_close_proximity_5g_val");
964 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_rssi_window_size
, msg
->rssi_window_size_val
,
965 NAN_REQ_ATTR_RSSI_WINDOW_SIZE_VAL
, request
, result
, "enable:Failed to put rssi_window_size_val");
967 CHECK_CONFIG_PUT_32_RETURN_FAIL(msg
->config_oui
, msg
->oui_val
,
968 NAN_REQ_ATTR_OUI_VAL
, request
, result
, "enable:Failed to put oui_val");
970 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->config_intf_addr
, msg
->intf_addr_val
, NAN_MAC_ADDR_LEN
,
971 NAN_REQ_ATTR_MAC_ADDR_VAL
, request
, result
, "enable:Failed to put intf_addr_val");
973 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->config_cluster_attribute_val
,
974 NAN_REQ_ATTR_CLUSTER_VAL
, request
, result
, "enable:Failed to put config_cluster_attribute_val");
976 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->config_scan_params
, msg
->scan_params_val
.dwell_time
, sizeof(msg
->scan_params_val
.dwell_time
),
977 NAN_REQ_ATTR_SOCIAL_CH_SCAN_DWELL_TIME
, request
, result
, "enable:Failed to put scan_params_val.dwell_time");
979 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->config_scan_params
, msg
->scan_params_val
.scan_period
, sizeof(msg
->scan_params_val
.scan_period
),
980 NAN_REQ_ATTR_SOCIAL_CH_SCAN_PERIOD
, request
, result
, "enable:Failed to put scan_params_val.scan_period");
982 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_random_factor_force
, msg
->random_factor_force_val
,
983 NAN_REQ_ATTR_RANDOM_FACTOR_FORCE_VAL
, request
, result
, "enable:Failed to put random_factor_force_val");
985 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_hop_count_force
, msg
->hop_count_force_val
,
986 NAN_REQ_ATTR_HOP_COUNT_FORCE_VAL
, request
, result
, "enable:Failed to put hop_count_force_val");
988 CHECK_CONFIG_PUT_32_RETURN_FAIL(msg
->config_24g_channel
, msg
->channel_24g_val
,
989 NAN_REQ_ATTR_CHANNEL_2G4_MHZ_VAL
, request
, result
, "enable:Failed to put channel_24g_val");
991 CHECK_CONFIG_PUT_32_RETURN_FAIL(msg
->config_5g_channel
, msg
->channel_5g_val
,
992 NAN_REQ_ATTR_CHANNEL_5G_MHZ_VAL
, request
, result
, "enable:Failed to put channel_5g_val");
994 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_subscribe_sid_beacon
, msg
->subscribe_sid_beacon_val
,
995 NAN_REQ_ATTR_SUBSCRIBE_SID_BEACON_VAL
, request
, result
, "enable:Failed to put subscribe_sid_beacon_val");
997 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_dw
.config_2dot4g_dw_band
, msg
->config_dw
.dw_2dot4g_interval_val
,
998 NAN_REQ_ATTR_DW_2G4_INTERVAL
, request
, result
, "enable:Failed to put dw_2dot4g_interval_val");
1000 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_dw
.config_5g_dw_band
, msg
->config_dw
.dw_5g_interval_val
,
1001 NAN_REQ_ATTR_DW_5G_INTERVAL
, request
, result
, "enable:Failed to put dw_5g_interval_val");
1003 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_disc_mac_addr_randomization
, msg
->disc_mac_addr_rand_interval_sec
,
1004 NAN_REQ_ATTR_DISC_MAC_ADDR_RANDOM_INTERVAL
, request
, result
, "enable:Failed to put disc_mac_addr_rand_interval_sec");
1006 request
.attr_end(data
);
1008 registerNanEvents();
1010 result
= requestResponse(request
);
1011 if (result
!= WIFI_SUCCESS
) {
1013 ALOGE("failed to NAN; result = %d", result
);
1014 unregisterNanEvents();
1016 ALOGD("Start NAN...success");
1021 int disable(transaction_id id
)
1023 ALOGD("NAN disable id:%d", id
);
1024 WifiRequest
request(familyId(), ifaceId());
1026 unregisterNanEvents();
1028 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_NAN_DISABLE
);
1029 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "disable:Failed to create WifiRequest");
1031 result
= requestResponse(request
);
1032 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "disable:Failed to requestResponse");
1036 int config(transaction_id id
, NanConfigRequest
*msg
) {
1037 ALOGD("NAN config id:%d", id
);
1038 WifiRequest
request(familyId(), ifaceId());
1040 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_NAN_CONFIG
);
1041 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "config:Failed to create WifiRequest");
1043 nlattr
*data
= request
.attr_start(NL80211_ATTR_VENDOR_DATA
);
1045 ALOGE("config: request.attr_start fail");
1046 return WIFI_ERROR_OUT_OF_MEMORY
;
1049 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_sid_beacon
, msg
->sid_beacon
,
1050 NAN_REQ_ATTR_SID_BEACON_VAL
, request
, result
, "config:Failed to put sid_beacon");
1052 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_rssi_proximity
, msg
->rssi_proximity
,
1053 NAN_REQ_ATTR_RSSI_PROXIMITY_2G4_VAL
, request
, result
, "config:Failed to put rssi_proximity");
1055 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_master_pref
, msg
->master_pref
,
1056 NAN_REQ_ATTR_MASTER_PREF
, request
, result
, "config:Failed to put master_pref");
1058 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_5g_rssi_close_proximity
, msg
->rssi_close_proximity_5g_val
,
1059 NAN_REQ_ATTR_RSSI_CLOSE_PROXIMITY_5G_VAL
, request
, result
, "config:Failed to put rssi_close_proximity_5g_val");
1061 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_rssi_window_size
, msg
->rssi_window_size_val
,
1062 NAN_REQ_ATTR_RSSI_WINDOW_SIZE_VAL
, request
, result
, "config:Failed to put rssi_window_size_val");
1064 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->config_cluster_attribute_val
,
1065 NAN_REQ_ATTR_CLUSTER_VAL
, request
, result
, "config:Failed to put config_cluster_attribute_val");
1067 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->config_scan_params
, msg
->scan_params_val
.dwell_time
, sizeof(msg
->scan_params_val
.dwell_time
),
1068 NAN_REQ_ATTR_SOCIAL_CH_SCAN_DWELL_TIME
, request
, result
, "config:Failed to put scan_params_val.dwell_time");
1070 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->config_scan_params
, msg
->scan_params_val
.scan_period
, sizeof(msg
->scan_params_val
.scan_period
),
1071 NAN_REQ_ATTR_SOCIAL_CH_SCAN_PERIOD
, request
, result
, "config:Failed to put scan_params_val.scan_period");
1073 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_random_factor_force
, msg
->random_factor_force_val
,
1074 NAN_REQ_ATTR_RANDOM_FACTOR_FORCE_VAL
, request
, result
, "config:Failed to put random_factor_force_val");
1076 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_hop_count_force
, msg
->hop_count_force_val
,
1077 NAN_REQ_ATTR_HOP_COUNT_FORCE_VAL
, request
, result
, "config:Failed to put hop_count_force_val");
1079 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_conn_capability
, msg
->conn_capability_val
.payload_transmit_flag
,
1080 NAN_REQ_ATTR_CONN_CAPABILITY_PAYLOAD_TX
, request
, result
, "config:Failed to put payload_transmit_flag");
1082 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_conn_capability
, msg
->conn_capability_val
.is_wfd_supported
,
1083 NAN_REQ_ATTR_CONN_CAPABILITY_WFD
, request
, result
, "config:Failed to put is_wfd_supported");
1085 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_conn_capability
, msg
->conn_capability_val
.is_wfds_supported
,
1086 NAN_REQ_ATTR_CONN_CAPABILITY_WFDS
, request
, result
, "config:Failed to put is_wfds_supported");
1088 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_conn_capability
, msg
->conn_capability_val
.is_tdls_supported
,
1089 NAN_REQ_ATTR_CONN_CAPABILITY_TDLS
, request
, result
, "config:Failed to put is_tdls_supported");
1091 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_conn_capability
, msg
->conn_capability_val
.is_ibss_supported
,
1092 NAN_REQ_ATTR_CONN_CAPABILITY_IBSS
, request
, result
, "config:Failed to put is_ibss_supported");
1094 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_conn_capability
, msg
->conn_capability_val
.is_mesh_supported
,
1095 NAN_REQ_ATTR_CONN_CAPABILITY_MESH
, request
, result
, "config:Failed to put is_mesh_supported");
1097 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_conn_capability
, msg
->conn_capability_val
.wlan_infra_field
,
1098 NAN_REQ_ATTR_CONN_CAPABILITY_WLAN_INFRA
, request
, result
, "config:Failed to put wlan_infra_field");
1100 if (msg
->num_config_discovery_attr
) {
1101 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->num_config_discovery_attr
,
1102 NAN_REQ_ATTR_DISCOVERY_ATTR_NUM_ENTRIES
, request
, result
, "config:Failed to put msg->num_config_discovery_attr");
1103 for (int i
= 0; i
< msg
->num_config_discovery_attr
; i
++) {
1104 nlattr
*nl_disc_attribute
= request
.attr_start(NAN_REQ_ATTR_DISCOVERY_ATTR_VAL
);
1105 NanTransmitPostDiscovery
*discovery_attr
= &msg
->discovery_attr_val
[i
];
1106 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, discovery_attr
->type
,
1107 NAN_REQ_ATTR_CONN_TYPE
, request
, result
, "config:Failed to put discovery_attr->type");
1108 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, discovery_attr
->role
,
1109 NAN_REQ_ATTR_NAN_ROLE
, request
, result
, "config:Failed to put discovery_attr->role");
1110 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, discovery_attr
->transmit_freq
,
1111 NAN_REQ_ATTR_TRANSMIT_FREQ
, request
, result
, "config:Failed to put discovery_attr->transmit_freq");
1112 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, discovery_attr
->duration
,
1113 NAN_REQ_ATTR_AVAILABILITY_DURATION
, request
, result
, "config:Failed to put discovery_attr->duration");
1114 CHECK_CONFIG_PUT_32_RETURN_FAIL(1, discovery_attr
->avail_interval_bitmap
,
1115 NAN_REQ_ATTR_AVAILABILITY_INTERVAL
, request
, result
, "config:Failed to put discovery_attr->avail_interval_bitmap");
1116 CHECK_CONFIG_PUT_RETURN_FAIL(1, discovery_attr
->addr
, NAN_MAC_ADDR_LEN
,
1117 NAN_REQ_ATTR_MAC_ADDR_VAL
, request
, result
, "config:Failed to put discovery_attr->addr");
1118 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, discovery_attr
->mesh_id_len
,
1119 NAN_REQ_ATTR_MESH_ID_LEN
, request
, result
, "config:Failed to put discovery_attr->mesh_id");
1120 CHECK_CONFIG_PUT_RETURN_FAIL(discovery_attr
->mesh_id_len
, discovery_attr
->mesh_id
, discovery_attr
->mesh_id_len
,
1121 NAN_REQ_ATTR_MESH_ID
, request
, result
, "config:Failed to put discovery_attr->mesh_id");
1122 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, discovery_attr
->infrastructure_ssid_len
,
1123 NAN_REQ_ATTR_INFRASTRUCTURE_SSID_LEN
, request
, result
, "config:Failed to put discovery_attr->infrastructure_ssid_val");
1124 CHECK_CONFIG_PUT_RETURN_FAIL(discovery_attr
->infrastructure_ssid_len
, discovery_attr
->infrastructure_ssid_val
, discovery_attr
->infrastructure_ssid_len
,
1125 NAN_REQ_ATTR_INFRASTRUCTURE_SSID
, request
, result
, "config:Failed to put discovery_attr->infrastructure_ssid_val");
1126 request
.attr_end(nl_disc_attribute
);
1130 if (msg
->config_fam
) {
1131 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->fam_val
.numchans
,
1132 NAN_REQ_ATTR_FURTHER_AVAIL_NUM_ENTRIES
, request
, result
, "config:Failed to put msg->fam_val.numchans");
1133 for (int i
= 0; i
< msg
->fam_val
.numchans
; i
++) {
1134 nlattr
*nl_fam_attribute
= request
.attr_start(NAN_REQ_ATTR_FURTHER_AVAIL_VAL
);
1135 NanFurtherAvailabilityChannel
*further_avail_chan
= &msg
->fam_val
.famchan
[i
];
1136 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, further_avail_chan
->entry_control
,
1137 NAN_REQ_ATTR_FURTHER_AVAIL_ENTRY_CTRL
, request
, result
, "config:Failed to put further_avail_chan->entry_control");
1138 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, further_avail_chan
->class_val
,
1139 NAN_REQ_ATTR_FURTHER_AVAIL_CHAN_CLASS
, request
, result
, "config:Failed to put further_avail_chan->class_val");
1140 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, further_avail_chan
->channel
,
1141 NAN_REQ_ATTR_FURTHER_AVAIL_CHAN
, request
, result
, "config:Failed to put further_avail_chan->channel");
1142 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, further_avail_chan
->mapid
,
1143 NAN_REQ_ATTR_FURTHER_AVAIL_CHAN_MAPID
, request
, result
, "config:Failed to put further_avail_chan->mapid");
1144 CHECK_CONFIG_PUT_32_RETURN_FAIL(1, further_avail_chan
->avail_interval_bitmap
,
1145 NAN_REQ_ATTR_FURTHER_AVAIL_INTERVAL_BITMAP
, request
, result
, "config:Failed to put further_avail_chan->avail_interval_bitmap");
1146 request
.attr_end(nl_fam_attribute
);
1150 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_subscribe_sid_beacon
, msg
->subscribe_sid_beacon_val
,
1151 NAN_REQ_ATTR_SUBSCRIBE_SID_BEACON_VAL
, request
, result
, "config:Failed to put subscribe_sid_beacon_val");
1153 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_dw
.config_2dot4g_dw_band
, msg
->config_dw
.dw_2dot4g_interval_val
,
1154 NAN_REQ_ATTR_DW_2G4_INTERVAL
, request
, result
, "config:Failed to put dw_2dot4g_interval_val");
1156 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_dw
.config_5g_dw_band
, msg
->config_dw
.dw_5g_interval_val
,
1157 NAN_REQ_ATTR_DW_5G_INTERVAL
, request
, result
, "config:Failed to put dw_5g_interval_val");
1159 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->config_disc_mac_addr_randomization
, msg
->disc_mac_addr_rand_interval_sec
,
1160 NAN_REQ_ATTR_DISC_MAC_ADDR_RANDOM_INTERVAL
, request
, result
, "config:Failed to put disc_mac_addr_rand_interval_sec");
1162 request
.attr_end(data
);
1164 result
= requestResponse(request
);
1165 if (result
!= WIFI_SUCCESS
) {
1167 ALOGE("failed to set_config; result = %d", result
);
1169 ALOGD("NAN config...success");
1174 static int setCallbackHandler(NanCallbackHandler handlers
) {
1175 callbackEventHandler
= handlers
;
1176 return WIFI_SUCCESS
;
1179 static int getVersion(NanVersion
*version
) {
1180 *version
= SLSI_WIFI_HAL_NAN_VERSION
;
1181 return WIFI_SUCCESS
;
1184 int publish(transaction_id id
, NanPublishRequest
*msg
) {
1185 ALOGD("NAN publish transId:%d publishId:%d publishType:%d", id
, msg
->publish_id
, msg
->publish_type
);
1186 WifiRequest
request(familyId(), ifaceId());
1188 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_NAN_PUBLISH
);
1189 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "publish:Failed to create WifiRequest");
1191 nlattr
*data
= request
.attr_start(NL80211_ATTR_VENDOR_DATA
);
1193 ALOGE("publish: request.attr_start fail");
1194 return WIFI_ERROR_OUT_OF_MEMORY
;
1197 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->publish_id
, msg
->publish_id
,
1198 NAN_REQ_ATTR_PUBLISH_ID
, request
, result
, "publish:Failed to put msg->publish_id");
1200 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->ttl
, msg
->ttl
,
1201 NAN_REQ_ATTR_PUBLISH_TTL
, request
, result
, "publish:Failed to put msg->ttl");
1203 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg
->period
,
1204 NAN_REQ_ATTR_PUBLISH_PERIOD
, request
, result
, "publish:Failed to put msg->period");
1206 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->publish_type
,
1207 NAN_REQ_ATTR_PUBLISH_TYPE
, request
, result
, "publish:Failed to put msg->publish_type");
1209 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->tx_type
,
1210 NAN_REQ_ATTR_PUBLISH_TX_TYPE
, request
, result
, "publish:Failed to put msg->tx_type");
1212 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->publish_count
,
1213 NAN_REQ_ATTR_PUBLISH_COUNT
, request
, result
, "publish:Failed to put msg->publish_count");
1215 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->service_name_len
, msg
->service_name_len
,
1216 NAN_REQ_ATTR_PUBLISH_SERVICE_NAME_LEN
, request
, result
, "publish:Failed to put msg->service_name_len");
1218 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->service_name_len
, msg
->service_name
, msg
->service_name_len
,
1219 NAN_REQ_ATTR_PUBLISH_SERVICE_NAME
, request
, result
, "publish:Failed to put msg->service_name");
1221 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->publish_match_indicator
,
1222 NAN_REQ_ATTR_PUBLISH_MATCH_ALGO
, request
, result
, "publish:Failed to put msg->publish_match_indicator");
1224 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->service_specific_info_len
, msg
->service_specific_info_len
,
1225 NAN_REQ_ATTR_PUBLISH_SERVICE_INFO_LEN
, request
, result
, "publish:Failed to put msg->service_specific_info_len");
1227 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->service_specific_info_len
, msg
->service_specific_info
, msg
->service_specific_info_len
,
1228 NAN_REQ_ATTR_PUBLISH_SERVICE_INFO
, request
, result
, "publish:Failed to put msg->service_specific_info");
1230 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->rx_match_filter_len
, msg
->rx_match_filter_len
,
1231 NAN_REQ_ATTR_PUBLISH_RX_MATCH_FILTER_LEN
, request
, result
, "publish:Failed to put msg->rx_match_filter_len");
1233 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->rx_match_filter_len
, msg
->rx_match_filter
, msg
->rx_match_filter_len
,
1234 NAN_REQ_ATTR_PUBLISH_RX_MATCH_FILTER
, request
, result
, "publish:Failed to put msg->rx_match_filter");
1236 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->tx_match_filter_len
, msg
->tx_match_filter_len
,
1237 NAN_REQ_ATTR_PUBLISH_TX_MATCH_FILTER_LEN
, request
, result
, "publish:Failed to put msg->tx_match_filter_len");
1239 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->tx_match_filter_len
, msg
->tx_match_filter
, msg
->tx_match_filter_len
,
1240 NAN_REQ_ATTR_PUBLISH_TX_MATCH_FILTER
, request
, result
, "publish:Failed to put msg->tx_match_filter");
1242 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->rssi_threshold_flag
,
1243 NAN_REQ_ATTR_PUBLISH_RSSI_THRESHOLD_FLAG
, request
, result
, "publish:Failed to put msg->rssi_threshold_flag");
1245 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->connmap
,
1246 NAN_REQ_ATTR_PUBLISH_CONN_MAP
, request
, result
, "publish:Failed to put msg->connmap");
1248 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->recv_indication_cfg
,
1249 NAN_REQ_ATTR_PUBLISH_RECV_IND_CFG
, request
, result
, "publish:Failed to put msg->recv_indication_cfg");
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");
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");
1257 result
= request
.put_u8(NAN_REQ_ATTR_RANGING_AUTO_RESPONSE
, msg
->ranging_auto_response
);
1258 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put ranging_auto_response");
1260 result
= putSdeaParams(&msg
->sdea_params
, &request
);
1263 result
= putRangingCfg(&msg
->ranging_cfg
, &request
);
1266 result
= putSecurityInfo(msg
->cipher_type
, &msg
->key_info
, msg
->scid_len
, msg
->scid
, &request
);
1269 result
= putRangeResponseCfg(&msg
->range_response_cfg
, &request
);
1273 request
.attr_end(data
);
1275 result
= requestResponse(request
);
1276 if (result
!= WIFI_SUCCESS
) {
1278 ALOGE("failed to publish; result = %d", result
);
1280 ALOGD("NAN publish...success");
1285 int publishCancel(transaction_id id
, NanPublishCancelRequest
*msg
) {
1286 ALOGD("NAN publishCancel transId:%d, publish_id:%d", id
, msg
->publish_id
);
1287 WifiRequest
request(familyId(), ifaceId());
1289 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_NAN_PUBLISHCANCEL
);
1290 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "publishCancel:Failed to create WifiRequest");
1292 nlattr
*data
= request
.attr_start(NL80211_ATTR_VENDOR_DATA
);
1294 ALOGE("publishCancel: request.attr_start fail");
1295 return WIFI_ERROR_OUT_OF_MEMORY
;
1298 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg
->publish_id
,
1299 NAN_REQ_ATTR_PUBLISH_ID
, request
, result
, "publishCancel:Failed to put msg->publish_id");
1301 request
.attr_end(data
);
1302 publishCancelTid
= id
;
1303 result
= requestResponse(request
);
1304 if (result
!= WIFI_SUCCESS
) {
1305 publishCancelTid
= 0;
1306 ALOGE("failed to publishCancel; result = %d", result
);
1308 ALOGD("NAN publishCancel...success");
1314 int subscribe(transaction_id id
, NanSubscribeRequest
*msg
) {
1315 ALOGD("NAN subscribe trans_id:%d subscribe_id:%d subscribetype:%d", id
, msg
->subscribe_id
, msg
->subscribe_type
);
1316 WifiRequest
request(familyId(), ifaceId());
1318 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_NAN_SUBSCRIBE
);
1319 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "subscribe:Failed to create WifiRequest");
1321 nlattr
*data
= request
.attr_start(NL80211_ATTR_VENDOR_DATA
);
1323 ALOGE("subscribe: request.attr_start fail");
1324 return WIFI_ERROR_OUT_OF_MEMORY
;
1327 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->subscribe_id
, msg
->subscribe_id
,
1328 NAN_REQ_ATTR_SUBSCRIBE_ID
, request
, result
, "subscribe:Failed to put msg->publish_id");
1330 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg
->ttl
,
1331 NAN_REQ_ATTR_SUBSCRIBE_TTL
, request
, result
, "subscribe:Failed to put msg->ttl");
1333 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg
->period
,
1334 NAN_REQ_ATTR_SUBSCRIBE_PERIOD
, request
, result
, "subscribe:Failed to put msg->period");
1336 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->subscribe_type
,
1337 NAN_REQ_ATTR_SUBSCRIBE_TYPE
, request
, result
, "subscribe:Failed to put msg->subscribe_type");
1339 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->serviceResponseFilter
,
1340 NAN_REQ_ATTR_SUBSCRIBE_RESP_FILTER_TYPE
, request
, result
, "subscribe:Failed to put msg->serviceResponseFilter");
1342 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->serviceResponseInclude
,
1343 NAN_REQ_ATTR_SUBSCRIBE_RESP_INCLUDE
, request
, result
, "subscribe:Failed to put msg->serviceResponseInclude");
1345 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->useServiceResponseFilter
,
1346 NAN_REQ_ATTR_SUBSCRIBE_USE_RESP_FILTER
, request
, result
, "subscribe:Failed to put msg->useServiceResponseFilter");
1348 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->ssiRequiredForMatchIndication
,
1349 NAN_REQ_ATTR_SUBSCRIBE_SSI_REQUIRED
, request
, result
, "subscribe:Failed to put msg->ssiRequiredForMatchIndication");
1351 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->subscribe_match_indicator
,
1352 NAN_REQ_ATTR_SUBSCRIBE_MATCH_INDICATOR
, request
, result
, "subscribe:Failed to put msg->subscribe_match_indicator");
1354 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->subscribe_count
,
1355 NAN_REQ_ATTR_SUBSCRIBE_COUNT
, request
, result
, "subscribe:Failed to put msg->subscribe_count");
1357 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->service_name_len
, msg
->service_name_len
,
1358 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_NAME_LEN
, request
, result
, "subscribe:Failed to put msg->service_name_len");
1360 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->service_name_len
, msg
->service_name
, msg
->service_name_len
,
1361 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_NAME
, request
, result
, "subscribe:Failed to put msg->service_name");
1363 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->service_specific_info_len
, msg
->service_specific_info_len
,
1364 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_INFO_LEN
, request
, result
, "subscribe:Failed to put msg->service_specific_info_len");
1366 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->service_specific_info_len
, msg
->service_specific_info
, msg
->service_specific_info_len
,
1367 NAN_REQ_ATTR_SUBSCRIBE_SERVICE_INFO
, request
, result
, "subscribe:Failed to put msg->service_specific_info");
1369 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->rx_match_filter_len
, msg
->rx_match_filter_len
,
1370 NAN_REQ_ATTR_SUBSCRIBE_RX_MATCH_FILTER_LEN
, request
, result
, "subscribe:Failed to put msg->rx_match_filter_len");
1372 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->rx_match_filter_len
, msg
->rx_match_filter
, msg
->rx_match_filter_len
,
1373 NAN_REQ_ATTR_SUBSCRIBE_RX_MATCH_FILTER
, request
, result
, "subscribe:Failed to put msg->rx_match_filter");
1375 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->tx_match_filter_len
, msg
->tx_match_filter_len
,
1376 NAN_REQ_ATTR_SUBSCRIBE_TX_MATCH_FILTER_LEN
, request
, result
, "subscribe:Failed to put msg->tx_match_filter_len");
1378 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->tx_match_filter_len
, msg
->tx_match_filter
, msg
->tx_match_filter_len
,
1379 NAN_REQ_ATTR_SUBSCRIBE_TX_MATCH_FILTER
, request
, result
, "subscribe:Failed to put msg->tx_match_filter");
1381 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->rssi_threshold_flag
,
1382 NAN_REQ_ATTR_SUBSCRIBE_RSSI_THRESHOLD_FLAG
, request
, result
, "subscribe:Failed to put msg->rssi_threshold_flag");
1384 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->connmap
,
1385 NAN_REQ_ATTR_SUBSCRIBE_CONN_MAP
, request
, result
, "subscribe:Failed to put msg->connmap");
1387 CHECK_CONFIG_PUT_8_RETURN_FAIL(msg
->num_intf_addr_present
, msg
->num_intf_addr_present
,
1388 NAN_REQ_ATTR_SUBSCRIBE_NUM_INTF_ADDR_PRESENT
, request
, result
, "subscribe:Failed to put msg->num_intf_addr_present");
1390 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->num_intf_addr_present
, msg
->intf_addr
, NAN_MAC_ADDR_LEN
* msg
->num_intf_addr_present
,
1391 NAN_REQ_ATTR_SUBSCRIBE_INTF_ADDR
, request
, result
, "subscribe:Failed to put msg->intf_addr");
1393 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->recv_indication_cfg
,
1394 NAN_REQ_ATTR_SUBSCRIBE_RECV_IND_CFG
, request
, result
, "subscribe:Failed to put msg->recv_indication_cfg");
1396 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg
->sdea_service_specific_info_len
,
1397 NAN_REQ_ATTR_PUBLISH_SDEA_LEN
, request
, result
, "subscribe:Failed to put msg->sdea_service_specific_info_len");
1399 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->sdea_service_specific_info_len
, msg
->sdea_service_specific_info
, msg
->sdea_service_specific_info_len
,
1400 NAN_REQ_ATTR_PUBLISH_SDEA
, request
, result
, "subscribe:Failed to put msg->sdea_service_specific_info");
1402 result
= request
.put_u8(NAN_REQ_ATTR_RANGING_AUTO_RESPONSE
, msg
->ranging_auto_response
);
1403 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "enable:Failed to put ranging_auto_response");
1405 result
= putSdeaParams(&msg
->sdea_params
, &request
);
1408 result
= putRangingCfg(&msg
->ranging_cfg
, &request
);
1411 result
= putSecurityInfo(msg
->cipher_type
, &msg
->key_info
, msg
->scid_len
, msg
->scid
, &request
);
1414 result
= putRangeResponseCfg(&msg
->range_response_cfg
, &request
);
1418 request
.attr_end(data
);
1420 result
= requestResponse(request
);
1421 if (result
!= WIFI_SUCCESS
) {
1423 ALOGE("failed to subscribe; result = %d", result
);
1425 ALOGD("NAN subscribe...success");
1431 int subscribeCancel(transaction_id id
, NanSubscribeCancelRequest
*msg
) {
1432 ALOGD("NAN subscribeCancel transId:%d subscribeId:%d", id
, msg
->subscribe_id
);
1433 WifiRequest
request(familyId(), ifaceId());
1435 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_NAN_SUBSCRIBECANCEL
);
1436 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "subscribeCancel:Failed to create WifiRequest");
1438 nlattr
*data
= request
.attr_start(NL80211_ATTR_VENDOR_DATA
);
1440 ALOGE("subscribeCancel: request.attr_start fail");
1441 return WIFI_ERROR_OUT_OF_MEMORY
;
1444 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg
->subscribe_id
,
1445 NAN_REQ_ATTR_SUBSCRIBE_ID
, request
, result
, "subscribeCancel:Failed to put msg->subscribe_id");
1447 request
.attr_end(data
);
1448 subscribeCancelTid
= id
;
1449 result
= requestResponse(request
);
1450 if (result
!= WIFI_SUCCESS
) {
1451 subscribeCancelTid
= 0;
1452 ALOGE("failed to subscribeCancel; result = %d", result
);
1454 ALOGD("NAN subscribeCancel...success");
1459 int followup(transaction_id id
, NanTransmitFollowupRequest
*msg
) {
1460 ALOGD("NAN followup transid:%d pub/subId:%d reqInstId:%d", id
, msg
->publish_subscribe_id
, msg
->requestor_instance_id
);
1461 WifiRequest
request(familyId(), ifaceId());
1463 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_NAN_TXFOLLOWUP
);
1464 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "followup:Failed to create WifiRequest");
1466 nlattr
*data
= request
.attr_start(NL80211_ATTR_VENDOR_DATA
);
1468 ALOGE("followup: request.attr_start fail");
1469 return WIFI_ERROR_OUT_OF_MEMORY
;
1472 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg
->publish_subscribe_id
,
1473 NAN_REQ_ATTR_FOLLOWUP_ID
, request
, result
, "followup:Failed to put msg->publish_subscribe_id");
1475 CHECK_CONFIG_PUT_32_RETURN_FAIL(1, msg
->requestor_instance_id
,
1476 NAN_REQ_ATTR_FOLLOWUP_REQUESTOR_ID
, request
, result
, "followup:Failed to put msg->requestor_instance_id");
1478 CHECK_CONFIG_PUT_RETURN_FAIL(1, msg
->addr
, NAN_MAC_ADDR_LEN
,
1479 NAN_REQ_ATTR_FOLLOWUP_ADDR
, request
, result
, "followup:Failed to put msg->addr");
1481 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->priority
,
1482 NAN_REQ_ATTR_FOLLOWUP_PRIORITY
, request
, result
, "followup:Failed to put msg->priority");
1484 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->dw_or_faw
,
1485 NAN_REQ_ATTR_FOLLOWUP_TX_WINDOW
, request
, result
, "followup:Failed to put msg->dw_or_faw");
1487 CHECK_CONFIG_PUT_16_RETURN_FAIL(msg
->service_specific_info_len
, msg
->service_specific_info_len
,
1488 NAN_REQ_ATTR_FOLLOWUP_SERVICE_NAME_LEN
, request
, result
, "followup:Failed to put msg->service_specific_info_len");
1490 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->service_specific_info_len
, msg
->service_specific_info
, msg
->service_specific_info_len
,
1491 NAN_REQ_ATTR_FOLLOWUP_SERVICE_NAME
, request
, result
, "followup:Failed to put msg->service_specific_info");
1493 CHECK_CONFIG_PUT_8_RETURN_FAIL(1, msg
->recv_indication_cfg
,
1494 NAN_REQ_ATTR_FOLLOWUP_RECV_IND_CFG
, request
, result
, "followup:Failed to put msg->recv_indication_cfg");
1496 CHECK_CONFIG_PUT_16_RETURN_FAIL(1, msg
->sdea_service_specific_info_len
,
1497 NAN_REQ_ATTR_PUBLISH_SDEA_LEN
, request
, result
, "publish:Failed to put msg->sdea_service_specific_info_len");
1499 CHECK_CONFIG_PUT_RETURN_FAIL(msg
->sdea_service_specific_info_len
, msg
->sdea_service_specific_info
, msg
->sdea_service_specific_info_len
,
1500 NAN_REQ_ATTR_PUBLISH_SDEA
, request
, result
, "publish:Failed to put msg->sdea_service_specific_info");
1502 request
.attr_end(data
);
1504 result
= requestResponse(request
);
1505 if (result
!= WIFI_SUCCESS
) {
1507 ALOGE("failed to followup; result = %d", result
);
1509 ALOGD("NAN followup...success");
1515 int getCapabilities(transaction_id id
) {
1516 ALOGD("NAN getCapabilities transId:%d", id
);
1517 WifiRequest
request(familyId(), ifaceId());
1519 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_NAN_CAPABILITIES
);
1520 CHECK_WIFI_STATUS_RETURN_FAIL(result
, "getCapabilities:Failed to create WifiRequest");
1522 capabilitiesTid
= id
;
1523 result
= requestResponse(request
);
1524 if (result
!= WIFI_SUCCESS
) {
1525 capabilitiesTid
= 0;
1526 ALOGE("failed to getCapabilities; result = %d", result
);
1528 ALOGD("NAN getCapabilities...success");
1533 int handleEvent(WifiEvent
&event
) {
1536 if (event
.get_cmd() != NL80211_CMD_VENDOR
) {
1537 ALOGD("NAN %s Ignoring event with cmd = %d", __func__
, event
.get_cmd());
1541 int id
= event
.get_vendor_id();
1542 int subcmd
= event
.get_vendor_subcmd();
1544 ALOGI("NAN %s Id = %0x, subcmd = %d", __func__
, id
, subcmd
);
1547 case SLSI_NAN_EVENT_MATCH
:
1548 ret
= processMatchEvent(event
);
1550 case SLSI_NAN_EVENT_MATCH_EXPIRED
:
1551 ret
= processMatchExpiredEvent(event
);
1553 case SLSI_NAN_EVENT_PUBLISH_TERMINATED
:
1554 ret
= processPublishTerminatedEvent(event
);
1556 case SLSI_NAN_EVENT_SUBSCRIBE_TERMINATED
:
1557 ret
= processSubscribeTerminatedEvent(event
);
1559 case SLSI_NAN_EVENT_FOLLOWUP
:
1560 ret
= processFollowupEvent(event
);
1562 case SLSI_NAN_EVENT_DISABLED
:
1563 ret
= processNanDisabledEvent(event
);
1565 case SLSI_NAN_EVENT_DISCOVERY_ENGINE
:
1566 ret
= processNanDiscoveryEvent(event
);
1568 case SLSI_NAN_EVENT_TRANSMIT_FOLLOWUP_STATUS
:
1569 ret
= processNanFollowupStatus(event
);
1576 int handleResponse(WifiEvent
&reply
) {
1577 if (reply
.get_cmd() != NL80211_CMD_VENDOR
) {
1578 ALOGD("NAN %s Ignoring reply with cmd = %d", __func__
, reply
.get_cmd());
1582 NanResponseMsg response
;
1583 memset(&response
, 0, sizeof(response
));
1585 if (processResponse(reply
, &response
) == NL_SKIP
)
1588 transaction_id id
= 0;
1589 switch ((int)response
.response_type
) {
1590 case NAN_RESPONSE_PUBLISH
:
1594 case NAN_RESPONSE_ENABLED
:
1598 case NAN_RESPONSE_DISABLED
:
1602 case NAN_RESPONSE_PUBLISH_CANCEL
:
1603 id
= publishCancelTid
;
1604 publishCancelTid
= 0;
1606 case NAN_RESPONSE_SUBSCRIBE_CANCEL
:
1607 id
= subscribeCancelTid
;
1608 subscribeCancelTid
= 0;
1610 case NAN_RESPONSE_CONFIG
:
1614 case NAN_GET_CAPABILITIES
:
1615 id
= capabilitiesTid
;
1616 capabilitiesTid
= 0;
1618 case NAN_RESPONSE_SUBSCRIBE
:
1622 case NAN_RESPONSE_TRANSMIT_FOLLOWUP
:
1624 /* followupTid is required on receiving followup_up transmit status.
1625 * Do not reset followupTid here*/
1628 ALOGD("NAN %s transId:%d status:%d, response:%d", __func__
, id
, response
.status
, response
.response_type
);
1629 if (callbackEventHandler
.NotifyResponse
)
1630 callbackEventHandler
.NotifyResponse(id
, &response
);
1635 NanCallbackHandler
NanCommand::callbackEventHandler
;
1637 NanCommand
*nan_get_object(transaction_id id
,
1638 wifi_interface_handle iface
) {
1639 wifi_handle handle
= getWifiHandle(iface
);
1640 NanCommand
*nanRequest
= (NanCommand
*)wifi_get_nan_cmd(handle
);
1642 nanRequest
= new NanCommand(iface
, id
);
1644 ALOGE("Could not alloc NanCommand");
1651 wifi_error
nan_enable_request(transaction_id id
,
1652 wifi_interface_handle iface
,
1653 NanEnableRequest
*msg
) {
1654 wifi_handle handle
= getWifiHandle(iface
);
1657 NanCommand
*nanRequest
= new NanCommand(iface
, id
);
1659 ALOGE("nan_enable_request:: Unable to create NanCommand");
1660 return WIFI_ERROR_OUT_OF_MEMORY
;
1663 wifi_set_nan_cmd(handle
, nanRequest
);
1664 ret
= (wifi_error
)nanRequest
->enable(id
, msg
);
1665 if (ret
!= WIFI_SUCCESS
) {
1666 wifi_reset_nan_cmd(handle
);
1672 /* Disable NAN functionality. */
1673 wifi_error
nan_disable_request(transaction_id id
, wifi_interface_handle iface
) {
1674 NanCommand
*nanRequest
= nan_get_object(id
, iface
);
1678 return WIFI_ERROR_OUT_OF_MEMORY
;
1680 ret
= (wifi_error
)nanRequest
->disable(id
);
1681 wifi_reset_nan_cmd(getWifiHandle(iface
));
1686 /* Publish request to advertize a service. */
1687 wifi_error
nan_publish_request(transaction_id id
,
1688 wifi_interface_handle iface
,
1689 NanPublishRequest
*msg
) {
1690 NanCommand
*nanRequest
= nan_get_object(id
, iface
);
1692 return WIFI_ERROR_OUT_OF_MEMORY
;
1694 return (wifi_error
)nanRequest
->publish(id
, msg
);
1697 /* Cancel previous publish requests. */
1698 wifi_error
nan_publish_cancel_request(transaction_id id
,
1699 wifi_interface_handle iface
,
1700 NanPublishCancelRequest
*msg
) {
1701 NanCommand
*nanRequest
= nan_get_object(id
, iface
);
1703 return WIFI_ERROR_OUT_OF_MEMORY
;
1705 return (wifi_error
)nanRequest
->publishCancel(id
, msg
);
1708 /* Subscribe request to search for a service. */
1709 wifi_error
nan_subscribe_request(transaction_id id
,
1710 wifi_interface_handle iface
,
1711 NanSubscribeRequest
*msg
) {
1712 NanCommand
*nanRequest
= nan_get_object(id
, iface
);
1714 return WIFI_ERROR_OUT_OF_MEMORY
;
1716 return (wifi_error
)nanRequest
->subscribe(id
, msg
);
1719 /* Cancel previous subscribe requests. */
1720 wifi_error
nan_subscribe_cancel_request(transaction_id id
,
1721 wifi_interface_handle iface
,
1722 NanSubscribeCancelRequest
*msg
) {
1723 NanCommand
*nanRequest
= nan_get_object(id
, iface
);
1725 return WIFI_ERROR_OUT_OF_MEMORY
;
1727 return (wifi_error
)nanRequest
->subscribeCancel(id
, msg
);
1730 /* NAN transmit follow up request. */
1731 wifi_error
nan_transmit_followup_request(transaction_id id
,
1732 wifi_interface_handle iface
,
1733 NanTransmitFollowupRequest
*msg
) {
1734 NanCommand
*nanRequest
= nan_get_object(id
, iface
);
1736 return WIFI_ERROR_OUT_OF_MEMORY
;
1738 return (wifi_error
)nanRequest
->followup(id
, msg
);
1741 /* NAN configuration request. */
1742 wifi_error
nan_config_request(transaction_id id
,
1743 wifi_interface_handle iface
,
1744 NanConfigRequest
*msg
) {
1745 NanCommand
*nanRequest
= nan_get_object(id
, iface
);
1747 return WIFI_ERROR_OUT_OF_MEMORY
;
1749 return (wifi_error
)nanRequest
->config(id
, msg
);
1752 /* Register NAN callbacks. */
1753 wifi_error
nan_register_handler(wifi_interface_handle iface
,
1754 NanCallbackHandler handlers
) {
1755 return (wifi_error
)NanCommand::setCallbackHandler(handlers
);
1758 /* Get NAN HAL version. */
1759 wifi_error
nan_get_version(wifi_handle handle
,
1760 NanVersion
*version
) {
1761 return (wifi_error
)NanCommand::getVersion(version
);
1764 /* Get NAN capabilities. */
1765 wifi_error
nan_get_capabilities(transaction_id id
,
1766 wifi_interface_handle iface
) {
1767 NanCommand
*nanRequest
= nan_get_object(id
, iface
);
1769 return WIFI_ERROR_OUT_OF_MEMORY
;
1771 return (wifi_error
)nanRequest
->getCapabilities(id
);