]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netinet/in_var.h
xnu-1486.2.11.tar.gz
[apple/xnu.git] / bsd / netinet / in_var.h
index 0c9d8c82944c4b5c9b846110b4914ba262637c81..df7a968af0066d06e2c37c0751b0cd41e04a5274 100644 (file)
@@ -1,23 +1,29 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2008 Apple Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
  * Copyright (c) 1985, 1986, 1993
@@ -64,7 +70,8 @@
 #include <sys/kern_event.h>
 #endif
 
-#ifdef __APPLE_API_UNSTABLE
+#ifdef KERNEL_PRIVATE
+#include <net/route.h>
 
 /*
  * Interface address, Internet version.  One of these structures
  * of the structure and is assumed to be first.
  */
 struct in_ifaddr {
-       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 */
-       TAILQ_ENTRY(in_ifaddr) ia_link; /* tailq macro glue */
-       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 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_int32_t               ia_net;         /* network number of interface */
+       u_int32_t               ia_netmask;     /* mask of net part */
+       u_int32_t               ia_subnet;      /* subnet number, including net */
+       u_int32_t               ia_subnetmask;  /* mask of subnet part */
+       struct in_addr          ia_netbroadcast; /* to recognize net broadcasts */
+       TAILQ_ENTRY(in_ifaddr)  ia_link;        /* tailq macro glue */
+       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 */
+       TAILQ_ENTRY(in_ifaddr)  ia_hash;        /* hash bucket entry */
 };
+#endif /* KERNEL_PRIVATE */
 
 struct in_aliasreq {
-       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;
-#ifdef __APPLE__
-        u_long              dlt;
-#endif
+       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;
+       u_int32_t               ifra_unused;    /* not used: used to be 'dlt' */
 };
 
-#ifdef __APPLE__
 /*
  * Event data, internet style.
  */
 struct kev_in_data {
-        struct net_event_data   link_data;
-       struct in_addr  ia_addr;
-       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_addr ia_dstaddr;
+       struct net_event_data   link_data;
+       struct in_addr          ia_addr;
+       u_int32_t               ia_net;         /* network number of interface */
+       u_int32_t               ia_netmask;     /* mask of net part */
+       u_int32_t               ia_subnet;      /* subnet number, including net */
+       u_int32_t               ia_subnetmask;  /* mask of subnet part */
+       struct in_addr          ia_netbroadcast;/* to recognize net broadcasts */
+       struct in_addr          ia_dstaddr;
+};
+
+struct kev_in_collision {
+       struct net_event_data   link_data;      /* link colliding arp was received on */
+       struct in_addr          ia_ipaddr;      /* IP address we and another node are using */
+       u_char                  hw_len;         /* length of hardware address */
+       u_char                  hw_addr[0];     /* variable length hardware address */
+};
+
+#ifdef __APPLE_API_PRIVATE
+struct kev_in_portinuse {
+       u_int16_t               port;           /* conflicting port number in host order */
+       u_int32_t               req_pid;        /* PID port requestor */
+       u_int32_t               reserved[2];    
 };
+#endif
 
 
 /*
@@ -128,8 +149,15 @@ struct kev_in_data {
 #define KEV_INET_SIFDSTADDR   4
 #define KEV_INET_SIFBRDADDR   5
 #define KEV_INET_SIFNETMASK   6
-#endif /* __APPLE__ */
+#define KEV_INET_ARPCOLLISION 7        /* use kev_in_collision */
 
+#ifdef __APPLE_API_PRIVATE
+#define KEV_INET_PORTINUSE    8        /* use ken_in_portinuse */
+#endif
+
+#ifdef KERNEL_PRIVATE
+#include <net/if_var.h>
+#include <kern/locks.h>
 /*
  * Given a pointer to an in_ifaddr (ifaddr),
  * return a pointer to the addr as a sockaddr_in.
@@ -140,48 +168,59 @@ struct kev_in_data {
 #define IN_LNAOF(in, ifa) \
        ((ntohl((in).s_addr) & ~((struct in_ifaddr *)(ifa)->ia_subnetmask))
 
-#endif /* __APPLE_API_UNSTABLE */
+/*
+ * Hash table for IPv4 addresses.
+ */
+__private_extern__ TAILQ_HEAD(in_ifaddrhead, in_ifaddr) in_ifaddrhead;
+__private_extern__ TAILQ_HEAD(in_ifaddrhashhead, in_ifaddr) *in_ifaddrhashtbl;
+__private_extern__ lck_rw_t *in_ifaddr_rwlock;
+
+#define        INADDR_HASH(x)  (&in_ifaddrhashtbl[inaddr_hashval(x)])
 
-#ifdef KERNEL
-#ifdef __APPLE_API_PRIVATE
-extern TAILQ_HEAD(in_ifaddrhead, in_ifaddr) in_ifaddrhead;
 extern struct  ifqueue ipintrq;                /* ip packet input queue */
 extern struct  in_addr zeroin_addr;
 extern u_char  inetctlerrmap[];
 
+extern int apple_hwcksum_tx;
+extern int apple_hwcksum_rx;
+
 /*
  * Macro 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; \
-\
-       TAILQ_FOREACH(ia, &in_ifaddrhead, ia_link) \
-               if (IA_SIN(ia)->sin_addr.s_addr == (addr).s_addr) \
-                       break; \
-       (ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \
+#define INADDR_TO_IFP(addr, ifp)                                       \
+       /* struct in_addr addr; */                                      \
+       /* struct ifnet *ifp; */                                        \
+{                                                                      \
+       struct in_ifaddr *ia;                                           \
+                                                                       \
+       lck_rw_lock_shared(in_ifaddr_rwlock);                           \
+       TAILQ_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;                       \
+       lck_rw_done(in_ifaddr_rwlock);                                  \
 }
 
 /*
  * Macro for finding the internet address structure (in_ifaddr) corresponding
- * to a given interface (ifnet structure).
+ * to a given interface (ifnet structure).  Caller is responsible for freeing
+ * the reference.
  */
-#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; \
+#define IFP_TO_IA(ifp, ia)                                             \
+       /* struct ifnet *ifp; */                                        \
+       /* struct in_ifaddr *ia; */                                     \
+{                                                                      \
+       lck_rw_lock_shared(in_ifaddr_rwlock);                           \
+       for ((ia) = TAILQ_FIRST(&in_ifaddrhead);                        \
+           (ia) != NULL && (ia)->ia_ifp != (ifp);                      \
+           (ia) = TAILQ_NEXT((ia), ia_link))                           \
+               continue;                                               \
+       if ((ia) != NULL)                                               \
+               ifaref(&(ia)->ia_ifa);                                  \
+       lck_rw_done(in_ifaddr_rwlock);                                  \
 }
-#endif /* __APPLE_API_PRIVATE */
-#endif
 
-#ifdef __APPLE_API_UNSTABLE
 /*
  * This information should be part of the ifnet structure but we don't wish
  * to change that - as it might break a number of things
@@ -211,10 +250,6 @@ struct in_multi {
        u_int   inm_state;              /*  state of the membership */
        struct  router_info *inm_rti;   /* router info*/
 };
-#endif /* __APPLE_API_UNSTABLE */
-
-#ifdef KERNEL
-#ifdef __APPLE_API_PRIVATE
 
 #ifdef SYSCTL_DECL
 SYSCTL_DECL(_net_inet_ip);
@@ -248,7 +283,7 @@ do { \
                    (addr).s_addr) \
                        break; \
        } \
-       (inm) = ifma ? ifma->ifma_protospec : 0; \
+       (inm) = ifma ? ifma->ifma_protospec : NULL; \
 } while(0)
 
 /*
@@ -275,20 +310,25 @@ do { \
 } while(0)
 
 struct route;
-struct in_multi *in_addmulti __P((struct in_addr *, struct ifnet *));
-void   in_delmulti __P((struct in_multi *));
-int    in_control __P((struct socket *, u_long, caddr_t, struct ifnet *,
-                       struct proc *));
-void   in_rtqdrain __P((void));
-void   ip_input __P((struct mbuf *));
-int    in_ifadown __P((struct ifaddr *ifa, int));
-void   in_ifscrub __P((struct ifnet *, struct in_ifaddr *));
-int    ipflow_fastforward __P((struct mbuf *));
-void   ipflow_create __P((const struct route *, struct mbuf *));
-void   ipflow_slowtimo __P((void));
-
-#endif /* __APPLE_API_PRIVATE */
-#endif /* _KERNEL */
+
+extern void in_ifaddr_init(void);
+extern struct in_multi *in_addmulti(struct in_addr *, struct ifnet *);
+extern void in_delmulti(struct in_multi **);
+extern int in_control(struct socket *, u_long, caddr_t, struct ifnet *,
+    struct proc *);
+extern void in_rtqdrain(void);
+extern struct radix_node *in_validate(struct radix_node *);
+extern void ip_input(struct mbuf *);
+extern int in_ifadown(struct ifaddr *ifa, int);
+extern void in_ifscrub(struct ifnet *, struct in_ifaddr *, int);
+extern int ipflow_fastforward(struct mbuf *);
+#if IPFLOW
+extern void ipflow_create(const struct route *, struct mbuf *);
+extern void ipflow_slowtimo(void);
+#endif /* IPFLOW */
+extern u_int32_t inaddr_hashval(u_int32_t);
+
+#endif /* KERNEL_PRIVATE */
 
 /* INET6 stuff */
 #include <netinet6/in6_var.h>