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.
50 #include <sys/types.h>
57 #define NUM_PPP 1 /* One PPP interface supported (per process) */
58 #define MAXWORDLEN 1024 /* max length of word in file (incl null) */
59 #define MAXARGS 1 /* max # args to a command */
60 #define MAXNAMELEN 256 /* max length of hostname or name for auth */
61 #define MAXSECRETLEN 256 /* max length of password or secret */
67 typedef enum ppp_phase
85 * Values for exit codes
87 typedef enum ppp_exit_code
91 EXIT_OPTION_ERROR = 2,
93 EXIT_NO_KERNEL_SUPPORT = 4,
94 EXIT_USER_REQUEST = 5,
97 EXIT_CONNECT_FAILED = 8,
98 EXIT_PTYCMD_FAILED = 9,
99 EXIT_NEGOTIATION_FAILED = 10,
100 EXIT_PEER_AUTH_FAILED = 11,
101 EXIT_IDLE_TIMEOUT = 12,
102 EXIT_CONNECT_TIME = 13,
107 EXIT_INIT_FAILED = 18,
108 EXIT_AUTH_TOPEER_FAILED = 19,
109 EXIT_TRAFFIC_LIMIT = 20,
110 EXIT_CNID_AUTH_FAILED = 21
114 * Type of notifier callbacks
141 * Unfortunately, the linux kernel driver uses a different structure
142 * for statistics from the rest of the ports.
143 * This structure serves as a common representation for the bits
150 unsigned int pkts_in;
151 unsigned int pkts_out;
153 typedef struct pppd_stats ppp_link_stats_st;
156 * Used for storing a sequence of words. Usually malloced.
159 struct wordlist *next;
164 typedef void (*printer_func)(void *, char *, ...);
167 * The following struct gives the addresses of procedures to call for a particular protocol.
170 /* PPP protocol number */
171 unsigned short protocol;
172 /* Initialization procedure */
173 void (*init)(int unit);
174 /* Process a received packet */
175 void (*input)(int unit, unsigned char *pkt, int len);
176 /* Process a received protocol-reject */
177 void (*protrej)(int unit);
178 /* Lower layer has come up */
179 void (*lowerup)(int unit);
180 /* Lower layer has gone down */
181 void (*lowerdown)(int unit);
182 /* Open the protocol */
183 void (*open)(int unit);
184 /* Close the protocol */
185 void (*close)(int unit, char *reason);
186 /* Print a packet in readable form */
187 int (*printpkt)(unsigned char *pkt, int len, printer_func printer, void *arg);
188 /* Process a received data packet */
189 void (*datainput)(int unit, unsigned char *pkt, int len);
190 /* 0 iff protocol is disabled */
192 /* Text name of protocol */
194 /* Text name of corresponding data protocol */
196 /* List of command-line options */
197 struct option *options;
198 /* Check requested options, assign defaults */
199 void (*check_options)(void);
200 /* Configure interface for demand-dial */
201 int (*demand_conf)(int unit);
202 /* Say whether to bring up link for this pkt */
203 int (*active_pkt)(unsigned char *pkt, int len);
206 /* Table of pointers to supported protocols */
207 extern struct protent *protocols[];
211 * This struct contains pointers to a set of procedures for doing operations on a "channel".
212 * A channel provides a way to send and receive PPP packets - the canonical example is a serial
213 * port device in PPP line discipline (or equivalently with PPP STREAMS modules pushed onto it).
216 /* set of options for this channel */
217 struct option *options;
218 /* find and process a per-channel options file */
219 void (*process_extra_options)(void);
220 /* check all the options that have been given */
221 void (*check_options)(void);
222 /* get the channel ready to do PPP, return a file descriptor */
223 int (*connect)(void);
224 /* we're finished with the channel */
225 void (*disconnect)(void);
226 /* put the channel into PPP `mode' */
227 int (*establish_ppp)(int);
228 /* take the channel out of PPP `mode', restore loopback if demand */
229 void (*disestablish_ppp)(int);
230 /* set the transmit-side PPP parameters of the channel */
231 void (*send_config)(int, uint32_t, int, int);
232 /* set the receive-side PPP parameters of the channel */
233 void (*recv_config)(int, uint32_t, int, int);
234 /* cleanup on error or normal exit */
235 void (*cleanup)(void);
236 /* close the device, called in children after fork */
240 extern struct channel *the_channel;
244 * Functions for string formatting and debugging
247 /* Is debug enabled */
251 int slprintf(char *, int, char *, ...);
254 int vslprintf(char *, int, char *, va_list);
257 size_t strlcpy(char *, const char *, size_t);
260 size_t strlcat(char *, const char *, size_t);
262 /* log a debug message */
263 void dbglog(char *, ...);
265 /* log an informational message */
266 void info(char *, ...);
268 /* log a notice-level message */
269 void notice(char *, ...);
271 /* log a warning message */
272 void warn(char *, ...);
274 /* log an error message */
275 void error(char *, ...);
277 /* log an error message and die(1) */
278 void fatal(char *, ...);
280 /* Say we ran out of memory, and die */
283 /* Format a packet and log it with syslog */
284 void log_packet(unsigned char *, int, char *, int);
286 /* dump packet to debug log if interesting */
287 void dump_packet(const char *, unsigned char *, int);
289 /* initialize for using pr_log */
290 void init_pr_log(const char *, int);
292 /* printer fn, output to syslog */
293 void pr_log(void *, char *, ...);
295 /* finish up after using pr_log */
296 void end_pr_log(void);
299 * Get the current exist status of pppd
301 ppp_exit_code_t ppp_status();
304 * Set the exit status
306 void ppp_set_status(ppp_exit_code_t code);
309 * Configure the session's maximum number of octets
311 void ppp_set_session_limit(unsigned int octets);
314 * Which direction to limit the number of octets
316 void ppp_set_session_limit_dir(unsigned int direction);
319 * Get the current link stats, returns true when valid and false if otherwise
321 bool ppp_get_link_stats(ppp_link_stats_st *stats);
324 * Get pppd's notion of time
326 int ppp_get_time(struct timeval *);
329 * Schedule a callback in s.us seconds from now
331 typedef void (*ppp_timer_cb)(void *arg);
332 void ppp_timeout(ppp_timer_cb func, void *arg, int s, int us);
335 * Cancel any pending timer callbacks
337 void ppp_untimeout(void (*func)(void *), void *arg);
340 * Clean up in a child before execing
342 void ppp_sys_close(void);
345 * Fork & close stuff in child
347 pid_t ppp_safe_fork(int, int, int);
350 * Get the current hostname
352 const char *ppp_hostname();
355 * Is pppd using pty as a device (opposed to notty or pty opt).
357 bool ppp_using_pty();
360 * Device is synchronous serial device
362 bool ppp_sync_serial();
367 bool ppp_get_modem();
370 * Control the mode of the tty terminal
372 void ppp_set_modem(bool on);
375 * Set the current session number, e.g. for PPPoE
377 void ppp_set_session_number(int number);
380 * Set the current session number, e.g. for PPPoE
382 int ppp_get_session_number(void);
385 * Check if pppd got signaled, returns 0 if not signaled, returns -1 on failure, and the signal number when signaled.
387 bool ppp_signaled(int sig);
390 * Maximum connect time in seconds
392 int ppp_get_max_connect_time(void);
395 * Set the maximum connect time in seconds
397 void ppp_set_max_connect_time(unsigned int max);
400 * Get the link idle time before shutting the link down
402 int ppp_get_max_idle_time(void);
405 * Set the link idle time before shutting the link down
407 void ppp_set_max_idle_time(unsigned int idle);
410 * Get the duration the link was up (uptime)
412 int ppp_get_link_uptime();
415 * Get the ipparam configured with pppd
417 const char *ppp_ipparam();
420 * check if IP address is unreasonable
422 bool ppp_bad_ip_addr(uint32_t);
425 * Expose an environment variable to scripts
427 void ppp_script_setenv(char *, char *, int);
430 * Unexpose an environment variable to scripts
432 void ppp_script_unsetenv(char *);
435 * Test whether ppp kernel support exists
437 int ppp_check_kernel_support(void);
440 * Restore device setting
442 void ppp_generic_disestablish(int dev_fd);
445 * Set the interface MTU
447 void ppp_set_mtu(int, int);
450 * Get the interface MTU
452 int ppp_get_mtu(int);
455 * Make a ppp interface
457 int ppp_generic_establish(int dev_fd);
460 * Get the peer's authentication name
462 const char *ppp_peer_authname(char *buf, size_t bufsz);
465 * Get the remote name
467 const char *ppp_remote_name();
470 * Get the remote number (if set), otherwise return NULL
472 const char *ppp_get_remote_number(void);
475 * Set the remote number, typically it's a MAC address
477 void ppp_set_remote_number(const char *buf);
480 * Get the current interface unit for the pppX device
485 * Get the current interface name
487 const char *ppp_ifname();
490 * Get the current interface name
492 int ppp_get_ifname(char *buf, size_t bufsz);
495 * Set the current interface name, ifname is a \0 terminated string
497 void ppp_set_ifname(const char *ifname);
500 * Set the original devnam (prior to any renaming, etc).
502 int ppp_set_pppdevnam(const char *name);
505 * Get the original devnam (prior to any renaming, etc).
507 const char *ppp_pppdevnam();
510 * Get the current devnam, e.g. /dev/ttyS0, /dev/ptmx
512 const char *ppp_devnam();
515 * Set the device name
517 int ppp_set_devnam(const char *name);
520 * Definition for the notify callback function
521 * ctx - contextual argument provided with the registration
522 * arg - anything passed by the notification, e.g. phase, pid, etc
524 typedef void (ppp_notify_fn)(void *ctx, int arg);
527 * Add a callback notification for when a given event has occured
529 void ppp_add_notify(ppp_notify_t type, ppp_notify_fn *func, void *ctx);
532 * Remove a callback notification previously registered
534 void ppp_del_notify(ppp_notify_t type, ppp_notify_fn *func, void *ctx);
537 * Get the path prefix in which a file is installed
539 int ppp_get_path(ppp_path_t type, char *buf, size_t bufsz);
542 * Get the file with path prefix
544 int ppp_get_filepath(ppp_path_t type, const char *name, char *buf, size_t bufsz);
547 * Check if pppd is to re-open link after it goes down
552 * Hooks to enable plugins to hook into various parts of the code
555 struct ppp_idle; /* Declared in <linux/ppp_defs.h> */
556 extern int (*idle_time_hook)(struct ppp_idle *);
557 extern int (*new_phase_hook)(int);
558 extern int (*holdoff_hook)(void);
559 extern int (*allowed_address_hook)(uint32_t addr);
560 extern void (*snoop_recv_hook)(unsigned char *p, int len);
561 extern void (*snoop_send_hook)(unsigned char *p, int len);
563 #endif /* PPP_PPPD_H */