svn commit: r250927 - in stable/9/sys: net netinet netinet6
Oleg Bulyzhin
oleg at FreeBSD.org
Thu May 23 11:29:29 UTC 2013
Author: oleg
Date: Thu May 23 11:29:28 2013
New Revision: 250927
URL: http://svnweb.freebsd.org/changeset/base/250927
Log:
MFC: r249628, r249742
- recover missing arp_ifinit() call.
- plug static llentry leak (ipv4 & ipv6 were affected).
PR: kern/172985
Modified:
stable/9/sys/net/if_vlan.c
stable/9/sys/netinet/in.c
stable/9/sys/netinet6/in6.c
Directory Properties:
stable/9/sys/ (props changed)
Modified: stable/9/sys/net/if_vlan.c
==============================================================================
--- stable/9/sys/net/if_vlan.c Thu May 23 05:42:35 2013 (r250926)
+++ stable/9/sys/net/if_vlan.c Thu May 23 11:29:28 2013 (r250927)
@@ -41,6 +41,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_inet.h"
#include "opt_vlan.h"
#include <sys/param.h>
@@ -66,6 +67,11 @@ __FBSDID("$FreeBSD$");
#include <net/if_vlan_var.h>
#include <net/vnet.h>
+#ifdef INET
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+#endif
+
#define VLANNAME "vlan"
#define VLAN_DEF_HWIDTH 4
#define VLAN_IFFLAGS (IFF_BROADCAST | IFF_MULTICAST)
Modified: stable/9/sys/netinet/in.c
==============================================================================
--- stable/9/sys/netinet/in.c Thu May 23 05:42:35 2013 (r250926)
+++ stable/9/sys/netinet/in.c Thu May 23 11:29:28 2013 (r250927)
@@ -1528,10 +1528,14 @@ in_lltable_lookup(struct lltable *llt, u
LLE_WLOCK(lle);
lle->la_flags |= LLE_DELETED;
EVENTHANDLER_INVOKE(arp_update_event, lle);
- LLE_WUNLOCK(lle);
#ifdef DIAGNOSTIC
- log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle);
+ log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle);
#endif
+ if ((lle->la_flags &
+ (LLE_STATIC | LLE_IFADDR)) == LLE_STATIC)
+ llentry_free(lle);
+ else
+ LLE_WUNLOCK(lle);
}
lle = (void *)-1;
Modified: stable/9/sys/netinet6/in6.c
==============================================================================
--- stable/9/sys/netinet6/in6.c Thu May 23 05:42:35 2013 (r250926)
+++ stable/9/sys/netinet6/in6.c Thu May 23 11:29:28 2013 (r250927)
@@ -194,10 +194,10 @@ in6_ifremloop(struct ifaddr *ifa)
ia = ifa2ia6(ifa);
ifp = ifa->ifa_ifp;
- IF_AFDATA_LOCK(ifp);
- lla_lookup(LLTABLE6(ifp), (LLE_DELETE | LLE_IFADDR),
- (struct sockaddr *)&ia->ia_addr);
- IF_AFDATA_UNLOCK(ifp);
+ memcpy(&addr, &ia->ia_addr, sizeof(ia->ia_addr));
+ memcpy(&mask, &ia->ia_prefixmask, sizeof(ia->ia_prefixmask));
+ lltable_prefix_free(AF_INET6, (struct sockaddr *)&addr,
+ (struct sockaddr *)&mask, LLE_STATIC);
/*
* initialize for rtmsg generation
@@ -209,8 +209,6 @@ in6_ifremloop(struct ifaddr *ifa)
gateway.sdl_alen = ifp->if_addrlen;
bzero(&rt0, sizeof(rt0));
rt0.rt_gateway = (struct sockaddr *)&gateway;
- memcpy(&mask, &ia->ia_prefixmask, sizeof(ia->ia_prefixmask));
- memcpy(&addr, &ia->ia_addr, sizeof(ia->ia_addr));
rt_mask(&rt0) = (struct sockaddr *)&mask;
rt_key(&rt0) = (struct sockaddr *)&addr;
rt0.rt_flags = RTF_HOST | RTF_STATIC;
@@ -2581,10 +2579,14 @@ in6_lltable_lookup(struct lltable *llt,
if (!(lle->la_flags & LLE_IFADDR) || (flags & LLE_IFADDR)) {
LLE_WLOCK(lle);
lle->la_flags |= LLE_DELETED;
- LLE_WUNLOCK(lle);
#ifdef DIAGNOSTIC
- log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle);
+ log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle);
#endif
+ if ((lle->la_flags &
+ (LLE_STATIC | LLE_IFADDR)) == LLE_STATIC)
+ llentry_free(lle);
+ else
+ LLE_WUNLOCK(lle);
}
lle = (void *)-1;
}
More information about the svn-src-stable-9
mailing list