2 * pppd.h - PPP daemon global declarations.
4 * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
18 * 3. The name "Carnegie Mellon University" must not be used to
19 * endorse or promote products derived from this software without
20 * prior written permission. For permission or any legal
21 * details, please contact
22 * Office of Technology Transfer
23 * Carnegie Mellon University
25 * Pittsburgh, PA 15213-3890
26 * (412) 268-4387, fax: (412) 268-7395
27 * tech-transfer@andrew.cmu.edu
29 * 4. Redistributions of any form whatsoever must retain the following
31 * "This product includes software developed by Computing Services
32 * at Carnegie Mellon University (http://www.cmu.edu/computing/)."
34 * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
35 * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
36 * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
37 * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
38 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
39 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
40 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
62 #ifdef HAVE_SYS_TYPES_H
63 #include <sys/types.h>
71 #define NUM_PPP 1 /* One PPP interface supported (per process) */
72 #define MAXWORDLEN 1024 /* max length of word in file (incl null) */
73 #define MAXARGS 1 /* max # args to a command */
74 #define MAXNAMELEN 256 /* max length of hostname or name for auth */
75 #define MAXSECRETLEN 256 /* max length of password or secret */
81 typedef enum ppp_phase
99 * Values for exit codes
101 typedef enum ppp_exit_code
104 EXIT_FATAL_ERROR = 1,
105 EXIT_OPTION_ERROR = 2,
107 EXIT_NO_KERNEL_SUPPORT = 4,
108 EXIT_USER_REQUEST = 5,
109 EXIT_LOCK_FAILED = 6,
110 EXIT_OPEN_FAILED = 7,
111 EXIT_CONNECT_FAILED = 8,
112 EXIT_PTYCMD_FAILED = 9,
113 EXIT_NEGOTIATION_FAILED = 10,
114 EXIT_PEER_AUTH_FAILED = 11,
115 EXIT_IDLE_TIMEOUT = 12,
116 EXIT_CONNECT_TIME = 13,
121 EXIT_INIT_FAILED = 18,
122 EXIT_AUTH_TOPEER_FAILED = 19,
123 EXIT_TRAFFIC_LIMIT = 20,
124 EXIT_CNID_AUTH_FAILED = 21
128 * Type of notifier callbacks
155 * Unfortunately, the linux kernel driver uses a different structure
156 * for statistics from the rest of the ports.
157 * This structure serves as a common representation for the bits
164 unsigned int pkts_in;
165 unsigned int pkts_out;
167 typedef struct pppd_stats ppp_link_stats_st;
170 * Used for storing a sequence of words. Usually malloced.
173 struct wordlist *next;
178 typedef void (*printer_func)(void *, char *, ...);
181 * The following struct gives the addresses of procedures to call for a particular protocol.
184 /* PPP protocol number */
185 unsigned short protocol;
186 /* Initialization procedure */
187 void (*init)(int unit);
188 /* Process a received packet */
189 void (*input)(int unit, unsigned char *pkt, int len);
190 /* Process a received protocol-reject */
191 void (*protrej)(int unit);
192 /* Lower layer has come up */
193 void (*lowerup)(int unit);
194 /* Lower layer has gone down */
195 void (*lowerdown)(int unit);
196 /* Open the protocol */
197 void (*open)(int unit);
198 /* Close the protocol */
199 void (*close)(int unit, char *reason);
200 /* Print a packet in readable form */
201 int (*printpkt)(unsigned char *pkt, int len, printer_func printer, void *arg);
202 /* Process a received data packet */
203 void (*datainput)(int unit, unsigned char *pkt, int len);
204 /* 0 iff protocol is disabled */
206 /* Text name of protocol */
208 /* Text name of corresponding data protocol */
210 /* List of command-line options */
211 struct option *options;
212 /* Check requested options, assign defaults */
213 void (*check_options)(void);
214 /* Configure interface for demand-dial */
215 int (*demand_conf)(int unit);
216 /* Say whether to bring up link for this pkt */
217 int (*active_pkt)(unsigned char *pkt, int len);
220 /* Table of pointers to supported protocols */
221 extern struct protent *protocols[];
225 * This struct contains pointers to a set of procedures for doing operations on a "channel".
226 * A channel provides a way to send and receive PPP packets - the canonical example is a serial
227 * port device in PPP line discipline (or equivalently with PPP STREAMS modules pushed onto it).
230 /* set of options for this channel */
231 struct option *options;
232 /* find and process a per-channel options file */
233 void (*process_extra_options)(void);
234 /* check all the options that have been given */
235 void (*check_options)(void);
236 /* get the channel ready to do PPP, return a file descriptor */
237 int (*connect)(void);
238 /* we're finished with the channel */
239 void (*disconnect)(void);
240 /* put the channel into PPP `mode' */
241 int (*establish_ppp)(int);
242 /* take the channel out of PPP `mode', restore loopback if demand */
243 void (*disestablish_ppp)(int);
244 /* set the transmit-side PPP parameters of the channel */
245 void (*send_config)(int, uint32_t, int, int);
246 /* set the receive-side PPP parameters of the channel */
247 void (*recv_config)(int, uint32_t, int, int);
248 /* cleanup on error or normal exit */
249 void (*cleanup)(void);
250 /* close the device, called in children after fork */
254 extern struct channel *the_channel;
258 * Functions for string formatting and debugging
261 /* Is debug enabled */
265 int slprintf(char *, int, char *, ...);
268 int vslprintf(char *, int, char *, va_list);
271 size_t strlcpy(char *, const char *, size_t);
274 size_t strlcat(char *, const char *, size_t);
276 /* log a debug message */
277 void dbglog(char *, ...);
279 /* log an informational message */
280 void info(char *, ...);
282 /* log a notice-level message */
283 void notice(char *, ...);
285 /* log a warning message */
286 void warn(char *, ...);
288 /* log an error message */
289 void error(char *, ...);
291 /* log an error message and die(1) */
292 void fatal(char *, ...);
294 /* Say we ran out of memory, and die */
297 /* Format a packet and log it with syslog */
298 void log_packet(unsigned char *, int, char *, int);
300 /* dump packet to debug log if interesting */
301 void dump_packet(const char *, unsigned char *, int);
303 /* initialize for using pr_log */
304 void init_pr_log(const char *, int);
306 /* printer fn, output to syslog */
307 void pr_log(void *, char *, ...);
309 /* finish up after using pr_log */
310 void end_pr_log(void);
313 * Get the current exist status of pppd
315 ppp_exit_code_t ppp_status();
318 * Set the exit status
320 void ppp_set_status(ppp_exit_code_t code);
323 * Configure the session's maximum number of octets
325 void ppp_set_session_limit(unsigned int octets);
328 * Which direction to limit the number of octets
330 void ppp_set_session_limit_dir(unsigned int direction);
333 * Get the current link stats, returns true when valid and false if otherwise
335 bool ppp_get_link_stats(ppp_link_stats_st *stats);
338 * Get pppd's notion of time
340 int ppp_get_time(struct timeval *);
343 * Schedule a callback in s.us seconds from now
345 typedef void (*ppp_timer_cb)(void *arg);
346 void ppp_timeout(ppp_timer_cb func, void *arg, int s, int us);
349 * Cancel any pending timer callbacks
351 void ppp_untimeout(void (*func)(void *), void *arg);
354 * Clean up in a child before execing
356 void ppp_sys_close(void);
359 * Fork & close stuff in child
361 pid_t ppp_safe_fork(int, int, int);
364 * Get the current hostname
366 const char *ppp_hostname();
369 * Is pppd using pty as a device (opposed to notty or pty opt).
371 bool ppp_using_pty();
374 * Device is synchronous serial device
376 bool ppp_sync_serial();
381 bool ppp_get_modem();
384 * Control the mode of the tty terminal
386 void ppp_set_modem(bool on);
389 * Set the current session number, e.g. for PPPoE
391 void ppp_set_session_number(int number);
394 * Set the current session number, e.g. for PPPoE
396 int ppp_get_session_number(void);
399 * Check if pppd got signaled, returns 0 if not signaled, returns -1 on failure, and the signal number when signaled.
401 bool ppp_signaled(int sig);
404 * Maximum connect time in seconds
406 int ppp_get_max_connect_time(void);
409 * Set the maximum connect time in seconds
411 void ppp_set_max_connect_time(unsigned int max);
414 * Get the link idle time before shutting the link down
416 int ppp_get_max_idle_time(void);
419 * Set the link idle time before shutting the link down
421 void ppp_set_max_idle_time(unsigned int idle);
424 * Get the duration the link was up (uptime)
426 int ppp_get_link_uptime();
429 * Get the ipparam configured with pppd
431 const char *ppp_ipparam();
434 * check if IP address is unreasonable
436 bool ppp_bad_ip_addr(uint32_t);
439 * Expose an environment variable to scripts
441 void ppp_script_setenv(char *, char *, int);
444 * Unexpose an environment variable to scripts
446 void ppp_script_unsetenv(char *);
449 * Test whether ppp kernel support exists
451 int ppp_check_kernel_support(void);
454 * Restore device setting
456 void ppp_generic_disestablish(int dev_fd);
459 * Set the interface MTU
461 void ppp_set_mtu(int, int);
464 * Get the interface MTU
466 int ppp_get_mtu(int);
469 * Make a ppp interface
471 int ppp_generic_establish(int dev_fd);
474 * Get the peer's authentication name
476 const char *ppp_peer_authname(char *buf, size_t bufsz);
479 * Get the remote name
481 const char *ppp_remote_name();
484 * Get the remote number (if set), otherwise return NULL
486 const char *ppp_get_remote_number(void);
489 * Set the remote number, typically it's a MAC address
491 void ppp_set_remote_number(const char *buf);
494 * Get the current interface unit for the pppX device
499 * Get the current interface name
501 const char *ppp_ifname();
504 * Get the current interface name
506 int ppp_get_ifname(char *buf, size_t bufsz);
509 * Set the current interface name, ifname is a \0 terminated string
511 void ppp_set_ifname(const char *ifname);
514 * Set the original devnam (prior to any renaming, etc).
516 int ppp_set_pppdevnam(const char *name);
519 * Get the original devnam (prior to any renaming, etc).
521 const char *ppp_pppdevnam();
524 * Get the current devnam, e.g. /dev/ttyS0, /dev/ptmx
526 const char *ppp_devnam();
529 * Set the device name
531 int ppp_set_devnam(const char *name);
534 * Definition for the notify callback function
535 * ctx - contextual argument provided with the registration
536 * arg - anything passed by the notification, e.g. phase, pid, etc
538 typedef void (ppp_notify_fn)(void *ctx, int arg);
541 * Add a callback notification for when a given event has occured
543 void ppp_add_notify(ppp_notify_t type, ppp_notify_fn *func, void *ctx);
546 * Remove a callback notification previously registered
548 void ppp_del_notify(ppp_notify_t type, ppp_notify_fn *func, void *ctx);
551 * Get the path prefix in which a file is installed
553 int ppp_get_path(ppp_path_t type, char *buf, size_t bufsz);
556 * Get the file with path prefix
558 int ppp_get_filepath(ppp_path_t type, const char *name, char *buf, size_t bufsz);
561 * Check if pppd is to re-open link after it goes down
566 * Hooks to enable plugins to hook into various parts of the code
569 struct ppp_idle; /* Declared in <linux/ppp_defs.h> */
570 extern int (*idle_time_hook)(struct ppp_idle *);
571 extern int (*new_phase_hook)(int);
572 extern int (*holdoff_hook)(void);
573 extern int (*allowed_address_hook)(uint32_t addr);
574 extern void (*snoop_recv_hook)(unsigned char *p, int len);
575 extern void (*snoop_send_hook)(unsigned char *p, int len);
577 #endif /* PPP_PPPD_H */