diff options
author | Gleb Smirnoff <glebius@FreeBSD.org> | 2015-02-16 01:12:20 +0000 |
---|---|---|
committer | Gleb Smirnoff <glebius@FreeBSD.org> | 2015-02-16 01:12:20 +0000 |
commit | 0b438b0fb87da9ed3e1949059981c87c24ffd833 (patch) | |
tree | e0c2f04d30beef9d9a240fc4825a40c430e9eec8 /sys/netinet6 | |
parent | b8fc9a86a80cf4920455867c6bfd8a8c6e487ebf (diff) | |
download | src-0b438b0fb87da9ed3e1949059981c87c24ffd833.tar.gz src-0b438b0fb87da9ed3e1949059981c87c24ffd833.zip |
Factor out ip6_deletefraghdr() function, to be shared between IPv6
stack and pf(4).
Submitted by: Kristof Provost
Reviewed by: ae
Differential Revision: D1764
Notes
Notes:
svn path=/head/; revision=278828
Diffstat (limited to 'sys/netinet6')
-rw-r--r-- | sys/netinet6/frag6.c | 27 | ||||
-rw-r--r-- | sys/netinet6/ip6_output.c | 24 | ||||
-rw-r--r-- | sys/netinet6/ip6_var.h | 1 |
3 files changed, 33 insertions, 19 deletions
diff --git a/sys/netinet6/frag6.c b/sys/netinet6/frag6.c index 92d07155bcb9..91818b2db62a 100644 --- a/sys/netinet6/frag6.c +++ b/sys/netinet6/frag6.c @@ -541,27 +541,16 @@ insert: *q6->ip6q_nxtp = (u_char)(nxt & 0xff); #endif - /* Delete frag6 header */ - if (m->m_len >= offset + sizeof(struct ip6_frag)) { - /* This is the only possible case with !PULLDOWN_TEST */ - ovbcopy((caddr_t)ip6, (caddr_t)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, M_NOWAIT)) == NULL) { - frag6_remque(q6); - V_frag6_nfrags -= q6->ip6q_nfrag; + if (ip6_deletefraghdr(m, offset, M_NOWAIT) != 0) { + frag6_remque(q6); + V_frag6_nfrags -= q6->ip6q_nfrag; #ifdef MAC - mac_ip6q_destroy(q6); + mac_ip6q_destroy(q6); #endif - free(q6, M_FTABLE); - V_frag6_nfragpackets--; - goto dropfrag; - } - m_adj(t, sizeof(struct ip6_frag)); - m_cat(m, t); + free(q6, M_FTABLE); + V_frag6_nfragpackets--; + + goto dropfrag; } /* diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c index a3474d34dc35..dd7ef2cac6cb 100644 --- a/sys/netinet6/ip6_output.c +++ b/sys/netinet6/ip6_output.c @@ -1206,6 +1206,30 @@ ip6_insertfraghdr(struct mbuf *m0, struct mbuf *m, int hlen, return (0); } +int +ip6_deletefraghdr(struct mbuf *m, int offset, int wait) +{ + struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); + struct mbuf *t; + + /* Delete frag6 header. */ + if (m->m_len >= offset + sizeof(struct ip6_frag)) { + /* This is the only possible case with !PULLDOWN_TEST. */ + 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); + } + + return (0); +} + static int ip6_getpmtu(struct route_in6 *ro_pmtu, struct route_in6 *ro, struct ifnet *ifp, struct in6_addr *dst, u_long *mtup, diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h index 155a607a7404..992a8acd1806 100644 --- a/sys/netinet6/ip6_var.h +++ b/sys/netinet6/ip6_var.h @@ -388,6 +388,7 @@ int ip6_setpktopts(struct mbuf *, struct ip6_pktopts *, void ip6_clearpktopts(struct ip6_pktopts *, int); struct ip6_pktopts *ip6_copypktopts(struct ip6_pktopts *, int); int ip6_optlen(struct inpcb *); +int ip6_deletefraghdr(struct mbuf *, int, int); int route6_input(struct mbuf **, int *, int); |