I was trying to keep update_proxy() together with dns & routes update because the state changes are clearly visible in policy.c. .But the later really uses more information from policy. Whereas update_proxy() has just to do with states of Device / VPN. Will edit to update PacRunnerManager directly from nm-device.c & nm-vpn-connection.c.
On 6/29/16, Dan Williams <[email protected]> wrote: > On Fri, 2016-06-24 at 00:42 +0530, Atul Anand wrote: >> src/policy.c fixed to update pacrunner with connection activation >> and deactivation.Previous sent configs are destroyed before updating >> PacRunner with new cofigs. >> --- >> libnm-core/nm-vpn-dbus-interface.h | 3 ++ >> src/nm-logging.c | 3 +- >> src/nm-logging.h | 1 + >> src/nm-policy.c | 75 >> +++++++++++++++++++++++++++++++++++++- >> src/nm-types.h | 2 + >> 5 files changed, 82 insertions(+), 2 deletions(-) >> >> diff --git a/libnm-core/nm-vpn-dbus-interface.h b/libnm-core/nm-vpn- >> dbus-interface.h >> index 9226458..e557e81 100644 >> --- a/libnm-core/nm-vpn-dbus-interface.h >> +++ b/libnm-core/nm-vpn-dbus-interface.h >> @@ -183,6 +183,9 @@ typedef enum { >> /* string: VPN interface name (tun0, tap0, etc) */ >> #define NM_VPN_PLUGIN_CONFIG_TUNDEV "tundev" >> >> +/* string: Proxy PAC */ >> +#define NM_VPN_PLUGIN_CONFIG_PROXY_PAC "pac" >> + >> /* string: Login message */ >> #define NM_VPN_PLUGIN_CONFIG_BANNER "banner" >> >> diff --git a/src/nm-logging.c b/src/nm-logging.c >> index 15e1492..0aa2b2b 100644 >> --- a/src/nm-logging.c >> +++ b/src/nm-logging.c >> @@ -129,7 +129,7 @@ static struct { >> char *logging_domains_to_string; >> const LogLevelDesc level_desc[_LOGL_N]; >> >> -#define _DOMAIN_DESC_LEN 38 >> +#define _DOMAIN_DESC_LEN 39 >> /* Would be nice to use C99 flexible array member here, >> * but that feature doesn't seem well supported. */ >> const LogDesc domain_desc[_DOMAIN_DESC_LEN]; >> @@ -185,6 +185,7 @@ static struct { >> { LOGD_AUDIT, "AUDIT" }, >> { LOGD_SYSTEMD, "SYSTEMD" }, >> { LOGD_VPN_PLUGIN,"VPN_PLUGIN" }, >> + { LOGD_PROXY, "PROXY" }, >> { 0, NULL } >> /* keep _DOMAIN_DESC_LEN in sync */ >> }, >> diff --git a/src/nm-logging.h b/src/nm-logging.h >> index 655f675..655175d 100644 >> --- a/src/nm-logging.h >> +++ b/src/nm-logging.h >> @@ -66,6 +66,7 @@ typedef enum { /*< skip >*/ >> LOGD_AUDIT = (1LL << 34), >> LOGD_SYSTEMD = (1LL << 35), >> LOGD_VPN_PLUGIN = (1LL << 36), >> + LOGD_PROXY = (1LL << 37), >> >> __LOGD_MAX, >> LOGD_ALL = (((__LOGD_MAX - 1LL) << 1) - 1LL), >> diff --git a/src/nm-policy.c b/src/nm-policy.c >> index 0c63b1c..29ea05c 100644 >> --- a/src/nm-policy.c >> +++ b/src/nm-policy.c >> @@ -34,6 +34,7 @@ >> #include "nm-setting-ip4-config.h" >> #include "nm-setting-connection.h" >> #include "nm-platform.h" >> +#include "nm-pacrunner-manager.h" >> #include "nm-dns-manager.h" >> #include "nm-vpn-manager.h" >> #include "nm-auth-utils.h" >> @@ -78,6 +79,7 @@ struct _NMPolicyPrivate { >> GResolver *resolver; >> GInetAddress *lookup_addr; >> GCancellable *lookup_cancellable; >> + NMPacRunnerManager *pacrunner_manager; >> NMDnsManager *dns_manager; >> gulong config_changed_id; >> >> @@ -414,6 +416,64 @@ update_default_ac (NMPolicy *self, >> set_active_func (best, TRUE); >> } >> >> +static void >> +update_proxy (NMPolicy *self) >> +{ >> + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); >> + NMDevice *device = NULL; >> + const GSList *connections = NULL, *iter; >> + >> + connections = nm_manager_get_active_connections (priv- >> >manager); >> + if (!connections) >> + return; >> + >> + for (iter = connections; iter; iter = g_slist_next (iter)) { >> + NMActiveConnection *active = iter->data; >> + NMProxyConfig *proxy_config = NULL; >> + NMIP4Config *ip4_config = NULL; >> + NMIP6Config *ip6_config = NULL; >> + const char *ip_iface = NULL; >> + >> + if (NM_IS_VPN_CONNECTION (active)) { >> + ip_iface = nm_vpn_connection_get_ip_iface >> (NM_VPN_CONNECTION (active), TRUE); >> + nm_pacrunner_manager_remove (priv- >> >pacrunner_manager, ip_iface); >> + >> + proxy_config = >> nm_vpn_connection_get_proxy_config (NM_VPN_CONNECTION (active)); >> + ip4_config = >> nm_vpn_connection_get_ip4_config (NM_VPN_CONNECTION (active)); >> + ip6_config = >> nm_vpn_connection_get_ip6_config (NM_VPN_CONNECTION (active)); >> + >> + if (!nm_pacrunner_manager_send (priv- >> >pacrunner_manager, >> + ip_iface, >> + proxy_config >> , >> + ip4_config, >> + ip6_config, >> + NM_PROXY_IP_ >> CONFIG_TYPE_VPN)) >> + _LOGI (LOGD_PROXY, "Couldn't update >> pacrunner for %s",ip_iface); >> + >> + continue; >> + } >> + >> + device = nm_active_connection_get_device (active); >> + if (!device) >> + continue; >> + >> + ip_iface = nm_device_get_ip_iface (device); >> + nm_pacrunner_manager_remove (priv- >> >pacrunner_manager, ip_iface); >> + >> + proxy_config = nm_device_get_proxy_config (device); >> + ip4_config = nm_device_get_ip4_config (device); >> + ip6_config = nm_device_get_ip6_config (device); >> + >> + if (!nm_pacrunner_manager_send (priv- >> >pacrunner_manager, >> + ip_iface, >> + proxy_config, >> + ip4_config, >> + ip6_config, >> + NM_PROXY_IP_CONFIG_T >> YPE_DEFAULT)) >> + _LOGI (LOGD_PROXY, "Couldn't update >> pacrunner for %s",ip_iface); >> + } >> +} >> + > > I feel like the bits that update the proxy should really be done in > NMDevice and NMVPNConnection instead of in the Policy. It doesn't look > like update_proxy() uses any special information the policy has, like > whether the connection is the default one or not. > > Instead, could we just have each NMDevice grab a reference to the > PACRunnerManager singleton and then push the proxy info (if any) at the > right state changes from nm-device.c? > > Maybe I'm just missing something and its necessary to do it from the > policy, but I can't quite see it. Any thoughts here? > > Dan > >> static NMIP4Config * >> get_best_ip4_config (NMPolicy *self, >> gboolean ignore_never_default, >> @@ -1204,6 +1264,8 @@ device_state_changed (NMDevice *device, >> nm_connection_clear_secrets (NM_CONNECTION >> (connection)); >> } >> >> + update_proxy (self); >> + >> /* Add device's new IPv4 and IPv6 configs to DNS */ >> >> nm_dns_manager_begin_updates (priv->dns_manager, >> __func__); >> @@ -1247,8 +1309,10 @@ device_state_changed (NMDevice *device, >> if (reason == NM_DEVICE_STATE_REASON_CARRIER && >> old_state == NM_DEVICE_STATE_UNAVAILABLE) >> reset_autoconnect_all (self, device); >> >> - if (old_state > NM_DEVICE_STATE_DISCONNECTED) >> + if (old_state > NM_DEVICE_STATE_DISCONNECTED) { >> + update_proxy (self); >> update_routing_and_dns (self, FALSE); >> + } >> >> /* Device is now available for auto-activation */ >> schedule_activate_check (self, device); >> @@ -1440,6 +1504,8 @@ vpn_connection_activated (NMPolicy *self, >> NMVpnConnection *vpn) >> NMIP6Config *ip6_config; >> const char *ip_iface; >> >> + update_proxy (self); >> + >> nm_dns_manager_begin_updates (priv->dns_manager, __func__); >> >> ip_iface = nm_vpn_connection_get_ip_iface (vpn, TRUE); >> @@ -1466,6 +1532,8 @@ vpn_connection_deactivated (NMPolicy *self, >> NMVpnConnection *vpn) >> NMIP4Config *ip4_config; >> NMIP6Config *ip6_config; >> >> + update_proxy (self); >> + >> nm_dns_manager_begin_updates (priv->dns_manager, __func__); >> >> ip4_config = nm_vpn_connection_get_ip4_config (vpn); >> @@ -1871,6 +1939,8 @@ constructed (GObject *object) >> priv->fw_started_id = g_signal_connect (priv- >> >firewall_manager, NM_FIREWALL_MANAGER_STARTED, >> G_CALLBACK >> (firewall_started), self); >> >> + priv->pacrunner_manager = g_object_ref >> (nm_pacrunner_manager_get ()); >> + >> priv->dns_manager = g_object_ref (nm_dns_manager_get ()); >> nm_dns_manager_set_initial_hostname (priv->dns_manager, >> priv->orig_hostname); >> priv->config_changed_id = g_signal_connect (priv- >> >dns_manager, NM_DNS_MANAGER_CONFIG_CHANGED, >> @@ -1933,6 +2003,9 @@ dispose (GObject *object) >> g_clear_object (&priv->firewall_manager); >> } >> >> + if (priv->pacrunner_manager) >> + g_clear_object (&priv->pacrunner_manager); >> + >> if (priv->dns_manager) { >> nm_clear_g_signal_handler (priv->dns_manager, &priv- >> >config_changed_id); >> g_clear_object (&priv->dns_manager); >> diff --git a/src/nm-types.h b/src/nm-types.h >> index 1fbf043..4e80200 100644 >> --- a/src/nm-types.h >> +++ b/src/nm-types.h >> @@ -42,11 +42,13 @@ typedef struct _NMDefaultRouteManager >> NMDefaultRouteManager; >> typedef struct _NMDevice NMDevice; >> typedef struct _NMDhcp4Config NMDhcp4Config; >> typedef struct _NMDhcp6Config NMDhcp6Config; >> +typedef struct _NMProxyConfig NMProxyConfig; >> typedef struct _NMIP4Config NMIP4Config; >> typedef struct _NMIP6Config NMIP6Config; >> typedef struct _NMManager NMManager; >> typedef struct _NMPolicy NMPolicy; >> typedef struct _NMRfkillManager NMRfkillManager; >> +typedef struct _NMPacRunnerManager NMPacRunnerManager; >> typedef struct _NMRouteManager NMRouteManager; >> typedef struct _NMSessionMonitor NMSessionMonitor; >> typedef struct _NMSleepMonitor NMSleepMonitor; > _______________________________________________ networkmanager-list mailing list [email protected] https://mail.gnome.org/mailman/listinfo/networkmanager-list
