svn commit: r288297 - in head: sys/netinet sys/netinet6 usr.sbin/arp usr.sbin/ndp

Alexander V. Chernikov melifaro at FreeBSD.org
Sun Sep 27 04:54:31 UTC 2015


Author: melifaro
Date: Sun Sep 27 04:54:29 2015
New Revision: 288297
URL: https://svnweb.freebsd.org/changeset/base/288297

Log:
  rtsock requests for deleting interface address lles started to return EPERM
    instead of old "ignore-and-return 0" in r287789. This broke arp -da /
    ndp -cn behavior (they exit on rtsock command failure). Fix this by
    translating LLE_IFADDR to RTM_PINNED flag, passing it to userland and
    making arp/ndp ignore these entries in batched delete.
  
  MFC after:	2 weeks

Modified:
  head/sys/netinet/in.c
  head/sys/netinet6/in6.c
  head/usr.sbin/arp/arp.c
  head/usr.sbin/ndp/ndp.c

Modified: head/sys/netinet/in.c
==============================================================================
--- head/sys/netinet/in.c	Sun Sep 27 04:47:08 2015	(r288296)
+++ head/sys/netinet/in.c	Sun Sep 27 04:54:29 2015	(r288297)
@@ -1333,6 +1333,8 @@ in_lltable_dump_entry(struct lltable *ll
 			arpc.rtm.rtm_flags |= (RTF_HOST | RTF_LLDATA);
 			if (lle->la_flags & LLE_STATIC)
 				arpc.rtm.rtm_flags |= RTF_STATIC;
+			if (lle->la_flags & LLE_IFADDR)
+				arpc.rtm.rtm_flags |= RTF_PINNED;
 			arpc.rtm.rtm_index = ifp->if_index;
 			error = SYSCTL_OUT(wr, &arpc, sizeof(arpc));
 

Modified: head/sys/netinet6/in6.c
==============================================================================
--- head/sys/netinet6/in6.c	Sun Sep 27 04:47:08 2015	(r288296)
+++ head/sys/netinet6/in6.c	Sun Sep 27 04:54:29 2015	(r288297)
@@ -2354,6 +2354,8 @@ in6_lltable_dump_entry(struct lltable *l
 			ndpc.rtm.rtm_flags |= (RTF_HOST | RTF_LLDATA);
 			if (lle->la_flags & LLE_STATIC)
 				ndpc.rtm.rtm_flags |= RTF_STATIC;
+			if (lle->la_flags & LLE_IFADDR)
+				ndpc.rtm.rtm_flags |= RTF_PINNED;
 			ndpc.rtm.rtm_index = ifp->if_index;
 			error = SYSCTL_OUT(wr, &ndpc, sizeof(ndpc));
 

Modified: head/usr.sbin/arp/arp.c
==============================================================================
--- head/usr.sbin/arp/arp.c	Sun Sep 27 04:47:08 2015	(r288296)
+++ head/usr.sbin/arp/arp.c	Sun Sep 27 04:54:29 2015	(r288297)
@@ -673,10 +673,13 @@ print_entry(struct sockaddr_dl *sdl,
  */
 static void
 nuke_entry(struct sockaddr_dl *sdl __unused,
-	struct sockaddr_in *addr, struct rt_msghdr *rtm __unused)
+	struct sockaddr_in *addr, struct rt_msghdr *rtm)
 {
 	char ip[20];
 
+	if (rtm->rtm_flags & RTF_PINNED)
+		return;
+
 	snprintf(ip, sizeof(ip), "%s", inet_ntoa(addr->sin_addr));
 	delete(ip);
 }

Modified: head/usr.sbin/ndp/ndp.c
==============================================================================
--- head/usr.sbin/ndp/ndp.c	Sun Sep 27 04:47:08 2015	(r288296)
+++ head/usr.sbin/ndp/ndp.c	Sun Sep 27 04:54:29 2015	(r288297)
@@ -649,6 +649,8 @@ again:;
 			if (rtm->rtm_flags & RTF_CLONED)
 				delete(host_buf);
 #else
+			if (rtm->rtm_flags & RTF_PINNED)
+				continue;
 			delete(host_buf);
 #endif
 			continue;


More information about the svn-src-head mailing list