summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2012-05-25 09:27:16 +0000
committerbz <bz@FreeBSD.org>2012-05-25 09:27:16 +0000
commit95907ed567f199388c4cd044d314ce8dde553626 (patch)
tree8e1cd6eb8946b2397bef51f3b4c45f1d036d1b1a
parent38909f62228cac599a036be39ae2bcb8fea24a4a (diff)
downloadFreeBSD-src-95907ed567f199388c4cd044d314ce8dde553626.zip
FreeBSD-src-95907ed567f199388c4cd044d314ce8dde553626.tar.gz
MFp4 bz_ipv6_fast:
Use M_ZERO with malloc rather than calling bzero() ourselves. Change if () panic() checks to KASSERT()s as they are only catching invariants in code flow but not dependent on network input/output. Move initial assigments indirecting pointers after the lock has been aquired. Passing layer boundries, reset M_PROTOFLAGS. Remove a NULL assignment before free. Sponsored by: The FreeBSD Foundation Sponsored by: iXsystems Reviewed by: gnn (as part of the whole) MFC After: 3 days
-rw-r--r--sys/netinet6/nd6.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
index 6615ad6..592eb90 100644
--- a/sys/netinet6/nd6.c
+++ b/sys/netinet6/nd6.c
@@ -174,9 +174,7 @@ nd6_ifattach(struct ifnet *ifp)
{
struct nd_ifinfo *nd;
- nd = (struct nd_ifinfo *)malloc(sizeof(*nd), M_IP6NDP, M_WAITOK);
- bzero(nd, sizeof(*nd));
-
+ nd = (struct nd_ifinfo *)malloc(sizeof(*nd), M_IP6NDP, M_WAITOK|M_ZERO);
nd->initialized = 1;
nd->chlim = IPV6_DEFHLIM;
@@ -284,10 +282,9 @@ nd6_option(union nd_opts *ndopts)
struct nd_opt_hdr *nd_opt;
int olen;
- if (ndopts == NULL)
- panic("ndopts == NULL in nd6_option");
- if (ndopts->nd_opts_last == NULL)
- panic("uninitialized ndopts in nd6_option");
+ KASSERT(ndopts != NULL, ("%s: ndopts == NULL", __func__));
+ KASSERT(ndopts->nd_opts_last != NULL, ("%s: uninitialized ndopts",
+ __func__));
if (ndopts->nd_opts_search == NULL)
return NULL;
if (ndopts->nd_opts_done)
@@ -335,10 +332,9 @@ nd6_options(union nd_opts *ndopts)
struct nd_opt_hdr *nd_opt;
int i = 0;
- if (ndopts == NULL)
- panic("ndopts == NULL in nd6_options");
- if (ndopts->nd_opts_last == NULL)
- panic("uninitialized ndopts in nd6_options");
+ KASSERT(ndopts != NULL, ("%s: ndopts == NULL", __func__));
+ KASSERT(ndopts->nd_opts_last != NULL, ("%s: uninitialized ndopts",
+ __func__));
if (ndopts->nd_opts_search == NULL)
return 0;
@@ -1174,11 +1170,13 @@ done:
void
nd6_rtrequest(int req, struct rtentry *rt, struct rt_addrinfo *info)
{
- struct sockaddr_in6 *gateway = (struct sockaddr_in6 *)rt->rt_gateway;
+ struct sockaddr_in6 *gateway;
struct nd_defrouter *dr;
- struct ifnet *ifp = rt->rt_ifp;
+ struct ifnet *ifp;
RT_LOCK_ASSERT(rt);
+ gateway = (struct sockaddr_in6 *)rt->rt_gateway;
+ ifp = rt->rt_ifp;
switch (req) {
case RTM_ADD:
@@ -1547,10 +1545,8 @@ nd6_cache_lladdr(struct ifnet *ifp, struct in6_addr *from, char *lladdr,
IF_AFDATA_UNLOCK_ASSERT(ifp);
- if (ifp == NULL)
- panic("ifp == NULL in nd6_cache_lladdr");
- if (from == NULL)
- panic("from == NULL in nd6_cache_lladdr");
+ KASSERT(ifp != NULL, ("%s: ifp == NULL", __func__));
+ KASSERT(from != NULL, ("%s: from == NULL", __func__));
/* nothing must be updated for unspecified address */
if (IN6_IS_ADDR_UNSPECIFIED(from))
@@ -2074,6 +2070,8 @@ nd6_output_lle(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *m0,
}
return (error);
}
+ /* Reset layer specific mbuf flags to avoid confusing lower layers. */
+ m->m_flags &= ~(M_PROTOFLAGS);
if ((ifp->if_flags & IFF_LOOPBACK) != 0) {
return ((*ifp->if_output)(origifp, m, (struct sockaddr *)dst,
NULL));
@@ -2239,7 +2237,6 @@ clear_llinfo_pqueue(struct llentry *ln)
for (m_hold = ln->la_hold; m_hold; m_hold = m_hold_next) {
m_hold_next = m_hold->m_nextpkt;
- m_hold->m_nextpkt = NULL;
m_freem(m_hold);
}
OpenPOWER on IntegriCloud