/*
* Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
*
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ *
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* Please see the License for the specific language governing rights and
* limitations under the License.
*
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
/* $NetBSD: uipc_mbuf.c,v 1.40 1999/04/01 00:23:25 thorpej Exp $ */
}
}
+struct mbuf *
+m_aux_copy(struct mbuf *to, struct mbuf *from)
+{
+ struct mbuf *m;
+ struct mbuf *top = NULL, **np = ⊤
+
+ if (!(to->m_flags & M_PKTHDR) || !(from->m_flags & M_PKTHDR))
+ return (NULL);
+
+ if ((m = from->m_pkthdr.aux) == NULL)
+ return (NULL);
+
+ while (m != NULL) {
+ struct mbuf *n;
+
+ MGET(n, M_DONTWAIT, m->m_type);
+ if (n == NULL) {
+ m_freem(top);
+ return (NULL);
+ }
+
+ /* Set length and data offset accordingly */
+ n->m_len = m->m_len;
+ n->m_data += (m->m_data - m->m_dat);
+
+ /* Copy databuf (mauxtag + possible aux data) */
+ bcopy(m->m_dat, n->m_dat, sizeof (m->m_dat));
+
+ *np = n;
+ np = &n->m_next;
+ m = m->m_next;
+ }
+
+ if (to->m_pkthdr.aux != NULL)
+ m_freem(to->m_pkthdr.aux);
+
+ to->m_pkthdr.aux = top;
+ return (top);
+}
+
/* Get a packet tag structure along with specified data following. */
struct m_tag *
m_tag_alloc(u_int32_t id, u_int16_t type, int len, int wait)