]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netinet6/ipcomp_output.c
xnu-3789.70.16.tar.gz
[apple/xnu.git] / bsd / netinet6 / ipcomp_output.c
index 7a8d39b1d3d784d3af58d33ab6332e23c9a49fea..8ad23be7389d008855bbb60fe81894be1375aaae 100644 (file)
@@ -1,3 +1,31 @@
+/*
+ * Copyright (c) 2016 Apple Inc. All rights reserved.
+ *
+ * @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. 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
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
+ */
+
 /*     $FreeBSD: src/sys/netinet6/ipcomp_output.c,v 1.1.2.2 2001/07/03 11:01:54 ume Exp $      */
 /*     $KAME: ipcomp_output.c,v 1.23 2001/01/23 08:59:37 itojun Exp $  */
 
 /*     $FreeBSD: src/sys/netinet6/ipcomp_output.c,v 1.1.2.2 2001/07/03 11:01:54 ume Exp $      */
 /*     $KAME: ipcomp_output.c,v 1.23 2001/01/23 08:59:37 itojun Exp $  */
 
@@ -49,7 +77,7 @@
 
 #include <net/if.h>
 #include <net/route.h>
 
 #include <net/if.h>
 #include <net/route.h>
-#include <net/zlib.h>
+#include <libkern/zlib.h>
 #include <kern/cpu_number.h>
 #include <kern/locks.h>
 
 #include <kern/cpu_number.h>
 #include <kern/locks.h>
 
 
 #include <net/net_osdep.h>
 
 
 #include <net/net_osdep.h>
 
-extern lck_mtx_t  *sadb_mutex;
 
 static int ipcomp_output(struct mbuf *, u_char *, struct mbuf *,
 
 static int ipcomp_output(struct mbuf *, u_char *, struct mbuf *,
-       struct ipsecrequest *, int);
+       int, struct secasvar *sav);
 
 /*
  * Modify the packet so that the payload is compressed.
 
 /*
  * Modify the packet so that the payload is compressed.
@@ -102,19 +129,13 @@ static int ipcomp_output(struct mbuf *, u_char *, struct mbuf *,
  *     <-----------------> compoff
  */
 static int
  *     <-----------------> compoff
  */
 static int
-ipcomp_output(m, nexthdrp, md, isr, af)
-       struct mbuf *m;
-       u_char *nexthdrp;
-       struct mbuf *md;
-       struct ipsecrequest *isr;
-       int af;
+ipcomp_output(struct mbuf *m, u_char *nexthdrp, struct mbuf *md, int af, struct secasvar *sav)
 {
        struct mbuf *n;
        struct mbuf *md0;
        struct mbuf *mcopy;
        struct mbuf *mprev;
        struct ipcomp *ipcomp;
 {
        struct mbuf *n;
        struct mbuf *md0;
        struct mbuf *mcopy;
        struct mbuf *mprev;
        struct ipcomp *ipcomp;
-       struct secasvar *sav = isr->sav;
        const struct ipcomp_algorithm *algo;
        u_int16_t cpi;          /* host order */
        size_t plen0, plen;     /*payload length to be compressed*/
        const struct ipcomp_algorithm *algo;
        u_int16_t cpi;          /* host order */
        size_t plen0, plen;     /*payload length to be compressed*/
@@ -144,7 +165,7 @@ ipcomp_output(m, nexthdrp, md, isr, af)
        /* grab parameters */
        algo = ipcomp_algorithm_lookup(sav->alg_enc);
        if ((ntohl(sav->spi) & ~0xffff) != 0 || !algo) {
        /* grab parameters */
        algo = ipcomp_algorithm_lookup(sav->alg_enc);
        if ((ntohl(sav->spi) & ~0xffff) != 0 || !algo) {
-               stat->out_inval++;
+               IPSEC_STAT_INCREMENT(stat->out_inval);
                m_freem(m);
                return EINVAL;
        }
                m_freem(m);
                return EINVAL;
        }
@@ -189,7 +210,7 @@ ipcomp_output(m, nexthdrp, md, isr, af)
        if (mprev == NULL || mprev->m_next != md) {
                ipseclog((LOG_DEBUG, "ipcomp%d_output: md is not in chain\n",
                    afnumber));
        if (mprev == NULL || mprev->m_next != md) {
                ipseclog((LOG_DEBUG, "ipcomp%d_output: md is not in chain\n",
                    afnumber));
-               stat->out_inval++;
+               IPSEC_STAT_INCREMENT(stat->out_inval);
                m_freem(m);
                m_freem(md0);
                m_freem(mcopy);
                m_freem(m);
                m_freem(md0);
                m_freem(mcopy);
@@ -206,19 +227,16 @@ ipcomp_output(m, nexthdrp, md, isr, af)
        mprev->m_next = md;
 
        /* compress data part */
        mprev->m_next = md;
 
        /* compress data part */
-       lck_mtx_unlock(sadb_mutex);
        if ((*algo->compress)(m, md, &plen) || mprev->m_next == NULL) {
        if ((*algo->compress)(m, md, &plen) || mprev->m_next == NULL) {
-               lck_mtx_lock(sadb_mutex);
                ipseclog((LOG_ERR, "packet compression failure\n"));
                m = NULL;
                m_freem(md0);
                m_freem(mcopy);
                ipseclog((LOG_ERR, "packet compression failure\n"));
                m = NULL;
                m_freem(md0);
                m_freem(mcopy);
-               stat->out_inval++;
+               IPSEC_STAT_INCREMENT(stat->out_inval);
                error = EINVAL;
                goto fail;
        }
                error = EINVAL;
                goto fail;
        }
-       lck_mtx_lock(sadb_mutex);
-       stat->out_comphist[sav->alg_enc]++;
+       IPSEC_STAT_INCREMENT(stat->out_comphist[sav->alg_enc]);
        md = mprev->m_next;
 
        /*
        md = mprev->m_next;
 
        /*
@@ -311,7 +329,7 @@ ipcomp_output(m, nexthdrp, md, isr, af)
                else {
                        ipseclog((LOG_ERR,
                            "IPv4 ESP output: size exceeds limit\n"));
                else {
                        ipseclog((LOG_ERR,
                            "IPv4 ESP output: size exceeds limit\n"));
-                       ipsecstat.out_inval++;
+                       IPSEC_STAT_INCREMENT(ipsecstat.out_inval);
                        m_freem(m);
                        error = EMSGSIZE;
                        goto fail;
                        m_freem(m);
                        error = EMSGSIZE;
                        goto fail;
@@ -330,9 +348,9 @@ ipcomp_output(m, nexthdrp, md, isr, af)
                ipseclog((LOG_DEBUG,
                    "NULL mbuf after compression in ipcomp%d_output",
                    afnumber));
                ipseclog((LOG_DEBUG,
                    "NULL mbuf after compression in ipcomp%d_output",
                    afnumber));
-               stat->out_inval++;
+               IPSEC_STAT_INCREMENT(stat->out_inval);
        }
        }
-               stat->out_success++;
+               IPSEC_STAT_INCREMENT(stat->out_success);
 
        /* compute byte lifetime against original packet */
        key_sa_recordxfer(sav, mcopy);
 
        /* compute byte lifetime against original packet */
        key_sa_recordxfer(sav, mcopy);
@@ -350,37 +368,35 @@ fail:
 
 #if INET
 int
 
 #if INET
 int
-ipcomp4_output(m, isr)
-       struct mbuf *m;
-       struct ipsecrequest *isr;
+ipcomp4_output(struct mbuf *m, struct secasvar *sav)
 {
        struct ip *ip;
        if (m->m_len < sizeof(struct ip)) {
                ipseclog((LOG_DEBUG, "ipcomp4_output: first mbuf too short\n"));
 {
        struct ip *ip;
        if (m->m_len < sizeof(struct ip)) {
                ipseclog((LOG_DEBUG, "ipcomp4_output: first mbuf too short\n"));
-               ipsecstat.out_inval++;
+               IPSEC_STAT_INCREMENT(ipsecstat.out_inval);
                m_freem(m);
                return 0;
        }
        ip = mtod(m, struct ip *);
        /* XXX assumes that m->m_next points to payload */
                m_freem(m);
                return 0;
        }
        ip = mtod(m, struct ip *);
        /* XXX assumes that m->m_next points to payload */
-       return ipcomp_output(m, &ip->ip_p, m->m_next, isr, AF_INET);
+       return ipcomp_output(m, &ip->ip_p, m->m_next, AF_INET, sav);
 }
 #endif /*INET*/
 
 }
 #endif /*INET*/
 
-#ifdef INET6
+#if INET6
 int
 int
-ipcomp6_output(m, nexthdrp, md, isr)
-       struct mbuf *m;
-       u_char *nexthdrp;
-       struct mbuf *md;
-       struct ipsecrequest *isr;
+ipcomp6_output(
+       struct mbuf *m,
+       u_char *nexthdrp,
+       struct mbuf *md,
+       struct secasvar *sav)
 {
        if (m->m_len < sizeof(struct ip6_hdr)) {
                ipseclog((LOG_DEBUG, "ipcomp6_output: first mbuf too short\n"));
 {
        if (m->m_len < sizeof(struct ip6_hdr)) {
                ipseclog((LOG_DEBUG, "ipcomp6_output: first mbuf too short\n"));
-               ipsec6stat.out_inval++;
+               IPSEC_STAT_INCREMENT(ipsec6stat.out_inval);
                m_freem(m);
                return 0;
        }
                m_freem(m);
                return 0;
        }
-       return ipcomp_output(m, nexthdrp, md, isr, AF_INET6);
+       return ipcomp_output(m, nexthdrp, md, AF_INET6, sav);
 }
 #endif /*INET6*/
 }
 #endif /*INET6*/