Annotation of kernel/bsd/netinet/in_var.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.1 (the "License").  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License.
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: 
        !            25: /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
        !            26: /*
        !            27:  * Copyright (c) 1985, 1986, 1993
        !            28:  *     The Regents of the University of California.  All rights reserved.
        !            29:  *
        !            30:  * Redistribution and use in source and binary forms, with or without
        !            31:  * modification, are permitted provided that the following conditions
        !            32:  * are met:
        !            33:  * 1. Redistributions of source code must retain the above copyright
        !            34:  *    notice, this list of conditions and the following disclaimer.
        !            35:  * 2. Redistributions in binary form must reproduce the above copyright
        !            36:  *    notice, this list of conditions and the following disclaimer in the
        !            37:  *    documentation and/or other materials provided with the distribution.
        !            38:  * 3. All advertising materials mentioning features or use of this software
        !            39:  *    must display the following acknowledgement:
        !            40:  *     This product includes software developed by the University of
        !            41:  *     California, Berkeley and its contributors.
        !            42:  * 4. Neither the name of the University nor the names of its contributors
        !            43:  *    may be used to endorse or promote products derived from this software
        !            44:  *    without specific prior written permission.
        !            45:  *
        !            46:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            47:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            48:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            49:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            50:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            51:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            52:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            53:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            54:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            55:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            56:  * SUCH DAMAGE.
        !            57:  *
        !            58:  *     @(#)in_var.h    8.2 (Berkeley) 1/9/95
        !            59:  */
        !            60: 
        !            61: /*
        !            62:  * Interface address, Internet version.  One of these structures
        !            63:  * is allocated for each interface with an Internet address.
        !            64:  * The ifaddr structure contains the protocol-independent part
        !            65:  * of the structure and is assumed to be first.
        !            66:  */
        !            67: struct in_ifaddr {
        !            68:        struct  ifaddr ia_ifa;          /* protocol-independent info */
        !            69: #define        ia_ifp          ia_ifa.ifa_ifp
        !            70: #define ia_flags       ia_ifa.ifa_flags
        !            71:                                        /* ia_{,sub}net{,mask} in host order */
        !            72:        u_long  ia_net;                 /* network number of interface */
        !            73:        u_long  ia_netmask;             /* mask of net part */
        !            74:        u_long  ia_subnet;              /* subnet number, including net */
        !            75:        u_long  ia_subnetmask;          /* mask of subnet part */
        !            76:        struct  in_addr ia_netbroadcast; /* to recognize net broadcasts */
        !            77:        struct  in_ifaddr *ia_next;     /* next in list of internet addresses */
        !            78:        struct  sockaddr_in ia_addr;    /* reserve space for interface name */
        !            79:        struct  sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */
        !            80: #define        ia_broadaddr    ia_dstaddr
        !            81:        struct  sockaddr_in ia_sockmask; /* reserve space for general netmask */
        !            82:        struct  in_multi *ia_multiaddrs; /* list of multicast addresses */
        !            83: };
        !            84: 
        !            85: struct in_aliasreq {
        !            86:        char    ifra_name[IFNAMSIZ];            /* if name, e.g. "en0" */
        !            87:        struct  sockaddr_in ifra_addr;
        !            88:        struct  sockaddr_in ifra_broadaddr;
        !            89: #define ifra_dstaddr ifra_broadaddr
        !            90:        struct  sockaddr_in ifra_mask;
        !            91: };
        !            92: /*
        !            93:  * Given a pointer to an in_ifaddr (ifaddr),
        !            94:  * return a pointer to the addr as a sockaddr_in.
        !            95:  */
        !            96: #define        IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr))
        !            97: 
        !            98: #define IN_LNAOF(in, ifa) \
        !            99:        ((ntohl((in).s_addr) & ~((struct in_ifaddr *)(ifa)->ia_subnetmask))
        !           100:                        
        !           101: 
        !           102: #ifdef _KERNEL
        !           103: extern struct  in_ifaddr *in_ifaddr;
        !           104: extern struct  ifqueue ipintrq;                /* ip packet input queue */
        !           105: 
        !           106: 
        !           107: /*
        !           108:  * Macro for finding the interface (ifnet structure) corresponding to one
        !           109:  * of our IP addresses.
        !           110:  */
        !           111: #define INADDR_TO_IFP(addr, ifp) \
        !           112:        /* struct in_addr addr; */ \
        !           113:        /* struct ifnet *ifp; */ \
        !           114: { \
        !           115:        register struct in_ifaddr *ia; \
        !           116: \
        !           117:        for (ia = in_ifaddr; \
        !           118:            ia != NULL && IA_SIN(ia)->sin_addr.s_addr != (addr).s_addr; \
        !           119:            ia = ia->ia_next) \
        !           120:                 continue; \
        !           121:        (ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \
        !           122: }
        !           123: 
        !           124: /*
        !           125:  * Macro for finding the internet address structure (in_ifaddr) corresponding
        !           126:  * to a given interface (ifnet structure).
        !           127:  */
        !           128: #define IFP_TO_IA(ifp, ia) \
        !           129:        /* struct ifnet *ifp; */ \
        !           130:        /* struct in_ifaddr *ia; */ \
        !           131: { \
        !           132:        for ((ia) = in_ifaddr; \
        !           133:            (ia) != NULL && (ia)->ia_ifp != (ifp); \
        !           134:            (ia) = (ia)->ia_next) \
        !           135:                continue; \
        !           136: }
        !           137: #endif
        !           138: 
        !           139: /*
        !           140:  * Internet multicast address structure.  There is one of these for each IP
        !           141:  * multicast group to which this host belongs on a given network interface.
        !           142:  * They are kept in a linked list, rooted in the interface's in_ifaddr
        !           143:  * structure.
        !           144:  */
        !           145: struct in_multi {
        !           146:        struct  in_addr inm_addr;       /* IP multicast address */
        !           147:        struct  ifnet *inm_ifp;         /* back pointer to ifnet */
        !           148:        struct  in_ifaddr *inm_ia;      /* back pointer to in_ifaddr */
        !           149:        u_int   inm_refcount;           /* no. membership claims by sockets */
        !           150:        u_int   inm_timer;              /* IGMP membership report timer */
        !           151:        struct  in_multi *inm_next;     /* ptr to next multicast address */
        !           152: };
        !           153: 
        !           154: #ifdef _KERNEL
        !           155: /*
        !           156:  * Structure used by macros below to remember position when stepping through
        !           157:  * all of the in_multi records.
        !           158:  */
        !           159: struct in_multistep {
        !           160:        struct in_ifaddr *i_ia;
        !           161:        struct in_multi *i_inm;
        !           162: };
        !           163: 
        !           164: /*
        !           165:  * Macro for looking up the in_multi record for a given IP multicast address
        !           166:  * on a given interface.  If no matching record is found, "inm" returns NULL.
        !           167:  */
        !           168: #define IN_LOOKUP_MULTI(addr, ifp, inm) \
        !           169:        /* struct in_addr addr; */ \
        !           170:        /* struct ifnet *ifp; */ \
        !           171:        /* struct in_multi *inm; */ \
        !           172: { \
        !           173:        register struct in_ifaddr *ia; \
        !           174: \
        !           175:        IFP_TO_IA((ifp), ia); \
        !           176:        if (ia == NULL) \
        !           177:                (inm) = NULL; \
        !           178:        else \
        !           179:                for ((inm) = ia->ia_multiaddrs; \
        !           180:                    (inm) != NULL && (inm)->inm_addr.s_addr != (addr).s_addr; \
        !           181:                     (inm) = inm->inm_next) \
        !           182:                         continue; \
        !           183: }
        !           184: 
        !           185: /*
        !           186:  * Macro to step through all of the in_multi records, one at a time.
        !           187:  * The current position is remembered in "step", which the caller must
        !           188:  * provide.  IN_FIRST_MULTI(), below, must be called to initialize "step"
        !           189:  * and get the first record.  Both macros return a NULL "inm" when there
        !           190:  * are no remaining records.
        !           191:  */
        !           192: #define IN_NEXT_MULTI(step, inm) \
        !           193:        /* struct in_multistep  step; */ \
        !           194:        /* struct in_multi *inm; */ \
        !           195: { \
        !           196:        if (((inm) = (step).i_inm) != NULL) \
        !           197:                (step).i_inm = (inm)->inm_next; \
        !           198:        else \
        !           199:                while ((step).i_ia != NULL) { \
        !           200:                        (inm) = (step).i_ia->ia_multiaddrs; \
        !           201:                        (step).i_ia = (step).i_ia->ia_next; \
        !           202:                        if ((inm) != NULL) { \
        !           203:                                (step).i_inm = (inm)->inm_next; \
        !           204:                                break; \
        !           205:                        } \
        !           206:                } \
        !           207: }
        !           208: 
        !           209: #define IN_FIRST_MULTI(step, inm) \
        !           210:        /* struct in_multistep step; */ \
        !           211:        /* struct in_multi *inm; */ \
        !           212: { \
        !           213:        (step).i_ia = in_ifaddr; \
        !           214:        (step).i_inm = NULL; \
        !           215:        IN_NEXT_MULTI((step), (inm)); \
        !           216: }
        !           217: 
        !           218: int    in_ifinit __P((struct ifnet *,
        !           219:            struct in_ifaddr *, struct sockaddr_in *, int));
        !           220: struct in_multi *in_addmulti __P((struct in_addr *, struct ifnet *));
        !           221: int    in_delmulti __P((struct in_multi *));
        !           222: void   in_ifscrub __P((struct ifnet *, struct in_ifaddr *));
        !           223: int    in_control __P((struct socket *, u_long, caddr_t, struct ifnet *));
        !           224: #endif

unix.superglobalmegacorp.com

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