#ifndef _LOCALCONF_H
#define _LOCALCONF_H
#if !(TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
#include <vproc.h>
#endif // !(TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
#include <dispatch/dispatch.h>
#if __has_include(<nw/private.h>)
#include <nw/private.h>
#else
#include <network/nat64.h>
#endif
#include "vmbuf.h"
#include "ipsec_doi.h"
#define LC_DEFAULT_CF SYSCONFDIR "/racoon.conf"
#define LC_PATHTYPE_INCLUDE 0
#define LC_PATHTYPE_PSK 1
#define LC_PATHTYPE_CERT 2
#define LC_PATHTYPE_PIDFILE 3
#define LC_PATHTYPE_LOGFILE 4
#define LC_PATHTYPE_MAX 5
#define LC_DEFAULT_PAD_MAXSIZE 20
#define LC_DEFAULT_PAD_RANDOM TRUE
#define LC_DEFAULT_PAD_RANDOMLEN FALSE
#define LC_DEFAULT_PAD_STRICT FALSE
#define LC_DEFAULT_PAD_EXCLTAIL TRUE
#define LC_DEFAULT_RETRY_COUNTER 5
#define LC_DEFAULT_RETRY_INTERVAL 2
#define LC_DEFAULT_COUNT_PERSEND 1
#define LC_DEFAULT_RETRY_CHECKPH1 30
#define LC_DEFAULT_WAIT_PH2COMPLETE 30
#define LC_DEFAULT_NATT_KA_INTERVAL 20
#define LC_DEFAULT_SECRETSIZE 16
#define LC_GSSENC_UTF16LE 0
#define LC_GSSENC_LATIN1 1
#define LC_GSSENC_MAX 2
#define LC_AUTOEXITSTATE_SET 0x00000001
#define LC_AUTOEXITSTATE_CLIENT 0x00000010
#define LC_AUTOEXITSTATE_ENABLED 0x00000011
struct vpnctl_socket_elem {
LIST_ENTRY(vpnctl_socket_elem) chain;
int sock;
dispatch_source_t source;
uint32_t read_bytes_len;
uint32_t pending_bytes_len;
uint8_t *buffer;
LIST_HEAD(_bound_addrs, bound_addr) bound_addresses;
};
struct bound_addr {
LIST_ENTRY(bound_addr) chain;
u_int32_t address;
nw_nat64_prefix_t nat64_prefix;
vchar_t *user_id;
vchar_t *user_pw;
vchar_t *version;
};
struct redirect {
LIST_ENTRY(redirect) chain;
u_int32_t cluster_address;
u_int32_t redirect_address;
u_int16_t force;
};
struct saved_msg_elem {
TAILQ_ENTRY(saved_msg_elem) chain;
void* msg;
};
struct localconf {
char *racoon_conf;
uid_t uid;
gid_t gid;
u_int16_t port_isakmp;
u_int16_t port_isakmp_natt;
u_int16_t port_admin;
int default_af;
int sock_vpncontrol;
int sock_pfkey;
int rtsock;
dispatch_source_t vpncontrol_source;
dispatch_source_t pfkey_source;
dispatch_source_t rt_source;
LIST_HEAD(_vpnctl_socket_elem_, vpnctl_socket_elem) vpnctl_comm_socks;
LIST_HEAD(_redirect_, redirect) redirect_addresses;
int auto_exit_state;
int auto_exit_delay;
schedule_ref auto_exit_sched;
TAILQ_HEAD(_saved_msg_elem, saved_msg_elem) saved_msg_queue;
int autograbaddr;
struct myaddrs *myaddrs;
char *logfile_param;
char *pathinfo[LC_PATHTYPE_MAX];
vchar_t *ident[IDTYPE_MAX];
int pad_random;
int pad_randomlen;
int pad_maxsize;
int pad_strict;
int pad_excltail;
int retry_counter;
int retry_interval;
int count_persend;
int retry_checkph1;
int wait_ph2complete;
int natt_ka_interval;
vchar_t *ext_nat_id;
int secret_size;
int strict_address;
int complex_bundle;
#if !(TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
vproc_transaction_t vt;
#endif // !(TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
};
extern struct localconf *lcconf;
extern void initlcconf(void);
extern void flushlcconf(void);
extern void savelcconf(void);
extern void restorelcconf(void);
extern vchar_t *getpskbyname(vchar_t *);
extern vchar_t *getpskbyaddr(struct sockaddr_storage *);
#if HAVE_KEYCHAIN
extern vchar_t *getpskfromkeychain(const char *, u_int8_t, int, vchar_t *);
#endif
extern void getpathname(char *, int, int, const char *);
extern int sittype2doi(int);
extern int doitype2doi(int);
extern vchar_t *getpsk(const char *, const int);
#endif