[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

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