[BACK]Return to in_var.h CVS log [TXT][DIR] Up to [local] / sys / netinet

Annotation of sys/netinet/in_var.h, Revision 1.1

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

CVSweb