Specify wiphy index while fetching driver country code

NL80211_CMD_GET_REG gives global country code information which may be
different from actual driver country code. Thus, use wiphy index while
fetching driver country code.

Also, the country code changes not subscribed with NetlinkUtils() when
there are no active interfaces in wificond internal structures. So,
fetch the current country code just before subscribing for country code
change events with NetlinkUtils() and broadcast to all registered
framework callbacks.

Bug: 314689364
Test: Manual - SoftAp turn on/off & verified the country code from
bugreport
Test: Manual - Wi-Fi turned ON and verified the country code from logs

Change-Id: I9a4e847abf1c5faa756ed3a624c350812e98bb8c
diff --git a/net/netlink_utils.cpp b/net/netlink_utils.cpp
index fc705d6..5ee595c 100644
--- a/net/netlink_utils.cpp
+++ b/net/netlink_utils.cpp
@@ -847,12 +847,15 @@
   return true;
 }
 
-bool NetlinkUtils::GetCountryCode(string* out_country_code) {
+bool NetlinkUtils::GetCountryCode(uint32_t wiphy_index,
+    string* out_country_code) {
   NL80211Packet get_country_code(
       netlink_manager_->GetFamilyId(),
       NL80211_CMD_GET_REG,
       netlink_manager_->GetSequenceNumber(),
       getpid());
+  get_country_code.AddAttribute(NL80211Attr<uint32_t>(NL80211_ATTR_WIPHY,
+                                                      wiphy_index));
   unique_ptr<const NL80211Packet> response;
   if (!netlink_manager_->SendMessageAndGetSingleResponse(get_country_code,
                                                          &response)) {
diff --git a/net/netlink_utils.h b/net/netlink_utils.h
index 3b334d9..c8f6756 100644
--- a/net/netlink_utils.h
+++ b/net/netlink_utils.h
@@ -241,7 +241,8 @@
 
   // Get current alpha2 country code from kernel.
   // Returns true on success.
-  virtual bool GetCountryCode(std::string* out_country_code);
+  virtual bool GetCountryCode(uint32_t wiphy_index,
+                              std::string* out_country_code);
 
   // Sign up to be notified when there is MLME event.
   // Only one handler can be registered per interface index.
diff --git a/server.cpp b/server.cpp
index 56ba4a2..6ad9462 100644
--- a/server.cpp
+++ b/server.cpp
@@ -78,10 +78,6 @@
   LOG(INFO) << "New wificond event callback registered";
   wificond_event_callbacks_.push_back(callback);
 
-  if (current_country_code_.empty() &&
-          !netlink_utils_->GetCountryCode(&current_country_code_)) {
-      LOG(ERROR) << "Fail to get country code";
-  }
   // Inform immediately about current country code
   if (!current_country_code_.empty())
     callback->OnRegDomainChanged(current_country_code_);
@@ -306,7 +302,9 @@
   }
 
   string country_code;
-  if (netlink_utils_->GetCountryCode(&country_code)) {
+  uint32_t wiphy_index;
+  if (netlink_utils_->GetWiphyIndex(&wiphy_index) &&
+      netlink_utils_->GetCountryCode(wiphy_index, &country_code)) {
     ss << "Current country code from kernel: " << country_code << endl;
   } else {
     ss << "Failed to get country code from kernel." << endl;
@@ -472,6 +470,20 @@
     LOG(ERROR) << "Failed to get wiphy index";
     return false;
   }
+
+  std::string country_code;
+  if (!netlink_utils_->GetCountryCode(*wiphy_index, &country_code) ||
+      country_code.empty()) {
+    LOG(ERROR) << "Fail to get country code";
+  } else {
+    LOG(INFO) << "Current driver country code " << country_code;
+    if (current_country_code_.empty() ||
+        current_country_code_.compare(country_code) != 0) {
+      current_country_code_ = country_code;
+      BroadcastRegDomainChanged();
+    }
+  }
+
   // TODO: It may need to handle multi-chips case to get multi-wiphy index and
   // register corresponding callback.
   netlink_utils_->SubscribeRegDomainChange(
@@ -525,7 +537,7 @@
 void Server::OnRegDomainChanged(uint32_t wiphy_index, std::string& country_code) {
   if (country_code.empty()) {
     LOG(DEBUG) << "Regulatory domain changed with empty country code (world mode?)";
-    if (!netlink_utils_->GetCountryCode(&current_country_code_)) {
+    if (!netlink_utils_->GetCountryCode(wiphy_index, &current_country_code_)) {
         LOG(ERROR) << "Fail to get country code on wiphy_index:" << wiphy_index;
     }
   } else {
diff --git a/tests/netlink_utils_unittest.cpp b/tests/netlink_utils_unittest.cpp
index 1b27cc8..26cd0d3 100644
--- a/tests/netlink_utils_unittest.cpp
+++ b/tests/netlink_utils_unittest.cpp
@@ -918,7 +918,7 @@
       WillOnce(DoAll(MakeupResponse(response), Return(true)));
 
   string country_code;
-  EXPECT_TRUE(netlink_utils_->GetCountryCode(&country_code));
+  EXPECT_TRUE(netlink_utils_->GetCountryCode(0, &country_code));
   EXPECT_EQ(kFakeCountryCode, country_code);
 }
 
@@ -930,7 +930,7 @@
       WillOnce(DoAll(MakeupResponse(response), Return(true)));
 
   string country_code_ignored;
-  EXPECT_FALSE(netlink_utils_->GetCountryCode(&country_code_ignored));
+  EXPECT_FALSE(netlink_utils_->GetCountryCode(0, &country_code_ignored));
 }
 
 TEST_F(NetlinkUtilsTest, CanSendMgmtFrame) {