diff --git a/ChangeLog b/ChangeLog index 0dde3d105b..6f1fef64d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2008-10-02 Dan Williams + + * src/ppp-manager/nm-ppp-manager.c + src/ppp-manager/nm-ppp-manager.h + - (impl_ppp_manager_need_secrets): tries secrets twice before asking + the settings daemon for completely new ones + - (create_pppd_cmd_line): new parameter 'ppp_name' used to set the + local PPP peer name; allow PPP debuging by launching NM with + the environment variable NM_PPP_DEBUG defined + - (nm_ppp_manager_start): new parameter 'ppp_name' passed to + create_pppd_cmd_line() + + * src/nm-serial-device.c + src/nm-serial-device.h + - New 'get_ppp_name' function for subclasses to implement to return the + local PPP peer name + - (real_act_stage2_config): call 'get_ppp_name' function of subclasses + and pass that name to the PPP manager + + * src/nm-device-ethernet.c + - (pppoe_stage2_config): pass the PPPoE username to the PPP manager as + the local peer name + + * src/nm-cdma-device.c + - (real_get_ppp_name): implement using the CDMA username + 2008-10-02 Dan Williams Patch from Alexander Sack diff --git a/src/nm-cdma-device.c b/src/nm-cdma-device.c index fd04b803d5..63e4883efd 100644 --- a/src/nm-cdma-device.c +++ b/src/nm-cdma-device.c @@ -312,6 +312,21 @@ real_connection_secrets_updated (NMDevice *dev, nm_device_activate_schedule_stage1_device_prepare (dev); } +static const char * +real_get_ppp_name (NMSerialDevice *device, NMActRequest *req) +{ + NMConnection *connection; + NMSettingCdma *s_cdma; + + connection = nm_act_request_get_connection (req); + g_assert (connection); + + s_cdma = (NMSettingCdma *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA); + g_assert (s_cdma); + + return s_cdma->username; +} + /*****************************************************************************/ /* Monitor device handling */ @@ -521,6 +536,7 @@ nm_cdma_device_class_init (NMCdmaDeviceClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); NMDeviceClass *device_class = NM_DEVICE_CLASS (klass); + NMSerialDeviceClass *serial_class = NM_SERIAL_DEVICE_CLASS (klass); g_type_class_add_private (object_class, sizeof (NMCdmaDevicePrivate)); @@ -534,6 +550,8 @@ nm_cdma_device_class_init (NMCdmaDeviceClass *klass) device_class->act_stage1_prepare = real_act_stage1_prepare; device_class->connection_secrets_updated = real_connection_secrets_updated; + serial_class->get_ppp_name = real_get_ppp_name; + /* Properties */ g_object_class_install_property (object_class, PROP_MONITOR_IFACE, diff --git a/src/nm-device-ethernet.c b/src/nm-device-ethernet.c index a276807ee6..0634bc50f0 100644 --- a/src/nm-device-ethernet.c +++ b/src/nm-device-ethernet.c @@ -1235,6 +1235,8 @@ static NMActStageReturn pppoe_stage2_config (NMDeviceEthernet *self, NMDeviceStateReason *reason) { NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self); + NMConnection *connection; + NMSettingPPPOE *s_pppoe; NMActRequest *req; GError *err = NULL; NMActStageReturn ret = NM_ACT_STAGE_RETURN_FAILURE; @@ -1242,8 +1244,14 @@ pppoe_stage2_config (NMDeviceEthernet *self, NMDeviceStateReason *reason) req = nm_device_get_act_request (NM_DEVICE (self)); g_assert (req); + connection = nm_act_request_get_connection (req); + g_assert (req); + + s_pppoe = (NMSettingPPPOE *) nm_connection_get_setting (connection, NM_TYPE_SETTING_PPPOE); + g_assert (s_pppoe); + priv->ppp_manager = nm_ppp_manager_new (nm_device_get_iface (NM_DEVICE (self))); - if (nm_ppp_manager_start (priv->ppp_manager, req, &err)) { + if (nm_ppp_manager_start (priv->ppp_manager, req, s_pppoe->username, &err)) { g_signal_connect (priv->ppp_manager, "state-changed", G_CALLBACK (ppp_state_changed), self); diff --git a/src/nm-serial-device.c b/src/nm-serial-device.c index e75875a5f2..36ddefb628 100644 --- a/src/nm-serial-device.c +++ b/src/nm-serial-device.c @@ -1013,15 +1013,20 @@ static NMActStageReturn real_act_stage2_config (NMDevice *device, NMDeviceStateReason *reason) { NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (device); + NMSerialDeviceClass *serial_class = NM_SERIAL_DEVICE_GET_CLASS (device); NMActRequest *req; GError *err = NULL; NMActStageReturn ret; + const char *ppp_name = NULL; req = nm_device_get_act_request (device); g_assert (req); + if (serial_class->get_ppp_name) + ppp_name = serial_class->get_ppp_name (NM_SERIAL_DEVICE (device), req); + priv->ppp_manager = nm_ppp_manager_new (nm_device_get_iface (device)); - if (nm_ppp_manager_start (priv->ppp_manager, req, &err)) { + if (nm_ppp_manager_start (priv->ppp_manager, req, ppp_name, &err)) { g_signal_connect (priv->ppp_manager, "state-changed", G_CALLBACK (ppp_state_changed), device); diff --git a/src/nm-serial-device.h b/src/nm-serial-device.h index e01fcf530b..024b2e8b50 100644 --- a/src/nm-serial-device.h +++ b/src/nm-serial-device.h @@ -23,6 +23,8 @@ typedef struct { typedef struct { NMDeviceClass parent; + const char * (*get_ppp_name) (NMSerialDevice *device, NMActRequest *req); + /* Signals */ void (*ppp_stats) (NMSerialDevice *device, guint32 in_bytes, guint32 out_bytes); } NMSerialDeviceClass; diff --git a/src/ppp-manager/nm-ppp-manager.c b/src/ppp-manager/nm-ppp-manager.c index 3ab51564bf..abf9a0bf6a 100644 --- a/src/ppp-manager/nm-ppp-manager.c +++ b/src/ppp-manager/nm-ppp-manager.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -408,9 +409,13 @@ impl_ppp_manager_need_secrets (NMPPPManager *manager, } tries = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (connection), PPP_MANAGER_SECRET_TRIES)); + /* Only ask for completely new secrets after retrying them once; some PPP + * servers (T-Mobile USA) appear to ask a few times when they actually don't + * even care what you pass back. + */ nm_act_request_request_connection_secrets (priv->act_req, setting_name, - tries ? TRUE : FALSE, + tries > 1 ? TRUE : FALSE, SECRETS_CALLER_PPP, hint1, hint2); @@ -698,11 +703,13 @@ static NMCmdLine * create_pppd_cmd_line (NMPPPManager *self, NMSettingPPP *setting, NMSettingPPPOE *pppoe, + const char *ppp_name, GError **err) { NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (self); const char *ppp_binary; NMCmdLine *cmd; + const char *ppp_debug; ppp_binary = nm_find_pppd (); if (!ppp_binary) { @@ -718,6 +725,15 @@ create_pppd_cmd_line (NMPPPManager *self, nm_cmd_line_add_string (cmd, "nodetach"); nm_cmd_line_add_string (cmd, "lock"); + ppp_debug = getenv ("NM_PPP_DEBUG"); + if (ppp_debug) + nm_cmd_line_add_string (cmd, "debug"); + + if (ppp_name) { + nm_cmd_line_add_string (cmd, "user"); + nm_cmd_line_add_string (cmd, ppp_name); + } + if (pppoe) { char *dev_str; @@ -732,9 +748,6 @@ create_pppd_cmd_line (NMPPPManager *self, nm_cmd_line_add_string (cmd, "rp_pppoe_service"); nm_cmd_line_add_string (cmd, pppoe->service); } - - nm_cmd_line_add_string (cmd, "user"); - nm_cmd_line_add_string (cmd, pppoe->username); } else { nm_cmd_line_add_string (cmd, priv->parent_iface); /* Don't send some random address as the local address */ @@ -843,7 +856,10 @@ pppoe_fill_defaults (NMSettingPPP *setting) } gboolean -nm_ppp_manager_start (NMPPPManager *manager, NMActRequest *req, GError **err) +nm_ppp_manager_start (NMPPPManager *manager, + NMActRequest *req, + const char *ppp_name, + GError **err) { NMPPPManagerPrivate *priv; NMConnection *connection; @@ -863,7 +879,7 @@ nm_ppp_manager_start (NMPPPManager *manager, NMActRequest *req, GError **err) if (pppoe_setting) pppoe_fill_defaults (ppp_setting); - ppp_cmd = create_pppd_cmd_line (manager, ppp_setting, pppoe_setting, err); + ppp_cmd = create_pppd_cmd_line (manager, ppp_setting, pppoe_setting, ppp_name, err); if (!ppp_cmd) return FALSE; diff --git a/src/ppp-manager/nm-ppp-manager.h b/src/ppp-manager/nm-ppp-manager.h index 4e0e576e40..ec18f16e7a 100644 --- a/src/ppp-manager/nm-ppp-manager.h +++ b/src/ppp-manager/nm-ppp-manager.h @@ -38,7 +38,10 @@ GType nm_ppp_manager_get_type (void); NMPPPManager *nm_ppp_manager_new (const char *iface); -gboolean nm_ppp_manager_start (NMPPPManager *manager, NMActRequest *req, GError **err); +gboolean nm_ppp_manager_start (NMPPPManager *manager, + NMActRequest *req, + const char *ppp_name, + GError **err); void nm_ppp_manager_update_secrets (NMPPPManager *manager, const char *device,