static void real_deactivate (NMModem *self, NMDevice *device) { NMModemPrivate *priv; int ifindex; g_return_if_fail (self != NULL); g_return_if_fail (NM_IS_MODEM (self)); g_return_if_fail (device != NULL); g_return_if_fail (NM_IS_DEVICE (device)); priv = NM_MODEM_GET_PRIVATE (self); priv->secrets_tries = 0; if (priv->act_request) { cancel_get_secrets (self); g_object_unref (priv->act_request); priv->act_request = NULL; } if (priv->call) { dbus_g_proxy_cancel_call (priv->proxy, priv->call); priv->call = NULL; } priv->in_bytes = priv->out_bytes = 0; if (priv->ppp_manager) { g_object_unref (priv->ppp_manager); priv->ppp_manager = NULL; } switch (priv->ip_method) { case MM_MODEM_IP_METHOD_PPP: break; case MM_MODEM_IP_METHOD_STATIC: case MM_MODEM_IP_METHOD_DHCP: ifindex = nm_device_get_ip_ifindex (device); if (ifindex >= 0) { /* FIXME: use AF_UNSPEC here when we have IPv6 support */ nm_system_iface_flush_routes (ifindex, AF_INET); nm_system_iface_flush_addresses (ifindex, AF_UNSPEC); nm_system_iface_set_up (ifindex, FALSE, NULL); } break; default: nm_log_err (LOGD_MB, "unknown IP method %d", priv->ip_method); break; } }
void nm_modem_device_state_changed (NMModem *self, NMDeviceState new_state, NMDeviceState old_state, NMDeviceStateReason reason) { gboolean was_connected = FALSE; NMModemPrivate *priv; g_return_if_fail (self != NULL); g_return_if_fail (NM_IS_MODEM (self)); if (IS_ACTIVATING_STATE (old_state) || (old_state == NM_DEVICE_STATE_ACTIVATED)) was_connected = TRUE; priv = NM_MODEM_GET_PRIVATE (self); /* Make sure we don't leave the serial device open */ switch (new_state) { case NM_DEVICE_STATE_NEED_AUTH: if (priv->ppp_manager) break; /* else fall through */ case NM_DEVICE_STATE_UNMANAGED: case NM_DEVICE_STATE_UNAVAILABLE: case NM_DEVICE_STATE_FAILED: case NM_DEVICE_STATE_DISCONNECTED: if (new_state != NM_DEVICE_STATE_NEED_AUTH) { if (priv->act_request) { cancel_get_secrets (self); g_object_unref (priv->act_request); priv->act_request = NULL; } } if (was_connected) { dbus_g_proxy_begin_call (nm_modem_get_proxy (self, MM_DBUS_INTERFACE_MODEM), "Disconnect", disconnect_done, self, NULL, G_TYPE_INVALID); } break; default: break; } }
static void _ppp_cleanup (NMPPPManager *manager) { NMPPPManagerPrivate *priv; g_return_if_fail (NM_IS_PPP_MANAGER (manager)); priv = NM_PPP_MANAGER_GET_PRIVATE (manager); cancel_get_secrets (manager); if (priv->monitor_id) { g_source_remove (priv->monitor_id); priv->monitor_id = 0; } if (priv->monitor_fd) { /* Get the stats one last time */ monitor_cb (manager); close (priv->monitor_fd); priv->monitor_fd = 0; } if (priv->ppp_timeout_handler) { g_source_remove (priv->ppp_timeout_handler); priv->ppp_timeout_handler = 0; } if (priv->ppp_watch_id) { g_source_remove (priv->ppp_watch_id); priv->ppp_watch_id = 0; } if (priv->pid) { if (kill (priv->pid, SIGTERM) == 0) g_timeout_add_seconds (2, ensure_killed, GINT_TO_POINTER (priv->pid)); else { kill (priv->pid, SIGKILL); /* ensure the child is reaped */ nm_log_dbg (LOGD_PPP, "waiting for pppd pid %d to exit", priv->pid); waitpid (priv->pid, NULL, 0); nm_log_dbg (LOGD_PPP, "pppd pid %d cleaned up", priv->pid); } priv->pid = 0; } }
void nm_modem_device_state_changed (NMModem *self, NMDeviceState new_state, NMDeviceState old_state, NMDeviceStateReason reason) { gboolean was_connected = FALSE, warn = TRUE; NMModemPrivate *priv; g_return_if_fail (self != NULL); g_return_if_fail (NM_IS_MODEM (self)); if (old_state >= NM_DEVICE_STATE_PREPARE && old_state <= NM_DEVICE_STATE_ACTIVATED) was_connected = TRUE; priv = NM_MODEM_GET_PRIVATE (self); /* Make sure we don't leave the serial device open */ switch (new_state) { case NM_DEVICE_STATE_NEED_AUTH: if (priv->ppp_manager) break; /* else fall through */ case NM_DEVICE_STATE_UNMANAGED: case NM_DEVICE_STATE_UNAVAILABLE: case NM_DEVICE_STATE_FAILED: case NM_DEVICE_STATE_DISCONNECTED: if (new_state != NM_DEVICE_STATE_NEED_AUTH) { if (priv->act_request) { cancel_get_secrets (self); g_object_unref (priv->act_request); priv->act_request = NULL; } } if (was_connected) { /* Don't bother warning on FAILED since the modem is already gone */ if (new_state == NM_DEVICE_STATE_FAILED) warn = FALSE; NM_MODEM_GET_CLASS (self)->disconnect (self, warn); } break; default: break; } }
static void deactivate_cleanup (NMModem *self, NMDevice *device) { NMModemPrivate *priv; int ifindex; g_return_if_fail (NM_IS_MODEM (self)); priv = NM_MODEM_GET_PRIVATE (self); priv->secrets_tries = 0; if (priv->act_request) { cancel_get_secrets (self); g_object_unref (priv->act_request); priv->act_request = NULL; } priv->in_bytes = priv->out_bytes = 0; nm_exported_object_clear_and_unexport (&priv->ppp_manager); if (device) { g_return_if_fail (NM_IS_DEVICE (device)); if (priv->ip4_method == NM_MODEM_IP_METHOD_STATIC || priv->ip4_method == NM_MODEM_IP_METHOD_AUTO || priv->ip6_method == NM_MODEM_IP_METHOD_STATIC || priv->ip6_method == NM_MODEM_IP_METHOD_AUTO) { ifindex = nm_device_get_ip_ifindex (device); if (ifindex > 0) { nm_route_manager_route_flush (nm_route_manager_get (), ifindex); nm_platform_address_flush (NM_PLATFORM_GET, ifindex); nm_platform_link_set_down (NM_PLATFORM_GET, ifindex); } } } priv->ip4_method = NM_MODEM_IP_METHOD_UNKNOWN; priv->ip6_method = NM_MODEM_IP_METHOD_UNKNOWN; g_free (priv->ppp_iface); priv->ppp_iface = NULL; }
void nm_modem_get_secrets (NMModem *self, const char *setting_name, gboolean request_new, const char *hint) { NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self); NMSecretAgentGetSecretsFlags flags = NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION; cancel_get_secrets (self); if (request_new) flags |= NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW; priv->secrets_id = nm_act_request_get_secrets (priv->act_request, setting_name, flags, hint, modem_secrets_cb, self); g_return_if_fail (priv->secrets_id); g_signal_emit (self, signals[AUTH_REQUESTED], 0); }
static void _ppp_cleanup (NMPPPManager *manager) { NMPPPManagerPrivate *priv; g_return_if_fail (NM_IS_PPP_MANAGER (manager)); priv = NM_PPP_MANAGER_GET_PRIVATE (manager); cancel_get_secrets (manager); nm_clear_g_source (&priv->monitor_id); if (priv->monitor_fd >= 0) { /* Get the stats one last time */ monitor_cb (manager); close (priv->monitor_fd); priv->monitor_fd = -1; } nm_clear_g_source (&priv->ppp_timeout_handler); nm_clear_g_source (&priv->ppp_watch_id); }