diff --git a/ChangeLog b/ChangeLog index e44f905eb..8cf0660d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-08-14 Dan Williams + + * src/nm-device.c + - (nm_device_deactivate_quickly): tear down activation request after + calling device-specific deactivation + + * src/nm-hso-gsm-device.c + - (real_deactivate_quickly): terminate connection when deactivating + 2008-08-14 Dan Williams * src/nm-activation-request.h diff --git a/src/nm-device.c b/src/nm-device.c index be3cfa088..dd1084ba6 100644 --- a/src/nm-device.c +++ b/src/nm-device.c @@ -1361,13 +1361,13 @@ nm_device_deactivate_quickly (NMDevice *self) aipd_cleanup (self); - /* Tear down an existing activation request */ - clear_act_request (self); - /* Call device type-specific deactivation */ if (NM_DEVICE_GET_CLASS (self)->deactivate_quickly) NM_DEVICE_GET_CLASS (self)->deactivate_quickly (self); + /* Tear down an existing activation request */ + clear_act_request (self); + return TRUE; } diff --git a/src/nm-hso-gsm-device.c b/src/nm-hso-gsm-device.c index 0bb8a2fb7..56f4e2343 100644 --- a/src/nm-hso-gsm-device.c +++ b/src/nm-hso-gsm-device.c @@ -390,12 +390,32 @@ static void real_deactivate_quickly (NMDevice *device) { NMHsoGsmDevicePrivate *priv = NM_HSO_GSM_DEVICE_GET_PRIVATE (device); + NMActRequest *req; + guint cid; + char *command; if (priv->pending_ip4_config) { g_object_unref (priv->pending_ip4_config); priv->pending_ip4_config = NULL; } + /* Don't leave the modem connected */ + req = nm_device_get_act_request (device); + if (req) { + cid = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (req), GSM_CID)); + if (cid) { + command = g_strdup_printf ("AT_OWANCALL=%d,0,1", cid); + nm_serial_device_send_command_string (NM_SERIAL_DEVICE (device), command); + g_free (command); + + /* FIXME: doesn't seem to take the command otherwise, perhaps since + * the serial port gets closed right away + */ + g_usleep (G_USEC_PER_SEC / 3); + } + } + + if (NM_DEVICE_CLASS (nm_hso_gsm_device_parent_class)->deactivate_quickly) NM_DEVICE_CLASS (nm_hso_gsm_device_parent_class)->deactivate_quickly (device); } @@ -410,6 +430,7 @@ real_deactivate (NMDevice *device) nm_system_device_flush_ip4_addresses_with_iface (priv->netdev_iface); nm_system_device_set_up_down_with_iface (priv->netdev_iface, FALSE); } + nm_device_set_ip_iface (device, NULL); if (NM_DEVICE_CLASS (nm_hso_gsm_device_parent_class)->deactivate) NM_DEVICE_CLASS (nm_hso_gsm_device_parent_class)->deactivate (device);