summaryrefslogtreecommitdiffstats
path: root/main/opennhrp/0001-netlink-ignore-kernel-routes-for-GRE-interfaces.patch
blob: 78cf3f89b456bef1b4378c66ef3feba395572b56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
From 7747c86253114ed9702346a93587e4e6cac444aa Mon Sep 17 00:00:00 2001
From: David Ward <david.ward@ll.mit.edu>
Date: Tue, 29 Mar 2011 22:43:03 -0400
Subject: [PATCH] netlink: ignore kernel routes for GRE interfaces

The kernel route should not be added as a peer, except on shortcut-
destination interfaces. It can prevent NHRP resolution requests from
being routed correctly to a statically-configured next hop server.

Signed-off-by: David Ward <david.ward@ll.mit.edu>
---
 nhrp/sysdep_netlink.c |    9 ++++-----
 1 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/nhrp/sysdep_netlink.c b/nhrp/sysdep_netlink.c
index a76acc2..e3e588b 100644
--- a/nhrp/sysdep_netlink.c
+++ b/nhrp/sysdep_netlink.c
@@ -691,7 +691,8 @@ static void netlink_route_new(struct nlmsghdr *msg)
 	} else if (iface->flags & NHRP_INTERFACE_FLAG_CONFIGURED) {
 		/* Routes which might get additional outbound
 		 * shortcuts */
-		 if (rtm->rtm_table != iface->route_table)
+		if (rtm->rtm_table != iface->route_table ||
+		    rtm->rtm_protocol == RTPROT_KERNEL)
 			return;
 		type = NHRP_PEER_TYPE_LOCAL_ROUTE;
 	}
@@ -728,12 +729,9 @@ static void netlink_route_del(struct nlmsghdr *msg)
 	if (rta[RTA_OIF] == NULL || rta[RTA_DST] == NULL)
 		return;
 
-	/* Consider only routes from main table */
 	if (rtm->rtm_family != PF_INET)
 		return;
 
-	/* Only consider routes for local interfaces that accept
-	 * shortcut connections */
 	iface = nhrp_interface_get_by_index(*(int*)RTA_DATA(rta[RTA_OIF]),
 					    FALSE);
 	if (iface == NULL)
@@ -747,7 +745,8 @@ static void netlink_route_del(struct nlmsghdr *msg)
 	} else if (iface->flags & NHRP_INTERFACE_FLAG_CONFIGURED) {
 		/* Routes which might get additional outbound
 		 * shortcuts */
-		 if (rtm->rtm_table != iface->route_table)
+		if (rtm->rtm_table != iface->route_table ||
+		    rtm->rtm_protocol == RTPROT_KERNEL)
 			return;
 		type = NHRP_PEER_TYPE_LOCAL_ROUTE;
 	}
-- 
1.7.1