Merge r278828, r278832

- Factor out ip6_deletefraghdr() function, to be shared between IPv6 stack and pf(4).
 - Move ip6_deletefraghdr() to frag6.c. (Suggested by bz)

Differential Revision:	https://reviews.freebsd.org/D2813
Reviewed by:	gnn
This commit is contained in:
kp 2015-06-18 20:21:02 +00:00
parent 383d953540
commit 37f96b7312
2 changed files with 33 additions and 19 deletions

View File

@ -555,27 +555,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;
}
/*
@ -789,3 +778,27 @@ frag6_drain(void)
IP6Q_UNLOCK();
VNET_LIST_RUNLOCK_NOSLEEP();
}
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);
}

View File

@ -425,6 +425,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);