* Copyright (c) 1985, 1986 Regents of the University of California.
* %sccs.include.redist.c%
* @(#)in_var.h 7.9 (Berkeley) %G%
* Interface address, Internet version. One of these structures
* is allocated for each interface with an Internet address.
* The ifaddr structure contains the protocol-independent part
* of the structure and is assumed to be first.
struct ifaddr ia_ifa
; /* protocol-independent info */
#define ia_ifp ia_ifa.ifa_ifp
#define ia_flags ia_ifa.ifa_flags
/* ia_{,sub}net{,mask} in host order */
u_long ia_net
; /* network number of interface */
u_long ia_netmask
; /* mask of net part */
u_long ia_subnet
; /* subnet number, including net */
u_long ia_subnetmask
; /* mask of subnet part */
struct in_addr ia_netbroadcast
; /* to recognize net broadcasts */
struct in_ifaddr
*ia_next
; /* next in list of internet addresses */
struct sockaddr_in ia_addr
; /* reserve space for interface name */
struct sockaddr_in ia_dstaddr
; /* reserve space for broadcast addr */
#define ia_broadaddr ia_dstaddr
struct sockaddr_in ia_sockmask
; /* reserve space for general netmask */
struct in_multi
*ia_multiaddrs
; /* list of multicast addresses */
char ifra_name
[IFNAMSIZ
]; /* if name, e.g. "en0" */
struct sockaddr_in ifra_addr
;
struct sockaddr_in ifra_broadaddr
;
#define ifra_dstaddr ifra_broadaddr
struct sockaddr_in ifra_mask
;
* Given a pointer to an in_ifaddr (ifaddr),
* return a pointer to the addr as a sockaddr_in.
#define IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr))
#define IN_LNAOF(in, ifa) \
((ntohl((in).s_addr) & ~((struct in_ifaddr *)(ifa)->ia_subnetmask))
extern struct in_ifaddr
*in_ifaddr
;
extern struct ifqueue ipintrq
; /* ip packet input queue */
void in_socktrim
__P((struct sockaddr_in
*));
* Macro for finding the interface (ifnet structure) corresponding to one
#define INADDR_TO_IFP(addr, ifp) \
/* struct in_addr addr; */ \
/* struct ifnet *ifp; */ \
register struct in_ifaddr *ia; \
ia != NULL && IA_SIN(ia)->sin_addr.s_addr != (addr).s_addr; \
(ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \
* Macro for finding the internet address structure (in_ifaddr) corresponding
* to a given interface (ifnet structure).
#define IFP_TO_IA(ifp, ia) \
/* struct ifnet *ifp; */ \
/* struct in_ifaddr *ia; */ \
(ia) != NULL && (ia)->ia_ifp != (ifp); \
* Internet multicast address structure. There is one of these for each IP
* multicast group to which this host belongs on a given network interface.
* They are kept in a linked list, rooted in the interface's in_ifaddr
struct in_addr inm_addr
; /* IP multicast address */
struct ifnet
*inm_ifp
; /* back pointer to ifnet */
struct in_ifaddr
*inm_ia
; /* back pointer to in_ifaddr */
u_int inm_refcount
; /* no. membership claims by sockets */
u_int inm_timer
; /* IGMP membership report timer */
struct in_multi
*inm_next
; /* ptr to next multicast address */
* Structure used by macros below to remember position when stepping through
* all of the in_multi records.
* Macro for looking up the in_multi record for a given IP multicast address
* on a given interface. If no matching record is found, "inm" returns NULL.
#define IN_LOOKUP_MULTI(addr, ifp, inm) \
/* struct in_addr addr; */ \
/* struct ifnet *ifp; */ \
/* struct in_multi *inm; */ \
register struct in_ifaddr *ia; \
for ((inm) = ia->ia_multiaddrs; \
(inm) != NULL && (inm)->inm_addr.s_addr != (addr).s_addr; \
* Macro to step through all of the in_multi records, one at a time.
* The current position is remembered in "step", which the caller must
* provide. IN_FIRST_MULTI(), below, must be called to initialize "step"
* and get the first record. Both macros return a NULL "inm" when there
* are no remaining records.
#define IN_NEXT_MULTI(step, inm) \
/* struct in_multistep step; */ \
/* struct in_multi *inm; */ \
if (((inm) = (step).i_inm) != NULL) \
(step).i_inm = (inm)->inm_next; \
while ((step).i_ia != NULL) { \
(inm) = (step).i_ia->ia_multiaddrs; \
(step).i_ia = (step).i_ia->ia_next; \
(step).i_inm = (inm)->inm_next; \
#define IN_FIRST_MULTI(step, inm) \
/* struct in_multistep step; */ \
/* struct in_multi *inm; */ \
(step).i_ia = in_ifaddr; \
IN_NEXT_MULTI((step), (inm)); \
int in_ifinit
__P((struct ifnet
*,
struct in_ifaddr
*, struct sockaddr_in
*, int));
struct in_multi
*in_addmulti
__P((struct in_addr
*, struct ifnet
*));
int in_delmulti
__P((struct in_multi
*));
void in_ifscrub
__P((struct ifnet
*, struct in_ifaddr
*));
int in_control
__P((struct socket
*, int, caddr_t
, struct ifnet
*));