Subject: netipsec/ipsec6.h prototype changes for NetBSD/FreeBSD diffs
To: None <tech-net@netbsd.org>
From: Jonathan Stone <jonathan@DSG.Stanford.EDU>
List: tech-net
Date: 11/19/2003 14:05:54
One major difference between FreeBSD and NetBSD which fast-ipsec
(sys/net/netipsec) trips right over, is the pcb format for IPv6.

On FreeBSD, in6pcb (and thus ``struct in6pcb'') is just a macro for
inpcb (or ``struct inpcb'').  NetBSD has two different structs, which
now share a common header.

The patches below resolve that conflict, in sys/netipsec/ipsec6.h, for
a group of the IPv6 functions for which the prototypes are (mostly)
common between fast-ipsec and KAME/NetBSD ipsec. Aside from one minor
#ifdef/endif, these diffs have been stable since late August.

I've already sent a copy to Sam Leffler for review and comment, since
both Samd and I are trying to keep our respective sys/netipsec/ in synch.
If anyone else has feedback/comments, this is a good time to voice
them.

(I have tried two different approaches to the casts and other changes
needed in the .c files, I will post one or both separately, soon.)

Index: netipsec/ipsec6.h
===================================================================
RCS file: /cvsroot/src/sys/netipsec/ipsec6.h,v
retrieving revision 1.1
diff -u -r1.1 ipsec6.h
--- netipsec/ipsec6.h	2003/08/13 20:06:50	1.1
+++ netipsec/ipsec6.h	2003/11/19 20:54:38
@@ -40,6 +40,9 @@
 
 #include <net/pfkeyv2.h>
 #include <netipsec/keydb.h>
+#ifdef __NetBSD__
+#include <netinet6/in6_pcb.h>
+#endif
 
 #ifdef _KERNEL
 extern int ip6_esp_trans_deflev;
@@ -48,8 +51,10 @@
 extern int ip6_ah_net_deflev;
 extern int ip6_ipsec_ecn;
 extern int ip6_esp_randpad;
+extern struct secpolicy ip6_def_policy;
 
 struct inpcb;
+struct in6pcb;
 
 /* KAME compatibility shims */
 #define	ipsec6_getpolicybyaddr	ipsec_getpolicybyaddr
@@ -60,19 +65,32 @@
 #define	out_polvio		ips_out_polvio
 #define	key_freesp(_x)		KEY_FREESP(&_x)
 
-extern int ipsec6_delete_pcbpolicy __P((struct inpcb *));
-extern int ipsec6_set_policy __P((struct inpcb *inp, int optname,
+extern int ipsec6_delete_pcbpolicy __P((struct in6pcb *));
+extern int ipsec6_set_policy __P((struct in6pcb *inp, int optname,
 	caddr_t request, size_t len, int priv));
 extern int ipsec6_get_policy
-	__P((struct inpcb *inp, caddr_t request, size_t len, struct mbuf **mp));
-extern int ipsec6_in_reject __P((struct mbuf *, struct inpcb *));
+	__P((struct in6pcb *inp, caddr_t request, size_t len, struct mbuf **mp));
+extern int ipsec6_in_reject __P((struct mbuf *, struct in6pcb *));
+/*
+ * KAME ipsec6_in_reject_so(struct mbuf*, struct so)  compatibility shim
+ */
+#define ipsec6_in_reject_so(m, _so) \
+  ipsec6_in_reject(m, ((_so) == NULL? NULL : sotoin6pcb(_so)))
 
 struct tcp6cb;
 
-extern size_t ipsec6_hdrsiz __P((struct mbuf *, u_int, struct inpcb *));
+extern size_t ipsec6_hdrsiz __P((struct mbuf *, u_int, struct in6pcb *));
+extern size_t ipsec6_hdrsiz_tcp __P((struct tcpcb*));
 
 struct ip6_hdr;
 extern const char *ipsec6_logpacketstr __P((struct ip6_hdr *, u_int32_t));
+
+#ifdef __NetBSD__
+/* NetBSD protosw ctlin entrypoint */
+extern void esp6_ctlinput __P((int, struct sockaddr *, void *));
+extern void ah6_ctlinput __P((int, struct sockaddr *, void *));
+extern int ipsec6_sysctl __P((int *, u_int, void *, size_t *, void *, size_t));
+#endif /* __NetBSD__ */
 
 struct m_tag;
 extern int ipsec6_common_input(struct mbuf **mp, int *offp, int proto);