shill: Add support for connecting to WEP+802.1x (Dynamic WEP) networks

These networks with dynamic with WEP keying require configuring the security
set to WEP and EAP.KeyMgmt set to "IEEE8021X".

Also updated UpdateConnectable() to take into account such networks.

BUG=chromium-os:20900
TEST=new unit test + changes to existing unittest, one new autotest
     passing ("003CheckWEP_8021x" from network_WiFiSecMat)

Change-Id: Ie55ddf18ad769af2b507208df802154e7c36c055
Reviewed-on: https://gerrit.chromium.org/gerrit/15074
Tested-by: Gaurav Shah <gauravsh@chromium.org>
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Commit-Ready: Gaurav Shah <gauravsh@chromium.org>
diff --git a/wifi_service_unittest.cc b/wifi_service_unittest.cc
index 7945900..dc00898 100644
--- a/wifi_service_unittest.cc
+++ b/wifi_service_unittest.cc
@@ -403,6 +403,35 @@
   wifi_service->ConnectTask();
 }
 
+
+MATCHER(DynamicWEPArgs, "") {
+  return ContainsKey(arg, wpa_supplicant::kNetworkPropertyEapIdentity) &&
+      ContainsKey(arg, wpa_supplicant::kNetworkPropertyCaPath) &&
+      !ContainsKey(arg, wpa_supplicant::kPropertySecurityProtocol);
+}
+
+// Dynamic WEP + 802.1x.
+TEST_F(WiFiServiceTest, ConnectTaskDynamicWEP) {
+  vector<uint8_t> ssid(5);
+  WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
+                                                   dispatcher(),
+                                                   metrics(),
+                                                   manager(),
+                                                   wifi(),
+                                                   ssid,
+                                                   flimflam::kModeManaged,
+                                                   flimflam::kSecurityWep,
+                                                   false);
+
+  Service::EapCredentials eap;
+  eap.key_management = "IEEE8021X";
+  eap.identity = "something";
+  wifi_service->set_eap(eap);
+  EXPECT_CALL(*wifi(),
+              ConnectTo(wifi_service.get(), DynamicWEPArgs()));
+  wifi_service->ConnectTask();
+}
+
 TEST_F(WiFiServiceTest, LoadHidden) {
   vector<uint8_t> ssid(5);
   ssid.push_back(0xff);
@@ -580,6 +609,9 @@
   EXPECT_FALSE(CheckConnectable(flimflam::kSecurity8021x, NULL, &eap));
   eap.password = "some password";
   EXPECT_TRUE(CheckConnectable(flimflam::kSecurity8021x, NULL, &eap));
+  // Dynamic WEP + 802.1X should be connectable under the same conditions.
+  eap.key_management = "IEEE8021X";
+  EXPECT_TRUE(CheckConnectable(flimflam::kSecurityWep, NULL, &eap));
 }
 
 TEST_F(WiFiServiceTest, IsAutoConnectable) {