root/netinet/in_var.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    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_ */

/* [<][>][^][v][top][bottom][index][help] */