summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authormelifaro <melifaro@FreeBSD.org>2015-12-13 16:37:01 +0000
committermelifaro <melifaro@FreeBSD.org>2015-12-13 16:37:01 +0000
commita10bfcd45d602a114cacad4e651b55cd4b351624 (patch)
tree5ccc343aaf2a96b61a305dfc22f9e772baedd9c4 /sys/net
parent9d2d111f78903eb9c4c84bfd4ec3a5641e1824c4 (diff)
downloadFreeBSD-src-a10bfcd45d602a114cacad4e651b55cd4b351624.zip
FreeBSD-src-a10bfcd45d602a114cacad4e651b55cd4b351624.tar.gz
Fix PINNED routes handling.
Before r291643, adding new interface prefix had the following logic: try_add: EEXIST && (PINNED) { try_del(w/o PINNED flag) if (OK) try_add(PINNED) } In r291643, deletion was performed w/ PINNED flag held which leaded to new interface prefixes (like ::1) overriding older ones. Fix this by requesting deletion w/o RTF_PINNED. PR: kern/205285 Submitted by: Fabian Keil <fk at fabiankeil.de>
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/route.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/net/route.c b/sys/net/route.c
index 6b19edd..86f99ee 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -1586,7 +1586,10 @@ rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt,
*/
struct sockaddr *info_dst = info->rti_info[RTAX_DST];
info->rti_info[RTAX_DST] = ndst;
+ /* Do not delete existing PINNED(interface) routes */
+ info->rti_flags &= ~RTF_PINNED;
rt_old = rt_unlinkrte(rnh, info, &error);
+ info->rti_flags |= RTF_PINNED;
info->rti_info[RTAX_DST] = info_dst;
if (rt_old != NULL)
rn = rnh->rnh_addaddr(ndst, netmask, rnh,
OpenPOWER on IntegriCloud