]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/net/net_osdep.h
xnu-344.tar.gz
[apple/xnu.git] / bsd / net / net_osdep.h
index eeb7c2f026cf5199cb13a98e82085b8f4b4eb9a9..e350606ac00d17b879db508bd378a1a8125b9ea1 100644 (file)
@@ -22,7 +22,7 @@
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
  * All rights reserved.
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
  * All rights reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -34,7 +34,7 @@
  * 3. Neither the name of the project nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  * 3. Neither the name of the project nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 /*
  * OS dependencies:
  *
 /*
  * OS dependencies:
  *
+ * - whether the IPv4 input routine convert the byte order of some fileds
+ *   of the IP header (x: convert to the host byte order, s: strip the header
+ *   length for possible reassembly)
+ *          ip_len ip_id ip_off
+ * bsdi3:       xs     x      x
+ * bsdi4:       xs            x
+ * FreeBSD:     xs            x
+ * NetBSD:       x            x
+ * OpenBSD:     xs     x      x
+ *
+ * - ifa_ifwithaf()
+ *   bsdi[34], netbsd, and openbsd define it in sys/net/if.c
+ *   freebsd (all versions) does not have it.
+ *  
+ * - struct rt_addrinfo
+ *   bsdi4, netbsd 1.5R and beyond: rti_addrs, rti_info[], rti_flags, rti_ifa,
+ *     rti_ifp, and rti_rtm.
+ *   others: rti_addrs and rti_info[] only.
+ *
+ * - ifa->ifa_rtrequest
+ *   bsdi4, netbsd 1.5R and beyond: rt_addrinfo *
+ *   others: sockaddr * (note that sys/net/route.c:rtrequest() has an unsafe
+ *     typecast code, from 4.3BSD-reno)
+ *
+ * - side effects of rtrequest{,1}(RTM_DELETE)
+ *     BSDI[34]: delete all cloned routes underneath the route.
+ *     FreeBSD[234]: delete all protocol-cloned routes underneath the route.
+ *                   note that cloned routes from an interface direct route
+ *                   still remain.
+ *     NetBSD: 1.5 have no side effects.  KAME/netbsd15, and post-1.5R, have
+ *             the same effects as of BSDI.
+ *     OpenBSD: have no side effects.  KAME/openbsd has the same effects as
+ *             of BSDI (the change is not merged - yet).
+ *
  * - privileged process
  *     NetBSD, FreeBSD 3
  *             struct proc *p;
  *             if (p && !suser(p->p_ucred, &p->p_acflag))
  *                     privileged;
  * - privileged process
  *     NetBSD, FreeBSD 3
  *             struct proc *p;
  *             if (p && !suser(p->p_ucred, &p->p_acflag))
  *                     privileged;
+ *     FreeBSD 4
+ *             struct proc *p;
+ *             if (p && !suser(p))
+ *                     privileged;
  *     OpenBSD, BSDI [34], FreeBSD 2
  *             struct socket *so;
  *             if (so->so_state & SS_PRIV)
  *     OpenBSD, BSDI [34], FreeBSD 2
  *             struct socket *so;
  *             if (so->so_state & SS_PRIV)
  *             needs to give struct proc * as argument
  *     OpenBSD, BSDI [34], FreeBSD 2
  *             do not need struct proc *
  *             needs to give struct proc * as argument
  *     OpenBSD, BSDI [34], FreeBSD 2
  *             do not need struct proc *
+ *
  * - bpf:
  * - bpf:
- *     OpenBSD, NetBSD, BSDI [34]
+ *     OpenBSD, NetBSD 1.5, BSDI [34]
  *             need caddr_t * (= if_bpf **) and struct ifnet *
  *             need caddr_t * (= if_bpf **) and struct ifnet *
- *     FreeBSD 2, FreeBSD 3
+ *     FreeBSD 2, FreeBSD 3, NetBSD post-1.5N
  *             need only struct ifnet * as argument
  *             need only struct ifnet * as argument
+ *
  * - struct ifnet
  *                     use queue.h?    member names    if name
  *                     ---             ---             ---
  * - struct ifnet
  *                     use queue.h?    member names    if name
  *                     ---             ---             ---
  *     OpenBSD         yes             standard        if_xname
  *     NetBSD          yes             standard        if_xname
  *     BSDI [34]       no              old standard    if_name+unit
  *     OpenBSD         yes             standard        if_xname
  *     NetBSD          yes             standard        if_xname
  *     BSDI [34]       no              old standard    if_name+unit
+ *
  * - usrreq
  *     NetBSD, OpenBSD, BSDI [34], FreeBSD 2
  * - usrreq
  *     NetBSD, OpenBSD, BSDI [34], FreeBSD 2
- *             single function with PRU_xx, arguments are mbuf 
+ *             single function with PRU_xx, arguments are mbuf
  *     FreeBSD 3
  *             separates functions, non-mbuf arguments
  *     FreeBSD 3
  *             separates functions, non-mbuf arguments
+ *
  * - {set,get}sockopt
  *     NetBSD, OpenBSD, BSDI [34], FreeBSD 2
  *             manipulation based on mbuf
  *     FreeBSD 3
  *             non-mbuf manipulation using sooptcopy{in,out}()
  * - {set,get}sockopt
  *     NetBSD, OpenBSD, BSDI [34], FreeBSD 2
  *             manipulation based on mbuf
  *     FreeBSD 3
  *             non-mbuf manipulation using sooptcopy{in,out}()
+ *
  * - timeout() and untimeout()
  * - timeout() and untimeout()
- *     NetBSD, OpenBSD, BSDI [34], FreeBSD 2
+ *     NetBSD 1.4.x, OpenBSD, BSDI [34], FreeBSD 2
  *             timeout() is a void function
  *     FreeBSD 3
  *             timeout() is a void function
  *     FreeBSD 3
- *             timeout() is non-void, must keep returned value for untimeuot()
+ *             timeout() is non-void, must keep returned value for untimeout()
+ *             callout_xx is also available (sys/callout.h)
+ *     NetBSD 1.5
+ *             timeout() is obsoleted, use callout_xx (sys/callout.h)
+ *     OpenBSD 2.8
+ *             timeout_{add,set,del} is encouraged (sys/timeout.h)
+ *
  * - sysctl
  *     NetBSD, OpenBSD
  *             foo_sysctl()
  *     BSDI [34]
  * - sysctl
  *     NetBSD, OpenBSD
  *             foo_sysctl()
  *     BSDI [34]
- *             foo_sysctl() but with different style
- *     FreeBSD 2, FreeBSD 3
- *             linker hack
+ *             foo_sysctl() but with different style.  sysctl_int_arr() takes
+ *             care of most of the cases.
+ *     FreeBSD
+ *             linker hack.  however, there are freebsd version differences
+ *             (how wonderful!).
+ *             on FreeBSD[23] function arg #define includes paren.
+ *                     int foo SYSCTL_HANDLER_ARGS;
+ *             on FreeBSD4, function arg #define does not include paren.
+ *                     int foo(SYSCTL_HANDLER_ARGS);
+ *             on some versions, forward reference to the tree is okay.
+ *             on some versions, you need SYSCTL_DECL().  you need things
+ *             like this.
+ *                     #ifdef SYSCTL_DECL
+ *                     SYSCTL_DECL(net_inet_ip6);
+ *                     #endif
+ *             it is hard to share functions between freebsd and non-freebsd.
  *
  * - if_ioctl
  *     NetBSD, FreeBSD 3, BSDI [34]
  *             2nd argument is u_long cmd
  *     FreeBSD 2
  *             2nd argument is int cmd
  *
  * - if_ioctl
  *     NetBSD, FreeBSD 3, BSDI [34]
  *             2nd argument is u_long cmd
  *     FreeBSD 2
  *             2nd argument is int cmd
+ *
  * - if attach routines
  *     NetBSD
  *             void xxattach(int);
  * - if attach routines
  *     NetBSD
  *             void xxattach(int);
  * - ovbcopy()
  *     in NetBSD 1.4 or later, ovbcopy() is not supplied in the kernel.
  *     bcopy() is safe against overwrites.
  * - ovbcopy()
  *     in NetBSD 1.4 or later, ovbcopy() is not supplied in the kernel.
  *     bcopy() is safe against overwrites.
+ *
  * - splnet()
  *     NetBSD 1.4 or later requires splsoftnet().
  *     other operating systems use splnet().
  * - splnet()
  *     NetBSD 1.4 or later requires splsoftnet().
  *     other operating systems use splnet().
  * - struct ifnet for loopback interface
  *     BSDI3: struct ifnet loif;
  *     BSDI4: struct ifnet *loifp;
  * - struct ifnet for loopback interface
  *     BSDI3: struct ifnet loif;
  *     BSDI4: struct ifnet *loifp;
- *     NetBSD, OpenBSD, FreeBSD2: struct ifnet loif[NLOOP];
+ *     NetBSD, OpenBSD 2.8, FreeBSD2: struct ifnet loif[NLOOP];
+ *     OpenBSD 2.9: struct ifnet *lo0ifp;
  *
  *     odd thing is that many of them refers loif as ifnet *loif,
  *     not loif[NLOOP], from outside of if_loop.c.
  *
  *     odd thing is that many of them refers loif as ifnet *loif,
  *     not loif[NLOOP], from outside of if_loop.c.
+ *
+ * - number of bpf pseudo devices
+ *     others: bpfilter.h, NBPFILTER
+ *     FreeBSD4: bpf.h, NBPF
+ *     solution:
+ *             #if defined(__FreeBSD__) && __FreeBSD__ >= 4
+ *             #include "bpf.h"
+ *             #define NBPFILTER       NBPF
+ *             #else
+ *             #include "bpfilter.h"
+ *             #endif
+ *
+ * - protosw for IPv4 (sys/netinet)
+ *     FreeBSD4: struct ipprotosw in netinet/ipprotosw.h
+ *     others: struct protosw in sys/protosw.h
+ *
+ * - protosw in general.
+ *     NetBSD 1.5 has extra member for ipfilter (netbsd-current dropped
+ *     it so it will go away in 1.6).
+ *     NetBSD 1.5 requires PR_LISTEN flag bit with protocols that permit
+ *     listen/accept (like tcp).
+ *
+ * - header files with defopt (opt_xx.h)
+ *     FreeBSD3: opt_{inet,ipsec,ip6fw,altq}.h
+ *     FreeBSD4: opt_{inet,inet6,ipsec,ip6fw,altq}.h
+ *     NetBSD: opt_{inet,ipsec,altq}.h
+ *     others: does not use defopt
+ *
+ * - (m->m_flags & M_EXT) != 0 does *not* mean that the max data length of
+ *   the mbuf == MCLBYTES.
+ *
+ * - sys/kern/uipc_mbuf.c:m_dup()
+ *     freebsd[34]: copies the whole mbuf chain.
+ *     netbsd: similar arg with m_copym().
+ *     others: no m_dup().
+ *
+ * - ifa_refcnt (struct ifaddr) management (IFAREF/IFAFREE).
+ *     NetBSD 1.5: always use IFAREF whenever reference gets added.
+ *             always use IFAFREE whenever reference gets freed.
+ *             IFAFREE frees ifaddr when ifa_refcnt reaches 0.
+ *     Darwin: always use ifaref whenever reference gets added.
+ *             always use ifafree whenever reference gets freed.
+ *             ifaref and ifafree are responsible for determining when to free.
+ *     others: do not increase refcnt for ifp->if_addrlist and in_ifaddr.
+ *             use IFAFREE once when ifaddr is disconnected from
+ *             ifp->if_addrlist and in_ifaddr.  IFAFREE frees ifaddr when
+ *             ifa_refcnt goes negative.
  */
 
 #ifndef __NET_NET_OSDEP_H_DEFINED_
 #define __NET_NET_OSDEP_H_DEFINED_
  */
 
 #ifndef __NET_NET_OSDEP_H_DEFINED_
 #define __NET_NET_OSDEP_H_DEFINED_
+#include <sys/appleapiopts.h>
 #ifdef KERNEL
 
 #ifdef KERNEL
 
-#if defined(__NetBSD__) || defined(__OpenBSD__)
-#define if_name(ifp)   ((ifp)->if_xname)
-#else
 struct ifnet;
 struct ifnet;
-extern char *if_name __P((struct ifnet *));
-#endif
+extern const char *if_name __P((struct ifnet *));
 
 
-#if defined (__APPLE__)
 #define HAVE_OLD_BPF
 #define HAVE_OLD_BPF
-#endif
 
 
-//#if defined(__FreeBSD__) && __FreeBSD__ >= 3
-#if defined (__APPLE__)
 #define ifa_list       ifa_link
 #define if_addrlist    if_addrhead
 #define if_list                if_link
 #define ifa_list       ifa_link
 #define if_addrlist    if_addrhead
 #define if_list                if_link
-#endif
 
 
-#if defined(__NetBSD__) && __NetBSD_Version__ >= 104000000
-#define ovbcopy                bcopy
+/* sys/net/if.h */
+#ifndef __APPLE__
+#define IFAREF(ifa)    do { ++(ifa)->ifa_refcnt; } while (0)
 #endif
 
 #endif
 
-#if defined(__OpenBSD__) || (defined(__bsdi__) && _BSDI_VERSION >= 199802)
-#define HAVE_NRL_INPCB
+#define WITH_CONVERT_AND_STRIP_IP_LEN
+
+#if 1                          /* at this moment, all OSes do this */
+#define WITH_CONVERT_IP_OFF
 #endif
 
 #endif /*_KERNEL*/
 #endif
 
 #endif /*_KERNEL*/