[AWARE] Add support for SDEA.ServiceInfo field

Add support for SDEA.ServiceInfo as extended service
specific information field in all SDF-related APIs:
discovery (configure & match), message sending and
receiving.

Rationale: SDEA.ServiceInfo will form the basis for
upper layer discovery protocols on NAN (e.g. mDNS).
Even if not exposed to user-facing API will need to
have handle to be able to create adaptation layers.

Bug: 35193423
Bug: 35040192
Test: unit test and integration (sl4a) tests.
Change-Id: I3fc225952e93a134d5e58795281238829ed4b1ea
diff --git a/wifi/1.0/default/hidl_struct_util.cpp b/wifi/1.0/default/hidl_struct_util.cpp
index 9e23d55..28ad6c3 100644
--- a/wifi/1.0/default/hidl_struct_util.cpp
+++ b/wifi/1.0/default/hidl_struct_util.cpp
@@ -917,6 +917,7 @@
   memcpy(legacy_request->service_specific_info,
         hidl_request.baseConfigs.serviceSpecificInfo.data(),
         legacy_request->service_specific_info_len);
+  // TODO: b/35193423 add support for extended service specific info
   legacy_request->rx_match_filter_len = hidl_request.baseConfigs.rxMatchFilter.size();
   if (legacy_request->rx_match_filter_len > NAN_MAX_MATCH_FILTER_LEN) {
     LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: rx_match_filter_len too large";
@@ -995,6 +996,7 @@
   memcpy(legacy_request->service_specific_info,
         hidl_request.baseConfigs.serviceSpecificInfo.data(),
         legacy_request->service_specific_info_len);
+  // TODO: b/35193423 add support for extended service specific info
   legacy_request->rx_match_filter_len = hidl_request.baseConfigs.rxMatchFilter.size();
   if (legacy_request->rx_match_filter_len > NAN_MAX_MATCH_FILTER_LEN) {
     LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: rx_match_filter_len too large";
@@ -1081,6 +1083,7 @@
   memcpy(legacy_request->service_specific_info,
         hidl_request.serviceSpecificInfo.data(),
         legacy_request->service_specific_info_len);
+  // TODO: b/35193423 add support for extended service specific info
   legacy_request->recv_indication_cfg = hidl_request.disableFollowupResultIndication ? 0x1 : 0x0;
 
   return true;
@@ -1272,6 +1275,7 @@
   hidl_response->maxMatchFilterLen = legacy_response.max_match_filter_len;
   hidl_response->maxTotalMatchFilterLen = legacy_response.max_total_match_filter_len;
   hidl_response->maxServiceSpecificInfoLen = legacy_response.max_service_specific_info_len;
+  // TODO: b/35193423 add support for extended service specific info
   hidl_response->maxVsaDataLen = legacy_response.max_vsa_data_len;
   hidl_response->maxNdiInterfaces = legacy_response.max_ndi_interfaces;
   hidl_response->maxNdpSessions = legacy_response.max_ndp_sessions;
@@ -1296,6 +1300,7 @@
   hidl_ind->addr = hidl_array<uint8_t, 6>(legacy_ind.addr);
   hidl_ind->serviceSpecificInfo = std::vector<uint8_t>(legacy_ind.service_specific_info,
         legacy_ind.service_specific_info + legacy_ind.service_specific_info_len);
+  // TODO: b/35193423 add support for extended service specific info
   hidl_ind->matchFilter = std::vector<uint8_t>(legacy_ind.sdf_match_filter,
         legacy_ind.sdf_match_filter + legacy_ind.sdf_match_filter_len);
   hidl_ind->matchOccuredInBeaconFlag = legacy_ind.match_occured_flag == 1;
diff --git a/wifi/1.0/types.hal b/wifi/1.0/types.hal
index d47f800..dd09820 100644
--- a/wifi/1.0/types.hal
+++ b/wifi/1.0/types.hal
@@ -934,6 +934,13 @@
    */
   vec<uint8_t> serviceSpecificInfo;
   /**
+   * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
+   * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
+   * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
+   * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
+   */
+  vec<uint8_t> extendedServiceSpecificInfo;
+  /**
    * Ordered sequence of <length, value> pairs (|length| uses 1 byte and contains the number of
    * bytes in the |value| field) which specify further match criteria (beyond the service name).
    * The match behavior is specified in details in the NAN spec.
@@ -1124,6 +1131,13 @@
    */
   vec<uint8_t> serviceSpecificInfo;
   /**
+   * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
+   * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
+   * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
+   * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
+   */
+  vec<uint8_t> extendedServiceSpecificInfo;
+  /**
    * Disable |IWifiNanIfaceEventCallback.eventTransmitFollowup| - i.e. do not get indication on
    * whether the follow-up was transmitted and received successfully.
    */
@@ -1259,6 +1273,10 @@
    */
   uint32_t maxServiceSpecificInfoLen;
   /**
+   * Maximum length (in bytes) of the extended service specific info field.
+   */
+  uint32_t maxExtendedServiceSpecificInfoLen;
+  /**
    * Maximum length (in bytes) of vendor-specific (VSA) data.
    */
   uint32_t maxVsaDataLen;
@@ -1315,6 +1333,13 @@
    */
   vec<uint8_t> serviceSpecificInfo;
   /**
+   * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
+   * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
+   * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
+   * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
+   */
+  vec<uint8_t> extendedServiceSpecificInfo;
+  /**
    * The match filter from the discovery packet (publish or subscribe) which caused service
    * discovery. Matches the peer's |NanDiscoveryCommonConfig.txMatchFilter|.
    * Max length: |NanCapabilities.maxMatchFilterLen|.
@@ -1412,6 +1437,13 @@
    * NAN Spec: Service Descriptor Attribute (SDA) / Service Info
    */
   vec<uint8_t> serviceSpecificInfo;
+  /**
+   * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
+   * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
+   * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
+   * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
+   */
+  vec<uint8_t> extendedServiceSpecificInfo;
 };
 
 /**