Implement the remaining USD callbacks in
the mainline supplicant.
Bug: 365585450
Test: m
Change-Id: I91cfd4e2706e1679b0ec9d6c741b4108bfc4e7bd
diff --git a/wpa_supplicant/aidl/mainline/callback_bridge.cpp b/wpa_supplicant/aidl/mainline/callback_bridge.cpp
index 1cf59ec..a7b284b 100644
--- a/wpa_supplicant/aidl/mainline/callback_bridge.cpp
+++ b/wpa_supplicant/aidl/mainline/callback_bridge.cpp
@@ -14,6 +14,8 @@
#include "callback_bridge.h"
}
+using ::aidl::android::system::wifi::mainline_supplicant::UsdMessageInfo;
+
void mainline_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,
@@ -30,3 +32,69 @@
srv_proto_type, subscribe_id, peer_publish_id, peer_addr, fsd, ssi, ssi_len);
callback->onUsdServiceDiscovered(serviceDiscoveryInfo);
}
+
+void mainline_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)
+ return;
+
+ auto callback = getStaIfaceCallback(wpa_s->ifname);
+ if (!callback)
+ return;
+
+ wpa_printf(MSG_DEBUG, "Notifying USD publish replied");
+ auto serviceDiscoveryInfo = createUsdServiceDiscoveryInfo(
+ srv_proto_type, publish_id, peer_subscribe_id, peer_addr, false /* fsd */,
+ ssi, ssi_len);
+ callback->onUsdPublishReplied(serviceDiscoveryInfo);
+}
+
+void mainline_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)
+ return;
+
+ auto callback = getStaIfaceCallback(wpa_s->ifname);
+ if (!callback)
+ return;
+
+ UsdMessageInfo messageInfo;
+ messageInfo.ownId = id;
+ messageInfo.peerId = peer_instance_id;
+ messageInfo.peerMacAddress = macAddrBytesToArray(peer_addr);
+ messageInfo.message = message ? byteArrToVec(message, message_len) : std::vector<uint8_t>();
+
+ wpa_printf(MSG_DEBUG, "Notifying USD message received");
+ callback->onUsdMessageReceived(messageInfo);
+}
+
+void mainline_aidl_notify_usd_publish_terminated(struct wpa_supplicant *wpa_s,
+ int publish_id, enum nan_de_reason reason) {
+ if (!wpa_s)
+ return;
+
+ auto callback = getStaIfaceCallback(wpa_s->ifname);
+ if (!callback)
+ return;
+
+ wpa_printf(MSG_DEBUG, "Notifying USD publish terminated");
+ callback->onUsdPublishTerminated(
+ publish_id, convertInternalUsdTerminateReasonCodeToAidl(reason));
+}
+
+void mainline_aidl_notify_usd_subscribe_terminated(struct wpa_supplicant *wpa_s,
+ int subscribe_id, enum nan_de_reason reason) {
+ if (!wpa_s)
+ return;
+
+ auto callback = getStaIfaceCallback(wpa_s->ifname);
+ if (!callback)
+ return;
+
+ wpa_printf(MSG_DEBUG, "Notifying USD subscribe terminated");
+ callback->onUsdSubscribeTerminated(
+ subscribe_id, convertInternalUsdTerminateReasonCodeToAidl(reason));
+}
diff --git a/wpa_supplicant/aidl/mainline/callback_bridge.h b/wpa_supplicant/aidl/mainline/callback_bridge.h
index bba0635..c35bf37 100644
--- a/wpa_supplicant/aidl/mainline/callback_bridge.h
+++ b/wpa_supplicant/aidl/mainline/callback_bridge.h
@@ -31,6 +31,17 @@
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 mainline_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 mainline_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 mainline_aidl_notify_usd_publish_terminated(struct wpa_supplicant *wpa_s,
+ int publish_id, enum nan_de_reason reason);
+void mainline_aidl_notify_usd_subscribe_terminated(struct wpa_supplicant *wpa_s,
+ int subscribe_id, enum nan_de_reason reason);
#else // MAINLINE_SUPPLICANT
@@ -38,6 +49,17 @@
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 mainline_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 mainline_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 mainline_aidl_notify_usd_publish_terminated(struct wpa_supplicant *wpa_s,
+ int publish_id, enum nan_de_reason reason) {}
+static void mainline_aidl_notify_usd_subscribe_terminated(struct wpa_supplicant *wpa_s,
+ int subscribe_id, enum nan_de_reason reason) {}
#endif // MAINLINE_SUPPLICANT
diff --git a/wpa_supplicant/aidl/mainline/sta_iface.cpp b/wpa_supplicant/aidl/mainline/sta_iface.cpp
index 90543e6..0eaa199 100644
--- a/wpa_supplicant/aidl/mainline/sta_iface.cpp
+++ b/wpa_supplicant/aidl/mainline/sta_iface.cpp
@@ -71,7 +71,18 @@
convertAidlServiceProtoTypeToInternal(
publishConfig.baseConfig.serviceProtoType),
ssiBuffer.get(), &nanPublishParams, false /* p2p */);
- // TODO: Return status code in a callback
+
+ // Core supplicant does not have an internal callback for USD publish,
+ // so invoke the failure callback directly if needed.
+ if (publishId < 0) {
+ wpa_printf(MSG_INFO, "Failed to configure USD publish");
+ auto callback = getStaIfaceCallback(iface_name_);
+ if (callback) {
+ callback->onUsdPublishConfigFailed(
+ cmdId, IStaInterfaceCallback::UsdConfigErrorCode::FAILURE_UNKNOWN);
+ }
+ return createStatus(SupplicantStatusCode::FAILURE_UNKNOWN);
+ }
return ndk::ScopedAStatus::ok();
}
@@ -98,7 +109,18 @@
convertAidlServiceProtoTypeToInternal(
subscribeConfig.baseConfig.serviceProtoType),
ssiBuffer.get(), &nanSubscribeParams, false /* p2p */);
- // TODO: Return status code in a callback
+
+ // Core supplicant does not have an internal callback for USD subscribe,
+ // so invoke the failure callback directly if needed.
+ if (subscribeId < 0) {
+ wpa_printf(MSG_INFO, "Failed to configure USD subscribe");
+ auto callback = getStaIfaceCallback(iface_name_);
+ if (callback) {
+ callback->onUsdSubscribeConfigFailed(
+ cmdId, IStaInterfaceCallback::UsdConfigErrorCode::FAILURE_UNKNOWN);
+ }
+ return createStatus(SupplicantStatusCode::FAILURE_UNKNOWN);
+ }
return ndk::ScopedAStatus::ok();
}
diff --git a/wpa_supplicant/aidl/mainline/usd_utils.h b/wpa_supplicant/aidl/mainline/usd_utils.h
index c9ad20a..4d8a52f 100644
--- a/wpa_supplicant/aidl/mainline/usd_utils.h
+++ b/wpa_supplicant/aidl/mainline/usd_utils.h
@@ -180,4 +180,17 @@
return discoveryInfo;
}
+static IStaInterfaceCallback::UsdTerminateReasonCode convertInternalUsdTerminateReasonCodeToAidl(
+ nan_de_reason terminateReason) {
+ switch (terminateReason) {
+ case NAN_DE_REASON_TIMEOUT:
+ return IStaInterfaceCallback::UsdTerminateReasonCode::TIMEOUT;
+ case NAN_DE_REASON_USER_REQUEST:
+ return IStaInterfaceCallback::UsdTerminateReasonCode::USER_REQUESTED;
+ case NAN_DE_REASON_FAILURE:
+ default:
+ return IStaInterfaceCallback::UsdTerminateReasonCode::FAILURE_UNKNOWN;
+ }
+}
+
#endif // MAINLINE_SUPPLICANT_USD_UTILS_H
diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
index 123cb44..ea6fc69 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -1566,6 +1566,8 @@
wpas_aidl_notify_usd_publish_replied(wpa_s, srv_proto_type,
publish_id, peer_subscribe_id, peer_addr, ssi, ssi_len);
+ mainline_aidl_notify_usd_publish_replied(wpa_s, srv_proto_type,
+ publish_id, peer_subscribe_id, peer_addr, ssi, ssi_len);
wpas_dbus_signal_nan_replied(wpa_s, srv_proto_type, publish_id,
peer_subscribe_id, peer_addr,
@@ -1591,6 +1593,8 @@
wpas_aidl_notify_usd_message_received(wpa_s, id, peer_instance_id,
peer_addr, ssi, ssi_len);
+ mainline_aidl_notify_usd_message_received(wpa_s, id, peer_instance_id,
+ peer_addr, ssi, ssi_len);
wpas_dbus_signal_nan_receive(wpa_s, id, peer_instance_id, peer_addr,
ssi, ssi_len);
@@ -1619,8 +1623,9 @@
wpa_msg_global(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);
+ mainline_aidl_notify_usd_publish_terminated(wpa_s, publish_id, reason);
wpas_dbus_signal_nan_publish_terminated(wpa_s, publish_id,
nan_reason_txt(reason));
@@ -1636,6 +1641,7 @@
subscribe_id, nan_reason_txt(reason));
wpas_aidl_notify_usd_subscribe_terminated(wpa_s, subscribe_id, reason);
+ mainline_aidl_notify_usd_subscribe_terminated(wpa_s, subscribe_id, reason);
wpas_dbus_signal_nan_subscribe_terminated(wpa_s, subscribe_id,
nan_reason_txt(reason));