[glib/glib-2-36] gnetworkmonitornetlink: handle default route via device
- From: David Woodhouse <dwmw2 src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/glib-2-36] gnetworkmonitornetlink: handle default route via device
- Date: Thu, 1 Aug 2013 15:51:34 +0000 (UTC)
commit 2d3837563f1087cf00630fc1d4126af7a5f25ebf
Author: Dan Winship <danw gnome org>
Date: Tue Jun 4 17:29:55 2013 -0300
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 files 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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]