shill: Provides an iterator for AttributeList (for netlink attributes).

BUG=None
TEST=unittest

Change-Id: I9b014897229da80a5ffd023cd8840cbab8796f77
Reviewed-on: https://gerrit.chromium.org/gerrit/49270
Commit-Queue: Wade Guthrie <wdg@chromium.org>
Reviewed-by: Wade Guthrie <wdg@chromium.org>
Tested-by: Wade Guthrie <wdg@chromium.org>
diff --git a/nl80211_message.cc b/nl80211_message.cc
index d3f4d19..3fc8baa 100644
--- a/nl80211_message.cc
+++ b/nl80211_message.cc
@@ -338,13 +338,12 @@
     return false;
   }
 
-  // Assume IDs for the nested attribute array are linear starting from 1.
-  // Currently, that is enforced in the input to the nested attribute.
-  uint32_t freq;
-  int i = 1;
-  while (frequency_list->GetU32AttributeValue(i, &freq)) {
-    value->push_back(freq);
-    ++i;
+  AttributeIdIterator freq_iter(*frequency_list);
+  for (; !freq_iter.AtEnd(); freq_iter.Advance()) {
+    uint32_t freq = 0;
+    if (frequency_list->GetU32AttributeValue(freq_iter.GetId(), &freq)) {
+      value->push_back(freq);
+    }
   }
   return true;
 }
@@ -364,13 +363,12 @@
     return false;
   }
 
-  // Assume IDs for the nested attribute array are linear starting from 1.
-  // Currently, that is enforced in the input to the nested attribute.
-  string ssid;
-  int i = 1;
-  while (ssid_list->GetStringAttributeValue(i, &ssid)) {
-    value->push_back(ssid);
-    ++i;
+  AttributeIdIterator ssid_iter(*ssid_list);
+  for (; !ssid_iter.AtEnd(); ssid_iter.Advance()) {
+    string ssid;
+    if (ssid_list->GetStringAttributeValue(ssid_iter.GetId(), &ssid)) {
+      value->push_back(ssid);
+    }
   }
   return true;
 }