#ifndef __VPNOPTIONS_H__
#define __VPNOPTIONS_H__
#ifndef DAEMON_NAME
#define DAEMON_NAME "vpnd"
#endif
#define SERVER_TYPE_PPP 1
#define SERVER_TYPE_IPSEC 2
#define OPT_STR_LEN 256
#define MAXARG 100
#define DIR_KEXT "/System/Library/Extensions/"
#define DIR_LOGS "/var/log/ppp/"
#define PATH_PPPD "/usr/sbin/pppd"
#define PPPD_PRGM "pppd"
#define PATH_VPND "/usr/sbin/vpnd"
#define VPND_PRGM "vpnd"
#define OPT_COMM_IDLETIMER_DEF 0 // no idle timer
#define OPT_COMM_SESSIONTIMER_DEF 0 // no session timer
#define OPT_VALUE 0xff
#define OPT_HEX 0x100
#define OPT_NOARG 0x200
#define OPT_OR 0x400
#define OPT_INC 0x800
#define OPT_A2OR 0x800
#define OPT_PRIV 0x1000
#define OPT_STATIC 0x2000
#define OPT_LLIMIT 0x4000
#define OPT_ULIMIT 0x8000
#define OPT_LIMITS (OPT_LLIMIT|OPT_ULIMIT)
#define OPT_ZEROOK 0x10000
#define OPT_HIDE 0x10000
#define OPT_A2LIST 0x10000
#define OPT_A2CLRB 0x10000
#define OPT_NOINCR 0x20000
#define OPT_ZEROINF 0x40000
#define OPT_PRIO 0x80000
#define OPT_PRIOSUB 0x100000
#define OPT_ALIAS 0x200000
#define OPT_A2COPY 0x400000
#define OPT_ENABLE 0x800000
#define OPT_A2CLR 0x1000000
#define OPT_PRIVFIX 0x2000000
#define OPT_INITONLY 0x4000000
#define OPT_DEVEQUIV 0x8000000
#define OPT_DEVNAM (OPT_INITONLY | OPT_DEVEQUIV)
#define OPT_A2PRINTER 0x10000000
#define OPT_A2STRVAL 0x20000000
#define OPT_NOPRINT 0x40000000
#define OPT_VAL(x) ((x) & OPT_VALUE)
#define OPRIO_DEFAULT 0
#define OPRIO_CFGFILE 1
#define OPRIO_CMDLINE 2
#define OPRIO_SECFILE 3
#define OPRIO_ROOT 100
#define OPT_LCP_ACCOMP_DEF 1 // address and control fields compression activated
#define OPT_LCP_PCOMP_DEF 1 // protocol field compression activated
#define OPT_LCP_RCACCM_DEF 0 // default asyncmap value
#define OPT_LCP_TXACCM_DEF 0 // default asyncmap value
#define OPT_LCP_MRU_DEF 1500
#define OPT_LCP_MRU_PPPoE_DEF 1492
#define OPT_LCP_MRU_PPTP_DEF 1500
#define OPT_LCP_MRU_L2TP_DEF 1500
#define OPT_LCP_MTU_DEF 1500
#define OPT_LCP_MTU_PPPoE_DEF 1492
#define OPT_LCP_MTU_PPTP_DEF 1448
#define OPT_LCP_MTU_L2TP_DEF 1280
#define OPT_LCP_ECHOINTERVAL_DEF 10
#define OPT_LCP_ECHOFAILURE_DEF 4
#define OPT_IPCP_HDRCOMP_DEF 1 // tcp vj compression activated
enum opt_type {
o_special_noarg = 0,
o_special = 1,
o_bool,
o_int,
o_uint32,
o_string,
o_wild
};
typedef struct {
char *name;
enum opt_type type;
void *addr;
char *description;
unsigned int flags;
void *addr2;
int upper_limit;
int lower_limit;
const char *source;
short int priority;
short int winner;
void *addr3;
} option_t;
#define LB_DEFAULT_PORT 4112
struct vpn_params {
int debug;
int log_verbose;
int daemonize;
SCDynamicStoreRef storeRef;
CFStringRef serverIDRef;
CFPropertyListRef serverRef;
char *server_id;
u_int32_t max_sessions;
char log_path[MAXPATHLEN];
u_int32_t next_arg_index;
char *exec_args[MAXARG];
int server_type;
CFStringRef serverSubTypeRef;
u_int32_t server_subtype;
char *plugin_path;
int lb_enable;
u_int16_t lb_port; struct in_addr lb_cluster_address; struct in_addr lb_redirect_address; char lb_interface[IFNAMSIZ+1];
};
int process_options(struct vpn_params *options, int argc, char *argv[]);
CFArrayRef get_active_servers(struct vpn_params *params);
int check_conflicts(struct vpn_params *params);
int process_prefs(struct vpn_params *params);
int publish_state(struct vpn_params* params);
int kill_orphans(struct vpn_params* params);
void open_dynamic_store(struct vpn_params* params);
void close_dynamic_store(struct vpn_params* params);
int add_builtin_plugin(struct vpn_params* params, void *channel);
int plugin_exists(const char *inPath);
char* validate_ip_string(const char *inIPString, char *outIPString, size_t outSize);
void addparam(char **arg, u_int32_t *argi, char *param);
void addintparam(char **arg, u_int32_t *argi, char *param, u_int32_t val);
void addstrparam(char **arg, u_int32_t *argi, char *param, char *val);
#endif