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>
61 #define NUM_PPP 1 /* One PPP interface supported (per process) */
62 #define MAXWORDLEN 1024 /* max length of word in file (incl null) */
63 #define MAXARGS 1 /* max # args to a command */
64 #define MAXNAMELEN 256 /* max length of hostname or name for auth */
65 #define MAXSECRETLEN 256 /* max length of password or secret */
71 typedef enum ppp_phase
89 * Values for exit codes
91 typedef enum ppp_exit_code
95 EXIT_OPTION_ERROR = 2,
97 EXIT_NO_KERNEL_SUPPORT = 4,
98 EXIT_USER_REQUEST = 5,
100 EXIT_OPEN_FAILED = 7,
101 EXIT_CONNECT_FAILED = 8,
102 EXIT_PTYCMD_FAILED = 9,
103 EXIT_NEGOTIATION_FAILED = 10,
104 EXIT_PEER_AUTH_FAILED = 11,
105 EXIT_IDLE_TIMEOUT = 12,
106 EXIT_CONNECT_TIME = 13,
111 EXIT_INIT_FAILED = 18,
112 EXIT_AUTH_TOPEER_FAILED = 19,
113 EXIT_TRAFFIC_LIMIT = 20,
114 EXIT_CNID_AUTH_FAILED = 21
118 * Type of notifier callbacks
145 * Unfortunately, the linux kernel driver uses a different structure
146 * for statistics from the rest of the ports.
147 * This structure serves as a common representation for the bits
154 unsigned int pkts_in;
155 unsigned int pkts_out;
157 typedef struct pppd_stats ppp_link_stats_st;
160 * Used for storing a sequence of words. Usually malloced.
163 struct wordlist *next;
168 typedef void (*printer_func)(void *, char *, ...);
171 * The following struct gives the addresses of procedures to call for a particular protocol.
174 /* PPP protocol number */
175 unsigned short protocol;
176 /* Initialization procedure */
177 void (*init)(int unit);
178 /* Process a received packet */
179 void (*input)(int unit, unsigned char *pkt, int len);
180 /* Process a received protocol-reject */
181 void (*protrej)(int unit);
182 /* Lower layer has come up */
183 void (*lowerup)(int unit);
184 /* Lower layer has gone down */
185 void (*lowerdown)(int unit);
186 /* Open the protocol */
187 void (*open)(int unit);
188 /* Close the protocol */
189 void (*close)(int unit, char *reason);
190 /* Print a packet in readable form */
191 int (*printpkt)(unsigned char *pkt, int len, printer_func printer, void *arg);
192 /* Process a received data packet */
193 void (*datainput)(int unit, unsigned char *pkt, int len);
194 /* 0 iff protocol is disabled */
196 /* Text name of protocol */
198 /* Text name of corresponding data protocol */
200 /* List of command-line options */
201 struct option *options;
202 /* Check requested options, assign defaults */
203 void (*check_options)(void);
204 /* Configure interface for demand-dial */
205 int (*demand_conf)(int unit);
206 /* Say whether to bring up link for this pkt */
207 int (*active_pkt)(unsigned char *pkt, int len);
210 /* Table of pointers to supported protocols */
211 extern struct protent *protocols[];
215 * This struct contains pointers to a set of procedures for doing operations on a "channel".
216 * A channel provides a way to send and receive PPP packets - the canonical example is a serial
217 * port device in PPP line discipline (or equivalently with PPP STREAMS modules pushed onto it).
220 /* set of options for this channel */
221 struct option *options;
222 /* find and process a per-channel options file */
223 void (*process_extra_options)(void);
224 /* check all the options that have been given */
225 void (*check_options)(void);
226 /* get the channel ready to do PPP, return a file descriptor */
227 int (*connect)(void);
228 /* we're finished with the channel */
229 void (*disconnect)(void);
230 /* put the channel into PPP `mode' */
231 int (*establish_ppp)(int);
232 /* take the channel out of PPP `mode', restore loopback if demand */
233 void (*disestablish_ppp)(int);
234 /* set the transmit-side PPP parameters of the channel */
235 void (*send_config)(int, uint32_t, int, int);
236 /* set the receive-side PPP parameters of the channel */
237 void (*recv_config)(int, uint32_t, int, int);
238 /* cleanup on error or normal exit */
239 void (*cleanup)(void);
240 /* close the device, called in children after fork */
244 extern struct channel *the_channel;
248 * Functions for string formatting and debugging
251 /* Is debug enabled */
255 int slprintf(char *, int, char *, ...);
258 int vslprintf(char *, int, char *, va_list);
261 size_t strlcpy(char *, const char *, size_t);
264 size_t strlcat(char *, const char *, size_t);
266 /* log a debug message */
267 void dbglog(char *, ...);
269 /* log an informational message */
270 void info(char *, ...);
272 /* log a notice-level message */
273 void notice(char *, ...);
275 /* log a warning message */
276 void warn(char *, ...);
278 /* log an error message */
279 void error(char *, ...);
281 /* log an error message and die(1) */
282 void fatal(char *, ...);
284 /* Say we ran out of memory, and die */
287 /* Format a packet and log it with syslog */
288 void log_packet(unsigned char *, int, char *, int);
290 /* dump packet to debug log if interesting */
291 void dump_packet(const char *, unsigned char *, int);
293 /* initialize for using pr_log */
294 void init_pr_log(const char *, int);
296 /* printer fn, output to syslog */
297 void pr_log(void *, char *, ...);
299 /* finish up after using pr_log */
300 void end_pr_log(void);
303 * Get the current exist status of pppd
305 ppp_exit_code_t ppp_status();
308 * Set the exit status
310 void ppp_set_status(ppp_exit_code_t code);
313 * Configure the session's maximum number of octets
315 void ppp_set_session_limit(unsigned int octets);
318 * Which direction to limit the number of octets
320 void ppp_set_session_limit_dir(unsigned int direction);
323 * Get the current link stats, returns true when valid and false if otherwise
325 bool ppp_get_link_stats(ppp_link_stats_st *stats);
328 * Get pppd's notion of time
330 int ppp_get_time(struct timeval *);
333 * Schedule a callback in s.us seconds from now
335 typedef void (*ppp_timer_cb)(void *arg);
336 void ppp_timeout(ppp_timer_cb func, void *arg, int s, int us);
339 * Cancel any pending timer callbacks
341 void ppp_untimeout(void (*func)(void *), void *arg);
344 * Clean up in a child before execing
346 void ppp_sys_close(void);
349 * Fork & close stuff in child
351 pid_t ppp_safe_fork(int, int, int);
354 * Get the current hostname
356 const char *ppp_hostname();
359 * Is pppd using pty as a device (opposed to notty or pty opt).
361 bool ppp_using_pty();
364 * Device is synchronous serial device
366 bool ppp_sync_serial();
371 bool ppp_get_modem();
374 * Control the mode of the tty terminal
376 void ppp_set_modem(bool on);
379 * Set the current session number, e.g. for PPPoE
381 void ppp_set_session_number(int number);
384 * Set the current session number, e.g. for PPPoE
386 int ppp_get_session_number(void);
389 * Check if pppd got signaled, returns 0 if not signaled, returns -1 on failure, and the signal number when signaled.
391 bool ppp_signaled(int sig);
394 * Maximum connect time in seconds
396 int ppp_get_max_connect_time(void);
399 * Set the maximum connect time in seconds
401 void ppp_set_max_connect_time(unsigned int max);
404 * Get the link idle time before shutting the link down
406 int ppp_get_max_idle_time(void);
409 * Set the link idle time before shutting the link down
411 void ppp_set_max_idle_time(unsigned int idle);
414 * Get the duration the link was up (uptime)
416 int ppp_get_link_uptime();
419 * Get the ipparam configured with pppd
421 const char *ppp_ipparam();
424 * check if IP address is unreasonable
426 bool ppp_bad_ip_addr(uint32_t);
429 * Expose an environment variable to scripts
431 void ppp_script_setenv(char *, char *, int);
434 * Unexpose an environment variable to scripts
436 void ppp_script_unsetenv(char *);
439 * Test whether ppp kernel support exists
441 int ppp_check_kernel_support(void);
444 * Restore device setting
446 void ppp_generic_disestablish(int dev_fd);
449 * Set the interface MTU
451 void ppp_set_mtu(int, int);
454 * Get the interface MTU
456 int ppp_get_mtu(int);
459 * Make a ppp interface
461 int ppp_generic_establish(int dev_fd);
464 * Get the peer's authentication name
466 const char *ppp_peer_authname(char *buf, size_t bufsz);
469 * Get the remote name
471 const char *ppp_remote_name();
474 * Get the remote number (if set), otherwise return NULL
476 const char *ppp_get_remote_number(void);
479 * Set the remote number, typically it's a MAC address
481 void ppp_set_remote_number(const char *buf);
484 * Get the current interface unit for the pppX device
489 * Get the current interface name
491 const char *ppp_ifname();
494 * Get the current interface name
496 int ppp_get_ifname(char *buf, size_t bufsz);
499 * Set the current interface name, ifname is a \0 terminated string
501 void ppp_set_ifname(const char *ifname);
504 * Set the original devnam (prior to any renaming, etc).
506 int ppp_set_pppdevnam(const char *name);
509 * Get the original devnam (prior to any renaming, etc).
511 const char *ppp_pppdevnam();
514 * Get the current devnam, e.g. /dev/ttyS0, /dev/ptmx
516 const char *ppp_devnam();
519 * Set the device name
521 int ppp_set_devnam(const char *name);
524 * Definition for the notify callback function
525 * ctx - contextual argument provided with the registration
526 * arg - anything passed by the notification, e.g. phase, pid, etc
528 typedef void (ppp_notify_fn)(void *ctx, int arg);
531 * Add a callback notification for when a given event has occured
533 void ppp_add_notify(ppp_notify_t type, ppp_notify_fn *func, void *ctx);
536 * Remove a callback notification previously registered
538 void ppp_del_notify(ppp_notify_t type, ppp_notify_fn *func, void *ctx);
541 * Get the path prefix in which a file is installed
543 int ppp_get_path(ppp_path_t type, char *buf, size_t bufsz);
546 * Get the file with path prefix
548 int ppp_get_filepath(ppp_path_t type, const char *name, char *buf, size_t bufsz);
551 * Check if pppd is to re-open link after it goes down
556 * Hooks to enable plugins to hook into various parts of the code
559 struct ppp_idle; /* Declared in <linux/ppp_defs.h> */
560 extern int (*idle_time_hook)(struct ppp_idle *);
561 extern int (*new_phase_hook)(int);
562 extern int (*holdoff_hook)(void);
563 extern int (*allowed_address_hook)(uint32_t addr);
564 extern void (*snoop_recv_hook)(unsigned char *p, int len);
565 extern void (*snoop_send_hook)(unsigned char *p, int len);
571 #endif /* PPP_PPPD_H */