[glib] gnetworkmonitornetlink: handle default route via device
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] gnetworkmonitornetlink: handle default route via device
- Date: Fri, 12 Jul 2013 16:00:10 +0000 (UTC)
commit c08ef6c165c6935f257d3fb98c049be50e3816da
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
gio/gnetworkmonitornetlink.c | 18 +++++++++---------
1 files changed, 9 insertions(+), 9 deletions(-)
---
diff --git a/gio/gnetworkmonitornetlink.c b/gio/gnetworkmonitornetlink.c
index 8983691..4f7d089 100644
--- a/gio/gnetworkmonitornetlink.c
+++ b/gio/gnetworkmonitornetlink.c
@@ -218,8 +218,7 @@ static void
add_network (GNetworkMonitorNetlink *nl,
GSocketFamily family,
gint dest_len,
- guint8 *dest,
- guint8 *gateway)
+ guint8 *dest)
{
GInetAddress *dest_addr;
GInetAddressMask *network;
@@ -245,8 +244,7 @@ static void
remove_network (GNetworkMonitorNetlink *nl,
GSocketFamily family,
gint dest_len,
- guint8 *dest,
- guint8 *gateway)
+ guint8 *dest)
{
GInetAddress *dest_addr;
GInetAddressMask *network;
@@ -305,7 +303,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;
@@ -367,22 +365,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]