aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet6/frag6.c
diff options
context:
space:
mode:
authorBjoern A. Zeeb <bz@FreeBSD.org>2019-11-15 21:40:40 +0000
committerBjoern A. Zeeb <bz@FreeBSD.org>2019-11-15 21:40:40 +0000
commita61b5cfbbfd54c51c9ba6cc9aa19907911fb3aa9 (patch)
tree85e44d97a45eae9a6121cc1e8be8bc9499bdd902 /sys/netinet6/frag6.c
parent5a2899ac850837f0fea8fa44eade617a2c0d01a1 (diff)
downloadsrc-a61b5cfbbfd54c51c9ba6cc9aa19907911fb3aa9.tar.gz
src-a61b5cfbbfd54c51c9ba6cc9aa19907911fb3aa9.zip
netinet6: Remove PULLDOWN_TESTs.
Remove the KAME introduced PULLDOWN_TESTs which did not even have a compile-time option in sys/conf to turn them on for a custom kernel build. They made the code a lot harder to read or more complicated in a few cases. Convert the IP6_EXTHDR_CHECK() calls into FreeBSD looking code. Rather than throwing the packet away if it would not fit the KAME mbuf expectations, convert the macros to m_pullup() calls. Do not do any extra manual conditional checks upfront as to whether the m_len would suffice (*), simply let m_pullup() do its work (incl. an early check). Remove extra m_pullup() calls where earlier in the function or the only caller has already done the pullup. Discussed with: rwatson (*) Reviewed by: ae MFC after: 8 weeks Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D22334
Notes
Notes: svn path=/head/; revision=354748
Diffstat (limited to 'sys/netinet6/frag6.c')
-rw-r--r--sys/netinet6/frag6.c55
1 files changed, 19 insertions, 36 deletions
diff --git a/sys/netinet6/frag6.c b/sys/netinet6/frag6.c
index b201bc6bf3a1..25e124adf4d3 100644
--- a/sys/netinet6/frag6.c
+++ b/sys/netinet6/frag6.c
@@ -218,30 +218,22 @@ SYSCTL_INT(_net_inet6_ip6, IPV6CTL_MAXFRAGBUCKETSIZE, maxfragbucketsize,
* Remove the IPv6 fragmentation header from the mbuf.
*/
int
-ip6_deletefraghdr(struct mbuf *m, int offset, int wait)
+ip6_deletefraghdr(struct mbuf *m, int offset, int wait __unused)
{
struct ip6_hdr *ip6;
- struct mbuf *t;
- /* Delete frag6 header. */
- if (m->m_len >= offset + sizeof(struct ip6_frag)) {
-
- /* This is the only possible case with !PULLDOWN_TEST. */
- ip6 = mtod(m, struct ip6_hdr *);
- bcopy(ip6, (char *)ip6 + sizeof(struct ip6_frag),
- offset);
- m->m_data += sizeof(struct ip6_frag);
- m->m_len -= sizeof(struct ip6_frag);
- } else {
-
- /* This comes with no copy if the boundary is on cluster. */
- if ((t = m_split(m, offset, wait)) == NULL)
- return (ENOMEM);
- m_adj(t, sizeof(struct ip6_frag));
- m_cat(m, t);
- }
+ KASSERT(m->m_len >= offset + sizeof(struct ip6_frag),
+ ("%s: ext headers not contigous in mbuf %p m_len %d >= "
+ "offset %d + %zu\n", __func__, m, m->m_len, offset,
+ sizeof(struct ip6_frag)));
+ /* Delete frag6 header. */
+ ip6 = mtod(m, struct ip6_hdr *);
+ bcopy(ip6, (char *)ip6 + sizeof(struct ip6_frag), offset);
+ m->m_data += sizeof(struct ip6_frag);
+ m->m_len -= sizeof(struct ip6_frag);
m->m_flags |= M_FRAGMENTED;
+
return (0);
}
@@ -397,15 +389,13 @@ frag6_input(struct mbuf **mp, int *offp, int proto)
M_ASSERTPKTHDR(m);
- ip6 = mtod(m, struct ip6_hdr *);
-#ifndef PULLDOWN_TEST
- IP6_EXTHDR_CHECK(m, offset, sizeof(struct ip6_frag), IPPROTO_DONE);
- ip6f = (struct ip6_frag *)((caddr_t)ip6 + offset);
-#else
- IP6_EXTHDR_GET(ip6f, struct ip6_frag *, m, offset, sizeof(*ip6f));
- if (ip6f == NULL)
+ m = m_pullup(m, offset + sizeof(struct ip6_frag));
+ if (m == NULL) {
+ IP6STAT_INC(ip6s_exthdrtoolong);
+ *mp = NULL;
return (IPPROTO_DONE);
-#endif
+ }
+ ip6 = mtod(m, struct ip6_hdr *);
dstifp = NULL;
/* Find the destination interface of the packet. */
@@ -429,6 +419,7 @@ frag6_input(struct mbuf **mp, int *offp, int proto)
* sizeof(struct ip6_frag) == 8
* sizeof(struct ip6_hdr) = 40
*/
+ ip6f = (struct ip6_frag *)((caddr_t)ip6 + offset);
if ((ip6f->ip6f_offlg & IP6F_MORE_FRAG) &&
(((ntohs(ip6->ip6_plen) - offset) & 0x7) != 0)) {
icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER,
@@ -833,15 +824,7 @@ postinsert:
V_ip6qb[bucket].count--;
atomic_subtract_int(&frag6_nfrags, q6->ip6q_nfrag);
- if (ip6_deletefraghdr(m, offset, M_NOWAIT) != 0) {
-#ifdef MAC
- mac_ip6q_destroy(q6);
-#endif
- free(q6, M_FRAG6);
- atomic_subtract_int(&V_frag6_nfragpackets, 1);
-
- goto dropfrag;
- }
+ ip6_deletefraghdr(m, offset, M_NOWAIT);
/* Set nxt(-hdr field value) to the original value. */
m_copyback(m, ip6_get_prevhdr(m, offset), sizeof(uint8_t),