/*
* pppd.h - PPP daemon global declarations.
*
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
+ * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
*
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
*
- * $Id: pppd.h,v 1.14 1996/07/01 01:19:55 paulus Exp $
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The name "Carnegie Mellon University" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For permission or any legal
+ * details, please contact
+ * Office of Technology Transfer
+ * Carnegie Mellon University
+ * 5000 Forbes Avenue
+ * Pittsburgh, PA 15213-3890
+ * (412) 268-4387, fax: (412) 268-7395
+ * tech-transfer@andrew.cmu.edu
+ *
+ * 4. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by Computing Services
+ * at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+ *
+ * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/*
- * TODO:
- */
+#ifndef PPP_PPPD_H
+#define PPP_PPPD_H
-#ifndef __PPPD_H__
-#define __PPPD_H__
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <sys/types.h>
-#include <stdio.h> /* for FILE */
-#include <sys/param.h> /* for MAXPATHLEN and BSD4_4, if defined */
-#include <sys/types.h> /* for u_int32_t, if defined */
-#include <sys/time.h> /* for struct timeval */
-#include <net/ppp_defs.h>
+#include "pppdconf.h"
-#if __STDC__
-#include <stdarg.h>
-#define __V(x) x
-#else
-#include <varargs.h>
-#define __V(x) (va_alist) va_dcl
+#ifdef __cplusplus
+extern "C" {
#endif
/*
- * Limits.
+ * Limits
*/
-
#define NUM_PPP 1 /* One PPP interface supported (per process) */
#define MAXWORDLEN 1024 /* max length of word in file (incl null) */
#define MAXARGS 1 /* max # args to a command */
#define MAXNAMELEN 256 /* max length of hostname or name for auth */
#define MAXSECRETLEN 256 /* max length of password or secret */
-/*
- * Global variables.
- */
-
-extern int hungup; /* Physical layer has disconnected */
-extern int ifunit; /* Interface unit number */
-extern char ifname[]; /* Interface name */
-extern int ttyfd; /* Serial device file descriptor */
-extern char hostname[]; /* Our hostname */
-extern u_char outpacket_buf[]; /* Buffer for outgoing packets */
-extern int phase; /* Current state of link - see values below */
-extern int baud_rate; /* Current link speed in bits/sec */
-extern char *progname; /* Name of this program */
-extern int redirect_stderr;/* Connector's stderr should go to file */
-extern char peer_authname[];/* Authenticated name of peer */
-
-/*
- * Variables set by command-line options.
- */
-
-extern int debug; /* Debug flag */
-extern int kdebugflag; /* Tell kernel to print debug messages */
-extern int default_device; /* Using /dev/tty or equivalent */
-extern char devnam[]; /* Device name */
-extern int crtscts; /* Use hardware flow control */
-extern int modem; /* Use modem control lines */
-extern int inspeed; /* Input/Output speed requested */
-extern u_int32_t netmask; /* IP netmask to set on interface */
-extern int lockflag; /* Create lock file to lock the serial dev */
-extern int nodetach; /* Don't detach from controlling tty */
-extern char *connector; /* Script to establish physical link */
-extern char *disconnector; /* Script to disestablish physical link */
-extern char *welcomer; /* Script to welcome client after connection */
-extern int maxconnect; /* Maximum connect time (seconds) */
-extern char user[]; /* Username for PAP */
-extern char passwd[]; /* Password for PAP */
-extern int auth_required; /* Peer is required to authenticate */
-extern int proxyarp; /* Set up proxy ARP entry for peer */
-extern int persist; /* Reopen link after it goes down */
-extern int uselogin; /* Use /etc/passwd for checking PAP */
-extern int lcp_echo_interval; /* Interval between LCP echo-requests */
-extern int lcp_echo_fails; /* Tolerance to unanswered echo-requests */
-extern char our_name[]; /* Our name for authentication purposes */
-extern char remote_name[]; /* Peer's name for authentication */
-extern int usehostname; /* Use hostname for our_name */
-extern int disable_defaultip; /* Don't use hostname for default IP adrs */
-extern int demand; /* Do dial-on-demand */
-extern char *ipparam; /* Extra parameter for ip up/down scripts */
-extern int cryptpap; /* Others' PAP passwords are encrypted */
-extern int idle_time_limit;/* Shut down link if idle for this long */
-extern int holdoff; /* Dead time before restarting */
-extern int refuse_pap; /* Don't wanna auth. ourselves with PAP */
-extern int refuse_chap; /* Don't wanna auth. ourselves with CHAP */
/*
* Values for phase.
*/
-#define PHASE_DEAD 0
-#define PHASE_INITIALIZE 1
-#define PHASE_DORMANT 2
-#define PHASE_ESTABLISH 3
-#define PHASE_AUTHENTICATE 4
-#define PHASE_NETWORK 5
-#define PHASE_TERMINATE 6
-#define PHASE_HOLDOFF 7
+typedef enum ppp_phase
+{
+ PHASE_DEAD,
+ PHASE_INITIALIZE,
+ PHASE_SERIALCONN,
+ PHASE_DORMANT,
+ PHASE_ESTABLISH,
+ PHASE_AUTHENTICATE,
+ PHASE_CALLBACK,
+ PHASE_NETWORK,
+ PHASE_RUNNING,
+ PHASE_TERMINATE,
+ PHASE_DISCONNECT,
+ PHASE_HOLDOFF,
+ PHASE_MASTER,
+} ppp_phase_t;
+
+/*
+ * Values for exit codes
+ */
+typedef enum ppp_exit_code
+{
+ EXIT_OK = 0,
+ EXIT_FATAL_ERROR = 1,
+ EXIT_OPTION_ERROR = 2,
+ EXIT_NOT_ROOT = 3,
+ EXIT_NO_KERNEL_SUPPORT = 4,
+ EXIT_USER_REQUEST = 5,
+ EXIT_LOCK_FAILED = 6,
+ EXIT_OPEN_FAILED = 7,
+ EXIT_CONNECT_FAILED = 8,
+ EXIT_PTYCMD_FAILED = 9,
+ EXIT_NEGOTIATION_FAILED = 10,
+ EXIT_PEER_AUTH_FAILED = 11,
+ EXIT_IDLE_TIMEOUT = 12,
+ EXIT_CONNECT_TIME = 13,
+ EXIT_CALLBACK = 14,
+ EXIT_PEER_DEAD = 15,
+ EXIT_HANGUP = 16,
+ EXIT_LOOPBACK = 17,
+ EXIT_INIT_FAILED = 18,
+ EXIT_AUTH_TOPEER_FAILED = 19,
+ EXIT_TRAFFIC_LIMIT = 20,
+ EXIT_CNID_AUTH_FAILED = 21
+} ppp_exit_code_t;
+
+/*
+ * Type of notifier callbacks
+ */
+typedef enum
+{
+ NF_PID_CHANGE,
+ NF_PHASE_CHANGE,
+ NF_EXIT,
+ NF_SIGNALED,
+ NF_IP_UP,
+ NF_IP_DOWN,
+ NF_IPV6_UP,
+ NF_IPV6_DOWN,
+ NF_AUTH_UP,
+ NF_LINK_DOWN,
+ NF_FORK,
+ NF_MAX_NOTIFY
+} ppp_notify_t;
+
+typedef enum
+{
+ PPP_DIR_LOG,
+ PPP_DIR_RUNTIME,
+ PPP_DIR_CONF,
+ PPP_DIR_PLUGIN,
+} ppp_path_t;
+
+/*
+ * Unfortunately, the linux kernel driver uses a different structure
+ * for statistics from the rest of the ports.
+ * This structure serves as a common representation for the bits
+ * pppd needs.
+ */
+struct pppd_stats
+{
+ uint64_t bytes_in;
+ uint64_t bytes_out;
+ unsigned int pkts_in;
+ unsigned int pkts_out;
+};
+typedef struct pppd_stats ppp_link_stats_st;
+
+/*
+ * Used for storing a sequence of words. Usually malloced.
+ */
+struct wordlist {
+ struct wordlist *next;
+ char *word;
+};
+
+struct option;
+typedef void (*printer_func)(void *, char *, ...);
/*
- * The following struct gives the addresses of procedures to call
- * for a particular protocol.
+ * The following struct gives the addresses of procedures to call for a particular protocol.
*/
struct protent {
- u_short protocol; /* PPP protocol number */
+ /* PPP protocol number */
+ unsigned short protocol;
/* Initialization procedure */
- void (*init) __P((int unit));
+ void (*init)(int unit);
/* Process a received packet */
- void (*input) __P((int unit, u_char *pkt, int len));
+ void (*input)(int unit, unsigned char *pkt, int len);
/* Process a received protocol-reject */
- void (*protrej) __P((int unit));
+ void (*protrej)(int unit);
/* Lower layer has come up */
- void (*lowerup) __P((int unit));
+ void (*lowerup)(int unit);
/* Lower layer has gone down */
- void (*lowerdown) __P((int unit));
+ void (*lowerdown)(int unit);
/* Open the protocol */
- void (*open) __P((int unit));
+ void (*open)(int unit);
/* Close the protocol */
- void (*close) __P((int unit, char *reason));
+ void (*close)(int unit, char *reason);
/* Print a packet in readable form */
- int (*printpkt) __P((u_char *pkt, int len,
- void (*printer) __P((void *, char *, ...)),
- void *arg));
+ int (*printpkt)(unsigned char *pkt, int len, printer_func printer, void *arg);
/* Process a received data packet */
- void (*datainput) __P((int unit, u_char *pkt, int len));
- int enabled_flag; /* 0 iff protocol is disabled */
- char *name; /* Text name of protocol */
+ void (*datainput)(int unit, unsigned char *pkt, int len);
+ /* 0 iff protocol is disabled */
+ bool enabled_flag;
+ /* Text name of protocol */
+ char *name;
+ /* Text name of corresponding data protocol */
+ char *data_name;
+ /* List of command-line options */
+ struct option *options;
/* Check requested options, assign defaults */
- void (*check_options) __P((void));
+ void (*check_options)(void);
/* Configure interface for demand-dial */
- int (*demand_conf) __P((int unit));
+ int (*demand_conf)(int unit);
/* Say whether to bring up link for this pkt */
- int (*active_pkt) __P((u_char *pkt, int len));
+ int (*active_pkt)(unsigned char *pkt, int len);
};
/* Table of pointers to supported protocols */
extern struct protent *protocols[];
+
/*
- * Prototypes.
- */
-
-/* Procedures exported from main.c. */
-void die __P((int)); /* Cleanup and exit */
-void quit __P((void)); /* like die(1) */
-void novm __P((char *)); /* Say we ran out of memory, and die */
-void timeout __P((void (*func)(), caddr_t arg, int t));
- /* Call func(arg) after t seconds */
-void untimeout __P((void (*func)(), caddr_t arg));
- /* Cancel call to func(arg) */
-int run_program __P((char *prog, char **args, int must_exist));
- /* Run program prog with args in child */
-void demuxprotrej __P((int, int));
- /* Demultiplex a Protocol-Reject */
-void format_packet __P((u_char *, int, void (*) (void *, char *, ...),
- void *)); /* Format a packet in human-readable form */
-void log_packet __P((u_char *, int, char *));
- /* Format a packet and log it with syslog */
-void print_string __P((char *, int, void (*) (void *, char *, ...),
- void *)); /* Format a string for output */
-int fmtmsg __P((char *, int, char *, ...)); /* sprintf++ */
-int vfmtmsg __P((char *, int, char *, va_list)); /* vsprintf++ */
-
-/* Procedures exported from auth.c */
-void link_required __P((int)); /* we are starting to use the link */
-void link_terminated __P((int)); /* we are finished with the link */
-void link_down __P((int)); /* the LCP layer has left the Opened state */
-void link_established __P((int)); /* the link is up; authenticate now */
-void np_up __P((int, int)); /* a network protocol has come up */
-void np_down __P((int, int)); /* a network protocol has gone down */
-void np_finished __P((int, int)); /* a network protocol no longer needs link */
-void auth_peer_fail __P((int, int));
- /* peer failed to authenticate itself */
-void auth_peer_success __P((int, int, char *, int));
- /* peer successfully authenticated itself */
-void auth_withpeer_fail __P((int, int));
- /* we failed to authenticate ourselves */
-void auth_withpeer_success __P((int, int));
- /* we successfully authenticated ourselves */
-void auth_check_options __P((void));
- /* check authentication options supplied */
-void auth_reset __P((int)); /* check what secrets we have */
-int check_passwd __P((int, char *, int, char *, int, char **, int *));
- /* Check peer-supplied username/password */
-int get_secret __P((int, char *, char *, char *, int *, int));
- /* get "secret" for chap */
-int auth_ip_addr __P((int, u_int32_t));
- /* check if IP address is authorized */
-int bad_ip_adrs __P((u_int32_t));
- /* check if IP address is unreasonable */
-void check_access __P((FILE *, char *));
- /* check permissions on secrets file */
-
-/* Procedures exported from demand.c */
-void demand_conf __P((void)); /* config interface(s) for demand-dial */
-void demand_block __P((void)); /* set all NPs to queue up packets */
-void demand_unblock __P((void)); /* set all NPs to pass packets */
-void demand_discard __P((void)); /* set all NPs to discard packets */
-void demand_rexmit __P((int)); /* retransmit saved frames for an NP */
-int loop_chars __P((unsigned char *, int)); /* process chars from loopback */
-int loop_frame __P((unsigned char *, int)); /* process frame from loopback */
-
-/* Procedures exported from sys-*.c */
-void sys_init __P((void)); /* Do system-dependent initialization */
-void sys_cleanup __P((void)); /* Restore system state before exiting */
-void sys_check_options __P((void)); /* Check options specified */
-void sys_close __P((void)); /* Clean up in a child before execing */
-int ppp_available __P((void)); /* Test whether ppp kernel support exists */
-void open_ppp_loopback __P((void)); /* Open loopback for demand-dialling */
-void establish_ppp __P((int)); /* Turn serial port into a ppp interface */
-void restore_loop __P((void)); /* Transfer ppp unit back to loopback */
-void disestablish_ppp __P((int)); /* Restore port to normal operation */
-void clean_check __P((void)); /* Check if line was 8-bit clean */
-void set_up_tty __P((int, int)); /* Set up port's speed, parameters, etc. */
-void restore_tty __P((int)); /* Restore port's original parameters */
-void setdtr __P((int, int)); /* Raise or lower port's DTR line */
-void output __P((int, u_char *, int)); /* Output a PPP packet */
-void wait_input __P((struct timeval *));
- /* Wait for input, with timeout */
-void wait_loop_output __P((struct timeval *));
- /* Wait for pkt from loopback, with timeout */
-void wait_time __P((struct timeval *)); /* Wait for given length of time */
-int read_packet __P((u_char *)); /* Read PPP packet */
-int get_loop_output __P((void)); /* Read pkts from loopback */
-void ppp_send_config __P((int, int, u_int32_t, int, int));
- /* Configure i/f transmit parameters */
-void ppp_set_xaccm __P((int, ext_accm));
- /* Set extended transmit ACCM */
-void ppp_recv_config __P((int, int, u_int32_t, int, int));
- /* Configure i/f receive parameters */
-int ccp_test __P((int, u_char *, int, int));
- /* Test support for compression scheme */
-void ccp_flags_set __P((int, int, int));
- /* Set kernel CCP state */
-int ccp_fatal_error __P((int)); /* Test for fatal decomp error in kernel */
-int get_idle_time __P((int, struct ppp_idle *));
- /* Find out how long link has been idle */
-int sifvjcomp __P((int, int, int, int));
- /* Configure VJ TCP header compression */
-int sifup __P((int)); /* Configure i/f up (for IP) */
-int sifnpmode __P((int u, int proto, enum NPmode mode));
- /* Set mode for handling packets for proto */
-int sifdown __P((int)); /* Configure i/f down (for IP) */
-int sifaddr __P((int, u_int32_t, u_int32_t, u_int32_t));
- /* Configure IP addresses for i/f */
-int cifaddr __P((int, u_int32_t, u_int32_t));
- /* Reset i/f IP addresses */
-int sifdefaultroute __P((int, u_int32_t));
- /* Create default route through i/f */
-int cifdefaultroute __P((int, u_int32_t));
- /* Delete default route through i/f */
-int sifproxyarp __P((int, u_int32_t));
- /* Add proxy ARP entry for peer */
-int cifproxyarp __P((int, u_int32_t));
- /* Delete proxy ARP entry for peer */
-u_int32_t GetMask __P((u_int32_t)); /* Get appropriate netmask for address */
-int lock __P((char *)); /* Create lock file for device */
-void unlock __P((void)); /* Delete previously-created lock file */
-int daemon __P((int, int)); /* Detach us from terminal session */
-int logwtmp __P((char *, char *, char *));
- /* Write entry to wtmp file */
-
-/* Procedures exported from options.c */
-int parse_args __P((int argc, char **argv));
- /* Parse options from arguments given */
-void usage __P((void)); /* Print a usage message */
-int options_from_file __P((char *filename, int must_exist, int check_prot));
- /* Parse options from an options file */
-int options_from_user __P((void)); /* Parse options from user's .ppprc */
-int options_for_tty __P((void)); /* Parse options from /etc/ppp/options.tty */
-void scan_args __P((int argc, char **argv));
- /* Look for tty name in command-line args */
-int getword __P((FILE *f, char *word, int *newlinep, char *filename));
- /* Read a word from a file */
-
-/*
- * Inline versions of get/put char/short/long.
- * Pointer is advanced; we assume that both arguments
- * are lvalues and will already be in registers.
- * cp MUST be u_char *.
- */
-#define GETCHAR(c, cp) { \
- (c) = *(cp)++; \
-}
-#define PUTCHAR(c, cp) { \
- *(cp)++ = (u_char) (c); \
-}
+ * This struct contains pointers to a set of procedures for doing operations on a "channel".
+ * A channel provides a way to send and receive PPP packets - the canonical example is a serial
+ * port device in PPP line discipline (or equivalently with PPP STREAMS modules pushed onto it).
+ */
+struct channel {
+ /* set of options for this channel */
+ struct option *options;
+ /* find and process a per-channel options file */
+ void (*process_extra_options)(void);
+ /* check all the options that have been given */
+ void (*check_options)(void);
+ /* get the channel ready to do PPP, return a file descriptor */
+ int (*connect)(void);
+ /* we're finished with the channel */
+ void (*disconnect)(void);
+ /* put the channel into PPP `mode' */
+ int (*establish_ppp)(int);
+ /* take the channel out of PPP `mode', restore loopback if demand */
+ void (*disestablish_ppp)(int);
+ /* set the transmit-side PPP parameters of the channel */
+ void (*send_config)(int, uint32_t, int, int);
+ /* set the receive-side PPP parameters of the channel */
+ void (*recv_config)(int, uint32_t, int, int);
+ /* cleanup on error or normal exit */
+ void (*cleanup)(void);
+ /* close the device, called in children after fork */
+ void (*close)(void);
+};
+extern struct channel *the_channel;
-#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); \
-}
+/*
+ * Functions for string formatting and debugging
+ */
+
+/* Is debug enabled */
+bool debug_on();
+
+/* Safe sprintf++ */
+int slprintf(char *, int, const char *, ...);
+
+/* vsprintf++ */
+int vslprintf(char *, int, const char *, va_list);
+
+/* safe strcpy */
+size_t strlcpy(char *, const char *, size_t);
+
+/* safe strncpy */
+size_t strlcat(char *, const char *, size_t);
+
+/* log a debug message */
+void dbglog(const char *, ...);
+
+/* log an informational message */
+void info(const char *, ...);
+
+/* log a notice-level message */
+void notice(const char *, ...);
+
+/* log a warning message */
+void warn(const char *, ...);
+
+/* log an error message */
+void error(const char *, ...);
+
+/* log an error message and die(1) */
+void fatal(const char *, ...);
+
+/* Say we ran out of memory, and die */
+void novm(const char *);
+
+/* Format a packet and log it with syslog */
+void log_packet(unsigned char *, int, char *, int);
-#define INCPTR(n, cp) ((cp) += (n))
-#define DECPTR(n, cp) ((cp) -= (n))
+/* dump packet to debug log if interesting */
+void dump_packet(const char *, unsigned char *, int);
-#undef FALSE
-#define FALSE 0
-#undef TRUE
-#define TRUE 1
+/* initialize for using pr_log */
+void init_pr_log(const char *, int);
+
+/* printer fn, output to syslog */
+void pr_log(void *, char *, ...);
+
+/* finish up after using pr_log */
+void end_pr_log(void);
/*
- * System dependent definitions for user-level 4.3BSD UNIX implementation.
+ * Get the current exist status of pppd
*/
+ppp_exit_code_t ppp_status();
-#define DEMUXPROTREJ(u, p) demuxprotrej(u, p)
+/*
+ * Set the exit status
+ */
+void ppp_set_status(ppp_exit_code_t code);
-#define TIMEOUT(r, f, t) timeout((r), (f), (t))
-#define UNTIMEOUT(r, f) untimeout((r), (f))
+/*
+ * Configure the session's maximum number of octets
+ */
+void ppp_set_session_limit(unsigned int octets);
-#define BCOPY(s, d, l) memcpy(d, s, l)
-#define BZERO(s, n) memset(s, 0, n)
-#define EXIT(u) quit()
+/*
+ * Which direction to limit the number of octets
+ */
+void ppp_set_session_limit_dir(unsigned int direction);
-#define PRINTMSG(m, l) { m[l] = '\0'; syslog(LOG_INFO, "Remote message: %s", m); }
+/*
+ * Get the current link stats, returns true when valid and false if otherwise
+ */
+bool ppp_get_link_stats(ppp_link_stats_st *stats);
/*
- * MAKEHEADER - Add Header fields to a packet.
+ * Get pppd's notion of time
*/
-#define MAKEHEADER(p, t) { \
- PUTCHAR(PPP_ALLSTATIONS, p); \
- PUTCHAR(PPP_UI, p); \
- PUTSHORT(t, p); }
+int ppp_get_time(struct timeval *);
+/*
+ * Schedule a callback in s.us seconds from now
+ */
+typedef void (*ppp_timer_cb)(void *arg);
+void ppp_timeout(ppp_timer_cb func, void *arg, int s, int us);
-#ifdef DEBUGALL
-#define DEBUGMAIN 1
-#define DEBUGFSM 1
-#define DEBUGLCP 1
-#define DEBUGIPCP 1
-#define DEBUGUPAP 1
-#define DEBUGCHAP 1
-#endif
+/*
+ * Cancel any pending timer callbacks
+ */
+void ppp_untimeout(void (*func)(void *), void *arg);
-#ifndef LOG_PPP /* we use LOG_LOCAL2 for syslog by default */
-#if defined(DEBUGMAIN) || defined(DEBUGFSM) || defined(DEBUGSYS) \
- || defined(DEBUGLCP) || defined(DEBUGIPCP) || defined(DEBUGUPAP) \
- || defined(DEBUGCHAP) || defined(DEBUG)
-#define LOG_PPP LOG_LOCAL2
-#else
-#define LOG_PPP LOG_DAEMON
-#endif
-#endif /* LOG_PPP */
+/*
+ * Clean up in a child before execing
+ */
+void ppp_sys_close(void);
-#ifdef DEBUGMAIN
-#define MAINDEBUG(x) if (debug) syslog x
-#else
-#define MAINDEBUG(x)
-#endif
+/*
+ * Fork & close stuff in child
+ */
+pid_t ppp_safe_fork(int, int, int);
-#ifdef DEBUGSYS
-#define SYSDEBUG(x) if (debug) syslog x
-#else
-#define SYSDEBUG(x)
-#endif
+/*
+ * Get the current hostname
+ */
+const char *ppp_hostname();
-#ifdef DEBUGFSM
-#define FSMDEBUG(x) if (debug) syslog x
-#else
-#define FSMDEBUG(x)
-#endif
+/*
+ * Is pppd using pty as a device (opposed to notty or pty opt).
+ */
+bool ppp_using_pty();
-#ifdef DEBUGLCP
-#define LCPDEBUG(x) if (debug) syslog x
-#else
-#define LCPDEBUG(x)
-#endif
+/*
+ * Device is synchronous serial device
+ */
+bool ppp_sync_serial();
-#ifdef DEBUGIPCP
-#define IPCPDEBUG(x) if (debug) syslog x
-#else
-#define IPCPDEBUG(x)
-#endif
+/*
+ * Modem mode
+ */
+bool ppp_get_modem();
-#ifdef DEBUGUPAP
-#define UPAPDEBUG(x) if (debug) syslog x
-#else
-#define UPAPDEBUG(x)
-#endif
+/*
+ * Control the mode of the tty terminal
+ */
+void ppp_set_modem(bool on);
-#ifdef DEBUGCHAP
-#define CHAPDEBUG(x) if (debug) syslog x
-#else
-#define CHAPDEBUG(x)
-#endif
+/*
+ * Set the current session number, e.g. for PPPoE
+ */
+void ppp_set_session_number(int number);
-#ifndef SIGTYPE
-#if defined(sun) || defined(SYSV) || defined(POSIX_SOURCE)
-#define SIGTYPE void
-#else
-#define SIGTYPE int
-#endif /* defined(sun) || defined(SYSV) || defined(POSIX_SOURCE) */
-#endif /* SIGTYPE */
+/*
+ * Set the current session number, e.g. for PPPoE
+ */
+int ppp_get_session_number(void);
-#ifndef MIN
-#define MIN(a, b) ((a) < (b)? (a): (b))
-#endif
-#ifndef MAX
-#define MAX(a, b) ((a) > (b)? (a): (b))
+/*
+ * Check if pppd got signaled, returns 0 if not signaled, returns -1 on failure, and the signal number when signaled.
+ */
+bool ppp_signaled(int sig);
+
+/*
+ * Maximum connect time in seconds
+ */
+int ppp_get_max_connect_time(void);
+
+/*
+ * Set the maximum connect time in seconds
+ */
+void ppp_set_max_connect_time(unsigned int max);
+
+/*
+ * Get the link idle time before shutting the link down
+ */
+int ppp_get_max_idle_time(void);
+
+/*
+ * Set the link idle time before shutting the link down
+ */
+void ppp_set_max_idle_time(unsigned int idle);
+
+/*
+ * Get the duration the link was up (uptime)
+ */
+int ppp_get_link_uptime();
+
+/*
+ * Get the ipparam configured with pppd
+ */
+const char *ppp_ipparam();
+
+/*
+ * check if IP address is unreasonable
+ */
+bool ppp_bad_ip_addr(uint32_t);
+
+/*
+ * Expose an environment variable to scripts
+ */
+void ppp_script_setenv(char *, char *, int);
+
+/*
+ * Unexpose an environment variable to scripts
+ */
+void ppp_script_unsetenv(char *);
+
+/*
+ * Test whether ppp kernel support exists
+ */
+int ppp_check_kernel_support(void);
+
+/*
+ * Restore device setting
+ */
+void ppp_generic_disestablish(int dev_fd);
+
+/*
+ * Set the interface MTU
+ */
+void ppp_set_mtu(int, int);
+
+/*
+ * Get the interface MTU
+ */
+int ppp_get_mtu(int);
+
+/*
+ * Make a ppp interface
+ */
+int ppp_generic_establish(int dev_fd);
+
+/*
+ * Get the peer's authentication name
+ */
+const char *ppp_peer_authname(char *buf, size_t bufsz);
+
+/*
+ * Get the remote name
+ */
+const char *ppp_remote_name();
+
+/*
+ * Get the remote number (if set), otherwise return NULL
+ */
+const char *ppp_get_remote_number(void);
+
+/*
+ * Set the remote number, typically it's a MAC address
+ */
+void ppp_set_remote_number(const char *buf);
+
+/*
+ * Get the current interface unit for the pppX device
+ */
+int ppp_ifunit();
+
+/*
+ * Get the current interface name
+ */
+const char *ppp_ifname();
+
+/*
+ * Get the current interface name
+ */
+int ppp_get_ifname(char *buf, size_t bufsz);
+
+/*
+ * Set the current interface name, ifname is a \0 terminated string
+ */
+void ppp_set_ifname(const char *ifname);
+
+/*
+ * Set the original devnam (prior to any renaming, etc).
+ */
+int ppp_set_pppdevnam(const char *name);
+
+/*
+ * Get the original devnam (prior to any renaming, etc).
+ */
+const char *ppp_pppdevnam();
+
+/*
+ * Get the current devnam, e.g. /dev/ttyS0, /dev/ptmx
+ */
+const char *ppp_devnam();
+
+/*
+ * Set the device name
+ */
+int ppp_set_devnam(const char *name);
+
+/*
+ * Definition for the notify callback function
+ * ctx - contextual argument provided with the registration
+ * arg - anything passed by the notification, e.g. phase, pid, etc
+ */
+typedef void (ppp_notify_fn)(void *ctx, int arg);
+
+/*
+ * Add a callback notification for when a given event has occured
+ */
+void ppp_add_notify(ppp_notify_t type, ppp_notify_fn *func, void *ctx);
+
+/*
+ * Remove a callback notification previously registered
+ */
+void ppp_del_notify(ppp_notify_t type, ppp_notify_fn *func, void *ctx);
+
+/*
+ * Get the path prefix in which a file is installed
+ */
+int ppp_get_path(ppp_path_t type, char *buf, size_t bufsz);
+
+/*
+ * Get the file with path prefix
+ */
+int ppp_get_filepath(ppp_path_t type, const char *name, char *buf, size_t bufsz);
+
+/*
+ * Check if pppd is to re-open link after it goes down
+ */
+bool ppp_persist();
+
+/*
+ * Hooks to enable plugins to hook into various parts of the code
+ */
+
+struct ppp_idle; /* Declared in <linux/ppp_defs.h> */
+extern int (*idle_time_hook)(struct ppp_idle *);
+extern int (*new_phase_hook)(int);
+extern int (*holdoff_hook)(void);
+extern int (*allowed_address_hook)(uint32_t addr);
+extern void (*snoop_recv_hook)(unsigned char *p, int len);
+extern void (*snoop_send_hook)(unsigned char *p, int len);
+
+#ifdef __cplusplus
+}
#endif
-#endif /* __PPP_H__ */
+#endif /* PPP_PPPD_H */