#ifndef _INET_IPSECAH_H
#define _INET_IPSECAH_H
#include <inet/ip.h>
#include <inet/ipdrop.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/note.h>
#ifdef _KERNEL
typedef struct ipsecahparam_s {
uint_t ipsecah_param_min;
uint_t ipsecah_param_max;
uint_t ipsecah_param_value;
char *ipsecah_param_name;
} ipsecahparam_t;
typedef struct ah_kstats_s
{
kstat_named_t ah_stat_num_aalgs;
kstat_named_t ah_stat_good_auth;
kstat_named_t ah_stat_bad_auth;
kstat_named_t ah_stat_replay_failures;
kstat_named_t ah_stat_replay_early_failures;
kstat_named_t ah_stat_keysock_in;
kstat_named_t ah_stat_out_requests;
kstat_named_t ah_stat_acquire_requests;
kstat_named_t ah_stat_bytes_expired;
kstat_named_t ah_stat_out_discards;
kstat_named_t ah_stat_crypto_sync;
kstat_named_t ah_stat_crypto_async;
kstat_named_t ah_stat_crypto_failures;
} ah_kstats_t;
#define AH_BUMP_STAT(ahstack, x) \
do { \
if (ahstack->ah_kstats != NULL) \
(ahstack->ah_kstats->ah_stat_ ## x).value.ui64++; \
_NOTE(CONSTCOND) \
} while (0)
#define AH_DEBUMP_STAT(ahstack, x) \
do { \
if (ahstack->ah_kstats != NULL) \
(ahstack->ah_kstats->ah_stat_ ## x).value.ui64--; \
_NOTE(CONSTCOND) \
} while (0)
struct ipsecah_stack {
netstack_t *ipsecah_netstack;
caddr_t ipsecah_g_nd;
ipsecahparam_t *ipsecah_params;
kmutex_t ipsecah_param_lock;
sadbp_t ah_sadb;
ipdropper_t ah_dropper;
kstat_t *ah_ksp;
ah_kstats_t *ah_kstats;
queue_t *ah_pfkey_q;
timeout_id_t ah_event;
};
typedef struct ipsecah_stack ipsecah_stack_t;
#define ipsecah_debug ipsecah_params[0].ipsecah_param_value
#define ipsecah_age_interval ipsecah_params[1].ipsecah_param_value
#define ipsecah_age_int_max ipsecah_params[1].ipsecah_param_max
#define ipsecah_reap_delay ipsecah_params[2].ipsecah_param_value
#define ipsecah_replay_size ipsecah_params[3].ipsecah_param_value
#define ipsecah_acquire_timeout ipsecah_params[4].ipsecah_param_value
#define ipsecah_larval_timeout ipsecah_params[5].ipsecah_param_value
#define ipsecah_default_soft_bytes ipsecah_params[6].ipsecah_param_value
#define ipsecah_default_hard_bytes ipsecah_params[7].ipsecah_param_value
#define ipsecah_default_soft_addtime ipsecah_params[8].ipsecah_param_value
#define ipsecah_default_hard_addtime ipsecah_params[9].ipsecah_param_value
#define ipsecah_default_soft_usetime ipsecah_params[10].ipsecah_param_value
#define ipsecah_default_hard_usetime ipsecah_params[11].ipsecah_param_value
#define ipsecah_log_unknown_spi ipsecah_params[12].ipsecah_param_value
#endif
typedef struct ah {
uint8_t ah_nexthdr;
uint8_t ah_length;
uint16_t ah_reserved;
uint32_t ah_spi;
uint32_t ah_replay;
} ah_t;
#define AH_BASELEN 12
#define AH_TOTAL_LEN(ah) (((ah)->ah_length << 2) + AH_BASELEN - \
sizeof ((ah)->ah_replay))
typedef struct ahold {
uint8_t ah_nexthdr;
uint8_t ah_length;
uint16_t ah_reserved;
uint32_t ah_spi;
} ahold_t;
#define AHOLD_BASELEN 8
#define AHOLD_TOTAL_LEN(ah) (((ah)->ah_length << 2) + AH_BASELEN)
#ifdef __cplusplus
}
#endif
#endif