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