Annotation of XNU/bsd/net/kext_net.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /* Copyright (C) 1999 Apple Computer, Inc.  */
        !            23: 
        !            24: /*
        !            25:  * Support for Network Kernel Extensions: Socket Filters
        !            26:  *
        !            27:  * Justin C. Walker, 990319
        !            28:  */
        !            29: 
        !            30: #include <sys/types.h>
        !            31: #include <sys/queue.h>
        !            32: #include <sys/malloc.h>
        !            33: #include <sys/param.h>
        !            34: #include <sys/mbuf.h>
        !            35: #include <sys/domain.h>
        !            36: #include <sys/protosw.h>
        !            37: #include <sys/socket.h>
        !            38: #include <machine/spl.h>
        !            39: #include "kext_net.h"
        !            40: 
        !            41: /* List of kernel extensions (networking) known to kernel */
        !            42: struct nf_list nf_list;
        !            43: 
        !            44: /*
        !            45:  * Register a global filter for the specified protocol
        !            46:  * Make a few checks and then insert the new descriptor in the
        !            47:  *  filter list and, if global, in its protosw's chain.
        !            48:  */
        !            49: int
        !            50: register_sockfilter(struct NFDescriptor *nfp, struct NFDescriptor *nfp1,
        !            51:                    struct protosw *pr, int flags)
        !            52: {      int s;
        !            53:        static int NF_initted = 0;
        !            54: 
        !            55:        if (nfp == NULL)
        !            56:                return(EINVAL);
        !            57: 
        !            58:        s = splhigh();
        !            59:        if (!NF_initted)
        !            60:        {       NF_initted = 1;
        !            61:                TAILQ_INIT(&nf_list);
        !            62:        }
        !            63: 
        !            64:        /*
        !            65:         * Install the extension:
        !            66:         * First, put it in the global list of all filters
        !            67:         * Then, if global, install in the protosw's list 
        !            68:         */
        !            69:        TAILQ_INSERT_TAIL(&nf_list, nfp, nf_list);
        !            70:        if (nfp->nf_flags & NFD_GLOBAL)
        !            71:        {       if (flags & NFF_BEFORE)
        !            72:                {       if (nfp1 == NULL)
        !            73:                        {       TAILQ_INSERT_HEAD(&pr->pr_sfilter,
        !            74:                                                  nfp, nf_next);
        !            75:                        } else
        !            76:                                TAILQ_INSERT_BEFORE(nfp1, nfp, nf_next);
        !            77:                } else          /* Default: AFTER */
        !            78:                {       if (nfp1 == NULL)
        !            79:                        {       TAILQ_INSERT_TAIL(&pr->pr_sfilter,
        !            80:                                                  nfp, nf_next);
        !            81:                        } else
        !            82:                                TAILQ_INSERT_AFTER(&pr->pr_sfilter, nfp1,
        !            83:                                                   nfp, nf_next);
        !            84:                }
        !            85:        }
        !            86:        splx(s);
        !            87:        return(0);
        !            88: }
        !            89: 
        !            90: unregister_sockfilter(struct NFDescriptor *nfp, struct protosw *pr, int flags)
        !            91: {      int s;
        !            92: 
        !            93:        s = splhigh();
        !            94:        TAILQ_REMOVE(&nf_list, nfp, nf_list);
        !            95:        /* Only globals are attached to the protosw entry */
        !            96:        if (nfp->nf_flags & NFD_GLOBAL)
        !            97:                TAILQ_REMOVE(&pr->pr_sfilter, nfp, nf_next);
        !            98:        splx(s);
        !            99:        return(0);
        !           100: }
        !           101: 
        !           102: struct NFDescriptor *
        !           103: find_nke(int handle)
        !           104: {      struct NFDescriptor *nfp;
        !           105: 
        !           106:        nfp = nf_list.tqh_first;
        !           107:        while (nfp)
        !           108:        {       if (nfp->nf_handle == handle)
        !           109:                        return(nfp);
        !           110:                nfp = nfp->nf_next.tqe_next;
        !           111:        }
        !           112:        return(NULL);
        !           113: }
        !           114: 
        !           115: /*
        !           116:  * Insert a previously registered, non-global, NKE into the list of
        !           117:  *  active NKEs for this socket.  Then invoke its "attach/create" entry.
        !           118:  * Assumed called with protection in place (spl/mutex/whatever)
        !           119:  * XXX: How to which extension is not found, on error.
        !           120:  */
        !           121: int
        !           122: nke_insert(struct socket *so, struct so_nke *np)
        !           123: {      int s, error;
        !           124:        struct kextcb *kp, *kp1;
        !           125:        struct NFDescriptor *nf1, *nf2 = NULL;
        !           126: 
        !           127:        if (np->nke_where != NULL)
        !           128:        {       if ((nf2 = find_nke(np->nke_where)) == NULL)
        !           129:                {       /* ??? */
        !           130:                        return(ENXIO);/* XXX */
        !           131:                }
        !           132:        }
        !           133: 
        !           134:        if ((nf1 = find_nke(np->nke_handle)) == NULL)
        !           135:        {       /* ??? */
        !           136:                return(ENXIO);/* XXX */
        !           137:        }
        !           138: 
        !           139:        kp = so->so_ext;
        !           140:        kp1 = NULL;
        !           141:         if (np->nke_flags & NFF_BEFORE)
        !           142:        {       if (nf2)
        !           143:                {       while (kp)
        !           144:                        {       if (kp->e_nfd == nf2)
        !           145:                                        break;
        !           146:                                kp1 = kp;
        !           147:                                kp = kp->e_next;
        !           148:                        }
        !           149:                        if (kp == NULL)
        !           150:                                return(ENXIO);/* XXX */
        !           151:                }
        !           152:        } else
        !           153:        {       if (nf2)
        !           154:                {       while (kp)
        !           155:                        {       if (kp->e_nfd == nf2)
        !           156:                                        break;
        !           157:                                kp1 = kp;
        !           158:                                kp = kp->e_next;
        !           159:                        }
        !           160:                        if (kp == NULL)
        !           161:                                return(ENXIO);/* XXX */
        !           162:                }
        !           163:                kp1 = kp;
        !           164:        }
        !           165:        /*
        !           166:         * Here with kp1 pointing to the insertion point.
        !           167:         * If null, this is first entry.
        !           168:         * Now, create and insert the descriptor.
        !           169:         */
        !           170: 
        !           171:        MALLOC(kp, struct kextcb *, sizeof(*kp), M_TEMP, M_WAITOK);
        !           172:        if (kp == NULL)
        !           173:                return(ENOBUFS); /* so_free will clean up */
        !           174:        bzero(kp, sizeof (*kp));
        !           175:        if (kp1 == NULL)
        !           176:                so->so_ext = kp;
        !           177:        else
        !           178:        {       kp->e_next = kp1->e_next;
        !           179:                kp1->e_next = kp;
        !           180:        }
        !           181:        kp->e_fcb = NULL;
        !           182:        kp->e_nfd = nf1;
        !           183:        kp->e_soif = nf1->nf_soif;
        !           184:        kp->e_sout = nf1->nf_soutil;
        !           185:        /*
        !           186:         * Ignore return value for create
        !           187:         * Everyone gets a chance at startup
        !           188:         */
        !           189:        if (kp->e_soif && kp->e_soif->sf_socreate)
        !           190:                (*kp->e_soif->sf_socreate)(so, so->so_proto, kp);
        !           191: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.