#ifndef __PPPD_H__
#define __PPPD_H__
#include <stdio.h>
#include <limits.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/time.h>
#include <net/ppp_defs.h>
#if defined(__STDC__)
#include <stdarg.h>
#define __V(x) x
#else
#include <varargs.h>
#define __V(x) (va_alist) va_dcl
#define const
#define volatile
#endif
#ifdef INET6
#include "eui64.h"
#endif
#ifdef HAVE_MULTILINK
#include "tdb.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define NUM_PPP 1
#define MAXWORDLEN 1024
#define MAXARGS 1
#define MAXNAMELEN 256
#define MAXSECRETLEN 256
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN MAXNAMELEN
#endif
#if (defined(SVR4) && (defined(SNI) || defined(__USLC__)))
#define SIFUPFIRST (1)
#else
#define SIFUPFIRST (0)
#endif
#if (defined(__linux__) || \
(defined(SVR4) && (defined(SNI) || defined(__USLC__))))
#define SIF6UPFIRST (1)
#else
#define SIF6UPFIRST (0)
#endif
typedef unsigned char bool;
enum opt_type {
o_special_noarg = 0,
o_special = 1,
o_bool,
o_int,
o_uint32,
o_string
};
typedef struct {
char *name;
enum opt_type type;
void *addr;
char *description;
int flags;
void *addr2;
int upper_limit;
int lower_limit;
} option_t;
#define OPT_VALUE 0xff
#define OPT_HEX 0x100
#define OPT_NOARG 0x200
#define OPT_OR 0x400
#define OPT_INC 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_NOINCR 0x20000
#define OPT_ZEROINF 0x40000
#define OPT_DISABLE 0x80000
#define OPT_A2INFO 0x100000
#define OPT_A2COPY 0x200000
#define OPT_ENABLE 0x400000
#define OPT_PRIVFIX 0x800000
#define OPT_PREPASS 0x1000000
#define OPT_INITONLY 0x2000000
#define OPT_DEVEQUIV 0x4000000
#define OPT_DEVNAM (OPT_PREPASS | OPT_INITONLY | OPT_DEVEQUIV)
#define OPT_VAL(x) ((x) & OPT_VALUE)
#ifndef GIDSET_TYPE
#define GIDSET_TYPE gid_t
#endif
struct permitted_ip {
int permit;
u_int32_t base;
u_int32_t mask;
};
struct pppd_stats {
ppp_counter_t bytes_in;
ppp_counter_t bytes_out;
ppp_counter_t pkts_in;
ppp_counter_t pkts_out;
};
struct wordlist {
struct wordlist *next;
char *word;
};
extern bool hungup;
extern int ifunit;
extern char ifname[32];
extern int ttyfd;
extern char hostname[];
extern u_char outpacket_buf[];
extern int phase;
extern int baud_rate;
extern char *progname;
extern int redirect_stderr;
extern char peer_authname[];
extern bool privileged;
extern bool need_holdoff;
extern char **script_env;
extern bool detached;
extern GIDSET_TYPE groups[NGROUPS_MAX];
extern int ngroups;
extern struct pppd_stats link_stats;
extern bool link_stats_valid;
extern int link_connect_time;
extern int using_pty;
extern int log_to_fd;
extern bool log_to_file;
extern bool log_to_specific_fd;
extern char *no_ppp_msg;
extern volatile int status;
extern int devnam_fixed;
extern int unsuccess;
extern int do_callback;
extern int doing_callback;
extern u_char nak_buffer[];
extern u_char inpacket_buf[];
extern bool direct_tty;
extern int absmax_mru;
extern int absmax_mtu;
extern int pty_slave;
extern bool early_log;
#define CALLBACK_DIALIN 1
#define CALLBACK_DIALOUT 2
extern int debug;
extern int kdebugflag;
extern int default_device;
extern char devnam[MAXPATHLEN];
extern char ppp_devnam[MAXPATHLEN];
extern int crtscts;
extern bool modem;
extern int inspeed;
extern u_int32_t netmask;
extern bool lockflag;
extern bool nodetach;
extern bool updetach;
extern char *initializer;
extern char *connect_script;
extern char *disconnect_script;
extern char *welcomer;
extern char *ptycommand;
extern int maxconnect;
extern char user[MAXNAMELEN];
extern char passwd[MAXSECRETLEN];
extern bool auth_required;
extern bool persist;
extern bool uselogin;
extern char our_name[MAXNAMELEN];
extern char remote_name[MAXNAMELEN];
extern bool explicit_remote;
extern bool demand;
extern char *ipparam;
extern bool cryptpap;
extern int idle_time_limit;
extern int holdoff;
extern bool holdoff_specified;
extern bool notty;
extern char *pty_socket;
extern char *record_file;
extern bool sync_serial;
extern int maxfail;
extern char linkname[MAXPATHLEN];
extern bool tune_kernel;
extern int connect_delay;
extern int max_data_rate;
extern int req_unit;
extern bool multilink;
extern bool noendpoint;
extern char *bundle_name;
#ifdef HAVE_MULTILINK
extern TDB_CONTEXT *pppdb;
extern char db_key[];
#endif
#ifdef PPP_FILTER
extern struct bpf_program pass_filter;
extern struct bpf_program active_filter;
#endif
#ifdef MSLANMAN
extern bool ms_lanman;
#endif
extern char *current_option;
extern bool privileged_option;
extern char *option_source;
extern int option_line;
extern bool already_ppp;
extern bool prepass;
extern struct stat devstat;
extern bool peer_nak_auth;
extern u_short nak_auth_orig;
extern u_short nak_auth_proto;
extern bool unsolicited_nak_auth;
extern u_short unsolicit_auth_proto;
extern bool peer_reject_auth;
extern u_short reject_auth_proto;
extern bool rejected_peers_auth;
extern u_short rejected_auth_proto;
extern bool naked_peers_auth;
extern u_short naked_auth_orig;
extern u_short naked_auth_proto;
#define PHASE_DEAD 0
#define PHASE_INITIALIZE 1
#define PHASE_INITIALIZED 2
#define PHASE_SERIALCONN 3
#define PHASE_CONNECTED 4
#define PHASE_DORMANT 5
#define PHASE_ESTABLISH 6
#define PHASE_AUTHENTICATE 7
#define PHASE_CALLBACK 8
#define PHASE_NETWORK 9
#define PHASE_RUNNING 10
#define PHASE_TERMINATE 11
#define PHASE_DISCONNECT 12
#define PHASE_HOLDOFF 13
#define PHASE_CALLINGBACK 14
#define PHASE_EXIT 15
#define PHASE__NAMES \
"Dead", "Initialize", "Initialized", "Serialconn", "Connected", \
"Dormant", "Establish", "Authenticate", "Callback", "Network", \
"Running", "Terminate", "Disconnect", "Holdoff", "Callingback", \
"Exit"
struct protent {
u_short protocol;
void (*init) __P((int unit));
void (*input) __P((int unit, u_char *pkt, int len));
void (*protrej) __P((int unit));
void (*lowerup) __P((int unit));
void (*lowerdown) __P((int unit));
void (*open) __P((int unit));
void (*close) __P((int unit, char *reason));
int (*printpkt) __P((u_char *pkt, int len,
void (*printer) __P((void *, const char *, ...)),
void *arg));
void (*datainput) __P((int unit, u_char *pkt, int len));
bool enabled_flag;
char *name;
char *data_name;
option_t *options;
void (*check_options) __P((void));
int (*demand_conf) __P((int unit));
int (*active_pkt) __P((u_char *pkt, int len));
void (*print_stat) __P((int unit, FILE *strptr));
};
struct option_info {
bool priv;
char *source;
int line;
};
extern struct option_info devnam_info;
extern struct option_info initializer_info;
extern struct option_info connect_script_info;
extern struct option_info disconnect_script_info;
extern struct option_info welcomer_info;
extern struct option_info ptycommand_info;
extern struct option_info ipsrc_info;
extern struct option_info ipdst_info;
extern struct option_info speed_info;
extern struct protent *protocols[];
extern void set_ifunit __P((int));
extern void detach __P((void));
extern void die __P((int));
extern void quit __P((void));
extern void novm __P((char *));
extern void timeout __P((void (*func)(void *), void *arg, int t));
extern void untimeout __P((void (*func)(void *), void *arg));
extern pid_t run_program __P((char *prog, char **args, int must_exist,
void (*done)(void *, int), void *arg));
extern void reopen_log __P((void));
extern void update_link_stats __P((int));
extern void script_setenv __P((const char *, const char *, int));
extern void script_unsetenv __P((const char *));
extern const char *script_getenv __P((const char *var));
extern void new_phase __P((int));
extern void print_ncpstate __P((int, FILE *));
extern const char *protocol_name __P((int proto));
extern const char *phase_name __P((int phaseval));
extern void log_packet __P((u_char *, int, const char *, int));
extern void print_string __P((char *, int, void (*)(void *, const char *, ...),
void *));
extern int slprintf __P((char *, int, const char *, ...));
extern int vslprintf __P((char *, int, const char *, va_list));
extern size_t strlcpy __P((char *, const char *, size_t));
extern size_t strlcat __P((char *, const char *, size_t));
extern void dbglog __P((const char *, ...));
extern void info __P((const char *, ...));
extern void notice __P((const char *, ...));
extern void warn __P((const char *, ...));
extern void error __P((const char *, ...));
extern void fatal __P((const char *, ...));
extern const char *code_name __P((int code, int shortflag));
extern int flprintf __P((FILE *, const char *, ...));
extern size_t strllen __P((const char *, size_t));
extern const char *signal_name __P((int signum));
extern void link_required __P((int));
extern void link_terminated __P((int));
extern void link_down __P((int));
extern void link_established __P((int));
extern void start_networks __P((void));
extern void np_up __P((int, int));
extern void np_down __P((int, int));
extern void np_finished __P((int, int));
extern void auth_peer_fail __P((int, int));
extern void auth_peer_success __P((int, int, char *, int));
extern void auth_withpeer_fail __P((int, int));
extern void auth_withpeer_success __P((int, int));
extern void auth_check_options __P((void));
extern void auth_reset __P((int));
extern int check_passwd __P((int, char *, int, char *, int, char **));
extern int get_secret __P((int, char *, char *, char *, int *, int));
extern int auth_ip_addr __P((int, u_int32_t));
extern int bad_ip_adrs __P((u_int32_t));
extern void demand_conf __P((void));
extern void demand_block __P((void));
extern void demand_unblock __P((void));
extern void demand_discard __P((void));
extern void demand_rexmit __P((int));
extern int loop_chars __P((unsigned char *, int));
extern int loop_frame __P((unsigned char *, int));
extern void mp_check_options __P((void));
extern int mp_join_bundle __P((void));
extern void sys_init __P((bool));
extern void sys_cleanup __P((void));
extern int sys_check_options __P((void));
extern void sys_options __P((void));
extern void sys_close __P((void));
extern int ppp_available __P((void));
extern int get_pty __P((int *, int *, char *, int));
extern int open_ppp_loopback __P((void));
extern int establish_ppp __P((int));
extern void restore_loop __P((void));
extern void disestablish_ppp __P((int));
extern void make_new_bundle __P((int, int, int, int));
extern int bundle_attach __P((int));
extern void cfg_bundle __P((int, int, int, int));
extern void clean_check __P((void));
extern void set_up_tty __P((int, int));
extern void restore_tty __P((int));
extern void setdtr __P((int, int));
extern void output __P((int, u_char *, int));
extern void wait_input __P((struct timeval *));
extern void add_fd __P((int));
extern void remove_fd __P((int));
extern int read_packet __P((u_char *));
extern int get_loop_output __P((void));
extern void ppp_send_config __P((int, int, u_int32_t, int, int));
extern void ppp_set_xaccm __P((int, ext_accm));
extern void ppp_recv_config __P((int, int, u_int32_t, int, int));
#ifdef NEGOTIATE_FCS
extern void ppp_send_fcs __P((int unit, int fcstype));
extern void ppp_recv_fcs __P((int unit, int fcstype));
#endif
#ifdef MUX_FRAME
extern void ppp_send_muxoption __P((int ,u_int32_t));
extern void ppp_recv_muxoption __P((int ,u_int32_t));
#endif
extern int ccp_test __P((int, u_char *, int, int));
#ifdef COMP_TUNE
extern void ccp_tune __P((int, int));
#endif
extern void ccp_flags_set __P((int, int, int));
extern int ccp_fatal_error __P((int));
extern int get_idle_time __P((int, struct ppp_idle *));
extern int get_ppp_stats __P((int, struct pppd_stats *));
extern int sifvjcomp __P((int, int, int, int));
extern int sifup __P((int));
extern int sifnpmode __P((int u, int proto, enum NPmode mode));
extern int sifdown __P((int));
extern int sifaddr __P((int, u_int32_t, u_int32_t, u_int32_t));
extern int cifaddr __P((int, u_int32_t, u_int32_t));
extern void sys_block_proto __P((uint16_t));
extern void sys_unblock_proto __P((uint16_t));
#ifdef INET6
extern int sif6addr __P((int, eui64_t, eui64_t));
extern int cif6addr __P((int, eui64_t, eui64_t));
#endif
extern int sifdefaultroute __P((int, u_int32_t, u_int32_t));
extern int cifdefaultroute __P((int, u_int32_t, u_int32_t));
extern int sifproxyarp __P((int unit, u_int32_t addr, int flag));
extern int cifproxyarp __P((int unit, u_int32_t addr));
extern u_int32_t GetMask __P((u_int32_t));
extern int lock __P((char *));
extern int relock __P((int));
extern void unlock __P((void));
extern void logwtmp __P((const char *, const char *, const char *));
extern int get_host_seed __P((void));
extern int have_route_to __P((u_int32_t));
#ifdef PPP_FILTER
extern int set_filters __P((struct bpf_program *pass,
struct bpf_program *active));
#endif
#ifdef IPX_CHANGE
extern int sipxfaddr __P((int, unsigned long, unsigned char *));
extern int cipxfaddr __P((int));
#endif
extern int get_if_hwaddr __P((u_char *addr, int msize, char *name));
extern int get_first_hwaddr __P((u_char *addr, int msize));
#if defined(INET6) && defined(SOL2)
extern int ether_to_eui64 __P((eui64_t *p_eui64));
extern int sif6up __P((int unit));
extern int sif6down __P((int unit));
extern int sif6mtu __P((int mtu));
extern int sif6flags __P((u_int32_t flags, int set));
#endif
#if defined(INET6) && !defined(SOL2)
#define sif6up sifup
#endif
extern int sifmtu __P((int mtu));
extern int siflags __P((u_int32_t flags, int set));
extern void sys_ifname __P((void));
extern void sys_print_state __P((FILE *strptr));
extern int sys_extra_fd __P((void));
extern int parse_args __P((int argc, char **argv));
extern int options_from_file __P((char *filename, bool must_exist,
bool check_prot, bool privileged));
extern int options_from_user __P((void));
extern int options_for_tty __P((void));
extern int options_from_list __P((struct wordlist *, bool privileged));
extern int getword __P((FILE *f, char *word, int *newlinep, char *filename));
extern void option_error __P((char *fmt, ...));
extern int int_option __P((char *, int *));
extern void add_options __P((option_t *));
extern int parse_dotted_ip __P((char *, u_int32_t *));
extern option_t *remove_option __P((char *));
extern void save_source __P((struct option_info *));
extern void set_source __P((struct option_info *));
extern const char *name_source __P((struct option_info *));
extern int (*new_phase_hook) __P((int new, int old));
extern int (*idle_time_hook) __P((struct ppp_idle *));
extern int (*holdoff_hook) __P((void));
extern int (*pap_check_hook) __P((void));
extern int (*pap_auth_hook) __P((char *user, char *passwd, char **msgp,
struct wordlist **paddrs, struct wordlist **popts));
extern void (*pap_logout_hook) __P((void));
extern int (*pap_passwd_hook) __P((char *user, char *passwd));
extern void (*ip_up_hook) __P((void));
extern void (*ip_down_hook) __P((void));
extern int (*check_options_hook) __P((uid_t uid));
extern int (*updown_script_hook) __P((const char ***argsp));
struct strbuf;
extern int (*sys_read_packet_hook) __P((int retv, struct strbuf *ctrl,
struct strbuf *data, int flags));
extern void (*device_pipe_hook) __P((int pipefd));
#define GETCHAR(c, cp) { \
(c) = *(cp)++; \
}
#define PUTCHAR(c, cp) { \
*(cp)++ = (u_char) (c); \
}
#define GETSHORT(s, cp) { \
(s) = *(cp)++ << 8; \
(s) |= *(cp)++; \
}
#define PUTSHORT(s, cp) { \
*(cp)++ = (u_char) ((s) >> 8); \
*(cp)++ = (u_char) (s); \
}
#define GETLONG(l, cp) { \
(l) = *(cp)++ << 8; \
(l) |= *(cp)++; (l) <<= 8; \
(l) |= *(cp)++; (l) <<= 8; \
(l) |= *(cp)++; \
}
#define PUTLONG(l, cp) { \
*(cp)++ = (u_char) ((l) >> 24); \
*(cp)++ = (u_char) ((l) >> 16); \
*(cp)++ = (u_char) ((l) >> 8); \
*(cp)++ = (u_char) (l); \
}
#define GETNLONG(l, cp) { \
u_int32_t getnlong_val; \
getnlong_val = *(cp)++ << 8; \
getnlong_val |= *(cp)++; getnlong_val <<= 8; \
getnlong_val |= *(cp)++; getnlong_val <<= 8; \
getnlong_val |= *(cp)++; \
(l) = htonl(getnlong_val); \
}
#define PUTNLONG(l, cp) { \
u_int32_t putnlong_val = ntohl(l); \
*(cp)++ = (u_char) (putnlong_val >> 24); \
*(cp)++ = (u_char) (putnlong_val >> 16); \
*(cp)++ = (u_char) (putnlong_val >> 8); \
*(cp)++ = (u_char) putnlong_val; \
}
#define INCPTR(n, cp) ((cp) += (n))
#define DECPTR(n, cp) ((cp) -= (n))
#define TIMEOUT(r, f, t) timeout((r), (f), (t))
#define UNTIMEOUT(r, f) untimeout((r), (f))
#ifndef SOL2
#define BCOPY(s, d, l) memcpy(d, s, l)
#define BZERO(s, n) memset(s, 0, n)
#else
#include <strings.h>
#define BCOPY bcopy
#define BZERO bzero
#endif
#define PRINTMSG(m, l) { info("Remote message: %0.*v", l, m); }
#define MAKEHEADER(p, t) { \
PUTCHAR(PPP_ALLSTATIONS, p); \
PUTCHAR(PPP_UI, p); \
PUTSHORT(t, p); }
#define EXIT_OK 0
#define EXIT_FATAL_ERROR 1
#define EXIT_OPTION_ERROR 2
#define EXIT_NOT_ROOT 3
#define EXIT_NO_KERNEL_SUPPORT 4
#define EXIT_USER_REQUEST 5
#define EXIT_LOCK_FAILED 6
#define EXIT_OPEN_FAILED 7
#define EXIT_CONNECT_FAILED 8
#define EXIT_PTYCMD_FAILED 9
#define EXIT_NEGOTIATION_FAILED 10
#define EXIT_PEER_AUTH_FAILED 11
#define EXIT_IDLE_TIMEOUT 12
#define EXIT_CONNECT_TIME 13
#define EXIT_CALLBACK 14
#define EXIT_PEER_DEAD 15
#define EXIT_HANGUP 16
#define EXIT_LOOPBACK 17
#define EXIT_INIT_FAILED 18
#define EXIT_AUTH_TOPEER_FAILED 19
#define MAXLEVELMINSIZE 100
#ifdef DEBUGALL
#define DEBUGMAIN 1
#define DEBUGSYS 1
#define DEBUGLCP 1
#define DEBUGIPCP 1
#define DEBUGIPV6CP 1
#define DEBUGCHAP 1
#define DEBUGIPXCP 1
#define LOG_PPP LOG_LOCAL2
#endif
#ifndef LOG_PPP
#define LOG_PPP LOG_DAEMON
#endif
#ifdef DEBUGMAIN
#define MAINDEBUG(x) if (debug) dbglog x
#else
#define MAINDEBUG(x) ((void) 0)
#endif
#ifdef DEBUGSYS
#define SYSDEBUG(x) if (debug) dbglog x
#else
#define SYSDEBUG(x) ((void) 0)
#endif
#ifdef DEBUGLCP
#define LCPDEBUG(x) if (debug) dbglog x
#else
#define LCPDEBUG(x) ((void) 0)
#endif
#ifdef DEBUGIPCP
#define IPCPDEBUG(x) if (debug) dbglog x
#else
#define IPCPDEBUG(x) ((void) 0)
#endif
#ifdef DEBUGIPV6CP
#define IPV6CPDEBUG(x) if (debug) dbglog x
#else
#define IPV6CPDEBUG(x) ((void) 0)
#endif
#ifdef DEBUGCHAP
#define CHAPDEBUG(x) if (debug) dbglog x
#else
#define CHAPDEBUG(x) ((void) 0)
#endif
#ifdef DEBUGIPXCP
#define IPXCPDEBUG(x) if (debug) dbglog x
#else
#define IPXCPDEBUG(x) ((void) 0)
#endif
#ifndef SIGTYPE
#if defined(sun) || defined(SYSV) || defined(POSIX_SOURCE)
#define SIGTYPE void
#else
#define SIGTYPE int
#endif
#endif
#ifndef MIN
#define MIN(a, b) ((a) < (b)? (a): (b))
#endif
#ifndef MAX
#define MAX(a, b) ((a) > (b)? (a): (b))
#endif
#ifndef Dim
#define Dim(x) (sizeof (x) / sizeof (*(x)))
#endif
#ifndef NBBY
#define NBBY 8
#endif
#ifndef isset
#define isset(arr, val) (((u_char *)(arr))[(val)/NBBY] & (1<<((val)%NBBY)))
#endif
#ifndef setbit
#define setbit(arr, val) (((u_char *)(arr))[(val)/NBBY] |= (1<<((val)%NBBY)))
#endif
#define IP_HDRLEN 20
#define IP_OFFMASK 0x1fff
#define TCP_HDRLEN 20
#define net_short(x) (((x)[0] << 8) + (x)[1])
#define native_long(x) (htonl((net_short(x) << 16) + \
net_short((unsigned char *)(x) + 2)))
#define get_ipv(x) ((((unsigned char *)(x))[0] >> 4) & 0xF)
#define get_iphl(x) (((unsigned char *)(x))[0] & 0xF)
#define get_iplen(x) net_short((unsigned char *)(x) + 2)
#define get_ipoff(x) net_short((unsigned char *)(x) + 6)
#define get_ipproto(x) (((unsigned char *)(x))[9])
#define get_ipsrc(x) native_long((unsigned char *)(x) + 12)
#define get_ipdst(x) native_long((unsigned char *)(x) + 16)
#define get_ip6nh(x) (((unsigned char *)(x))[6])
#define get_ip6src(x) (((unsigned char *)(x))+8)
#define get_ip6dst(x) (((unsigned char *)(x))+24)
#define get_sport(x) net_short(x)
#define get_dport(x) net_short((unsigned char *)(x) + 2)
#define get_tcpoff(x) (((unsigned char *)(x))[12] >> 4)
#define get_tcpflags(x) (((unsigned char *)(x))[13])
#define LOCAL_IP_ADDR(addr) \
(((addr) & 0xff000000) == 0x0a000000 || \
((addr) & 0xfff00000) == 0xac100000 || \
((addr) & 0xffff0000) == 0xc0a80000)
#ifdef __cplusplus
}
#endif
#endif