pseudomodem: Clearing bearers should remove them from DBus connection.

Bearers will now get properly removed from the DBus connection when the
pseudomodem is reset. Also fixed bug involving Ip4Config/Ip6Config
property of bearer.

BUG=chromium:240598
TEST=network_3GSmokeTest.pseudomodem should pass.

Change-Id: I96ae164ee01514ffe10c0db70593705314c050ac
Reviewed-on: https://gerrit.chromium.org/gerrit/51159
Commit-Queue: Arman Uguray <armansito@chromium.org>
Reviewed-by: Arman Uguray <armansito@chromium.org>
Tested-by: Arman Uguray <armansito@chromium.org>
diff --git a/client/cros/cellular/pseudomodem/bearer.py b/client/cros/cellular/pseudomodem/bearer.py
index e73b12c..ad1b951 100644
--- a/client/cros/cellular/pseudomodem/bearer.py
+++ b/client/cros/cellular/pseudomodem/bearer.py
@@ -86,7 +86,8 @@
 
         self._AddProperty('Ip4Config')
         self.Set(mm1.I_BEARER, config_prop, {
-            'method': dbus.types.UInt32(mm1.MM_BEARER_IP_METHOD_DHCP)
+            'method': dbus.types.UInt32(mm1.MM_BEARER_IP_METHOD_DHCP,
+                                        variant_level=1)
         })
         self._active = True
         self.Set(mm1.I_BEARER, 'Connected', dbus.types.Boolean(True))
diff --git a/client/cros/cellular/pseudomodem/modem.py b/client/cros/cellular/pseudomodem/modem.py
index ab5d068..4c8a2d9 100644
--- a/client/cros/cellular/pseudomodem/modem.py
+++ b/client/cros/cellular/pseudomodem/modem.py
@@ -17,6 +17,10 @@
 
 ALLOWED_BEARER_PROPERTIES = [
     'apn',
+    'operator-id',
+    'allowed-modes',
+    'preferred-mode',
+    'bands',
     'ip-type',
     'user',
     'password',
@@ -434,9 +438,29 @@
         @param bearer: Object path of the bearer to delete.
 
         """
-        self.Disconnect(bearer)
-        if bearer in self.bearers:
-            self.bearers.pop(bearer)
+        logging.info('Modem.DeleteBearer: ' + str(bearer))
+        if not bearer in self.bearers:
+            logging.info('Unknown bearer. Nothing to do.')
+            return
+        bearer_object = self.bearers[bearer]
+        if bearer_object.IsActive():
+            def _SuccessCallback():
+                logging.info('Modem: Bearer %s disconnected.', str(bearer))
+            def _ErrorCallback(error):
+                logging.info('Modem: Failed to disconnect bearer: %s',
+                             str(error))
+            self.Disconnect(bearer, _SuccessCallback, _ErrorCallback)
+
+        bearer_object.remove_from_connection()
+        self.bearers.pop(bearer)
+
+    def ClearBearers(self):
+        """
+        Deletes all bearers that are managed by this modem.
+
+        """
+        for b in self.bearers.keys():
+            self.DeleteBearer(b)
 
     @dbus.service.method(mm1.I_MODEM)
     def Reset(self):
@@ -465,7 +489,7 @@
             if manager:
                 manager.Remove(self)
 
-            self.bearers.clear()
+            self.ClearBearers()
 
             # Reappear.
             def _DelayedReappear():