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:
parent
383d953540
commit
37f96b7312
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user