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