Setup USD callback infrastructure and
function calls.
Callback methods in aidl_manager are
still skeleton implementations at
this step.
Bug: 382756996
Test: m
Change-Id: I2748110013d8e08c8ca1b9ba759ebae76a746879
diff --git a/wpa_supplicant/aidl/vendor/aidl.cpp b/wpa_supplicant/aidl/vendor/aidl.cpp
index a0446fe..afda33f 100644
--- a/wpa_supplicant/aidl/vendor/aidl.cpp
+++ b/wpa_supplicant/aidl/vendor/aidl.cpp
@@ -1116,3 +1116,81 @@
wpa_printf(MSG_DEBUG, "Notifying Qos Policy SCS Response");
aidl_manager->notifyQosPolicyScsResponse(wpa_s, count, scs_resp);
}
+
+void wpas_aidl_notify_usd_service_discovered(struct wpa_supplicant *wpa_s,
+ enum nan_service_protocol_type srv_proto_type,
+ int subscribe_id, int peer_publish_id, const u8 *peer_addr,
+ bool fsd, const u8 *ssi, size_t ssi_len)
+{
+ if (!wpa_s || !peer_addr || !ssi)
+ return;
+
+ AidlManager *aidl_manager = AidlManager::getInstance();
+ if (!aidl_manager)
+ return;
+
+ wpa_printf(MSG_DEBUG, "Notifying USD service discovered");
+ aidl_manager->notifyUsdServiceDiscovered(wpa_s, srv_proto_type,
+ subscribe_id, peer_publish_id, peer_addr, fsd, ssi, ssi_len);
+}
+
+void wpas_aidl_notify_usd_publish_replied(struct wpa_supplicant *wpa_s,
+ enum nan_service_protocol_type srv_proto_type,
+ int publish_id, int peer_subscribe_id,
+ const u8 *peer_addr, const u8 *ssi, size_t ssi_len)
+{
+ if (!wpa_s || !peer_addr || !ssi)
+ return;
+
+ AidlManager *aidl_manager = AidlManager::getInstance();
+ if (!aidl_manager)
+ return;
+
+ wpa_printf(MSG_DEBUG, "Notifying USD publish replied");
+ aidl_manager->notifyUsdPublishReplied(wpa_s, srv_proto_type,
+ publish_id, peer_subscribe_id, peer_addr, ssi, ssi_len);
+}
+
+void wpas_aidl_notify_usd_message_received(struct wpa_supplicant *wpa_s,
+ int id, int peer_instance_id, const u8 *peer_addr,
+ const u8 *message, size_t message_len)
+{
+ if (!wpa_s || !peer_addr || !message)
+ return;
+
+ AidlManager *aidl_manager = AidlManager::getInstance();
+ if (!aidl_manager)
+ return;
+
+ wpa_printf(MSG_DEBUG, "Notifying USD message received");
+ aidl_manager->notifyUsdMessageReceived(wpa_s, id, peer_instance_id,
+ peer_addr, message, message_len);
+}
+
+void wpas_aidl_notify_usd_publish_terminated(struct wpa_supplicant *wpa_s,
+ int publish_id, enum nan_de_reason reason)
+{
+ if (!wpa_s)
+ return;
+
+ AidlManager *aidl_manager = AidlManager::getInstance();
+ if (!aidl_manager)
+ return;
+
+ wpa_printf(MSG_DEBUG, "Notifying USD publish terminated");
+ aidl_manager->notifyUsdPublishTerminated(wpa_s, publish_id, reason);
+}
+
+void wpas_aidl_notify_usd_subscribe_terminated(struct wpa_supplicant *wpa_s,
+ int subscribe_id, enum nan_de_reason reason)
+{
+ if (!wpa_s)
+ return;
+
+ AidlManager *aidl_manager = AidlManager::getInstance();
+ if (!aidl_manager)
+ return;
+
+ wpa_printf(MSG_DEBUG, "Notifying USD subscribe terminated");
+ aidl_manager->notifyUsdSubscribeTerminated(wpa_s, subscribe_id, reason);
+}
diff --git a/wpa_supplicant/aidl/vendor/aidl.h b/wpa_supplicant/aidl/vendor/aidl.h
index 71620f4..a8f38cb 100644
--- a/wpa_supplicant/aidl/vendor/aidl.h
+++ b/wpa_supplicant/aidl/vendor/aidl.h
@@ -157,6 +157,21 @@
ssize_t wpas_aidl_list_aliases(const char *prefix, char ***aliases);
void wpas_aidl_notify_qos_policy_scs_response(struct wpa_supplicant *wpa_s,
unsigned int count, int **scs_resp);
+ void wpas_aidl_notify_usd_service_discovered(struct wpa_supplicant *wpa_s,
+ enum nan_service_protocol_type srv_proto_type,
+ int subscribe_id, int peer_publish_id, const u8 *peer_addr,
+ bool fsd, const u8 *ssi, size_t ssi_len);
+ void wpas_aidl_notify_usd_publish_replied(struct wpa_supplicant *wpa_s,
+ enum nan_service_protocol_type srv_proto_type,
+ int publish_id, int peer_subscribe_id,
+ const u8 *peer_addr, const u8 *ssi, size_t ssi_len);
+ void wpas_aidl_notify_usd_message_received(struct wpa_supplicant *wpa_s, int id,
+ int peer_instance_id, const u8 *peer_addr,
+ const u8 *message, size_t message_len);
+ void wpas_aidl_notify_usd_publish_terminated(struct wpa_supplicant *wpa_s,
+ int publish_id, enum nan_de_reason reason);
+ void wpas_aidl_notify_usd_subscribe_terminated(struct wpa_supplicant *wpa_s,
+ int subscribe_id, enum nan_de_reason reason);
#else // CONFIG_CTRL_IFACE_AIDL
static inline int wpas_aidl_register_interface(struct wpa_supplicant *wpa_s)
{
@@ -357,6 +372,21 @@
}
static void wpas_aidl_notify_qos_policy_scs_response(struct wpa_supplicant *wpa_s,
unsigned int count, int **scs_resp) {}
+static void wpas_aidl_notify_usd_service_discovered(struct wpa_supplicant *wpa_s,
+ enum nan_service_protocol_type srv_proto_type,
+ int subscribe_id, int peer_publish_id, const u8 *peer_addr,
+ bool fsd, const u8 *ssi, size_t ssi_len) {}
+static void wpas_aidl_notify_usd_publish_replied(struct wpa_supplicant *wpa_s,
+ enum nan_service_protocol_type srv_proto_type,
+ int publish_id, int peer_subscribe_id,
+ const u8 *peer_addr, const u8 *ssi, size_t ssi_len) {}
+static void wpas_aidl_notify_usd_message_received(struct wpa_supplicant *wpa_s, int id,
+ int peer_instance_id, const u8 *peer_addr,
+ const u8 *message, size_t message_len) {}
+static void wpas_aidl_notify_usd_publish_terminated(struct wpa_supplicant *wpa_s,
+ int publish_id, enum nan_de_reason reason) {}
+static void wpas_aidl_notify_usd_subscribe_terminated(struct wpa_supplicant *wpa_s,
+ int subscribe_id, enum nan_de_reason reason) {}
#endif // CONFIG_CTRL_IFACE_AIDL
#ifdef _cplusplus
diff --git a/wpa_supplicant/aidl/vendor/aidl_manager.cpp b/wpa_supplicant/aidl/vendor/aidl_manager.cpp
index 177f478..dd0c159 100644
--- a/wpa_supplicant/aidl/vendor/aidl_manager.cpp
+++ b/wpa_supplicant/aidl/vendor/aidl_manager.cpp
@@ -2976,6 +2976,62 @@
std::placeholders::_1, scsResponses));
}
+void AidlManager::notifyUsdPublishStarted(struct wpa_supplicant *wpa_s,
+ int cmd_id, int publish_id)
+{
+
+}
+void AidlManager::notifyUsdSubscribeStarted(struct wpa_supplicant *wpa_s,
+ int cmd_id, int subscribe_id)
+{
+
+}
+void AidlManager::notifyUsdPublishConfigFailed(struct wpa_supplicant *wpa_s, int cmd_id)
+{
+
+}
+
+void AidlManager::notifyUsdSubscribeConfigFailed(struct wpa_supplicant *wpa_s, int cmd_id)
+{
+
+}
+
+void AidlManager::notifyUsdServiceDiscovered(struct wpa_supplicant *wpa_s,
+ enum nan_service_protocol_type srv_proto_type,
+ int subscribe_id, int peer_publish_id, const u8 *peer_addr,
+ bool fsd, const u8 *ssi, size_t ssi_len)
+{
+
+}
+
+void AidlManager::notifyUsdPublishReplied(struct wpa_supplicant *wpa_s,
+ enum nan_service_protocol_type srv_proto_type,
+ int publish_id, int peer_subscribe_id,
+ const u8 *peer_addr, const u8 *ssi, size_t ssi_len)
+{
+
+}
+
+void AidlManager::notifyUsdMessageReceived(struct wpa_supplicant *wpa_s, int id,
+ int peer_instance_id, const u8 *peer_addr,
+ const u8 *message, size_t message_len)
+{
+
+}
+
+
+void AidlManager::notifyUsdPublishTerminated(struct wpa_supplicant *wpa_s,
+ int publish_id, enum nan_de_reason reason)
+{
+
+}
+
+void AidlManager::notifyUsdSubscribeTerminated(struct wpa_supplicant *wpa_s,
+ int subscribe_id, enum nan_de_reason reason)
+{
+
+}
+
} // namespace supplicant
} // namespace wifi
} // namespace hardware
diff --git a/wpa_supplicant/aidl/vendor/aidl_manager.h b/wpa_supplicant/aidl/vendor/aidl_manager.h
index 46a40aa..d40837c 100644
--- a/wpa_supplicant/aidl/vendor/aidl_manager.h
+++ b/wpa_supplicant/aidl/vendor/aidl_manager.h
@@ -178,6 +178,27 @@
unsigned int count, int **scs_resp);
void notifyMloLinksInfoChanged(struct wpa_supplicant *wpa_s,
enum mlo_info_change_reason reason);
+ void notifyUsdPublishStarted(struct wpa_supplicant *wpa_s,
+ int cmd_id, int publish_id);
+ void notifyUsdSubscribeStarted(struct wpa_supplicant *wpa_s,
+ int cmd_id, int subscribe_id);
+ void notifyUsdPublishConfigFailed(struct wpa_supplicant *wpa_s, int cmd_id);
+ void notifyUsdSubscribeConfigFailed(struct wpa_supplicant *wpa_s, int cmd_id);
+ void notifyUsdServiceDiscovered(struct wpa_supplicant *wpa_s,
+ enum nan_service_protocol_type srv_proto_type,
+ int subscribe_id, int peer_publish_id, const u8 *peer_addr,
+ bool fsd, const u8 *ssi, size_t ssi_len);
+ void notifyUsdPublishReplied(struct wpa_supplicant *wpa_s,
+ enum nan_service_protocol_type srv_proto_type,
+ int publish_id, int peer_subscribe_id,
+ const u8 *peer_addr, const u8 *ssi, size_t ssi_len);
+ void notifyUsdMessageReceived(struct wpa_supplicant *wpa_s, int id,
+ int peer_instance_id, const u8 *peer_addr,
+ const u8 *message, size_t message_len);
+ void notifyUsdPublishTerminated(struct wpa_supplicant *wpa_s,
+ int publish_id, enum nan_de_reason reason);
+ void notifyUsdSubscribeTerminated(struct wpa_supplicant *wpa_s,
+ int subscribe_id, enum nan_de_reason reason);
// Methods called from aidl objects.
int32_t isAidlServiceVersionAtLeast(int32_t expected_version);
diff --git a/wpa_supplicant/aidl/vendor/sta_iface.cpp b/wpa_supplicant/aidl/vendor/sta_iface.cpp
index 2e1bcc3..478874d 100644
--- a/wpa_supplicant/aidl/vendor/sta_iface.cpp
+++ b/wpa_supplicant/aidl/vendor/sta_iface.cpp
@@ -2782,15 +2782,23 @@
struct nan_publish_params nanPublishParams =
convertAidlNanPublishParamsToInternal(usdPublishConfig);
- int status = wpas_nan_usd_publish(
+ int publishId = wpas_nan_usd_publish(
wpa_s, usdPublishConfig.usdBaseConfig.serviceName.c_str(),
convertAidlServiceProtoTypeToInternal(
usdPublishConfig.usdBaseConfig.serviceProtoType),
ssiBuffer.get(), &nanPublishParams, false /* p2p */);
- if (status < 0) {
+
+ // Core supplicant does not have an internal callback for USD publish, but some
+ // implementations may decide to offload and return the result in a callback.
+ // In our case (core supplicant), the AIDL callback will be invoked directly here.
+ AidlManager *aidl_manager = AidlManager::getInstance();
+ WPA_ASSERT(aidl_manager);
+ if (publishId < 0) {
wpa_printf(MSG_INFO, "Failed to configure USD publish");
+ aidl_manager->notifyUsdPublishConfigFailed(wpa_s, cmdId);
return createStatus(SupplicantStatusCode::FAILURE_UNKNOWN);
}
+ aidl_manager->notifyUsdPublishStarted(wpa_s, cmdId, publishId);
return ndk::ScopedAStatus::ok();
}
@@ -2810,15 +2818,21 @@
struct nan_subscribe_params nanSubscribeParams =
convertAidlNanSubscribeParamsToInternal(usdSubscribeConfig);
- int status = wpas_nan_usd_subscribe(
+ int subscribeId = wpas_nan_usd_subscribe(
wpa_s, usdSubscribeConfig.usdBaseConfig.serviceName.c_str(),
convertAidlServiceProtoTypeToInternal(
usdSubscribeConfig.usdBaseConfig.serviceProtoType),
ssiBuffer.get(), &nanSubscribeParams, false /* p2p */);
- if (status < 0) {
+
+ // See comment in startUsdPublishInternal regarding callbacks
+ AidlManager *aidl_manager = AidlManager::getInstance();
+ WPA_ASSERT(aidl_manager);
+ if (subscribeId < 0) {
wpa_printf(MSG_INFO, "Failed to configure USD subscribe");
+ aidl_manager->notifyUsdSubscribeConfigFailed(wpa_s, cmdId);
return createStatus(SupplicantStatusCode::FAILURE_UNKNOWN);
}
+ aidl_manager->notifyUsdSubscribeStarted(wpa_s, cmdId, subscribeId);
return ndk::ScopedAStatus::ok();
}
diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
index 2dc68b0..0cd7c63 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -1512,6 +1512,9 @@
subscribe_id, peer_publish_id, MAC2STR(peer_addr),
fsd, fsd_gas, srv_proto_type, ssi_hex);
os_free(ssi_hex);
+
+ wpas_aidl_notify_usd_service_discovered(wpa_s, srv_proto_type,
+ subscribe_id, peer_publish_id, peer_addr, fsd, ssi, ssi_len);
}
@@ -1534,6 +1537,9 @@
publish_id, MAC2STR(peer_addr), peer_subscribe_id,
srv_proto_type, ssi_hex);
os_free(ssi_hex);
+
+ wpas_aidl_notify_usd_publish_replied(wpa_s, srv_proto_type,
+ publish_id, peer_subscribe_id, peer_addr, ssi, ssi_len);
}
@@ -1552,6 +1558,9 @@
"id=%d peer_instance_id=%d address=" MACSTR " ssi=%s",
id, peer_instance_id, MAC2STR(peer_addr), ssi_hex);
os_free(ssi_hex);
+
+ wpas_aidl_notify_usd_message_received(wpa_s, id, peer_instance_id,
+ peer_addr, ssi, ssi_len);
}
@@ -1577,6 +1586,7 @@
wpa_msg(wpa_s, MSG_INFO, NAN_PUBLISH_TERMINATED
"publish_id=%d reason=%s",
publish_id, nan_reason_txt(reason));
+ wpas_aidl_notify_usd_publish_terminated(wpa_s, publish_id, reason);
}
@@ -1587,6 +1597,7 @@
wpa_msg(wpa_s, MSG_INFO, NAN_SUBSCRIBE_TERMINATED
"subscribe_id=%d reason=%s",
subscribe_id, nan_reason_txt(reason));
+ wpas_aidl_notify_usd_subscribe_terminated(wpa_s, subscribe_id, reason);
}
#endif /* CONFIG_NAN_USD */