X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/blobdiff_plain/7f28d940eb5f32762caf7ad42dcb78e76f36e7c1..6dcb12dc7a8451f66dd30ed6b55fe5864093ec30:/sys/netinet/in_var.h diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h index a9d665f05a..3085f69385 100644 --- a/sys/netinet/in_var.h +++ b/sys/netinet/in_var.h @@ -32,7 +32,7 @@ * * @(#)in_var.h 8.2 (Berkeley) 1/9/95 * $FreeBSD: src/sys/netinet/in_var.h,v 1.33.2.3 2001/12/14 20:09:34 jlemon Exp $ - * $DragonFly: src/sys/netinet/in_var.h,v 1.11 2006/05/20 02:42:12 dillon Exp $ + * $DragonFly: src/sys/netinet/in_var.h,v 1.16 2008/10/26 07:11:28 sephe Exp $ */ #ifndef _NETINET_IN_VAR_H_ @@ -67,8 +67,8 @@ struct in_ifaddr { 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 */ - LIST_ENTRY(in_ifaddr) ia_hash; /* entry in bucket of inet addresses */ - TAILQ_ENTRY(in_ifaddr) ia_link; /* list of internet addresses */ + void *ia_pad1[2]; + void *ia_pad2[2]; 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 @@ -94,53 +94,57 @@ struct in_aliasreq { #ifdef _KERNEL +struct in_ifaddr_container; + extern struct in_addr zeroin_addr; extern u_char inetctlerrmap[]; /* * Hash table for IP addresses. */ -extern LIST_HEAD(in_ifaddrhashhead, in_ifaddr) *in_ifaddrhashtbl; -extern TAILQ_HEAD(in_ifaddrhead, in_ifaddr) in_ifaddrhead; +extern LIST_HEAD(in_ifaddrhashhead, in_ifaddr_container) *in_ifaddrhashtbls[]; +extern TAILQ_HEAD(in_ifaddrhead, in_ifaddr_container) in_ifaddrheads[]; extern u_long in_ifaddrhmask; /* mask for hash table */ #define INADDR_NHASH_LOG2 9 #define INADDR_NHASH (1 << INADDR_NHASH_LOG2) #define INADDR_HASHVAL(x) fnv_32_buf((&(x)), sizeof(x), FNV1_32_INIT) #define INADDR_HASH(x) \ - (&in_ifaddrhashtbl[INADDR_HASHVAL(x) & in_ifaddrhmask]) + (&in_ifaddrhashtbls[mycpuid][INADDR_HASHVAL(x) & in_ifaddrhmask]) /* - * Macro for finding the interface (ifnet structure) corresponding to one + * Function for finding the interface (ifnet structure) corresponding to one * of our IP addresses. */ -#define INADDR_TO_IFP(addr, ifp) \ - /* struct in_addr addr; */ \ - /* struct ifnet *ifp; */ \ -{ \ - struct in_ifaddr *ia; \ -\ - LIST_FOREACH(ia, INADDR_HASH((addr).s_addr), ia_hash) \ - if (IA_SIN(ia)->sin_addr.s_addr == (addr).s_addr) \ - break; \ - (ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \ +static __inline struct ifnet * +INADDR_TO_IFP(const struct in_addr *_addr) +{ + struct in_ifaddr_container *_iac; + + LIST_FOREACH(_iac, INADDR_HASH(_addr->s_addr), ia_hash) { + if (IA_SIN(_iac->ia)->sin_addr.s_addr == _addr->s_addr) + return _iac->ia->ia_ifp; + } + return NULL; } /* - * Macro for finding the internet address structure (in_ifaddr) corresponding + * Function 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; */ \ -{ \ - for ((ia) = TAILQ_FIRST(&in_ifaddrhead); \ - (ia) != NULL && (ia)->ia_ifp != (ifp); \ - (ia) = TAILQ_NEXT((ia), ia_link)) \ - continue; \ +static __inline struct in_ifaddr * +IFP_TO_IA(const struct ifnet *_ifp) +{ + struct in_ifaddr_container *_iac; + + TAILQ_FOREACH(_iac, &in_ifaddrheads[mycpuid], ia_link) + if (_iac->ia->ia_ifp == _ifp) + return _iac->ia; + return NULL; } -#endif + +#endif /* _KERNEL */ /* * This information should be part of the ifnet structure but we don't wish @@ -243,11 +247,12 @@ int in_control (struct socket *, u_long, caddr_t, struct ifnet *, struct thread *); void in_rtqdrain (void); void ip_input (struct mbuf *); +void ip_forward (struct mbuf *, boolean_t, struct sockaddr_in *); int in_ifadown (struct ifaddr *ifa, int); void in_ifscrub (struct ifnet *, struct in_ifaddr *); -int ipflow_fastforward (struct mbuf *, struct lwkt_serialize *); -void ipflow_create (const struct route *, struct mbuf *); -void ipflow_slowtimo (void); +void in_iaunlink (struct in_ifaddr *); +void in_iahash_insert (struct in_ifaddr *); +void in_iahash_remove (struct in_ifaddr *); #endif /* _KERNEL */