wifi(implementation): Set prop with the first active iface

This is updated whenever a new STA or AP iface is created & removed.
Also, when the chip is configured.

This property can be read by the rest of the system (including vendor
specific HAL instances) to retrieve the active iface name.

Bug: 129506593
Test: ./data/android.hardware.wifi@1.0-service-tests
Test: Manually verified the property name after wifi on/off & softap
on/off.

Change-Id: Ic1c21fd3a1c6894c797070bf889f705e4cba6dd1
diff --git a/wifi/1.3/default/wifi_chip.cpp b/wifi/1.3/default/wifi_chip.cpp
index 957b22b..25eb289 100644
--- a/wifi/1.3/default/wifi_chip.cpp
+++ b/wifi/1.3/default/wifi_chip.cpp
@@ -41,7 +41,9 @@
 constexpr uint32_t kMaxRingBufferFileAgeSeconds = 60 * 60 * 10;
 constexpr uint32_t kMaxRingBufferFileNum = 20;
 constexpr char kTombstoneFolderPath[] = "/data/vendor/tombstones/wifi/";
-constexpr unsigned kMaxWlanIfaces = 100;
+constexpr char kActiveWlanIfaceNameProperty[] = "wifi.active.interface";
+constexpr char kNoActiveWlanIfaceNamePropertyValue[] = "";
+constexpr unsigned kMaxWlanIfaces = 5;
 
 template <typename Iface>
 void invalidateAndClear(std::vector<sp<Iface>>& ifaces, sp<Iface> iface) {
@@ -105,6 +107,13 @@
     return buffer.data();
 }
 
+void setActiveWlanIfaceNameProperty(const std::string& ifname) {
+    auto res = property_set(kActiveWlanIfaceNameProperty, ifname.data());
+    if (res != 0) {
+        PLOG(ERROR) << "Failed to set active wlan iface name property";
+    }
+}
+
 // delete files that meet either conditions:
 // 1. older than a predefined time in the wifi tombstone dir.
 // 2. Files in excess to a predefined amount, starting from the oldest ones
@@ -316,13 +325,16 @@
       is_valid_(true),
       current_mode_id_(feature_flags::chip_mode_ids::kInvalid),
       modes_(feature_flags.lock()->getChipModes()),
-      debug_ring_buffer_cb_registered_(false) {}
+      debug_ring_buffer_cb_registered_(false) {
+    setActiveWlanIfaceNameProperty(kNoActiveWlanIfaceNamePropertyValue);
+}
 
 void WifiChip::invalidate() {
     if (!writeRingbufferFilesInternal()) {
         LOG(ERROR) << "Error writing files to flash";
     }
     invalidateAndRemoveAllIfaces();
+    setActiveWlanIfaceNameProperty(kNoActiveWlanIfaceNamePropertyValue);
     legacy_hal_.reset();
     event_cb_handler_.invalidate();
     is_valid_ = false;
@@ -693,6 +705,7 @@
     }
     current_mode_id_ = mode_id;
     LOG(INFO) << "Configured chip in mode " << mode_id;
+    setActiveWlanIfaceNameProperty(getFirstActiveWlanIfaceName());
     return status;
 }
 
@@ -780,6 +793,7 @@
             LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
         }
     }
+    setActiveWlanIfaceNameProperty(getFirstActiveWlanIfaceName());
     return {createWifiStatus(WifiStatusCode::SUCCESS), iface};
 }
 
@@ -811,6 +825,7 @@
             LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
         }
     }
+    setActiveWlanIfaceNameProperty(getFirstActiveWlanIfaceName());
     return createWifiStatus(WifiStatusCode::SUCCESS);
 }
 
@@ -919,6 +934,7 @@
             LOG(ERROR) << "Failed to invoke onIfaceAdded callback";
         }
     }
+    setActiveWlanIfaceNameProperty(getFirstActiveWlanIfaceName());
     return {createWifiStatus(WifiStatusCode::SUCCESS), iface};
 }
 
@@ -950,6 +966,7 @@
             LOG(ERROR) << "Failed to invoke onIfaceRemoved callback";
         }
     }
+    setActiveWlanIfaceNameProperty(getFirstActiveWlanIfaceName());
     return createWifiStatus(WifiStatusCode::SUCCESS);
 }