summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/netinet6/icmp6.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-12-09 14:19:03 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-10 09:53:34 +0100
commit75b706fde4cbf82bcd41a1cec319778aa0f8eb2d (patch)
treeea39a351a1f6337b5a5dd6036314693adef5ffe6 /freebsd/sys/netinet6/icmp6.c
parentVMSTAT(8): Port to RTEMS (diff)
downloadrtems-libbsd-75b706fde4cbf82bcd41a1cec319778aa0f8eb2d.tar.bz2
Update to FreeBSD head 2016-12-10
Git mirror commit 80c55f08a05ab3b26a73b226ccb56adc3122a55c.
Diffstat (limited to 'freebsd/sys/netinet6/icmp6.c')
-rw-r--r--freebsd/sys/netinet6/icmp6.c169
1 files changed, 56 insertions, 113 deletions
diff --git a/freebsd/sys/netinet6/icmp6.c b/freebsd/sys/netinet6/icmp6.c
index 6e3a4873..14ce2b3b 100644
--- a/freebsd/sys/netinet6/icmp6.c
+++ b/freebsd/sys/netinet6/icmp6.c
@@ -492,7 +492,7 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
break;
case ICMP6_DST_UNREACH_ADMIN:
icmp6_ifstat_inc(ifp, ifs6_in_adminprohib);
- code = PRC_UNREACH_PROTOCOL; /* is this a good code? */
+ code = PRC_UNREACH_ADMIN_PROHIB;
break;
case ICMP6_DST_UNREACH_BEYONDSCOPE:
/* I mean "source address was incorrect." */
@@ -556,7 +556,7 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
icmp6_ifstat_inc(ifp, ifs6_in_echo);
if (code != 0)
goto badcode;
- if ((n = m_copy(m, 0, M_COPYALL)) == NULL) {
+ if ((n = m_copym(m, 0, M_COPYALL, M_NOWAIT)) == NULL) {
/* Give up remote */
break;
}
@@ -653,7 +653,7 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
IP6_EXTHDR_CHECK(m, off, sizeof(struct icmp6_nodeinfo),
IPPROTO_DONE);
#endif
- n = m_copy(m, 0, M_COPYALL);
+ n = m_copym(m, 0, M_COPYALL, M_NOWAIT);
if (n)
n = ni6_input(n, off);
/* XXX meaningless if n == NULL */
@@ -740,36 +740,19 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
goto badcode;
if (icmp6len < sizeof(struct nd_router_solicit))
goto badlen;
- if ((n = m_copym(m, 0, M_COPYALL, M_NOWAIT)) == NULL) {
- /* give up local */
-
- /* Send incoming SeND packet to user space. */
- if (send_sendso_input_hook != NULL) {
- IP6_EXTHDR_CHECK(m, off,
- icmp6len, IPPROTO_DONE);
- error = send_sendso_input_hook(m, ifp,
- SND_IN, ip6len);
- /* -1 == no app on SEND socket */
- if (error == 0)
- return (IPPROTO_DONE);
- nd6_rs_input(m, off, icmp6len);
- } else
- nd6_rs_input(m, off, icmp6len);
- m = NULL;
- goto freeit;
- }
if (send_sendso_input_hook != NULL) {
- IP6_EXTHDR_CHECK(n, off,
- icmp6len, IPPROTO_DONE);
- error = send_sendso_input_hook(n, ifp,
- SND_IN, ip6len);
- if (error == 0)
+ IP6_EXTHDR_CHECK(m, off, icmp6len, IPPROTO_DONE);
+ error = send_sendso_input_hook(m, ifp, SND_IN, ip6len);
+ if (error == 0) {
+ m = NULL;
goto freeit;
- /* -1 == no app on SEND socket */
- nd6_rs_input(n, off, icmp6len);
- } else
- nd6_rs_input(n, off, icmp6len);
- /* m stays. */
+ }
+ }
+ n = m_copym(m, 0, M_COPYALL, M_NOWAIT);
+ nd6_rs_input(m, off, icmp6len);
+ m = n;
+ if (m == NULL)
+ goto freeit;
break;
case ND_ROUTER_ADVERT:
@@ -778,29 +761,18 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
goto badcode;
if (icmp6len < sizeof(struct nd_router_advert))
goto badlen;
- if ((n = m_copym(m, 0, M_COPYALL, M_NOWAIT)) == NULL) {
-
- /* Send incoming SeND-protected/ND packet to user space. */
- if (send_sendso_input_hook != NULL) {
- error = send_sendso_input_hook(m, ifp,
- SND_IN, ip6len);
- if (error == 0)
- return (IPPROTO_DONE);
- nd6_ra_input(m, off, icmp6len);
- } else
- nd6_ra_input(m, off, icmp6len);
- m = NULL;
- goto freeit;
- }
if (send_sendso_input_hook != NULL) {
- error = send_sendso_input_hook(n, ifp,
- SND_IN, ip6len);
- if (error == 0)
+ error = send_sendso_input_hook(m, ifp, SND_IN, ip6len);
+ if (error == 0) {
+ m = NULL;
goto freeit;
- nd6_ra_input(n, off, icmp6len);
- } else
- nd6_ra_input(n, off, icmp6len);
- /* m stays. */
+ }
+ }
+ n = m_copym(m, 0, M_COPYALL, M_NOWAIT);
+ nd6_ra_input(m, off, icmp6len);
+ m = n;
+ if (m == NULL)
+ goto freeit;
break;
case ND_NEIGHBOR_SOLICIT:
@@ -809,27 +781,18 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
goto badcode;
if (icmp6len < sizeof(struct nd_neighbor_solicit))
goto badlen;
- if ((n = m_copym(m, 0, M_COPYALL, M_NOWAIT)) == NULL) {
- if (send_sendso_input_hook != NULL) {
- error = send_sendso_input_hook(m, ifp,
- SND_IN, ip6len);
- if (error == 0)
- return (IPPROTO_DONE);
- nd6_ns_input(m, off, icmp6len);
- } else
- nd6_ns_input(m, off, icmp6len);
- m = NULL;
- goto freeit;
- }
if (send_sendso_input_hook != NULL) {
- error = send_sendso_input_hook(n, ifp,
- SND_IN, ip6len);
- if (error == 0)
+ error = send_sendso_input_hook(m, ifp, SND_IN, ip6len);
+ if (error == 0) {
+ m = NULL;
goto freeit;
- nd6_ns_input(n, off, icmp6len);
- } else
- nd6_ns_input(n, off, icmp6len);
- /* m stays. */
+ }
+ }
+ n = m_copym(m, 0, M_COPYALL, M_NOWAIT);
+ nd6_ns_input(m, off, icmp6len);
+ m = n;
+ if (m == NULL)
+ goto freeit;
break;
case ND_NEIGHBOR_ADVERT:
@@ -838,29 +801,18 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
goto badcode;
if (icmp6len < sizeof(struct nd_neighbor_advert))
goto badlen;
- if ((n = m_copym(m, 0, M_COPYALL, M_NOWAIT)) == NULL) {
-
- /* Send incoming SeND-protected/ND packet to user space. */
- if (send_sendso_input_hook != NULL) {
- error = send_sendso_input_hook(m, ifp,
- SND_IN, ip6len);
- if (error == 0)
- return (IPPROTO_DONE);
- nd6_na_input(m, off, icmp6len);
- } else
- nd6_na_input(m, off, icmp6len);
- m = NULL;
- goto freeit;
- }
if (send_sendso_input_hook != NULL) {
- error = send_sendso_input_hook(n, ifp,
- SND_IN, ip6len);
- if (error == 0)
+ error = send_sendso_input_hook(m, ifp, SND_IN, ip6len);
+ if (error == 0) {
+ m = NULL;
goto freeit;
- nd6_na_input(n, off, icmp6len);
- } else
- nd6_na_input(n, off, icmp6len);
- /* m stays. */
+ }
+ }
+ n = m_copym(m, 0, M_COPYALL, M_NOWAIT);
+ nd6_na_input(m, off, icmp6len);
+ m = n;
+ if (m == NULL)
+ goto freeit;
break;
case ND_REDIRECT:
@@ -869,27 +821,18 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
goto badcode;
if (icmp6len < sizeof(struct nd_redirect))
goto badlen;
- if ((n = m_copym(m, 0, M_COPYALL, M_NOWAIT)) == NULL) {
- if (send_sendso_input_hook != NULL) {
- error = send_sendso_input_hook(m, ifp,
- SND_IN, ip6len);
- if (error == 0)
- return (IPPROTO_DONE);
- icmp6_redirect_input(m, off);
- } else
- icmp6_redirect_input(m, off);
- m = NULL;
- goto freeit;
- }
if (send_sendso_input_hook != NULL) {
- error = send_sendso_input_hook(n, ifp,
- SND_IN, ip6len);
- if (error == 0)
+ error = send_sendso_input_hook(m, ifp, SND_IN, ip6len);
+ if (error == 0) {
+ m = NULL;
goto freeit;
- icmp6_redirect_input(n, off);
- } else
- icmp6_redirect_input(n, off);
- /* m stays. */
+ }
+ }
+ n = m_copym(m, 0, M_COPYALL, M_NOWAIT);
+ icmp6_redirect_input(m, off);
+ m = n;
+ if (m == NULL)
+ goto freeit;
break;
case ICMP6_ROUTER_RENUMBERING:
@@ -2053,7 +1996,7 @@ icmp6_rip6_input(struct mbuf **mp, int off)
}
}
if (n != NULL ||
- (n = m_copy(m, 0, (int)M_COPYALL)) != NULL) {
+ (n = m_copym(m, 0, M_COPYALL, M_NOWAIT)) != NULL) {
if (last->inp_flags & INP_CONTROLOPTS)
ip6_savecontrol(last, n, &opts);
/* strip intermediate headers */
@@ -2217,7 +2160,7 @@ icmp6_reflect(struct mbuf *m, size_t off)
* that we do not own. Select a source address based on the
* source address of the erroneous packet.
*/
- in6_splitscope(&ip6->ip6_dst, &dst6, &scopeid);
+ in6_splitscope(&ip6->ip6_src, &dst6, &scopeid);
error = in6_selectsrc_addr(RT_DEFAULT_FIB, &dst6,
scopeid, NULL, &src6, &hlim);