Mercurial > ecos-v2_0-branch
diff packages/net/tcpip/current/include/netinet/ip_ipsp.h @ 97:ced4577552cd ecos-sw-2000-06-06
Merge from eCos master repository on 2000-06-06-08:44:00-BST
| author | jlarmour |
|---|---|
| date | Tue, 06 Jun 2000 08:39:36 +0000 |
| parents | |
| children | e0c0827131d1 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/net/tcpip/current/include/netinet/ip_ipsp.h @@ -0,0 +1,626 @@ +//========================================================================== +// +// include/netinet/ipsp.h +// +// +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//####BSDCOPYRIGHTBEGIN#### +// +// ------------------------------------------- +// +// Portions of this software may have been derived from OpenBSD or other sources, +// and are covered by the appropriate copyright disclaimers included herein. +// +// ------------------------------------------- +// +//####BSDCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-01-10 +// Purpose: +// Description: +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + + +/* $OpenBSD: ip_ipsp.h,v 1.50 1999/12/08 12:10:25 angelos Exp $ */ + +/* + * The authors of this code are John Ioannidis (ji@tla.org), + * Angelos D. Keromytis (kermit@csd.uch.gr), + * Niels Provos (provos@physnet.uni-hamburg.de) and + * Niklas Hallqvist (niklas@appli.se). + * + * This code was written by John Ioannidis for BSD/OS in Athens, Greece, + * in November 1995. + * + * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996, + * by Angelos D. Keromytis. + * + * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis + * and Niels Provos. + * + * Additional features in 1999 by Angelos D. Keromytis and Niklas Hallqvist. + * + * Copyright (c) 1995, 1996, 1997, 1998, 1999 by John Ioannidis, + * Angelos D. Keromytis and Niels Provos. + * Copyright (c) 1999 Niklas Hallqvist. + * + * Permission to use, copy, and modify this software without fee + * is hereby granted, provided that this entire notice is included in + * all copies of any software which is or includes a copy or + * modification of this software. + * You may use this code under the GNU public license if you so wish. Please + * contribute changes back to the authors under this freer than GPL license + * so that we may further the use of strong encryption without limitations to + * all. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE + * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR + * PURPOSE. + */ + +#ifndef _NETINET_IPSP_H_ +#define _NETINET_IPSP_H_ + +/* + * IPSP global definitions. + */ + +#include <sys/types.h> +#include <sys/queue.h> +#include <netinet/in.h> +#ifndef __ECOS +#include <sys/md5k.h> +#endif +#include <netinet/ip_sha1.h> +#include <netinet/ip_rmd160.h> +#include <netinet/ip_blf.h> +#include <netinet/ip_cast.h> +#include <netinet/ip_skipjack.h> + +union sockaddr_union +{ + struct sockaddr sa; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; +}; + +/* HMAC key sizes */ +#define MD5HMAC96_KEYSIZE 16 +#define SHA1HMAC96_KEYSIZE 20 +#define RIPEMD160HMAC96_KEYSIZE 20 + +/* IV lengths */ +#define ESP_DES_IVS 8 +#define ESP_3DES_IVS 8 +#define ESP_BLF_IVS 8 +#define ESP_CAST_IVS 8 +#define ESP_SKIPJACK_IVS 8 +#define ESP_MAX_IVS 8 /* Keep updated */ + +/* Block sizes -- it is assumed that they're powers of 2 */ +#define ESP_DES_BLKS 8 +#define ESP_3DES_BLKS 8 +#define ESP_BLF_BLKS 8 +#define ESP_CAST_BLKS 8 +#define ESP_SKIPJACK_BLKS 8 +#define ESP_MAX_BLKS 8 /* Keep updated */ + +#define HMAC_BLOCK_LEN 64 + +#define AH_HMAC_HASHLEN 12 /* 96 bits of authenticator */ +#define AH_HMAC_RPLENGTH 4 /* 32 bits of replay counter */ +#define AH_HMAC_INITIAL_RPL 1 /* Replay counter initial value */ + +/* HMAC definitions */ +#define HMAC_IPAD_VAL 0x36 +#define HMAC_OPAD_VAL 0x5C +#define HMAC_BLOCK_LEN 64 + +/* Authenticator lengths */ +#define AH_MD5_ALEN 16 +#define AH_SHA1_ALEN 20 +#define AH_RMD160_ALEN 20 +#define AH_ALEN_MAX 20 /* Keep updated */ + +/* Reserved SPI numbers */ +#define SPI_LOCAL_USE 0 +#define SPI_RESERVED_MIN 1 +#define SPI_RESERVED_MAX 255 + +struct sockaddr_encap +{ + u_int8_t sen_len; /* length */ + u_int8_t sen_family; /* PF_KEY */ + u_int16_t sen_type; /* see SENT_* */ + union + { + u_int8_t Data[16]; /* other stuff mapped here */ + + struct /* SENT_IP4 */ + { + struct in_addr Src; + struct in_addr Dst; + u_int16_t Sport; + u_int16_t Dport; + u_int8_t Proto; + u_int8_t Filler[3]; + } Sip4; + + struct /* SENT_IP6 */ + { + struct in6_addr Src; + struct in6_addr Dst; + u_int16_t Sport; + u_int16_t Dport; + u_int8_t Proto; + u_int8_t Filler[3]; + } Sip6; + + struct /* SENT_IPSP */ + { + struct in_addr Dst; + u_int32_t Spi; + u_int8_t Sproto; + u_int8_t Filler[7]; + } Sipsp; + + struct /* SENT_IPSP6 */ + { + struct in6_addr Dst; + u_int32_t Spi; + u_int8_t Sproto; + u_int8_t Filler[7]; + } Sipsp6; + } Sen; +}; + +#define sen_data Sen.Data +#define sen_ip_src Sen.Sip4.Src +#define sen_ip_dst Sen.Sip4.Dst +#define sen_proto Sen.Sip4.Proto +#define sen_sport Sen.Sip4.Sport +#define sen_dport Sen.Sip4.Dport +#define sen_ip6_src Sen.Sip6.Src +#define sen_ip6_dst Sen.Sip6.Dst +#define sen_ip6_proto Sen.Sip6.Proto +#define sen_ip6_sport Sen.Sip6.Sport +#define sen_ip6_dport Sen.Sip6.Dport +#define sen_ipsp_dst Sen.Sipsp.Dst +#define sen_ipsp_spi Sen.Sipsp.Spi +#define sen_ipsp_sproto Sen.Sipsp.Sproto +#define sen_ipsp6_dst Sen.Sipsp6.Dst +#define sen_ipsp6_spi Sen.Sipsp6.Spi +#define sen_ipsp6_sproto Sen.Sipsp6.Sproto + +/* + * The "type" is really part of the address as far as the routing + * system is concerned. By using only one bit in the type field + * for each type, we sort-of make sure that different types of + * encapsulation addresses won't be matched against the wrong type. + * + */ + +#define SENT_IP4 0x0001 /* data is two struct in_addr */ +#define SENT_IPSP 0x0002 /* data as in IP4/6 plus SPI */ +#define SENT_IP6 0x0004 +#define SENT_IPSP6 0x0008 + +/* + * SENT_HDRLEN is the length of the "header" + * SENT_*_LEN are the lengths of various forms of sen_data + * SENT_*_OFF are the offsets in the sen_data array of various fields + */ + +#define SENT_HDRLEN (2 * sizeof(u_int8_t) + sizeof(u_int16_t)) + +#define SENT_IP4_SRCOFF (0) +#define SENT_IP4_DSTOFF (sizeof (struct in_addr)) + +#define SENT_IP6_SRCOFF (0) +#define SENT_IP6_DSTOFF (sizeof (struct in6_addr)) + +#define SENT_IP4_LEN 20 +#define SENT_IPSP_LEN 20 +#define SENT_IP6_LEN 44 +#define SENT_IPSP6_LEN 32 + +#define NOTIFY_SOFT_EXPIRE 0 /* Soft expiration of SA */ +#define NOTIFY_HARD_EXPIRE 1 /* Hard expiration of SA */ +#define NOTIFY_REQUEST_SA 2 /* Establish an SA */ + +#define NOTIFY_SATYPE_CONF 1 /* SA should do encryption */ +#define NOTIFY_SATYPE_AUTH 2 /* SA should do authentication */ +#define NOTIFY_SATYPE_TUNNEL 4 /* SA should use tunneling */ + +/* + * For encapsulation routes are possible not only for the destination + * address but also for the protocol, source and destination ports + * if available + */ + +struct route_enc { + struct rtentry *re_rt; + struct sockaddr_encap re_dst; +}; + +struct flow +{ + struct flow *flow_next; /* Next in flow chain */ + struct flow *flow_prev; /* Previous in flow chain */ + struct tdb *flow_sa; /* Pointer to the SA */ + union sockaddr_union flow_src; /* Source address */ + union sockaddr_union flow_srcmask; /* Source netmask */ + union sockaddr_union flow_dst; /* Destination address */ + union sockaddr_union flow_dstmask; /* Destination netmask */ + u_int8_t flow_proto; /* Transport protocol, if applicable */ + u_int8_t foo[3]; /* Alignment */ +}; + +struct tdb /* tunnel descriptor block */ +{ + struct tdb *tdb_hnext; /* Next in hash chain */ + struct tdb *tdb_onext; /* Next in output */ + struct tdb *tdb_inext; /* Previous in output */ + + struct xformsw *tdb_xform; /* Transformation to use */ + struct enc_xform *tdb_encalgxform; /* Encryption algorithm xform */ + struct auth_hash *tdb_authalgxform; /* Authentication algorithm xform */ + +#define TDBF_UNIQUE 0x00001 /* This should not be used by others */ +#define TDBF_TIMER 0x00002 /* Absolute expiration timer in use */ +#define TDBF_BYTES 0x00004 /* Check the byte counters */ +#define TDBF_ALLOCATIONS 0x00008 /* Check the flows counters */ +#define TDBF_INVALID 0x00010 /* This SPI is not valid yet/anymore */ +#define TDBF_FIRSTUSE 0x00020 /* Expire after first use */ +#define TDBF_HALFIV 0x00040 /* Use half-length IV (ESP old only) */ +#define TDBF_SOFT_TIMER 0x00080 /* Soft expiration */ +#define TDBF_SOFT_BYTES 0x00100 /* Soft expiration */ +#define TDBF_SOFT_ALLOCATIONS 0x00200 /* Soft expiration */ +#define TDBF_SOFT_FIRSTUSE 0x00400 /* Soft expiration */ +#define TDBF_PFS 0x00800 /* Ask for PFS from Key Mgmt. */ +#define TDBF_TUNNELING 0x01000 /* Force IP-IP encapsulation */ + u_int32_t tdb_flags; /* Flags related to this TDB */ + + TAILQ_ENTRY(tdb) tdb_expnext; /* Expiration cluster list link */ + TAILQ_ENTRY(tdb) tdb_explink; /* Expiration ordered list link */ + + u_int32_t tdb_exp_allocations; /* Expire after so many flows */ + u_int32_t tdb_soft_allocations; /* Expiration warning */ + u_int32_t tdb_cur_allocations; /* Total number of allocations */ + + u_int64_t tdb_exp_bytes; /* Expire after so many bytes passed */ + u_int64_t tdb_soft_bytes; /* Expiration warning */ + u_int64_t tdb_cur_bytes; /* Current count of bytes */ + + u_int64_t tdb_exp_timeout; /* When does the SPI expire */ + u_int64_t tdb_soft_timeout; /* Send a soft-expire warning */ + u_int64_t tdb_established; /* When was the SPI established */ + u_int64_t tdb_timeout; /* Next absolute expiration time. */ + + u_int64_t tdb_first_use; /* When was it first used */ + u_int64_t tdb_soft_first_use; /* Soft warning */ + u_int64_t tdb_exp_first_use; /* Expire if tdb_first_use + + * tdb_exp_first_use <= curtime */ + + u_int32_t tdb_spi; /* SPI */ + u_int16_t tdb_amxkeylen; /* AH-old only */ + u_int16_t tdb_ivlen; /* IV length */ + u_int8_t tdb_sproto; /* IPsec protocol */ + u_int8_t tdb_wnd; /* Replay window */ + u_int8_t tdb_satype; /* SA type (RFC2367, PF_KEY) */ + u_int8_t tdb_FILLER; /* Padding */ + + union sockaddr_union tdb_dst; /* Destination address for this SA */ + union sockaddr_union tdb_src; /* Source address for this SA */ + union sockaddr_union tdb_proxy; + + u_int8_t *tdb_key; /* Key material (schedules) */ + u_int8_t *tdb_ictx; /* Authentication contexts */ + u_int8_t *tdb_octx; + u_int8_t *tdb_srcid; /* Source ID for this SA */ + u_int8_t *tdb_dstid; /* Destination ID for this SA */ + u_int8_t *tdb_amxkey; /* AH-old only */ + + union + { + u_int8_t Iv[ESP_3DES_IVS]; /* That's enough space */ + u_int32_t Ivl; /* Make sure this is 4 bytes */ + u_int64_t Ivq; /* Make sure this is 8 bytes! */ + }IV; +#define tdb_iv IV.Iv +#define tdb_ivl IV.Ivl +#define tdb_ivq IV.Ivq + + u_int32_t tdb_rpl; /* Replay counter */ + u_int32_t tdb_bitmap; /* Used for replay sliding window */ + u_int32_t tdb_initial; /* Initial replay value */ + + u_int32_t tdb_epoch; /* Used by the kernfs interface */ + u_int16_t tdb_srcid_len; + u_int16_t tdb_dstid_len; + u_int16_t tdb_srcid_type; + u_int16_t tdb_dstid_type; + + caddr_t tdb_interface; + struct flow *tdb_flow; /* Which flows use this SA */ + + struct tdb *tdb_bind_out; /* Outgoing SA to use */ + TAILQ_HEAD(tdb_bind_head, tdb) tdb_bind_in; + TAILQ_ENTRY(tdb) tdb_bind_in_next; /* Refering Incoming SAs */ + TAILQ_HEAD(tdb_inp_head, inpcb) tdb_inp; +}; + +#ifndef __ECOS +union authctx_old { + MD5_CTX md5ctx; + SHA1_CTX sha1ctx; +}; + +union authctx { + MD5_CTX md5ctx; + SHA1_CTX sha1ctx; + RMD160_CTX rmd160ctx; +}; +#endif + +struct tdb_ident { + u_int32_t spi; + union sockaddr_union dst; + u_int8_t proto; +}; + +struct auth_hash { + int type; + char *name; + u_int16_t keysize; + u_int16_t hashsize; + u_int16_t ctxsize; + void (*Init)(void *); + void (*Update)(void *, u_int8_t *, u_int16_t); + void (*Final)(u_int8_t *, void *); +}; + +struct enc_xform { + int type; + char *name; + u_int16_t blocksize, ivsize; + u_int16_t minkey, maxkey; + u_int32_t ivmask; /* Or all possible modes, zero iv = 1 */ + void (*encrypt)(struct tdb *, u_int8_t *); + void (*decrypt)(struct tdb *, u_int8_t *); + void (*setkey)(u_int8_t **, u_int8_t *, int len); + void (*zerokey)(u_int8_t **); +}; + +struct ipsecinit +{ + u_int8_t *ii_enckey; + u_int8_t *ii_authkey; + u_int16_t ii_enckeylen; + u_int16_t ii_authkeylen; + u_int8_t ii_encalg; + u_int8_t ii_authalg; +}; + +struct xformsw +{ + u_short xf_type; /* Unique ID of xform */ + u_short xf_flags; /* flags (see below) */ + char *xf_name; /* human-readable name */ + int (*xf_attach)(void); /* called at config time */ + int (*xf_init)(struct tdb *, struct xformsw *, struct ipsecinit *); + int (*xf_zeroize)(struct tdb *); /* termination */ + struct mbuf *(*xf_input)(struct mbuf *, struct tdb *, int, int); /* input */ + int (*xf_output)(struct mbuf *, struct tdb *, struct mbuf **, int, int); /* output */ +}; + +/* xform IDs */ +#define XF_IP4 1 /* IP inside IP */ +#define XF_OLD_AH 2 /* RFCs 1828 & 1852 */ +#define XF_OLD_ESP 3 /* RFCs 1829 & 1851 */ +#define XF_NEW_AH 4 /* AH HMAC 96bits */ +#define XF_NEW_ESP 5 /* ESP + auth 96bits + replay counter */ +#define XF_TCPSIGNATURE 6 /* TCP MD5 Signature option, RFC 2358 */ + +/* xform attributes */ +#define XFT_AUTH 0x0001 +#define XFT_CONF 0x0100 + +#define IPSEC_ZEROES_SIZE 256 /* Larger than an IP6 extension hdr. */ +#define IPSEC_KERNFS_BUFSIZE 4096 + +#if BYTE_ORDER == LITTLE_ENDIAN +static __inline u_int64_t +htonq(u_int64_t q) +{ + register u_int32_t u, l; + u = q >> 32; + l = (u_int32_t) q; + + return htonl(u) | ((u_int64_t)htonl(l) << 32); +} + +#define ntohq(_x) htonq(_x) + +#elif BYTE_ORDER == BIG_ENDIAN + +#define htonq(_x) (_x) +#define ntohq(_x) htonq(_x) + +#else +#error "Please fix <machine/endian.h>" +#endif + +#ifdef _KERNEL + +/* + * Protects all tdb lists. + * Must at least be splsoftnet (note: do not use splsoftclock as it is + * special on some architectures, assuming it is always an spl lowering + * operation). + */ +#define spltdb splsoftnet + +extern int encdebug; +extern int ipsec_in_use; +extern u_int8_t hmac_ipad_buffer[64]; +extern u_int8_t hmac_opad_buffer[64]; + +extern TAILQ_HEAD(expclusterlist_head, tdb) expclusterlist; +extern TAILQ_HEAD(explist_head, tdb) explist; +extern struct xformsw xformsw[], *xformswNXFORMSW; + +/* Check if a given tdb has encryption, authentication and/or tunneling */ +#define TDB_ATTRIB(x) (((x)->tdb_encalgxform ? NOTIFY_SATYPE_CONF : 0)| \ + ((x)->tdb_authalgxform ? NOTIFY_SATYPE_AUTH : 0)) + +/* Traverse spi chain and get attributes */ + +#define SPI_CHAIN_ATTRIB(have, TDB_DIR, TDBP) do {\ + int s = spltdb(); \ + struct tdb *tmptdb = (TDBP); \ + \ + (have) = 0; \ + while (tmptdb && tmptdb->tdb_xform) { \ + if (tmptdb == NULL || tmptdb->tdb_flags & TDBF_INVALID) \ + break; \ + (have) |= TDB_ATTRIB(tmptdb); \ + tmptdb = tmptdb->TDB_DIR; \ + } \ + splx(s); \ +} while (0) + +/* Misc. */ +extern char *inet_ntoa4(struct in_addr); + +#ifdef INET6 +extern char *inet6_ntoa4(struct in6_addr); +#endif /* INET6 */ + +extern char *ipsp_address(union sockaddr_union); + +/* TDB management routines */ +extern void tdb_add_inp(struct tdb *tdb, struct inpcb *inp); +extern u_int32_t reserve_spi(u_int32_t, u_int32_t, union sockaddr_union *, + union sockaddr_union *, u_int8_t, int *); +extern struct tdb *gettdb(u_int32_t, union sockaddr_union *, u_int8_t); +extern void puttdb(struct tdb *); +extern void tdb_delete(struct tdb *, int, int); +extern int tdb_init(struct tdb *, u_int16_t, struct ipsecinit *); +extern void tdb_expiration(struct tdb *, int); +/* Flag values for the last argument of tdb_expiration(). */ +#define TDBEXP_EARLY 1 /* The tdb is likely to end up early. */ +#define TDBEXP_TIMEOUT 2 /* Maintain expiration timeout. */ +extern int tdb_walk(int (*)(struct tdb *, void *), void *); +extern void handle_expirations(void *); + +/* Flow management routines */ +extern struct flow *get_flow(void); +extern void put_flow(struct flow *, struct tdb *); +extern void delete_flow(struct flow *, struct tdb *); +extern struct flow *find_flow(union sockaddr_union *, union sockaddr_union *, + union sockaddr_union *, union sockaddr_union *, + u_int8_t, struct tdb *); +extern struct flow *find_global_flow(union sockaddr_union *, + union sockaddr_union *, + union sockaddr_union *, + union sockaddr_union *, u_int8_t); + +/* XF_IP4 */ +extern int ipe4_attach(void); +extern int ipe4_init(struct tdb *, struct xformsw *, struct ipsecinit *); +extern int ipe4_zeroize(struct tdb *); +extern int ipe4_output(struct mbuf *, struct tdb *, struct mbuf **, int, int); +extern void ipe4_input __P((struct mbuf *, ...)); +extern void ip4_input __P((struct mbuf *, ...)); + +/* XF_ETHERIP */ +extern int etherip_output(struct mbuf *, struct tdb *, struct mbuf **, + int, int); +extern void etherip_input __P((struct mbuf *, ...)); + +/* XF_OLD_AH */ +extern int ah_old_attach(void); +extern int ah_old_init(struct tdb *, struct xformsw *, struct ipsecinit *); +extern int ah_old_zeroize(struct tdb *); +extern int ah_old_output(struct mbuf *, struct tdb *, struct mbuf **, + int, int); +extern struct mbuf *ah_old_input(struct mbuf *, struct tdb *, int, int); + +/* XF_NEW_AH */ +extern int ah_new_attach(void); +extern int ah_new_init(struct tdb *, struct xformsw *, struct ipsecinit *); +extern int ah_new_zeroize(struct tdb *); +extern int ah_new_output(struct mbuf *, struct tdb *, struct mbuf **, + int, int); +extern struct mbuf *ah_new_input(struct mbuf *, struct tdb *, int, int); + +/* XF_OLD_ESP */ +extern int esp_old_attach(void); +extern int esp_old_init(struct tdb *, struct xformsw *, struct ipsecinit *); +extern int esp_old_zeroize(struct tdb *); +extern int esp_old_output(struct mbuf *, struct tdb *, struct mbuf **, + int, int); +extern struct mbuf *esp_old_input(struct mbuf *, struct tdb *, int, int); + +/* XF_NEW_ESP */ +extern int esp_new_attach(void); +extern int esp_new_init(struct tdb *, struct xformsw *, struct ipsecinit *); +extern int esp_new_zeroize(struct tdb *); +extern int esp_new_output(struct mbuf *, struct tdb *, struct mbuf **, + int, int); +extern struct mbuf *esp_new_input(struct mbuf *, struct tdb *, int, int); + +/* XF_TCPSIGNATURE */ +extern int tcp_signature_tdb_attach __P((void)); +extern int tcp_signature_tdb_init __P((struct tdb *, struct xformsw *, + struct ipsecinit *)); +extern int tcp_signature_tdb_zeroize __P((struct tdb *)); +extern struct mbuf *tcp_signature_tdb_input __P((struct mbuf *, struct tdb *)); +extern int tcp_signature_tdb_output __P((struct mbuf *, struct tdb *, + struct mbuf **)); + +/* Padding */ +extern caddr_t m_pad(struct mbuf *, int, int); + +/* Replay window */ +extern int checkreplaywindow32(u_int32_t, u_int32_t, u_int32_t *, u_int32_t, + u_int32_t *); + +extern unsigned char ipseczeroes[]; +#endif /* _KERNEL */ +#endif /* _NETINET_IPSP_H_ */
