539 lines
15 KiB
C
539 lines
15 KiB
C
/*
|
|
* ipppd.h - PPP daemon global declarations.
|
|
*
|
|
* Copyright (c) 1989 Carnegie Mellon University.
|
|
* All rights reserved.
|
|
*
|
|
* 2000-07-25 Callback improvements by richard.kunze@web.de
|
|
*
|
|
* 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.
|
|
*
|
|
* $Id: ipppd.h,v 1.24 2004/02/12 10:50:21 keil Exp $
|
|
*/
|
|
|
|
/*
|
|
* TODO:
|
|
*/
|
|
|
|
#define ISDN4LINUX_PATCH
|
|
|
|
#ifndef __IPPPD_H__
|
|
#define __IPPPD_H__
|
|
|
|
#include <stdarg.h>
|
|
#include <sys/param.h> /* for MAXPATHLEN and BSD4_4, if defined */
|
|
#include <sys/types.h> /* for u_int32_t, if defined */
|
|
#include <sys/bitypes.h>
|
|
#if defined __GLIBC__ && __GLIBC__ >= 2
|
|
# include <net/ppp_defs.h>
|
|
# include <linux/isdn_ppp.h>
|
|
#else
|
|
# include <linux/ppp_defs.h>
|
|
# include <linux/isdn_ppp.h>
|
|
#endif
|
|
#include <stdio.h>
|
|
#include <net/if.h>
|
|
|
|
#if defined __GLIBC__ && __GLIBC__ >= 2
|
|
# include <utmp.h>
|
|
#endif
|
|
|
|
#if 0
|
|
#include <linux/version.h>
|
|
#if (LINUX_VERSION_CODE < ((0x020100)+88))
|
|
#define ISDN_PPP_COMP_MAX_OPTIONS 16
|
|
struct isdn_ppp_comp_data {
|
|
int num;
|
|
unsigned char options[ISDN_PPP_COMP_MAX_OPTIONS];
|
|
int optlen;
|
|
int flags;
|
|
};
|
|
#endif
|
|
#endif
|
|
|
|
#include "config.h"
|
|
|
|
#ifndef PPP_LINK_CCP
|
|
#define PPP_LINK_CCP 0x80fb
|
|
#endif
|
|
#ifndef IPPP_COMP_FLAG_XMIT
|
|
#define IPPP_COMP_FLAG_XMIT 0x1
|
|
#endif
|
|
#ifndef IPPP_COMP_FLAG_LINK
|
|
#define IPPP_COMP_FLAG_LINK 0x2
|
|
#endif
|
|
/* Old Linux Kernels don't have VERSION defined */
|
|
#ifndef IPPP_VERSION
|
|
#define IPPP_VERSION "2.2.0"
|
|
#else
|
|
#define NEW_VERS
|
|
#endif
|
|
|
|
#define NUM_PPP 64 /* 64 PPP interface supported (per process) */
|
|
|
|
struct wordlist {
|
|
struct wordlist *next;
|
|
char word[1];
|
|
};
|
|
|
|
#ifdef RADIUS
|
|
#define MAXUSERNAME 255
|
|
#define MAXSESSIONID 32
|
|
#define MAXCID 17
|
|
extern int useradius; /* Use RADIUS server for PAP authentication */
|
|
extern int useradacct; /* Use RADIUS server for accounting */
|
|
#endif
|
|
|
|
struct link_struct {
|
|
struct link_struct *bundle_next;
|
|
int fd; /* link file descriptor */
|
|
int peer_mru; /* link: peer_mru */
|
|
int logged_in;
|
|
int auth_pending;
|
|
struct wordlist *addresses;
|
|
int unit; /* link unit */
|
|
int master; /* 'master' link unit */
|
|
int lcp_unit;
|
|
int ipcp_unit;
|
|
int ccp_unit;
|
|
int ccp_l_unit;
|
|
int chap_unit;
|
|
int upap_unit;
|
|
int cbcp_unit;
|
|
int ipxcp_unit;
|
|
int phase;
|
|
int auth_up_script;
|
|
int kill_link;
|
|
int open_ccp_flag;
|
|
int ifunit;
|
|
int openfails;
|
|
char ifname[IFNAMSIZ];
|
|
char devnam[MAXPATHLEN];
|
|
char peer_authname[64];
|
|
int initfdflags;
|
|
int hungup;
|
|
struct pppcallinfo pci;
|
|
int has_proxy_arp;
|
|
int attempts;
|
|
#ifdef RADIUS
|
|
int radius_in ;
|
|
int rx_bytes;
|
|
int tx_bytes;
|
|
time_t start_time;
|
|
char session_id[MAXSESSIONID+1];
|
|
char remote_number [MAXCID+1] ;
|
|
#endif
|
|
};
|
|
|
|
extern struct link_struct lns[NUM_PPP];
|
|
|
|
/*
|
|
* Limits.
|
|
*/
|
|
|
|
#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 char hostname[]; /* Our hostname */
|
|
extern u_char outpacket_buf[]; /* Buffer for outgoing packets */
|
|
extern int baud_rate; /* Current link speed in bits/sec */
|
|
extern char *progname; /* Name of this program */
|
|
extern char pidfilename[MAXPATHLEN];
|
|
|
|
extern void set_userip(char *ruser,int ruserlen);
|
|
#ifdef RADIUS
|
|
int radius_acct_start() ;
|
|
int radius_acct_stop() ;
|
|
#endif
|
|
|
|
extern char options_rcsid[];
|
|
extern char auth_rcsid[];
|
|
extern char lcp_rcsid[];
|
|
extern char ipcp_rcsid[];
|
|
extern char ipxcp_rcsid[];
|
|
extern char cbcp_rcsid[];
|
|
extern char main_rcsid[];
|
|
extern char chap_rcsid[];
|
|
#ifdef USE_MSCHAP
|
|
extern char chap_ms_rcsid[];
|
|
#endif
|
|
extern char upap_rcsid[];
|
|
extern char ccp_rcsid[];
|
|
extern char fsm_rcsid[];
|
|
extern char magic_rcsid[];
|
|
extern char sys_rcsid[];
|
|
|
|
/*
|
|
* Variables set by command-line options.
|
|
*/
|
|
|
|
extern int maxconnect;
|
|
extern int usefirstip,useifip,useifmtu;
|
|
extern int deldefaultroute;/* delete default gw, if it exists */
|
|
extern int numdev; /* number of handled devices */
|
|
extern int debug; /* Debug flag */
|
|
extern int kdebugflag; /* Tell kernel to print debug messages */
|
|
extern int default_device; /* Using /dev/tty or equivalent */
|
|
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 user[]; /* Username for PAP */
|
|
extern char passwd[]; /* Password for PAP */
|
|
extern int ask_passwd; /* Ask user for password */
|
|
extern int fdpasswd; /* Password via filedescriptor */
|
|
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 char *ipparam; /* Extra parameter for ip up/down scripts */
|
|
extern int cryptpap; /* Others' PAP passwords are encrypted */
|
|
#ifdef __linux__
|
|
extern int hostroute; /* Add a route to the host at the other end? */
|
|
#endif
|
|
#ifdef IPPP_FILTER
|
|
|
|
# ifdef HAVE_NET_BPF_H
|
|
# include <net/bpf.h>
|
|
# else
|
|
# ifdef HAVE_PCAP_BPF_H
|
|
# include <pcap-bpf.h>
|
|
# else
|
|
# error no BPF include defined
|
|
# endif
|
|
# endif
|
|
|
|
extern struct bpf_program pass_filter; /* Filter for pkts to pass */
|
|
extern struct bpf_program active_filter; /* Filter for link-active pkts */
|
|
#endif /* IPPP_FILTER */
|
|
|
|
/*
|
|
* Values for phase.
|
|
*/
|
|
#define PHASE_WAIT -1
|
|
#define PHASE_DEAD 0
|
|
#define PHASE_ESTABLISH 1
|
|
#define PHASE_AUTHENTICATE 2
|
|
#define PHASE_CALLBACK 3
|
|
#define PHASE_NETWORK 4
|
|
#define PHASE_TERMINATE 5
|
|
|
|
/*
|
|
* The following struct gives the addresses of procedures to call
|
|
* for a particular protocol.
|
|
*/
|
|
struct protent {
|
|
u_short protocol; /* PPP protocol number */
|
|
void (*init) (int unit);
|
|
void (*input) (int unit, u_char *pkt, int len);
|
|
void (*protrej) (int unit);
|
|
void (*lowerup) (int unit);
|
|
void (*lowerdown) (int unit);
|
|
void (*open) (int unit);
|
|
void (*close) (int unit, char *reason);
|
|
int (*printpkt) (u_char *pkt, int len, void (*printer) (void *, char *, ...), void *arg);
|
|
void (*datainput) (int unit, u_char *pkt, int len);
|
|
int enabled_flag; /* 0 iff protocol is disabled */
|
|
char *name; /* Text name of protocol */
|
|
void (*check_options) (void);
|
|
int (*demand_conf) (int unit);
|
|
int (*active_pkt) (u_char *pkt, int len);
|
|
};
|
|
|
|
/* Table of pointers to supported protocols */
|
|
extern struct protent *protocols[];
|
|
|
|
/*
|
|
* Prototypes.
|
|
*/
|
|
void quit(void); /* Cleanup and exit */
|
|
void timeout(void (*)(), caddr_t, int); /* Look-alike of kernel's timeout() */
|
|
void untimeout (void (*)(), caddr_t); /* Look-alike of kernel's untimeout() */
|
|
void demuxprotrej (int,u_short); /* Demultiplex a Protocol-Reject */
|
|
int check_passwd (int, char *, int, char *, int, char **, int *); /* Check peer-supplied username/password */
|
|
#ifdef RADIUS
|
|
int radius_check_passwd (int, char *, int, char *, int, char **, int *); /* Check peer-supplied username/password */
|
|
#endif
|
|
int get_secret (int, char *, char *, char *, int *, int); /* get "secret" for chap */
|
|
u_int32_t GetMask (u_int32_t); /* get netmask for address */
|
|
void die (int);
|
|
void check_access (FILE *, char *);
|
|
|
|
int ccp_getunit(int,int);
|
|
int ipcp_getunit(int);
|
|
int lcp_getunit(int);
|
|
void ccp_freeunit(int);
|
|
void ipcp_freeunit(int);
|
|
void lcp_freeunit(int);
|
|
char *ip_ntoa(u_int32_t);
|
|
int bad_ip_adrs(u_int32_t);
|
|
int getword(FILE *,char *,int *,char *);
|
|
void print_string(char *p,int len,void (*printer)(void *,char *,...),void *arg);
|
|
int auth_ip_addr(int unit,u_int32_t addr);
|
|
void auth_peer_fail(int,int,int);
|
|
void auth_withpeer_fail(int unit,int protocol,int reason);
|
|
void auth_peer_success(int unit,int protocol);
|
|
void auth_withpeer_success(int unit,int protocol);
|
|
|
|
void link_required(int);
|
|
void link_terminated(int);
|
|
void link_down(int);
|
|
void link_established(int unit);
|
|
#ifdef IPPP_FILTER
|
|
int set_filters(int, struct bpf_program *, struct bpf_program *);
|
|
#endif /* IPPP_FILTER */
|
|
int device_script(char *program,int in,int out);
|
|
void check_auth_options(void);
|
|
void setipdefault(void);
|
|
int options_from_file(char *filename,int must_exist,int check_prot,int slot);
|
|
int options_for_tty(void);
|
|
int options_from_user(void);
|
|
int parse_args(int argc,char **argv);
|
|
int run_program(char *prog,char **args,int must_exist,int tu);
|
|
void establish_ppp (int);
|
|
void calltimeout (void);
|
|
struct timeval *timeleft (struct timeval *);
|
|
void reap_kids (void);
|
|
void cleanup (int, caddr_t,int);
|
|
void close_fd (int);
|
|
void die (int);
|
|
void novm (char *);
|
|
void log_packet (u_char *, int, char *,int);
|
|
int set_kdebugflag (int requested_level,int tu);
|
|
void sys_init(void);
|
|
void note_debug_level (void);
|
|
void output_ppp (int unit, unsigned char *p, int len);
|
|
void wait_input (struct timeval *timo);
|
|
int read_packet (unsigned char *buf,int tu);
|
|
void ppp_send_config (int unit,int mtu,u_int32_t asyncmap,int pcomp,int accomp);
|
|
void ppp_set_xaccm (int unit, ext_accm accm);
|
|
void ppp_recv_config (int unit,int mru,u_int32_t asyncmap,int pcomp,int accomp);
|
|
int ccp_test (int unit, u_char *opt_ptr, int opt_len, int for_transmit);
|
|
int ccp_get_compressors(int ccp_unit,unsigned long *);
|
|
void ccp_flags_set (int unit, int isopen, int isup);
|
|
int ccp_fatal_error (int unit);
|
|
int sifvjcomp (int unit, int vjcomp, int cidcomp, int maxcid);
|
|
int sifup (int u);
|
|
int sifdown (int u);
|
|
int sifbundle(int,int);
|
|
int sifaddr (int unit, int our_adr, int his_adr, int net_mask);
|
|
int cifaddr (int unit, int our_adr, int his_adr);
|
|
int sifdefaultroute (int unit, int gateway);
|
|
int cifdefaultroute (int unit, int gateway);
|
|
int sifproxyarp (int unit, u_int32_t his_adr);
|
|
int cifproxyarp (int unit, u_int32_t his_adr);
|
|
int sipxfaddr (int unit, u_int32_t network, unsigned char * node );
|
|
int cipxfaddr (int linkunit);
|
|
int ppp_available(char *dev);
|
|
int logwtmputmp (int unit,char *line, char *name, char *host);
|
|
int lock (char *dev);
|
|
void unlock(void);
|
|
void setifip(int);
|
|
extern void enable_mp(int,int);
|
|
void remove_sys_options(void);
|
|
u_int32_t magic(void);
|
|
int fmtmsg (char *, int, char *, ...); /* sprintf++ */
|
|
int vfmtmsg (char *, int, char *, va_list); /* vsprintf++ */
|
|
void option_error (char *fmt, ...);
|
|
void usage (void); /* Print a usage message */
|
|
|
|
/*
|
|
* This structure is used to store information about certain
|
|
* options, such as where the option value came from (/etc/ppp/options,
|
|
* command line, etc.) and whether it came from a privileged source.
|
|
*/
|
|
|
|
struct option_info {
|
|
int priv; /* was value set by sysadmin? */
|
|
char *source; /* where option came from */
|
|
};
|
|
|
|
extern struct option_info auth_req_info;
|
|
extern struct option_info connector_info;
|
|
extern struct option_info disconnector_info;
|
|
extern struct option_info welcomer_info;
|
|
extern struct option_info devnam_info;
|
|
|
|
|
|
/*
|
|
* 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); \
|
|
}
|
|
|
|
|
|
#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 INCPTR(n, cp) ((cp) += (n))
|
|
#define DECPTR(n, cp) ((cp) -= (n))
|
|
|
|
#undef FALSE
|
|
#define FALSE 0
|
|
#undef TRUE
|
|
#define TRUE 1
|
|
|
|
/*
|
|
* System dependent definitions for user-level 4.3BSD UNIX implementation.
|
|
*/
|
|
|
|
#define DEMUXPROTREJ(u, p) demuxprotrej(u, p)
|
|
|
|
#define TIMEOUT(r, f, t) timeout((r), (f), (t))
|
|
#define UNTIMEOUT(r, f) untimeout((r), (f))
|
|
|
|
#define BCOPY(s, d, l) memcpy(d, s, l)
|
|
#define BZERO(s, n) memset(s, 0, n)
|
|
#define EXIT(u) quit()
|
|
|
|
#define PRINTMSG(m, l) { m[l] = '\0'; syslog(LOG_INFO, "Remote message: %s", m); }
|
|
|
|
/*
|
|
* MAKEHEADER - Add Header fields to a packet.
|
|
*/
|
|
#define MAKEHEADER(p, t) { \
|
|
PUTCHAR(PPP_ALLSTATIONS, p); \
|
|
PUTCHAR(PPP_UI, p); \
|
|
PUTSHORT(t, p); }
|
|
|
|
|
|
#ifdef DEBUGALL
|
|
#define DEBUGMAIN 1
|
|
#define DEBUGFSM 1
|
|
#define DEBUGLCP 1
|
|
#define DEBUGIPCP 1
|
|
#define DEBUGIPXCP 1
|
|
#define DEBUGUPAP 1
|
|
#define DEBUGCHAP 1
|
|
#endif
|
|
#define DEBUGCHAP 1
|
|
#ifndef LOG_PPP /* we use LOG_LOCAL2 for syslog by default */
|
|
#if defined(DEBUGMAIN) || defined(DEBUGFSM) || defined(DEBUG) \
|
|
|| defined(DEBUGLCP) || defined(DEBUGIPCP) || defined(DEBUGUPAP) \
|
|
|| defined(DEBUGCHAP) || defined(DEBUGIPXCP)
|
|
#define LOG_PPP LOG_LOCAL2
|
|
#else
|
|
#define LOG_PPP LOG_DAEMON
|
|
#endif
|
|
#endif /* LOG_PPP */
|
|
|
|
#ifdef DEBUGMAIN
|
|
#define MAINDEBUG(x) if (debug) syslog x
|
|
#else
|
|
#define MAINDEBUG(x)
|
|
#endif
|
|
|
|
#ifdef DEBUGFSM
|
|
#define FSMDEBUG(x) if (debug) syslog x
|
|
#else
|
|
#define FSMDEBUG(x)
|
|
#endif
|
|
|
|
#ifdef DEBUGLCP
|
|
#define LCPDEBUG(x) if (debug) syslog x
|
|
#else
|
|
#define LCPDEBUG(x)
|
|
#endif
|
|
|
|
#ifdef DEBUGIPCP
|
|
#define IPCPDEBUG(x) if (debug) syslog x
|
|
#else
|
|
#define IPCPDEBUG(x)
|
|
#endif
|
|
|
|
#ifdef DEBUGIPXCP
|
|
#define IPXCPDEBUG(x) if (debug) syslog x
|
|
#else
|
|
#define IPXCPDEBUG(x)
|
|
#endif
|
|
|
|
#ifdef DEBUGUPAP
|
|
#define UPAPDEBUG(x) if (debug) syslog x
|
|
#else
|
|
#define UPAPDEBUG(x)
|
|
#endif
|
|
|
|
#ifdef DEBUGCHAP
|
|
#define CHAPDEBUG(x) if (debug) syslog x
|
|
#else
|
|
#define CHAPDEBUG(x)
|
|
#endif
|
|
|
|
#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 */
|
|
|
|
#ifndef MIN
|
|
#define MIN(a, b) ((a) < (b)? (a): (b))
|
|
#endif
|
|
#ifndef MAX
|
|
#define MAX(a, b) ((a) > (b)? (a): (b))
|
|
#endif
|
|
|
|
/* error values for auth-fail script */
|
|
#define AUTH_ERR_TIME 1 /* timeout sending auth requests */
|
|
#define AUTH_ERR_PROT 2 /* auth protocol rejected */
|
|
#define AUTH_ERR_USER 3 /* user or password illegal */
|
|
#define AUTH_ERR_PAP 0 /* error in PAP-handling ored with reason */
|
|
#define AUTH_ERR_CHAP 8 /* error in CHAP-handling ored with reason */
|
|
|
|
|
|
#endif /* __IPPP_H__ */
|
|
|