From 2d3837563f1087cf00630fc1d4126af7a5f25ebf Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Tue, 4 Jun 2013 17:29:55 -0300 Subject: [PATCH] gnetworkmonitornetlink: handle default route via device If the default route is via a device rather than a particular IP address, then neither RTA_DST nor RTA_GATEWAY will be present in the RTM_NEWROUTE message, and so GNetworkMonitorNetlink would ignore it, and then think there was no default route. (This could happen with certain kinds of VPNs, if they were set to route all traffic through the VPN.) Fix this by recognizing routes that specify RTA_OIF ("output interface") instead of RTA_GATEWAY. https://bugzilla.gnome.org/show_bug.cgi?id=701609 (cherry picked from commit c08ef6c165c6935f257d3fb98c049be50e3816da) --- gio/gnetworkmonitornetlink.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/gio/gnetworkmonitornetlink.c b/gio/gnetworkmonitornetlink.c index 17df1da..9af0e8b 100644 --- a/gio/gnetworkmonitornetlink.c +++ b/gio/gnetworkmonitornetlink.c @@ -219,8 +219,7 @@ static void add_network (GNetworkMonitorNetlink *nl, GSocketFamily family, gint dest_len, - guint8 *dest, - guint8 *gateway) + guint8 *dest) { GInetAddress *dest_addr; GInetAddressMask *network; @@ -246,8 +245,7 @@ static void remove_network (GNetworkMonitorNetlink *nl, GSocketFamily family, gint dest_len, - guint8 *dest, - guint8 *gateway) + guint8 *dest) { GInetAddress *dest_addr; GInetAddressMask *network; @@ -306,7 +304,7 @@ read_netlink_messages (GSocket *socket, struct rtmsg *rtmsg; struct rtattr *attr; gsize attrlen; - guint8 *dest, *gateway; + guint8 *dest, *gateway, *oif; gboolean retval = TRUE; iv.buffer = NULL; @@ -368,22 +366,24 @@ read_netlink_messages (GSocket *socket, attrlen = NLMSG_PAYLOAD (msg, sizeof (struct rtmsg)); attr = RTM_RTA (rtmsg); - dest = gateway = NULL; + dest = gateway = oif = NULL; while (RTA_OK (attr, attrlen)) { if (attr->rta_type == RTA_DST) dest = RTA_DATA (attr); else if (attr->rta_type == RTA_GATEWAY) gateway = RTA_DATA (attr); + else if (attr->rta_type == RTA_OIF) + oif = RTA_DATA (attr); attr = RTA_NEXT (attr, attrlen); } - if (dest || gateway) + if (dest || gateway || oif) { if (msg->nlmsg_type == RTM_NEWROUTE) - add_network (nl, rtmsg->rtm_family, rtmsg->rtm_dst_len, dest, gateway); + add_network (nl, rtmsg->rtm_family, rtmsg->rtm_dst_len, dest); else - remove_network (nl, rtmsg->rtm_family, rtmsg->rtm_dst_len, dest, gateway); + remove_network (nl, rtmsg->rtm_family, rtmsg->rtm_dst_len, dest); queue_request_dump (nl); } break; -- 2.7.4