/bin/wifi:  Trigger ifplugd for Frenzy in client mode.

Because the Frenzy interface never goes down, ifplugd can't react to
it, meaning run-dhclient never happens for wlan0 in client mode.
Having /bin/wifi poke ifplugd.action when starting a client resolves
this.

BUG=28726532

Change-Id: I7e7caff6df68b6ce6623f53002d60a0c63d19d52
diff --git a/wifi/quantenna.py b/wifi/quantenna.py
index 54b0262..4c6c162 100755
--- a/wifi/quantenna.py
+++ b/wifi/quantenna.py
@@ -39,6 +39,11 @@
                                  stderr=subprocess.STDOUT).strip()
 
 
+def _ifplugd_action(*args):
+  return subprocess.check_output(['/etc/ifplugd/ifplugd.action'] + list(args),
+                                 stderr=subprocess.STDOUT).strip()
+
+
 def info_parsed(interface):
   """Fake version of iw.info_parsed."""
   wifiinfo_filename = os.path.join(WIFIINFO_PATH, interface)
@@ -122,6 +127,12 @@
     else:
       raise utils.BinWifiException('wpa_supplicant failed to connect')
 
+    try:
+      _ifplugd_action(interface, 'up')
+    except subprocess.CalledProcessError:
+      utils.log('Failed to call ifplugd.action.  %s may not get an IP address.'
+                % interface)
+
   return True
 
 
diff --git a/wifi/quantenna_test.py b/wifi/quantenna_test.py
index 0b6975f..b2f70ce 100755
--- a/wifi/quantenna_test.py
+++ b/wifi/quantenna_test.py
@@ -14,6 +14,7 @@
 
 
 calls = []
+ifplugd_action_calls = []
 
 
 def fake_qcsapi(*args):
@@ -50,6 +51,7 @@
 
 def set_fakes(interface='wlan1'):
   del calls[:]
+  del ifplugd_action_calls[:]
   bridge_interfaces.clear()
   os.environ['WIFI_PSK'] = 'wifi_psk'
   os.environ['WIFI_CLIENT_PSK'] = 'wifi_client_psk'
@@ -57,6 +59,7 @@
   quantenna._get_mac_address = lambda _: '00:11:22:33:44:55'
   quantenna._qcsapi = fake_qcsapi
   quantenna._brctl = fake_brctl
+  quantenna._ifplugd_action = lambda *args: ifplugd_action_calls.append(args)
 
 
 def matching_calls_indices(accept):
@@ -131,6 +134,9 @@
   wvtest.WVPASSLT(sp, i[0])
   wvtest.WVPASSLT(i[-1], calls.index(['rfenable', '1']))
 
+  # We shouldn't touch ifplugd in AP mode.
+  wvtest.WVPASSEQ(len(ifplugd_action_calls), 0)
+
   # Run set_wifi again in client mode with new options.
   opt.channel = '147'
   opt.ssid = 'TEST_SSID2'
@@ -177,6 +183,10 @@
   wvtest.WVPASSLT(rim, i[0])
   wvtest.WVPASSLT(i[-1], calls.index(['apply_security_config', 'wifi0']))
 
+  # We should have called ipflugd.action after setclient.
+  wvtest.WVPASSEQ(len(ifplugd_action_calls), 1)
+  wvtest.WVPASSEQ(ifplugd_action_calls[0], ('wlan1', 'up'))
+
   # Make sure subsequent equivalent calls don't fail despite the redundant
   # bridge changes.
   wvtest.WVPASS(quantenna.set_client_wifi(opt))