Home | History | Annotate | Line # | Download | only in net
if_spppsubr.c revision 1.7
      1  1.7   thorpej /*	$NetBSD: if_spppsubr.c,v 1.7 2000/03/23 07:03:25 thorpej Exp $	 */
      2  1.4  explorer 
      3  1.1  explorer /*
      4  1.1  explorer  * Synchronous PPP/Cisco link level subroutines.
      5  1.1  explorer  * Keepalive protocol implemented in both Cisco and PPP modes.
      6  1.1  explorer  *
      7  1.3  explorer  * Copyright (C) 1994-1996 Cronyx Engineering Ltd.
      8  1.3  explorer  * Author: Serge Vakulenko, <vak (at) cronyx.ru>
      9  1.3  explorer  *
     10  1.3  explorer  * Heavily revamped to conform to RFC 1661.
     11  1.3  explorer  * Copyright (C) 1997, Joerg Wunsch.
     12  1.1  explorer  *
     13  1.1  explorer  * This software is distributed with NO WARRANTIES, not even the implied
     14  1.1  explorer  * warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     15  1.1  explorer  *
     16  1.1  explorer  * Authors grant any other persons or organisations permission to use
     17  1.1  explorer  * or modify this software as long as this message is kept with the software,
     18  1.1  explorer  * all derivative works or modified versions.
     19  1.1  explorer  *
     20  1.3  explorer  * From: Version 2.4, Thu Apr 30 17:17:21 MSD 1997
     21  1.3  explorer  *
     22  1.3  explorer  * From: if_spppsubr.c,v 1.39 1998/04/04 13:26:03 phk Exp
     23  1.3  explorer  *
     24  1.4  explorer  * From: Id: if_spppsubr.c,v 1.23 1999/02/23 14:47:50 hm Exp
     25  1.1  explorer  */
     26  1.1  explorer 
     27  1.3  explorer #if defined(__NetBSD__) || (defined(__FreeBSD__) && __FreeBSD__ >= 3)
     28  1.1  explorer #include "opt_inet.h"
     29  1.3  explorer #include "opt_ipx.h"
     30  1.3  explorer #include "opt_iso.h"
     31  1.1  explorer #include "opt_ns.h"
     32  1.3  explorer #endif
     33  1.1  explorer 
     34  1.1  explorer #include <sys/param.h>
     35  1.3  explorer 
     36  1.1  explorer #include <sys/systm.h>
     37  1.1  explorer #include <sys/kernel.h>
     38  1.3  explorer #include <sys/sockio.h>
     39  1.1  explorer #include <sys/socket.h>
     40  1.3  explorer #include <sys/syslog.h>
     41  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
     42  1.3  explorer #include <machine/random.h>
     43  1.3  explorer #endif
     44  1.3  explorer #include <sys/malloc.h>
     45  1.1  explorer #include <sys/mbuf.h>
     46  1.1  explorer 
     47  1.3  explorer #if defined (__OpenBSD__)
     48  1.3  explorer #include <sys/md5k.h>
     49  1.3  explorer #else
     50  1.3  explorer #include <sys/md5.h>
     51  1.3  explorer #endif
     52  1.3  explorer 
     53  1.1  explorer #include <net/if.h>
     54  1.1  explorer #include <net/netisr.h>
     55  1.1  explorer #include <net/if_types.h>
     56  1.3  explorer #include <net/route.h>
     57  1.3  explorer 
     58  1.3  explorer #include <machine/stdarg.h>
     59  1.1  explorer 
     60  1.1  explorer #ifdef INET
     61  1.1  explorer #include <netinet/in.h>
     62  1.1  explorer #include <netinet/in_systm.h>
     63  1.1  explorer #include <netinet/in_var.h>
     64  1.1  explorer #include <netinet/ip.h>
     65  1.1  explorer #include <netinet/tcp.h>
     66  1.3  explorer #if defined (__FreeBSD__) || defined (__OpenBSD__)
     67  1.3  explorer #include <netinet/if_ether.h>
     68  1.3  explorer #else
     69  1.3  explorer #include <net/ethertypes.h>
     70  1.1  explorer #endif
     71  1.3  explorer #else
     72  1.3  explorer #error Huh? sppp without INET?
     73  1.1  explorer #endif
     74  1.1  explorer 
     75  1.1  explorer #ifdef IPX
     76  1.1  explorer #include <netipx/ipx.h>
     77  1.1  explorer #include <netipx/ipx_if.h>
     78  1.1  explorer #endif
     79  1.1  explorer 
     80  1.1  explorer #ifdef NS
     81  1.1  explorer #include <netns/ns.h>
     82  1.1  explorer #include <netns/ns_if.h>
     83  1.1  explorer #endif
     84  1.1  explorer 
     85  1.1  explorer #ifdef ISO
     86  1.1  explorer #include <netiso/argo_debug.h>
     87  1.1  explorer #include <netiso/iso.h>
     88  1.1  explorer #include <netiso/iso_var.h>
     89  1.1  explorer #include <netiso/iso_snpac.h>
     90  1.1  explorer #endif
     91  1.1  explorer 
     92  1.3  explorer #if defined(__FreeBSD__) || defined(__NetBSD__)
     93  1.1  explorer #include <net/if_sppp.h>
     94  1.1  explorer #else
     95  1.3  explorer #include <i4b/sppp/if_sppp.h>
     96  1.1  explorer #endif
     97  1.3  explorer #if defined(__NetBSD__) || defined (__OpenBSD__)
     98  1.3  explorer #include <machine/cpu.h> /* XXX for softnet */
     99  1.1  explorer #endif
    100  1.1  explorer 
    101  1.1  explorer #define MAXALIVECNT     3               /* max. alive packets */
    102  1.1  explorer 
    103  1.3  explorer /*
    104  1.3  explorer  * Interface flags that can be set in an ifconfig command.
    105  1.3  explorer  *
    106  1.3  explorer  * Setting link0 will make the link passive, i.e. it will be marked
    107  1.3  explorer  * as being administrative openable, but won't be opened to begin
    108  1.3  explorer  * with.  Incoming calls will be answered, or subsequent calls with
    109  1.3  explorer  * -link1 will cause the administrative open of the LCP layer.
    110  1.3  explorer  *
    111  1.3  explorer  * Setting link1 will cause the link to auto-dial only as packets
    112  1.3  explorer  * arrive to be sent.
    113  1.3  explorer  *
    114  1.3  explorer  * Setting IFF_DEBUG will syslog the option negotiation and state
    115  1.3  explorer  * transitions at level kern.debug.  Note: all logs consistently look
    116  1.3  explorer  * like
    117  1.3  explorer  *
    118  1.3  explorer  *   <if-name><unit>: <proto-name> <additional info...>
    119  1.3  explorer  *
    120  1.3  explorer  * with <if-name><unit> being something like "bppp0", and <proto-name>
    121  1.3  explorer  * being one of "lcp", "ipcp", "cisco", "chap", "pap", etc.
    122  1.3  explorer  */
    123  1.3  explorer 
    124  1.3  explorer #define IFF_PASSIVE	IFF_LINK0	/* wait passively for connection */
    125  1.3  explorer #define IFF_AUTO	IFF_LINK1	/* auto-dial on output */
    126  1.3  explorer 
    127  1.3  explorer #define PPP_ALLSTATIONS 0xff		/* All-Stations broadcast address */
    128  1.3  explorer #define PPP_UI		0x03		/* Unnumbered Information */
    129  1.3  explorer #define PPP_IP		0x0021		/* Internet Protocol */
    130  1.3  explorer #define PPP_ISO		0x0023		/* ISO OSI Protocol */
    131  1.3  explorer #define PPP_XNS		0x0025		/* Xerox NS Protocol */
    132  1.3  explorer #define PPP_IPX		0x002b		/* Novell IPX Protocol */
    133  1.5    itojun #define PPP_IPV6	0x0057		/* Internet Protocol version 6 */
    134  1.3  explorer #define PPP_LCP		0xc021		/* Link Control Protocol */
    135  1.3  explorer #define PPP_PAP		0xc023		/* Password Authentication Protocol */
    136  1.3  explorer #define PPP_CHAP	0xc223		/* Challenge-Handshake Auth Protocol */
    137  1.3  explorer #define PPP_IPCP	0x8021		/* Internet Protocol Control Protocol */
    138  1.3  explorer 
    139  1.3  explorer #define CONF_REQ	1		/* PPP configure request */
    140  1.3  explorer #define CONF_ACK	2		/* PPP configure acknowledge */
    141  1.3  explorer #define CONF_NAK	3		/* PPP configure negative ack */
    142  1.3  explorer #define CONF_REJ	4		/* PPP configure reject */
    143  1.3  explorer #define TERM_REQ	5		/* PPP terminate request */
    144  1.3  explorer #define TERM_ACK	6		/* PPP terminate acknowledge */
    145  1.3  explorer #define CODE_REJ	7		/* PPP code reject */
    146  1.3  explorer #define PROTO_REJ	8		/* PPP protocol reject */
    147  1.3  explorer #define ECHO_REQ	9		/* PPP echo request */
    148  1.3  explorer #define ECHO_REPLY	10		/* PPP echo reply */
    149  1.3  explorer #define DISC_REQ	11		/* PPP discard request */
    150  1.3  explorer 
    151  1.3  explorer #define LCP_OPT_MRU		1	/* maximum receive unit */
    152  1.3  explorer #define LCP_OPT_ASYNC_MAP	2	/* async control character map */
    153  1.3  explorer #define LCP_OPT_AUTH_PROTO	3	/* authentication protocol */
    154  1.3  explorer #define LCP_OPT_QUAL_PROTO	4	/* quality protocol */
    155  1.3  explorer #define LCP_OPT_MAGIC		5	/* magic number */
    156  1.3  explorer #define LCP_OPT_RESERVED	6	/* reserved */
    157  1.3  explorer #define LCP_OPT_PROTO_COMP	7	/* protocol field compression */
    158  1.3  explorer #define LCP_OPT_ADDR_COMP	8	/* address/control field compression */
    159  1.3  explorer 
    160  1.3  explorer #define IPCP_OPT_ADDRESSES	1	/* both IP addresses; deprecated */
    161  1.3  explorer #define IPCP_OPT_COMPRESSION	2	/* IP compression protocol (VJ) */
    162  1.3  explorer #define IPCP_OPT_ADDRESS	3	/* local IP address */
    163  1.3  explorer 
    164  1.3  explorer #define PAP_REQ			1	/* PAP name/password request */
    165  1.3  explorer #define PAP_ACK			2	/* PAP acknowledge */
    166  1.3  explorer #define PAP_NAK			3	/* PAP fail */
    167  1.3  explorer 
    168  1.3  explorer #define CHAP_CHALLENGE		1	/* CHAP challenge request */
    169  1.3  explorer #define CHAP_RESPONSE		2	/* CHAP challenge response */
    170  1.3  explorer #define CHAP_SUCCESS		3	/* CHAP response ok */
    171  1.3  explorer #define CHAP_FAILURE		4	/* CHAP response failed */
    172  1.3  explorer 
    173  1.3  explorer #define CHAP_MD5		5	/* hash algorithm - MD5 */
    174  1.3  explorer 
    175  1.3  explorer #define CISCO_MULTICAST		0x8f	/* Cisco multicast address */
    176  1.3  explorer #define CISCO_UNICAST		0x0f	/* Cisco unicast address */
    177  1.3  explorer #define CISCO_KEEPALIVE		0x8035	/* Cisco keepalive protocol */
    178  1.3  explorer #define CISCO_ADDR_REQ		0	/* Cisco address request */
    179  1.3  explorer #define CISCO_ADDR_REPLY	1	/* Cisco address reply */
    180  1.3  explorer #define CISCO_KEEPALIVE_REQ	2	/* Cisco keepalive request */
    181  1.3  explorer 
    182  1.3  explorer /* states are named and numbered according to RFC 1661 */
    183  1.3  explorer #define STATE_INITIAL	0
    184  1.3  explorer #define STATE_STARTING	1
    185  1.3  explorer #define STATE_CLOSED	2
    186  1.3  explorer #define STATE_STOPPED	3
    187  1.3  explorer #define STATE_CLOSING	4
    188  1.3  explorer #define STATE_STOPPING	5
    189  1.3  explorer #define STATE_REQ_SENT	6
    190  1.3  explorer #define STATE_ACK_RCVD	7
    191  1.3  explorer #define STATE_ACK_SENT	8
    192  1.3  explorer #define STATE_OPENED	9
    193  1.1  explorer 
    194  1.1  explorer struct ppp_header {
    195  1.3  explorer 	u_char address;
    196  1.3  explorer 	u_char control;
    197  1.3  explorer 	u_short protocol;
    198  1.6   thorpej } __attribute__((__packed__));
    199  1.1  explorer #define PPP_HEADER_LEN          sizeof (struct ppp_header)
    200  1.1  explorer 
    201  1.1  explorer struct lcp_header {
    202  1.3  explorer 	u_char type;
    203  1.3  explorer 	u_char ident;
    204  1.3  explorer 	u_short len;
    205  1.6   thorpej } __attribute__((__packed__));
    206  1.1  explorer #define LCP_HEADER_LEN          sizeof (struct lcp_header)
    207  1.1  explorer 
    208  1.1  explorer struct cisco_packet {
    209  1.3  explorer 	u_long type;
    210  1.3  explorer 	u_long par1;
    211  1.3  explorer 	u_long par2;
    212  1.3  explorer 	u_short rel;
    213  1.3  explorer 	u_short time0;
    214  1.3  explorer 	u_short time1;
    215  1.6   thorpej } __attribute__((__packed__));
    216  1.1  explorer #define CISCO_PACKET_LEN 18
    217  1.1  explorer 
    218  1.3  explorer /*
    219  1.3  explorer  * We follow the spelling and capitalization of RFC 1661 here, to make
    220  1.3  explorer  * it easier comparing with the standard.  Please refer to this RFC in
    221  1.3  explorer  * case you can't make sense out of these abbreviation; it will also
    222  1.3  explorer  * explain the semantics related to the various events and actions.
    223  1.3  explorer  */
    224  1.3  explorer struct cp {
    225  1.3  explorer 	u_short	proto;		/* PPP control protocol number */
    226  1.3  explorer 	u_char protoidx;	/* index into state table in struct sppp */
    227  1.3  explorer 	u_char flags;
    228  1.3  explorer #define CP_LCP		0x01	/* this is the LCP */
    229  1.3  explorer #define CP_AUTH		0x02	/* this is an authentication protocol */
    230  1.3  explorer #define CP_NCP		0x04	/* this is a NCP */
    231  1.3  explorer #define CP_QUAL		0x08	/* this is a quality reporting protocol */
    232  1.3  explorer 	const char *name;	/* name of this control protocol */
    233  1.3  explorer 	/* event handlers */
    234  1.3  explorer 	void	(*Up)(struct sppp *sp);
    235  1.3  explorer 	void	(*Down)(struct sppp *sp);
    236  1.3  explorer 	void	(*Open)(struct sppp *sp);
    237  1.3  explorer 	void	(*Close)(struct sppp *sp);
    238  1.3  explorer 	void	(*TO)(void *sp);
    239  1.3  explorer 	int	(*RCR)(struct sppp *sp, struct lcp_header *h, int len);
    240  1.3  explorer 	void	(*RCN_rej)(struct sppp *sp, struct lcp_header *h, int len);
    241  1.3  explorer 	void	(*RCN_nak)(struct sppp *sp, struct lcp_header *h, int len);
    242  1.3  explorer 	/* actions */
    243  1.3  explorer 	void	(*tlu)(struct sppp *sp);
    244  1.3  explorer 	void	(*tld)(struct sppp *sp);
    245  1.3  explorer 	void	(*tls)(struct sppp *sp);
    246  1.3  explorer 	void	(*tlf)(struct sppp *sp);
    247  1.3  explorer 	void	(*scr)(struct sppp *sp);
    248  1.3  explorer };
    249  1.3  explorer 
    250  1.1  explorer static struct sppp *spppq;
    251  1.7   thorpej #if defined(__NetBSD__)
    252  1.7   thorpej static struct callout keepalive_ch;
    253  1.7   thorpej #endif
    254  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
    255  1.3  explorer static struct callout_handle keepalive_ch;
    256  1.3  explorer #endif
    257  1.3  explorer 
    258  1.3  explorer #ifdef __FreeBSD__
    259  1.3  explorer #define	SPP_FMT		"%s%d: "
    260  1.3  explorer #define	SPP_ARGS(ifp)	(ifp)->if_name, (ifp)->if_unit
    261  1.3  explorer #else
    262  1.3  explorer #define	SPP_FMT		"%s: "
    263  1.3  explorer #define	SPP_ARGS(ifp)	(ifp)->if_xname
    264  1.3  explorer #endif
    265  1.1  explorer 
    266  1.1  explorer /*
    267  1.1  explorer  * The following disgusting hack gets around the problem that IP TOS
    268  1.1  explorer  * can't be set yet.  We want to put "interactive" traffic on a high
    269  1.1  explorer  * priority queue.  To decide if traffic is interactive, we check that
    270  1.1  explorer  * a) it is TCP and b) one of its ports is telnet, rlogin or ftp control.
    271  1.3  explorer  *
    272  1.3  explorer  * XXX is this really still necessary?  - joerg -
    273  1.1  explorer  */
    274  1.3  explorer static u_short interactive_ports[8] = {
    275  1.1  explorer 	0,	513,	0,	0,
    276  1.1  explorer 	0,	21,	0,	23,
    277  1.1  explorer };
    278  1.1  explorer #define INTERACTIVE(p) (interactive_ports[(p) & 7] == (p))
    279  1.1  explorer 
    280  1.3  explorer /* almost every function needs these */
    281  1.3  explorer #define STDDCL							\
    282  1.3  explorer 	struct ifnet *ifp = &sp->pp_if;				\
    283  1.3  explorer 	int debug = ifp->if_flags & IFF_DEBUG
    284  1.3  explorer 
    285  1.3  explorer static int sppp_output(struct ifnet *ifp, struct mbuf *m,
    286  1.3  explorer 		       struct sockaddr *dst, struct rtentry *rt);
    287  1.3  explorer 
    288  1.3  explorer static void sppp_cisco_send(struct sppp *sp, int type, long par1, long par2);
    289  1.3  explorer static void sppp_cisco_input(struct sppp *sp, struct mbuf *m);
    290  1.3  explorer 
    291  1.3  explorer static void sppp_cp_input(const struct cp *cp, struct sppp *sp,
    292  1.3  explorer 			  struct mbuf *m);
    293  1.3  explorer static void sppp_cp_send(struct sppp *sp, u_short proto, u_char type,
    294  1.3  explorer 			 u_char ident, u_short len, void *data);
    295  1.3  explorer /* static void sppp_cp_timeout(void *arg); */
    296  1.3  explorer static void sppp_cp_change_state(const struct cp *cp, struct sppp *sp,
    297  1.3  explorer 				 int newstate);
    298  1.3  explorer static void sppp_auth_send(const struct cp *cp,
    299  1.3  explorer 			   struct sppp *sp, unsigned int type, unsigned int id,
    300  1.3  explorer 			   ...);
    301  1.3  explorer 
    302  1.3  explorer static void sppp_up_event(const struct cp *cp, struct sppp *sp);
    303  1.3  explorer static void sppp_down_event(const struct cp *cp, struct sppp *sp);
    304  1.3  explorer static void sppp_open_event(const struct cp *cp, struct sppp *sp);
    305  1.3  explorer static void sppp_close_event(const struct cp *cp, struct sppp *sp);
    306  1.3  explorer static void sppp_to_event(const struct cp *cp, struct sppp *sp);
    307  1.3  explorer 
    308  1.3  explorer static void sppp_null(struct sppp *sp);
    309  1.3  explorer 
    310  1.3  explorer static void sppp_lcp_init(struct sppp *sp);
    311  1.3  explorer static void sppp_lcp_up(struct sppp *sp);
    312  1.3  explorer static void sppp_lcp_down(struct sppp *sp);
    313  1.3  explorer static void sppp_lcp_open(struct sppp *sp);
    314  1.3  explorer static void sppp_lcp_close(struct sppp *sp);
    315  1.3  explorer static void sppp_lcp_TO(void *sp);
    316  1.3  explorer static int sppp_lcp_RCR(struct sppp *sp, struct lcp_header *h, int len);
    317  1.3  explorer static void sppp_lcp_RCN_rej(struct sppp *sp, struct lcp_header *h, int len);
    318  1.3  explorer static void sppp_lcp_RCN_nak(struct sppp *sp, struct lcp_header *h, int len);
    319  1.3  explorer static void sppp_lcp_tlu(struct sppp *sp);
    320  1.3  explorer static void sppp_lcp_tld(struct sppp *sp);
    321  1.3  explorer static void sppp_lcp_tls(struct sppp *sp);
    322  1.3  explorer static void sppp_lcp_tlf(struct sppp *sp);
    323  1.3  explorer static void sppp_lcp_scr(struct sppp *sp);
    324  1.3  explorer static void sppp_lcp_check_and_close(struct sppp *sp);
    325  1.3  explorer static int sppp_ncp_check(struct sppp *sp);
    326  1.3  explorer 
    327  1.3  explorer static void sppp_ipcp_init(struct sppp *sp);
    328  1.3  explorer static void sppp_ipcp_up(struct sppp *sp);
    329  1.3  explorer static void sppp_ipcp_down(struct sppp *sp);
    330  1.3  explorer static void sppp_ipcp_open(struct sppp *sp);
    331  1.3  explorer static void sppp_ipcp_close(struct sppp *sp);
    332  1.3  explorer static void sppp_ipcp_TO(void *sp);
    333  1.3  explorer static int sppp_ipcp_RCR(struct sppp *sp, struct lcp_header *h, int len);
    334  1.3  explorer static void sppp_ipcp_RCN_rej(struct sppp *sp, struct lcp_header *h, int len);
    335  1.3  explorer static void sppp_ipcp_RCN_nak(struct sppp *sp, struct lcp_header *h, int len);
    336  1.3  explorer static void sppp_ipcp_tlu(struct sppp *sp);
    337  1.3  explorer static void sppp_ipcp_tld(struct sppp *sp);
    338  1.3  explorer static void sppp_ipcp_tls(struct sppp *sp);
    339  1.3  explorer static void sppp_ipcp_tlf(struct sppp *sp);
    340  1.3  explorer static void sppp_ipcp_scr(struct sppp *sp);
    341  1.3  explorer 
    342  1.3  explorer static void sppp_pap_input(struct sppp *sp, struct mbuf *m);
    343  1.3  explorer static void sppp_pap_init(struct sppp *sp);
    344  1.3  explorer static void sppp_pap_open(struct sppp *sp);
    345  1.3  explorer static void sppp_pap_close(struct sppp *sp);
    346  1.3  explorer static void sppp_pap_TO(void *sp);
    347  1.3  explorer static void sppp_pap_my_TO(void *sp);
    348  1.3  explorer static void sppp_pap_tlu(struct sppp *sp);
    349  1.3  explorer static void sppp_pap_tld(struct sppp *sp);
    350  1.3  explorer static void sppp_pap_scr(struct sppp *sp);
    351  1.3  explorer 
    352  1.3  explorer static void sppp_chap_input(struct sppp *sp, struct mbuf *m);
    353  1.3  explorer static void sppp_chap_init(struct sppp *sp);
    354  1.3  explorer static void sppp_chap_open(struct sppp *sp);
    355  1.3  explorer static void sppp_chap_close(struct sppp *sp);
    356  1.3  explorer static void sppp_chap_TO(void *sp);
    357  1.3  explorer static void sppp_chap_tlu(struct sppp *sp);
    358  1.3  explorer static void sppp_chap_tld(struct sppp *sp);
    359  1.3  explorer static void sppp_chap_scr(struct sppp *sp);
    360  1.3  explorer 
    361  1.3  explorer static const char *sppp_auth_type_name(u_short proto, u_char type);
    362  1.3  explorer static const char *sppp_cp_type_name(u_char type);
    363  1.3  explorer static const char *sppp_dotted_quad(u_long addr);
    364  1.3  explorer static const char *sppp_ipcp_opt_name(u_char opt);
    365  1.3  explorer static const char *sppp_lcp_opt_name(u_char opt);
    366  1.3  explorer static const char *sppp_phase_name(enum ppp_phase phase);
    367  1.3  explorer static const char *sppp_proto_name(u_short proto);
    368  1.3  explorer static const char *sppp_state_name(int state);
    369  1.3  explorer static int sppp_params(struct sppp *sp, int cmd, void *data);
    370  1.3  explorer static int sppp_strnlen(u_char *p, int max);
    371  1.3  explorer static void sppp_get_ip_addrs(struct sppp *sp, u_long *src, u_long *dst,
    372  1.3  explorer 			      u_long *srcmask);
    373  1.3  explorer static void sppp_keepalive(void *dummy);
    374  1.3  explorer static void sppp_phase_network(struct sppp *sp);
    375  1.3  explorer static void sppp_print_bytes(const u_char *p, u_short len);
    376  1.3  explorer static void sppp_print_string(const char *p, u_short len);
    377  1.3  explorer static void sppp_qflush(struct ifqueue *ifq);
    378  1.3  explorer static void sppp_set_ip_addr(struct sppp *sp, u_long src);
    379  1.3  explorer 
    380  1.3  explorer /* our control protocol descriptors */
    381  1.3  explorer static const struct cp lcp = {
    382  1.3  explorer 	PPP_LCP, IDX_LCP, CP_LCP, "lcp",
    383  1.3  explorer 	sppp_lcp_up, sppp_lcp_down, sppp_lcp_open, sppp_lcp_close,
    384  1.3  explorer 	sppp_lcp_TO, sppp_lcp_RCR, sppp_lcp_RCN_rej, sppp_lcp_RCN_nak,
    385  1.3  explorer 	sppp_lcp_tlu, sppp_lcp_tld, sppp_lcp_tls, sppp_lcp_tlf,
    386  1.3  explorer 	sppp_lcp_scr
    387  1.3  explorer };
    388  1.3  explorer 
    389  1.3  explorer static const struct cp ipcp = {
    390  1.3  explorer 	PPP_IPCP, IDX_IPCP, CP_NCP, "ipcp",
    391  1.3  explorer 	sppp_ipcp_up, sppp_ipcp_down, sppp_ipcp_open, sppp_ipcp_close,
    392  1.3  explorer 	sppp_ipcp_TO, sppp_ipcp_RCR, sppp_ipcp_RCN_rej, sppp_ipcp_RCN_nak,
    393  1.3  explorer 	sppp_ipcp_tlu, sppp_ipcp_tld, sppp_ipcp_tls, sppp_ipcp_tlf,
    394  1.3  explorer 	sppp_ipcp_scr
    395  1.3  explorer };
    396  1.3  explorer 
    397  1.3  explorer static const struct cp pap = {
    398  1.3  explorer 	PPP_PAP, IDX_PAP, CP_AUTH, "pap",
    399  1.3  explorer 	sppp_null, sppp_null, sppp_pap_open, sppp_pap_close,
    400  1.3  explorer 	sppp_pap_TO, 0, 0, 0,
    401  1.3  explorer 	sppp_pap_tlu, sppp_pap_tld, sppp_null, sppp_null,
    402  1.3  explorer 	sppp_pap_scr
    403  1.3  explorer };
    404  1.3  explorer 
    405  1.3  explorer static const struct cp chap = {
    406  1.3  explorer 	PPP_CHAP, IDX_CHAP, CP_AUTH, "chap",
    407  1.3  explorer 	sppp_null, sppp_null, sppp_chap_open, sppp_chap_close,
    408  1.3  explorer 	sppp_chap_TO, 0, 0, 0,
    409  1.3  explorer 	sppp_chap_tlu, sppp_chap_tld, sppp_null, sppp_null,
    410  1.3  explorer 	sppp_chap_scr
    411  1.3  explorer };
    412  1.3  explorer 
    413  1.3  explorer static const struct cp *cps[IDX_COUNT] = {
    414  1.3  explorer 	&lcp,			/* IDX_LCP */
    415  1.3  explorer 	&ipcp,			/* IDX_IPCP */
    416  1.3  explorer 	&pap,			/* IDX_PAP */
    417  1.3  explorer 	&chap,			/* IDX_CHAP */
    418  1.3  explorer };
    419  1.1  explorer 
    420  1.1  explorer 
    421  1.3  explorer /*
    423  1.1  explorer  * Exported functions, comprising our interface to the lower layer.
    424  1.1  explorer  */
    425  1.1  explorer 
    426  1.1  explorer /*
    427  1.1  explorer  * Process the received packet.
    428  1.3  explorer  */
    429  1.3  explorer void
    430  1.1  explorer sppp_input(struct ifnet *ifp, struct mbuf *m)
    431  1.1  explorer {
    432  1.1  explorer 	struct ppp_header *h;
    433  1.1  explorer 	struct ifqueue *inq = 0;
    434  1.3  explorer 	int s;
    435  1.3  explorer 	struct sppp *sp = (struct sppp *)ifp;
    436  1.1  explorer 	int debug = ifp->if_flags & IFF_DEBUG;
    437  1.1  explorer 
    438  1.1  explorer 	if (ifp->if_flags & IFF_UP)
    439  1.1  explorer 		/* Count received bytes, add FCS and one flag */
    440  1.1  explorer 		ifp->if_ibytes += m->m_pkthdr.len + 3;
    441  1.1  explorer 
    442  1.1  explorer 	if (m->m_pkthdr.len <= PPP_HEADER_LEN) {
    443  1.3  explorer 		/* Too small packet, drop it. */
    444  1.3  explorer 		if (debug)
    445  1.3  explorer 			log(LOG_DEBUG,
    446  1.3  explorer 			    SPP_FMT "input packet is too small, %d bytes\n",
    447  1.3  explorer 			    SPP_ARGS(ifp), m->m_pkthdr.len);
    448  1.3  explorer 	  drop:
    449  1.3  explorer 		++ifp->if_ierrors;
    450  1.1  explorer 		++ifp->if_iqdrops;
    451  1.1  explorer 		m_freem (m);
    452  1.1  explorer 		return;
    453  1.1  explorer 	}
    454  1.1  explorer 
    455  1.1  explorer 	/* Get PPP header. */
    456  1.1  explorer 	h = mtod (m, struct ppp_header*);
    457  1.1  explorer 	m_adj (m, PPP_HEADER_LEN);
    458  1.1  explorer 
    459  1.1  explorer 	switch (h->address) {
    460  1.1  explorer 	case PPP_ALLSTATIONS:
    461  1.1  explorer 		if (h->control != PPP_UI)
    462  1.1  explorer 			goto invalid;
    463  1.3  explorer 		if (sp->pp_flags & PP_CISCO) {
    464  1.3  explorer 			if (debug)
    465  1.3  explorer 				log(LOG_DEBUG,
    466  1.3  explorer 				    SPP_FMT "PPP packet in Cisco mode "
    467  1.3  explorer 				    "<addr=0x%x ctrl=0x%x proto=0x%x>\n",
    468  1.3  explorer 				    SPP_ARGS(ifp),
    469  1.1  explorer 				    h->address, h->control, ntohs(h->protocol));
    470  1.1  explorer 			goto drop;
    471  1.1  explorer 		}
    472  1.1  explorer 		switch (ntohs (h->protocol)) {
    473  1.3  explorer 		default:
    474  1.3  explorer 			if (sp->state[IDX_LCP] == STATE_OPENED)
    475  1.1  explorer 				sppp_cp_send (sp, PPP_LCP, PROTO_REJ,
    476  1.1  explorer 					++sp->pp_seq, m->m_pkthdr.len + 2,
    477  1.3  explorer 					&h->protocol);
    478  1.3  explorer 			if (debug)
    479  1.3  explorer 				log(LOG_DEBUG,
    480  1.3  explorer 				    SPP_FMT "invalid input protocol "
    481  1.3  explorer 				    "<addr=0x%x ctrl=0x%x proto=0x%x>\n",
    482  1.3  explorer 				    SPP_ARGS(ifp),
    483  1.1  explorer 				    h->address, h->control, ntohs(h->protocol));
    484  1.1  explorer 			++ifp->if_noproto;
    485  1.1  explorer 			goto drop;
    486  1.3  explorer 		case PPP_LCP:
    487  1.3  explorer 			sppp_cp_input(&lcp, sp, m);
    488  1.3  explorer 			m_freem (m);
    489  1.3  explorer 			return;
    490  1.3  explorer 		case PPP_PAP:
    491  1.3  explorer 			if (sp->pp_phase >= PHASE_AUTHENTICATE)
    492  1.3  explorer 				sppp_pap_input(sp, m);
    493  1.3  explorer 			m_freem (m);
    494  1.3  explorer 			return;
    495  1.3  explorer 		case PPP_CHAP:
    496  1.3  explorer 			if (sp->pp_phase >= PHASE_AUTHENTICATE)
    497  1.1  explorer 				sppp_chap_input(sp, m);
    498  1.1  explorer 			m_freem (m);
    499  1.1  explorer 			return;
    500  1.1  explorer #ifdef INET
    501  1.3  explorer 		case PPP_IPCP:
    502  1.3  explorer 			if (sp->pp_phase == PHASE_NETWORK)
    503  1.1  explorer 				sppp_cp_input(&ipcp, sp, m);
    504  1.1  explorer 			m_freem (m);
    505  1.1  explorer 			return;
    506  1.3  explorer 		case PPP_IP:
    507  1.1  explorer 			if (sp->state[IDX_IPCP] == STATE_OPENED) {
    508  1.1  explorer 				schednetisr (NETISR_IP);
    509  1.1  explorer 				inq = &ipintrq;
    510  1.1  explorer 			}
    511  1.1  explorer 			break;
    512  1.1  explorer #endif
    513  1.1  explorer #ifdef IPX
    514  1.1  explorer 		case PPP_IPX:
    515  1.3  explorer 			/* IPX IPXCP not implemented yet */
    516  1.1  explorer 			if (sp->pp_phase == PHASE_NETWORK) {
    517  1.1  explorer 				schednetisr (NETISR_IPX);
    518  1.1  explorer 				inq = &ipxintrq;
    519  1.1  explorer 			}
    520  1.1  explorer 			break;
    521  1.1  explorer #endif
    522  1.1  explorer #ifdef NS
    523  1.1  explorer 		case PPP_XNS:
    524  1.3  explorer 			/* XNS IDPCP not implemented yet */
    525  1.1  explorer 			if (sp->pp_phase == PHASE_NETWORK) {
    526  1.1  explorer 				schednetisr (NETISR_NS);
    527  1.1  explorer 				inq = &nsintrq;
    528  1.1  explorer 			}
    529  1.1  explorer 			break;
    530  1.1  explorer #endif
    531  1.1  explorer #ifdef ISO
    532  1.1  explorer 		case PPP_ISO:
    533  1.3  explorer 			/* OSI NLCP not implemented yet */
    534  1.1  explorer 			if (sp->pp_phase == PHASE_NETWORK) {
    535  1.1  explorer 				schednetisr (NETISR_ISO);
    536  1.1  explorer 				inq = &clnlintrq;
    537  1.1  explorer 			}
    538  1.1  explorer 			break;
    539  1.1  explorer #endif
    540  1.1  explorer 		}
    541  1.1  explorer 		break;
    542  1.1  explorer 	case CISCO_MULTICAST:
    543  1.1  explorer 	case CISCO_UNICAST:
    544  1.1  explorer 		/* Don't check the control field here (RFC 1547). */
    545  1.3  explorer 		if (! (sp->pp_flags & PP_CISCO)) {
    546  1.3  explorer 			if (debug)
    547  1.3  explorer 				log(LOG_DEBUG,
    548  1.3  explorer 				    SPP_FMT "Cisco packet in PPP mode "
    549  1.3  explorer 				    "<addr=0x%x ctrl=0x%x proto=0x%x>\n",
    550  1.3  explorer 				    SPP_ARGS(ifp),
    551  1.1  explorer 				    h->address, h->control, ntohs(h->protocol));
    552  1.1  explorer 			goto drop;
    553  1.1  explorer 		}
    554  1.1  explorer 		switch (ntohs (h->protocol)) {
    555  1.1  explorer 		default:
    556  1.1  explorer 			++ifp->if_noproto;
    557  1.1  explorer 			goto invalid;
    558  1.1  explorer 		case CISCO_KEEPALIVE:
    559  1.1  explorer 			sppp_cisco_input ((struct sppp*) ifp, m);
    560  1.1  explorer 			m_freem (m);
    561  1.1  explorer 			return;
    562  1.1  explorer #ifdef INET
    563  1.1  explorer 		case ETHERTYPE_IP:
    564  1.1  explorer 			schednetisr (NETISR_IP);
    565  1.1  explorer 			inq = &ipintrq;
    566  1.1  explorer 			break;
    567  1.1  explorer #endif
    568  1.1  explorer #ifdef IPX
    569  1.1  explorer 		case ETHERTYPE_IPX:
    570  1.1  explorer 			schednetisr (NETISR_IPX);
    571  1.1  explorer 			inq = &ipxintrq;
    572  1.1  explorer 			break;
    573  1.1  explorer #endif
    574  1.1  explorer #ifdef NS
    575  1.1  explorer 		case ETHERTYPE_NS:
    576  1.1  explorer 			schednetisr (NETISR_NS);
    577  1.1  explorer 			inq = &nsintrq;
    578  1.1  explorer 			break;
    579  1.1  explorer #endif
    580  1.1  explorer 		}
    581  1.3  explorer 		break;
    582  1.3  explorer 	default:        /* Invalid PPP packet. */
    583  1.3  explorer 	  invalid:
    584  1.3  explorer 		if (debug)
    585  1.3  explorer 			log(LOG_DEBUG,
    586  1.3  explorer 			    SPP_FMT "invalid input packet "
    587  1.3  explorer 			    "<addr=0x%x ctrl=0x%x proto=0x%x>\n",
    588  1.3  explorer 			    SPP_ARGS(ifp),
    589  1.3  explorer 			    h->address, h->control, ntohs(h->protocol));
    590  1.1  explorer 		goto drop;
    591  1.1  explorer 	}
    592  1.1  explorer 
    593  1.1  explorer 	if (! (ifp->if_flags & IFF_UP) || ! inq)
    594  1.1  explorer 		goto drop;
    595  1.1  explorer 
    596  1.3  explorer 	/* Check queue. */
    597  1.1  explorer 	s = splimp();
    598  1.1  explorer 	if (IF_QFULL (inq)) {
    599  1.3  explorer 		/* Queue overflow. */
    600  1.3  explorer 		IF_DROP(inq);
    601  1.3  explorer 		splx(s);
    602  1.3  explorer 		if (debug)
    603  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "protocol queue overflow\n",
    604  1.1  explorer 				SPP_ARGS(ifp));
    605  1.1  explorer 		goto drop;
    606  1.3  explorer 	}
    607  1.3  explorer 	IF_ENQUEUE(inq, m);
    608  1.1  explorer 	splx(s);
    609  1.1  explorer }
    610  1.1  explorer 
    611  1.1  explorer /*
    612  1.1  explorer  * Enqueue transmit packet.
    613  1.1  explorer  */
    614  1.3  explorer static int
    615  1.3  explorer sppp_output(struct ifnet *ifp, struct mbuf *m,
    616  1.1  explorer 	    struct sockaddr *dst, struct rtentry *rt)
    617  1.1  explorer {
    618  1.1  explorer 	struct sppp *sp = (struct sppp*) ifp;
    619  1.1  explorer 	struct ppp_header *h;
    620  1.3  explorer 	struct ifqueue *ifq;
    621  1.3  explorer 	int s, rv = 0;
    622  1.3  explorer 
    623  1.1  explorer 	s = splimp();
    624  1.3  explorer 
    625  1.3  explorer 	if ((ifp->if_flags & IFF_UP) == 0 ||
    626  1.1  explorer 	    (ifp->if_flags & (IFF_RUNNING | IFF_AUTO)) == 0) {
    627  1.1  explorer 		m_freem (m);
    628  1.1  explorer 		splx (s);
    629  1.1  explorer 		return (ENETDOWN);
    630  1.1  explorer 	}
    631  1.3  explorer 
    632  1.3  explorer 	if ((ifp->if_flags & (IFF_RUNNING | IFF_AUTO)) == IFF_AUTO) {
    633  1.3  explorer 		/*
    634  1.3  explorer 		 * Interface is not yet running, but auto-dial.  Need
    635  1.3  explorer 		 * to start LCP for it.
    636  1.3  explorer 		 */
    637  1.3  explorer 		ifp->if_flags |= IFF_RUNNING;
    638  1.3  explorer 		splx(s);
    639  1.3  explorer 		lcp.Open(sp);
    640  1.3  explorer 		s = splimp();
    641  1.3  explorer 	}
    642  1.1  explorer 
    643  1.3  explorer 	ifq = &ifp->if_snd;
    644  1.1  explorer 
    645  1.3  explorer #ifdef INET
    646  1.3  explorer 	if (dst->sa_family == AF_INET)
    647  1.3  explorer 	{
    648  1.1  explorer 		/* Check mbuf length here??? */
    649  1.3  explorer 		struct ip *ip = mtod (m, struct ip*);
    650  1.1  explorer 		struct tcphdr *tcp = (struct tcphdr*) ((long*)ip + ip->ip_hl);
    651  1.3  explorer 
    652  1.3  explorer 		/*
    653  1.3  explorer 		 * When using dynamic local IP address assignment by using
    654  1.3  explorer 		 * 0.0.0.0 as a local address, the first TCP session will
    655  1.3  explorer 		 * not connect because the local TCP checksum is computed
    656  1.3  explorer 		 * using 0.0.0.0 which will later become our real IP address
    657  1.3  explorer 		 * so the TCP checksum computed at the remote end will
    658  1.3  explorer 		 * become invalid. So we
    659  1.3  explorer 		 * - don't let packets with src ip addr 0 thru
    660  1.3  explorer 		 * - we flag TCP packets with src ip 0 as an error
    661  1.3  explorer 		 */
    662  1.3  explorer 
    663  1.3  explorer 		if(ip->ip_src.s_addr == INADDR_ANY)	/* -hm */
    664  1.3  explorer 		{
    665  1.3  explorer 			m_freem(m);
    666  1.3  explorer 			splx(s);
    667  1.3  explorer 			if(ip->ip_p == IPPROTO_TCP)
    668  1.3  explorer 				return(EADDRNOTAVAIL);
    669  1.3  explorer 			else
    670  1.3  explorer 				return(0);
    671  1.3  explorer 		}
    672  1.3  explorer 
    673  1.3  explorer 		/*
    674  1.3  explorer 		 * Put low delay, telnet, rlogin and ftp control packets
    675  1.3  explorer 		 * in front of the queue.
    676  1.3  explorer 		 */
    677  1.3  explorer 
    678  1.1  explorer 		if (! IF_QFULL (&sp->pp_fastq) &&
    679  1.3  explorer 		    ((ip->ip_tos & IPTOS_LOWDELAY) ||
    680  1.1  explorer 	    	    ((ip->ip_p == IPPROTO_TCP &&
    681  1.3  explorer 	    	    m->m_len >= sizeof (struct ip) + sizeof (struct tcphdr) &&
    682  1.3  explorer 	    	    (INTERACTIVE (ntohs (tcp->th_sport)))) ||
    683  1.1  explorer 	    	    INTERACTIVE (ntohs (tcp->th_dport)))))
    684  1.1  explorer 			ifq = &sp->pp_fastq;
    685  1.1  explorer 	}
    686  1.1  explorer #endif
    687  1.5    itojun 
    688  1.5    itojun #ifdef INET6
    689  1.5    itojun 	if (dst->sa_family == AF_INET6) {
    690  1.5    itojun 		/* XXX do something tricky here? */
    691  1.5    itojun 	}
    692  1.5    itojun #endif
    693  1.1  explorer 
    694  1.1  explorer 	/*
    695  1.1  explorer 	 * Prepend general data packet PPP header. For now, IP only.
    696  1.1  explorer 	 */
    697  1.1  explorer 	M_PREPEND (m, PPP_HEADER_LEN, M_DONTWAIT);
    698  1.1  explorer 	if (! m) {
    699  1.3  explorer 		if (ifp->if_flags & IFF_DEBUG)
    700  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "no memory for transmit header\n",
    701  1.3  explorer 				SPP_ARGS(ifp));
    702  1.1  explorer 		++ifp->if_oerrors;
    703  1.1  explorer 		splx (s);
    704  1.1  explorer 		return (ENOBUFS);
    705  1.3  explorer 	}
    706  1.3  explorer 	/*
    707  1.3  explorer 	 * May want to check size of packet
    708  1.3  explorer 	 * (albeit due to the implementation it's always enough)
    709  1.1  explorer 	 */
    710  1.1  explorer 	h = mtod (m, struct ppp_header*);
    711  1.1  explorer 	if (sp->pp_flags & PP_CISCO) {
    712  1.1  explorer 		h->address = CISCO_UNICAST;        /* unicast address */
    713  1.1  explorer 		h->control = 0;
    714  1.1  explorer 	} else {
    715  1.1  explorer 		h->address = PPP_ALLSTATIONS;        /* broadcast address */
    716  1.1  explorer 		h->control = PPP_UI;                 /* Unnumbered Info */
    717  1.1  explorer 	}
    718  1.1  explorer 
    719  1.1  explorer 	switch (dst->sa_family) {
    720  1.1  explorer #ifdef INET
    721  1.1  explorer 	case AF_INET:   /* Internet Protocol */
    722  1.1  explorer 		if (sp->pp_flags & PP_CISCO)
    723  1.1  explorer 			h->protocol = htons (ETHERTYPE_IP);
    724  1.3  explorer 		else {
    725  1.3  explorer 			/*
    726  1.3  explorer 			 * Don't choke with an ENETDOWN early.  It's
    727  1.3  explorer 			 * possible that we just started dialing out,
    728  1.3  explorer 			 * so don't drop the packet immediately.  If
    729  1.3  explorer 			 * we notice that we run out of buffer space
    730  1.3  explorer 			 * below, we will however remember that we are
    731  1.3  explorer 			 * not ready to carry IP packets, and return
    732  1.3  explorer 			 * ENETDOWN, as opposed to ENOBUFS.
    733  1.3  explorer 			 */
    734  1.5    itojun 			h->protocol = htons(PPP_IP);
    735  1.5    itojun 			if (sp->state[IDX_IPCP] != STATE_OPENED)
    736  1.5    itojun 				rv = ENETDOWN;
    737  1.5    itojun 		}
    738  1.5    itojun 		break;
    739  1.5    itojun #endif
    740  1.5    itojun #ifdef INET6
    741  1.5    itojun 	case AF_INET6:   /* Internet Protocol version 6 */
    742  1.5    itojun 		if (sp->pp_flags & PP_CISCO)
    743  1.5    itojun 			h->protocol = htons (ETHERTYPE_IPV6);
    744  1.5    itojun 		else {
    745  1.5    itojun 			/*
    746  1.5    itojun 			 * Don't choke with an ENETDOWN early.  It's
    747  1.5    itojun 			 * possible that we just started dialing out,
    748  1.5    itojun 			 * so don't drop the packet immediately.  If
    749  1.5    itojun 			 * we notice that we run out of buffer space
    750  1.5    itojun 			 * below, we will however remember that we are
    751  1.5    itojun 			 * not ready to carry IP packets, and return
    752  1.5    itojun 			 * ENETDOWN, as opposed to ENOBUFS.
    753  1.5    itojun 			 */
    754  1.3  explorer 			h->protocol = htons(PPP_IPV6);
    755  1.3  explorer 			if (sp->state[IDX_IPCP] != STATE_OPENED)
    756  1.1  explorer 				rv = ENETDOWN;
    757  1.1  explorer 		}
    758  1.1  explorer 		break;
    759  1.1  explorer #endif
    760  1.1  explorer #ifdef NS
    761  1.1  explorer 	case AF_NS:     /* Xerox NS Protocol */
    762  1.1  explorer 		h->protocol = htons ((sp->pp_flags & PP_CISCO) ?
    763  1.1  explorer 			ETHERTYPE_NS : PPP_XNS);
    764  1.1  explorer 		break;
    765  1.1  explorer #endif
    766  1.1  explorer #ifdef IPX
    767  1.1  explorer 	case AF_IPX:     /* Novell IPX Protocol */
    768  1.1  explorer 		h->protocol = htons ((sp->pp_flags & PP_CISCO) ?
    769  1.1  explorer 			ETHERTYPE_IPX : PPP_IPX);
    770  1.1  explorer 		break;
    771  1.1  explorer #endif
    772  1.1  explorer #ifdef ISO
    773  1.1  explorer 	case AF_ISO:    /* ISO OSI Protocol */
    774  1.1  explorer 		if (sp->pp_flags & PP_CISCO)
    775  1.1  explorer 			goto nosupport;
    776  1.1  explorer 		h->protocol = htons (PPP_ISO);
    777  1.1  explorer 		break;
    778  1.1  explorer nosupport:
    779  1.1  explorer #endif
    780  1.1  explorer 	default:
    781  1.3  explorer 		m_freem (m);
    782  1.1  explorer 		++ifp->if_oerrors;
    783  1.1  explorer 		splx (s);
    784  1.1  explorer 		return (EAFNOSUPPORT);
    785  1.1  explorer 	}
    786  1.1  explorer 
    787  1.1  explorer 	/*
    788  1.1  explorer 	 * Queue message on interface, and start output if interface
    789  1.1  explorer 	 * not yet active.
    790  1.1  explorer 	 */
    791  1.1  explorer 	if (IF_QFULL (ifq)) {
    792  1.1  explorer 		IF_DROP (&ifp->if_snd);
    793  1.3  explorer 		m_freem (m);
    794  1.1  explorer 		++ifp->if_oerrors;
    795  1.3  explorer 		splx (s);
    796  1.1  explorer 		return (rv? rv: ENOBUFS);
    797  1.1  explorer 	}
    798  1.1  explorer 	IF_ENQUEUE (ifq, m);
    799  1.1  explorer 	if (! (ifp->if_flags & IFF_OACTIVE))
    800  1.1  explorer 		(*ifp->if_start) (ifp);
    801  1.1  explorer 
    802  1.1  explorer 	/*
    803  1.1  explorer 	 * Count output packets and bytes.
    804  1.1  explorer 	 * The packet length includes header, FCS and 1 flag,
    805  1.1  explorer 	 * according to RFC 1333.
    806  1.1  explorer 	 */
    807  1.1  explorer 	ifp->if_obytes += m->m_pkthdr.len + 3;
    808  1.1  explorer 	splx (s);
    809  1.1  explorer 	return (0);
    810  1.1  explorer }
    811  1.3  explorer 
    812  1.3  explorer void
    813  1.1  explorer sppp_attach(struct ifnet *ifp)
    814  1.1  explorer {
    815  1.1  explorer 	struct sppp *sp = (struct sppp*) ifp;
    816  1.1  explorer 
    817  1.7   thorpej 	/* Initialize keepalive handler. */
    818  1.7   thorpej 	if (! spppq) {
    819  1.7   thorpej #if defined(__NetBSD__)
    820  1.7   thorpej 		callout_init(&keepalive_ch);
    821  1.7   thorpej 		callout_reset(&keepalive_ch, hz * 10, sppp_keepalive, NULL);
    822  1.3  explorer #else
    823  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
    824  1.3  explorer 		keepalive_ch =
    825  1.3  explorer #endif
    826  1.7   thorpej 		timeout(sppp_keepalive, 0, hz * 10);
    827  1.7   thorpej #endif /* __NetBSD__ */
    828  1.1  explorer 	}
    829  1.1  explorer 
    830  1.1  explorer 	/* Insert new entry into the keepalive list. */
    831  1.1  explorer 	sp->pp_next = spppq;
    832  1.1  explorer 	spppq = sp;
    833  1.1  explorer 
    834  1.1  explorer 	sp->pp_if.if_type = IFT_PPP;
    835  1.1  explorer 	sp->pp_if.if_output = sppp_output;
    836  1.3  explorer 	sp->pp_fastq.ifq_maxlen = 32;
    837  1.1  explorer 	sp->pp_cpq.ifq_maxlen = 20;
    838  1.1  explorer 	sp->pp_loopcnt = 0;
    839  1.1  explorer 	sp->pp_alivecnt = 0;
    840  1.1  explorer 	sp->pp_seq = 0;
    841  1.3  explorer 	sp->pp_rseq = 0;
    842  1.3  explorer 	sp->pp_phase = PHASE_DEAD;
    843  1.3  explorer 	sp->pp_up = lcp.Up;
    844  1.3  explorer 	sp->pp_down = lcp.Down;
    845  1.3  explorer 
    846  1.3  explorer 	sppp_lcp_init(sp);
    847  1.3  explorer 	sppp_ipcp_init(sp);
    848  1.3  explorer 	sppp_pap_init(sp);
    849  1.1  explorer 	sppp_chap_init(sp);
    850  1.1  explorer }
    851  1.3  explorer 
    852  1.3  explorer void
    853  1.1  explorer sppp_detach(struct ifnet *ifp)
    854  1.1  explorer {
    855  1.3  explorer 	struct sppp **q, *p, *sp = (struct sppp*) ifp;
    856  1.1  explorer 	int i;
    857  1.1  explorer 
    858  1.1  explorer 	/* Remove the entry from the keepalive list. */
    859  1.1  explorer 	for (q = &spppq; (p = *q); q = &p->pp_next)
    860  1.1  explorer 		if (p == sp) {
    861  1.1  explorer 			*q = p->pp_next;
    862  1.1  explorer 			break;
    863  1.1  explorer 		}
    864  1.1  explorer 
    865  1.7   thorpej 	/* Stop keepalive handler. */
    866  1.7   thorpej 	if (! spppq) {
    867  1.7   thorpej #if defined(__NetBSD__)
    868  1.7   thorpej 		callout_stop(&keepalive_ch);
    869  1.3  explorer #else
    870  1.3  explorer 		untimeout(sppp_keepalive, 0
    871  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
    872  1.3  explorer 		,keepalive_ch
    873  1.3  explorer #endif
    874  1.7   thorpej 		);
    875  1.7   thorpej #endif /* __NetBSD__ */
    876  1.3  explorer 	}
    877  1.7   thorpej 
    878  1.7   thorpej 	for (i = 0; i < IDX_COUNT; i++) {
    879  1.7   thorpej #if defined(__NetBSD__)
    880  1.7   thorpej 		callout_stop(&sp->ch[i]);
    881  1.3  explorer #else
    882  1.3  explorer 		untimeout((cps[i])->TO, (void *)sp
    883  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
    884  1.3  explorer 		, sp->ch[i]
    885  1.3  explorer #endif
    886  1.7   thorpej 		);
    887  1.7   thorpej #endif /* __NetBSD__ */
    888  1.7   thorpej 	}
    889  1.7   thorpej #if defined(__NetBSD__)
    890  1.7   thorpej 	callout_stop(&sp->pap_my_to_ch);
    891  1.3  explorer #else
    892  1.3  explorer 	untimeout(sppp_pap_my_TO, (void *)sp
    893  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
    894  1.3  explorer 	, sp->pap_my_to_ch
    895  1.3  explorer #endif
    896  1.7   thorpej 	);
    897  1.1  explorer #endif /* __NetBSD__ */
    898  1.1  explorer }
    899  1.1  explorer 
    900  1.1  explorer /*
    901  1.1  explorer  * Flush the interface output queue.
    902  1.3  explorer  */
    903  1.3  explorer void
    904  1.1  explorer sppp_flush(struct ifnet *ifp)
    905  1.1  explorer {
    906  1.1  explorer 	struct sppp *sp = (struct sppp*) ifp;
    907  1.3  explorer 
    908  1.3  explorer 	sppp_qflush (&sp->pp_if.if_snd);
    909  1.3  explorer 	sppp_qflush (&sp->pp_fastq);
    910  1.1  explorer 	sppp_qflush (&sp->pp_cpq);
    911  1.1  explorer }
    912  1.1  explorer 
    913  1.1  explorer /*
    914  1.1  explorer  * Check if the output queue is empty.
    915  1.1  explorer  */
    916  1.3  explorer int
    917  1.1  explorer sppp_isempty(struct ifnet *ifp)
    918  1.1  explorer {
    919  1.3  explorer 	struct sppp *sp = (struct sppp*) ifp;
    920  1.1  explorer 	int empty, s;
    921  1.3  explorer 
    922  1.3  explorer 	s = splimp();
    923  1.3  explorer 	empty = !sp->pp_fastq.ifq_head && !sp->pp_cpq.ifq_head &&
    924  1.3  explorer 		!sp->pp_if.if_snd.ifq_head;
    925  1.1  explorer 	splx(s);
    926  1.1  explorer 	return (empty);
    927  1.1  explorer }
    928  1.1  explorer 
    929  1.1  explorer /*
    930  1.1  explorer  * Get next packet to send.
    931  1.3  explorer  */
    932  1.3  explorer struct mbuf *
    933  1.1  explorer sppp_dequeue(struct ifnet *ifp)
    934  1.1  explorer {
    935  1.1  explorer 	struct sppp *sp = (struct sppp*) ifp;
    936  1.3  explorer 	struct mbuf *m;
    937  1.1  explorer 	int s;
    938  1.3  explorer 
    939  1.3  explorer 	s = splimp();
    940  1.3  explorer 	/*
    941  1.3  explorer 	 * Process only the control protocol queue until we have at
    942  1.3  explorer 	 * least one NCP open.
    943  1.3  explorer 	 *
    944  1.3  explorer 	 * Do always serve all three queues in Cisco mode.
    945  1.3  explorer 	 */
    946  1.3  explorer 	IF_DEQUEUE(&sp->pp_cpq, m);
    947  1.3  explorer 	if (m == NULL &&
    948  1.3  explorer 	    (sppp_ncp_check(sp) || (sp->pp_flags & PP_CISCO) != 0)) {
    949  1.3  explorer 		IF_DEQUEUE(&sp->pp_fastq, m);
    950  1.3  explorer 		if (m == NULL)
    951  1.3  explorer 			IF_DEQUEUE (&sp->pp_if.if_snd, m);
    952  1.3  explorer 	}
    953  1.3  explorer 	splx(s);
    954  1.1  explorer 	return m;
    955  1.1  explorer }
    956  1.1  explorer 
    957  1.3  explorer /*
    958  1.1  explorer  * Pick the next packet, do not remove it from the queue.
    959  1.3  explorer  */
    960  1.3  explorer struct mbuf *
    961  1.1  explorer sppp_pick(struct ifnet *ifp)
    962  1.3  explorer {
    963  1.3  explorer 	struct sppp *sp = (struct sppp*)ifp;
    964  1.3  explorer 	struct mbuf *m;
    965  1.1  explorer 	int s;
    966  1.3  explorer 
    967  1.1  explorer 	s= splimp ();
    968  1.3  explorer 
    969  1.3  explorer 	m = sp->pp_cpq.ifq_head;
    970  1.3  explorer 	if (m == NULL &&
    971  1.3  explorer 	    (sp->pp_phase == PHASE_NETWORK ||
    972  1.3  explorer 	     (sp->pp_flags & PP_CISCO) != 0))
    973  1.3  explorer 		if ((m = sp->pp_fastq.ifq_head) == NULL)
    974  1.1  explorer 			m = sp->pp_if.if_snd.ifq_head;
    975  1.3  explorer 	splx (s);
    976  1.1  explorer 	return (m);
    977  1.1  explorer }
    978  1.1  explorer 
    979  1.3  explorer /*
    980  1.1  explorer  * Process an ioctl request.  Called on low priority level.
    981  1.3  explorer  */
    982  1.3  explorer int
    983  1.3  explorer #if defined(__FreeBSD_version) && __FreeBSD_version >= 300003
    984  1.3  explorer sppp_ioctl(struct ifnet *ifp, u_long cmd, void *data)
    985  1.3  explorer #else
    986  1.3  explorer sppp_ioctl(struct ifnet *ifp, int cmd, void *data)
    987  1.1  explorer #endif
    988  1.3  explorer {
    989  1.3  explorer 	struct ifreq *ifr = (struct ifreq*) data;
    990  1.3  explorer 	struct sppp *sp = (struct sppp*) ifp;
    991  1.1  explorer 	int s, rv, going_up, going_down, newmode;
    992  1.3  explorer 
    993  1.3  explorer 	s = splimp();
    994  1.3  explorer 	rv = 0;
    995  1.3  explorer 	switch (cmd) {
    996  1.3  explorer 	case SIOCAIFADDR:
    997  1.1  explorer 	case SIOCSIFDSTADDR:
    998  1.3  explorer 		break;
    999  1.3  explorer 
   1000  1.3  explorer 	case SIOCSIFADDR:
   1001  1.3  explorer 		if_up(ifp);
   1002  1.3  explorer 		/* fall through... */
   1003  1.3  explorer 
   1004  1.3  explorer 	case SIOCSIFFLAGS:
   1005  1.3  explorer 		going_up = ifp->if_flags & IFF_UP &&
   1006  1.3  explorer 			(ifp->if_flags & IFF_RUNNING) == 0;
   1007  1.3  explorer 		going_down = (ifp->if_flags & IFF_UP) == 0 &&
   1008  1.3  explorer 			ifp->if_flags & IFF_RUNNING;
   1009  1.3  explorer 		newmode = ifp->if_flags & (IFF_AUTO | IFF_PASSIVE);
   1010  1.3  explorer 		if (newmode == (IFF_AUTO | IFF_PASSIVE)) {
   1011  1.3  explorer 			/* sanity */
   1012  1.3  explorer 			newmode = IFF_PASSIVE;
   1013  1.1  explorer 			ifp->if_flags &= ~IFF_AUTO;
   1014  1.1  explorer 		}
   1015  1.3  explorer 
   1016  1.3  explorer 		if (going_up || going_down)
   1017  1.3  explorer 			lcp.Close(sp);
   1018  1.3  explorer 		if (going_up && newmode == 0) {
   1019  1.3  explorer 			/* neither auto-dial nor passive */
   1020  1.3  explorer 			ifp->if_flags |= IFF_RUNNING;
   1021  1.3  explorer 			if (!(sp->pp_flags & PP_CISCO))
   1022  1.3  explorer 				lcp.Open(sp);
   1023  1.3  explorer 		} else if (going_down) {
   1024  1.3  explorer 			sppp_flush(ifp);
   1025  1.1  explorer 			ifp->if_flags &= ~IFF_RUNNING;
   1026  1.3  explorer 		}
   1027  1.3  explorer 
   1028  1.3  explorer 		break;
   1029  1.3  explorer 
   1030  1.3  explorer #ifdef SIOCSIFMTU
   1031  1.3  explorer #ifndef ifr_mtu
   1032  1.3  explorer #define ifr_mtu ifr_metric
   1033  1.3  explorer #endif
   1034  1.3  explorer 	case SIOCSIFMTU:
   1035  1.3  explorer 		if (ifr->ifr_mtu < 128 || ifr->ifr_mtu > sp->lcp.their_mru)
   1036  1.3  explorer 			return (EINVAL);
   1037  1.3  explorer 		ifp->if_mtu = ifr->ifr_mtu;
   1038  1.3  explorer 		break;
   1039  1.3  explorer #endif
   1040  1.3  explorer #ifdef SLIOCSETMTU
   1041  1.3  explorer 	case SLIOCSETMTU:
   1042  1.3  explorer 		if (*(short*)data < 128 || *(short*)data > sp->lcp.their_mru)
   1043  1.3  explorer 			return (EINVAL);
   1044  1.1  explorer 		ifp->if_mtu = *(short*)data;
   1045  1.3  explorer 		break;
   1046  1.3  explorer #endif
   1047  1.3  explorer #ifdef SIOCGIFMTU
   1048  1.3  explorer 	case SIOCGIFMTU:
   1049  1.1  explorer 		ifr->ifr_mtu = ifp->if_mtu;
   1050  1.3  explorer 		break;
   1051  1.3  explorer #endif
   1052  1.3  explorer #ifdef SLIOCGETMTU
   1053  1.3  explorer 	case SLIOCGETMTU:
   1054  1.1  explorer 		*(short*)data = ifp->if_mtu;
   1055  1.3  explorer 		break;
   1056  1.3  explorer #endif
   1057  1.3  explorer 	case SIOCADDMULTI:
   1058  1.1  explorer 	case SIOCDELMULTI:
   1059  1.1  explorer 		break;
   1060  1.3  explorer 
   1061  1.3  explorer 	case SIOCGIFGENERIC:
   1062  1.3  explorer 	case SIOCSIFGENERIC:
   1063  1.1  explorer 		rv = sppp_params(sp, cmd, data);
   1064  1.3  explorer 		break;
   1065  1.3  explorer 
   1066  1.3  explorer 	default:
   1067  1.1  explorer 		rv = ENOTTY;
   1068  1.3  explorer 	}
   1069  1.3  explorer 	splx(s);
   1070  1.1  explorer 	return rv;
   1071  1.1  explorer }
   1072  1.3  explorer 
   1073  1.3  explorer 
   1074  1.3  explorer /*
   1076  1.3  explorer  * Cisco framing implementation.
   1077  1.1  explorer  */
   1078  1.1  explorer 
   1079  1.1  explorer /*
   1080  1.3  explorer  * Handle incoming Cisco keepalive protocol packets.
   1081  1.3  explorer  */
   1082  1.1  explorer static void
   1083  1.3  explorer sppp_cisco_input(struct sppp *sp, struct mbuf *m)
   1084  1.1  explorer {
   1085  1.3  explorer 	STDDCL;
   1086  1.1  explorer 	struct cisco_packet *h;
   1087  1.1  explorer 	u_long me, mymask;
   1088  1.3  explorer 
   1089  1.3  explorer 	if (m->m_pkthdr.len < CISCO_PACKET_LEN) {
   1090  1.3  explorer 		if (debug)
   1091  1.3  explorer 			log(LOG_DEBUG,
   1092  1.1  explorer 			    SPP_FMT "cisco invalid packet length: %d bytes\n",
   1093  1.1  explorer 			    SPP_ARGS(ifp), m->m_pkthdr.len);
   1094  1.1  explorer 		return;
   1095  1.3  explorer 	}
   1096  1.3  explorer 	h = mtod (m, struct cisco_packet*);
   1097  1.3  explorer 	if (debug)
   1098  1.3  explorer 		log(LOG_DEBUG,
   1099  1.3  explorer 		    SPP_FMT "cisco input: %d bytes "
   1100  1.3  explorer 		    "<0x%lx 0x%lx 0x%lx 0x%x 0x%x-0x%x>\n",
   1101  1.3  explorer 		    SPP_ARGS(ifp), m->m_pkthdr.len,
   1102  1.1  explorer 		    (u_long)ntohl (h->type), (u_long)h->par1, (u_long)h->par2, (u_int)h->rel,
   1103  1.1  explorer 		    (u_int)h->time0, (u_int)h->time1);
   1104  1.3  explorer 	switch (ntohl (h->type)) {
   1105  1.3  explorer 	default:
   1106  1.3  explorer 		if (debug)
   1107  1.1  explorer 			addlog(SPP_FMT "cisco unknown packet type: 0x%lx\n",
   1108  1.1  explorer 			       SPP_ARGS(ifp), (u_long)ntohl (h->type));
   1109  1.1  explorer 		break;
   1110  1.1  explorer 	case CISCO_ADDR_REPLY:
   1111  1.1  explorer 		/* Reply on address request, ignore */
   1112  1.1  explorer 		break;
   1113  1.1  explorer 	case CISCO_KEEPALIVE_REQ:
   1114  1.1  explorer 		sp->pp_alivecnt = 0;
   1115  1.1  explorer 		sp->pp_rseq = ntohl (h->par1);
   1116  1.1  explorer 		if (sp->pp_seq == sp->pp_rseq) {
   1117  1.1  explorer 			/* Local and remote sequence numbers are equal.
   1118  1.3  explorer 			 * Probably, the line is in loopback mode. */
   1119  1.3  explorer 			if (sp->pp_loopcnt >= MAXALIVECNT) {
   1120  1.1  explorer 				printf (SPP_FMT "loopback\n",
   1121  1.1  explorer 					SPP_ARGS(ifp));
   1122  1.1  explorer 				sp->pp_loopcnt = 0;
   1123  1.3  explorer 				if (ifp->if_flags & IFF_UP) {
   1124  1.1  explorer 					if_down (ifp);
   1125  1.1  explorer 					sppp_qflush (&sp->pp_cpq);
   1126  1.1  explorer 				}
   1127  1.1  explorer 			}
   1128  1.1  explorer 			++sp->pp_loopcnt;
   1129  1.3  explorer 
   1130  1.3  explorer 			/* Generate new local sequence number */
   1131  1.3  explorer #if defined(__NetBSD__) || (defined(__FreeBSD__) && __FreeBSD__ >= 3)
   1132  1.1  explorer 			sp->pp_seq = random();
   1133  1.3  explorer #else
   1134  1.1  explorer 			sp->pp_seq ^= time.tv_sec ^ time.tv_usec;
   1135  1.1  explorer #endif
   1136  1.3  explorer 			break;
   1137  1.1  explorer 		}
   1138  1.1  explorer 		sp->pp_loopcnt = 0;
   1139  1.3  explorer 		if (! (ifp->if_flags & IFF_UP) &&
   1140  1.3  explorer 		    (ifp->if_flags & IFF_RUNNING)) {
   1141  1.1  explorer 			if_up(ifp);
   1142  1.1  explorer 			printf (SPP_FMT "up\n", SPP_ARGS(ifp));
   1143  1.1  explorer 		}
   1144  1.3  explorer 		break;
   1145  1.3  explorer 	case CISCO_ADDR_REQ:
   1146  1.3  explorer 		sppp_get_ip_addrs(sp, &me, 0, &mymask);
   1147  1.1  explorer 		if (me != 0L)
   1148  1.1  explorer 			sppp_cisco_send(sp, CISCO_ADDR_REPLY, me, mymask);
   1149  1.1  explorer 		break;
   1150  1.1  explorer 	}
   1151  1.1  explorer }
   1152  1.3  explorer 
   1153  1.1  explorer /*
   1154  1.1  explorer  * Send Cisco keepalive packet.
   1155  1.3  explorer  */
   1156  1.1  explorer static void
   1157  1.3  explorer sppp_cisco_send(struct sppp *sp, int type, long par1, long par2)
   1158  1.1  explorer {
   1159  1.3  explorer 	STDDCL;
   1160  1.1  explorer 	struct ppp_header *h;
   1161  1.3  explorer 	struct cisco_packet *ch;
   1162  1.3  explorer 	struct mbuf *m;
   1163  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   1164  1.3  explorer 	struct timeval tv;
   1165  1.3  explorer #else
   1166  1.1  explorer 	u_long t = (time.tv_sec - boottime.tv_sec) * 1000;
   1167  1.3  explorer #endif
   1168  1.3  explorer 
   1169  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   1170  1.3  explorer 	getmicrouptime(&tv);
   1171  1.1  explorer #endif
   1172  1.1  explorer 
   1173  1.1  explorer 	MGETHDR (m, M_DONTWAIT, MT_DATA);
   1174  1.3  explorer 	if (! m)
   1175  1.1  explorer 		return;
   1176  1.1  explorer 	m->m_pkthdr.len = m->m_len = PPP_HEADER_LEN + CISCO_PACKET_LEN;
   1177  1.1  explorer 	m->m_pkthdr.rcvif = 0;
   1178  1.3  explorer 
   1179  1.3  explorer 	h = mtod (m, struct ppp_header*);
   1180  1.3  explorer 	h->address = CISCO_MULTICAST;
   1181  1.3  explorer 	h->control = 0;
   1182  1.3  explorer 	h->protocol = htons (CISCO_KEEPALIVE);
   1183  1.3  explorer 
   1184  1.3  explorer 	ch = (struct cisco_packet*) (h + 1);
   1185  1.3  explorer 	ch->type = htonl (type);
   1186  1.3  explorer 	ch->par1 = htonl (par1);
   1187  1.3  explorer 	ch->par2 = htonl (par2);
   1188  1.3  explorer 	ch->rel = -1;
   1189  1.3  explorer 
   1190  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   1191  1.3  explorer 	ch->time0 = htons ((u_short) (tv.tv_sec >> 16));
   1192  1.3  explorer 	ch->time1 = htons ((u_short) tv.tv_sec);
   1193  1.3  explorer #else
   1194  1.3  explorer 	ch->time0 = htons ((u_short) (t >> 16));
   1195  1.1  explorer 	ch->time1 = htons ((u_short) t);
   1196  1.3  explorer #endif
   1197  1.3  explorer 
   1198  1.3  explorer 	if (debug)
   1199  1.3  explorer 		log(LOG_DEBUG,
   1200  1.3  explorer 		    SPP_FMT "cisco output: <0x%lx 0x%lx 0x%lx 0x%x 0x%x-0x%x>\n",
   1201  1.1  explorer 			SPP_ARGS(ifp), (u_long)ntohl (ch->type), (u_long)ch->par1,
   1202  1.3  explorer 			(u_long)ch->par2, (u_int)ch->rel, (u_int)ch->time0, (u_int)ch->time1);
   1203  1.3  explorer 
   1204  1.1  explorer 	if (IF_QFULL (&sp->pp_cpq)) {
   1205  1.1  explorer 		IF_DROP (&sp->pp_fastq);
   1206  1.1  explorer 		IF_DROP (&ifp->if_snd);
   1207  1.3  explorer 		m_freem (m);
   1208  1.1  explorer 	} else
   1209  1.1  explorer 		IF_ENQUEUE (&sp->pp_cpq, m);
   1210  1.1  explorer 	if (! (ifp->if_flags & IFF_OACTIVE))
   1211  1.1  explorer 		(*ifp->if_start) (ifp);
   1212  1.1  explorer 	ifp->if_obytes += m->m_pkthdr.len + 3;
   1213  1.3  explorer }
   1214  1.3  explorer 
   1215  1.3  explorer /*
   1217  1.1  explorer  * PPP protocol implementation.
   1218  1.3  explorer  */
   1219  1.1  explorer 
   1220  1.1  explorer /*
   1221  1.3  explorer  * Send PPP control protocol packet.
   1222  1.3  explorer  */
   1223  1.1  explorer static void
   1224  1.3  explorer sppp_cp_send(struct sppp *sp, u_short proto, u_char type,
   1225  1.1  explorer 	     u_char ident, u_short len, void *data)
   1226  1.3  explorer {
   1227  1.1  explorer 	STDDCL;
   1228  1.1  explorer 	struct ppp_header *h;
   1229  1.3  explorer 	struct lcp_header *lh;
   1230  1.3  explorer 	struct mbuf *m;
   1231  1.1  explorer 
   1232  1.1  explorer 	if (len > MHLEN - PPP_HEADER_LEN - LCP_HEADER_LEN)
   1233  1.1  explorer 		len = MHLEN - PPP_HEADER_LEN - LCP_HEADER_LEN;
   1234  1.3  explorer 	MGETHDR (m, M_DONTWAIT, MT_DATA);
   1235  1.1  explorer 	if (! m)
   1236  1.1  explorer 		return;
   1237  1.1  explorer 	m->m_pkthdr.len = m->m_len = PPP_HEADER_LEN + LCP_HEADER_LEN + len;
   1238  1.3  explorer 	m->m_pkthdr.rcvif = 0;
   1239  1.3  explorer 
   1240  1.3  explorer 	h = mtod (m, struct ppp_header*);
   1241  1.1  explorer 	h->address = PPP_ALLSTATIONS;        /* broadcast address */
   1242  1.3  explorer 	h->control = PPP_UI;                 /* Unnumbered Info */
   1243  1.3  explorer 	h->protocol = htons (proto);         /* Link Control Protocol */
   1244  1.3  explorer 
   1245  1.3  explorer 	lh = (struct lcp_header*) (h + 1);
   1246  1.3  explorer 	lh->type = type;
   1247  1.3  explorer 	lh->ident = ident;
   1248  1.1  explorer 	lh->len = htons (LCP_HEADER_LEN + len);
   1249  1.3  explorer 	if (len)
   1250  1.3  explorer 		bcopy (data, lh+1, len);
   1251  1.3  explorer 
   1252  1.3  explorer 	if (debug) {
   1253  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "%s output <%s id=0x%x len=%d",
   1254  1.3  explorer 		    SPP_ARGS(ifp),
   1255  1.3  explorer 		    sppp_proto_name(proto),
   1256  1.3  explorer 		    sppp_cp_type_name (lh->type), lh->ident,
   1257  1.3  explorer 		    ntohs (lh->len));
   1258  1.3  explorer 		if (len)
   1259  1.3  explorer 			sppp_print_bytes ((u_char*) (lh+1), len);
   1260  1.3  explorer 		addlog(">\n");
   1261  1.1  explorer 	}
   1262  1.1  explorer 	if (IF_QFULL (&sp->pp_cpq)) {
   1263  1.3  explorer 		IF_DROP (&sp->pp_fastq);
   1264  1.1  explorer 		IF_DROP (&ifp->if_snd);
   1265  1.3  explorer 		m_freem (m);
   1266  1.1  explorer 		++ifp->if_oerrors;
   1267  1.1  explorer 	} else
   1268  1.1  explorer 		IF_ENQUEUE (&sp->pp_cpq, m);
   1269  1.1  explorer 	if (! (ifp->if_flags & IFF_OACTIVE))
   1270  1.1  explorer 		(*ifp->if_start) (ifp);
   1271  1.1  explorer 	ifp->if_obytes += m->m_pkthdr.len + 3;
   1272  1.3  explorer }
   1273  1.1  explorer 
   1274  1.1  explorer /*
   1275  1.3  explorer  * Handle incoming PPP control protocol packets.
   1276  1.1  explorer  */
   1277  1.3  explorer static void
   1278  1.1  explorer sppp_cp_input(const struct cp *cp, struct sppp *sp, struct mbuf *m)
   1279  1.1  explorer {
   1280  1.3  explorer 	STDDCL;
   1281  1.3  explorer 	struct lcp_header *h;
   1282  1.1  explorer 	int len = m->m_pkthdr.len;
   1283  1.1  explorer 	int rv;
   1284  1.3  explorer 	u_char *p;
   1285  1.3  explorer 
   1286  1.3  explorer 	if (len < 4) {
   1287  1.3  explorer 		if (debug)
   1288  1.1  explorer 			log(LOG_DEBUG,
   1289  1.1  explorer 			    SPP_FMT "%s invalid packet length: %d bytes\n",
   1290  1.1  explorer 			    SPP_ARGS(ifp), cp->name, len);
   1291  1.3  explorer 		return;
   1292  1.3  explorer 	}
   1293  1.3  explorer 	h = mtod (m, struct lcp_header*);
   1294  1.3  explorer 	if (debug) {
   1295  1.3  explorer 		log(LOG_DEBUG,
   1296  1.3  explorer 		    SPP_FMT "%s input(%s): <%s id=0x%x len=%d",
   1297  1.1  explorer 		    SPP_ARGS(ifp), cp->name,
   1298  1.3  explorer 		    sppp_state_name(sp->state[cp->protoidx]),
   1299  1.3  explorer 		    sppp_cp_type_name (h->type), h->ident, ntohs (h->len));
   1300  1.1  explorer 		if (len > 4)
   1301  1.1  explorer 			sppp_print_bytes ((u_char*) (h+1), len-4);
   1302  1.1  explorer 		addlog(">\n");
   1303  1.3  explorer 	}
   1304  1.1  explorer 	if (len > ntohs (h->len))
   1305  1.3  explorer 		len = ntohs (h->len);
   1306  1.1  explorer 	p = (u_char *)(h + 1);
   1307  1.3  explorer 	switch (h->type) {
   1308  1.3  explorer 	case CONF_REQ:
   1309  1.3  explorer 		if (len < 4) {
   1310  1.3  explorer 			if (debug)
   1311  1.3  explorer 				addlog(SPP_FMT "%s invalid conf-req length %d\n",
   1312  1.3  explorer 				       SPP_ARGS(ifp), cp->name,
   1313  1.3  explorer 				       len);
   1314  1.3  explorer 			++ifp->if_ierrors;
   1315  1.3  explorer 			break;
   1316  1.3  explorer 		}
   1317  1.3  explorer 		/* handle states where RCR doesn't get a SCA/SCN */
   1318  1.1  explorer 		switch (sp->state[cp->protoidx]) {
   1319  1.3  explorer 		case STATE_CLOSING:
   1320  1.3  explorer 		case STATE_STOPPING:
   1321  1.3  explorer 			return;
   1322  1.3  explorer 		case STATE_CLOSED:
   1323  1.3  explorer 			sppp_cp_send(sp, cp->proto, TERM_ACK, h->ident,
   1324  1.3  explorer 				     0, 0);
   1325  1.3  explorer 			return;
   1326  1.3  explorer 		}
   1327  1.3  explorer 		rv = (cp->RCR)(sp, h, len);
   1328  1.3  explorer 		switch (sp->state[cp->protoidx]) {
   1329  1.3  explorer 		case STATE_OPENED:
   1330  1.3  explorer 			(cp->tld)(sp);
   1331  1.3  explorer 			(cp->scr)(sp);
   1332  1.3  explorer 			/* fall through... */
   1333  1.3  explorer 		case STATE_ACK_SENT:
   1334  1.3  explorer 		case STATE_REQ_SENT:
   1335  1.3  explorer 			sppp_cp_change_state(cp, sp, rv?
   1336  1.3  explorer 					     STATE_ACK_SENT: STATE_REQ_SENT);
   1337  1.3  explorer 			break;
   1338  1.3  explorer 		case STATE_STOPPED:
   1339  1.3  explorer 			sp->rst_counter[cp->protoidx] = sp->lcp.max_configure;
   1340  1.3  explorer 			(cp->scr)(sp);
   1341  1.3  explorer 			sppp_cp_change_state(cp, sp, rv?
   1342  1.3  explorer 					     STATE_ACK_SENT: STATE_REQ_SENT);
   1343  1.3  explorer 			break;
   1344  1.3  explorer 		case STATE_ACK_RCVD:
   1345  1.3  explorer 			if (rv) {
   1346  1.3  explorer 				sppp_cp_change_state(cp, sp, STATE_OPENED);
   1347  1.3  explorer 				if (debug)
   1348  1.3  explorer 					log(LOG_DEBUG, SPP_FMT "%s tlu\n",
   1349  1.3  explorer 					    SPP_ARGS(ifp),
   1350  1.3  explorer 					    cp->name);
   1351  1.3  explorer 				(cp->tlu)(sp);
   1352  1.3  explorer 			} else
   1353  1.3  explorer 				sppp_cp_change_state(cp, sp, STATE_ACK_RCVD);
   1354  1.3  explorer 			break;
   1355  1.3  explorer 		default:
   1356  1.3  explorer 			printf(SPP_FMT "%s illegal %s in state %s\n",
   1357  1.3  explorer 			       SPP_ARGS(ifp), cp->name,
   1358  1.3  explorer 			       sppp_cp_type_name(h->type),
   1359  1.3  explorer 			       sppp_state_name(sp->state[cp->protoidx]));
   1360  1.3  explorer 			++ifp->if_ierrors;
   1361  1.3  explorer 		}
   1362  1.3  explorer 		break;
   1363  1.3  explorer 	case CONF_ACK:
   1364  1.3  explorer 		if (h->ident != sp->confid[cp->protoidx]) {
   1365  1.3  explorer 			if (debug)
   1366  1.3  explorer 				addlog(SPP_FMT "%s id mismatch 0x%x != 0x%x\n",
   1367  1.3  explorer 				       SPP_ARGS(ifp), cp->name,
   1368  1.3  explorer 				       h->ident, sp->confid[cp->protoidx]);
   1369  1.3  explorer 			++ifp->if_ierrors;
   1370  1.3  explorer 			break;
   1371  1.3  explorer 		}
   1372  1.3  explorer 		switch (sp->state[cp->protoidx]) {
   1373  1.3  explorer 		case STATE_CLOSED:
   1374  1.3  explorer 		case STATE_STOPPED:
   1375  1.3  explorer 			sppp_cp_send(sp, cp->proto, TERM_ACK, h->ident, 0, 0);
   1376  1.3  explorer 			break;
   1377  1.3  explorer 		case STATE_CLOSING:
   1378  1.3  explorer 		case STATE_STOPPING:
   1379  1.3  explorer 			break;
   1380  1.3  explorer 		case STATE_REQ_SENT:
   1381  1.3  explorer 			sp->rst_counter[cp->protoidx] = sp->lcp.max_configure;
   1382  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_ACK_RCVD);
   1383  1.3  explorer 			break;
   1384  1.3  explorer 		case STATE_OPENED:
   1385  1.3  explorer 			(cp->tld)(sp);
   1386  1.3  explorer 			/* fall through */
   1387  1.3  explorer 		case STATE_ACK_RCVD:
   1388  1.3  explorer 			(cp->scr)(sp);
   1389  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_REQ_SENT);
   1390  1.3  explorer 			break;
   1391  1.3  explorer 		case STATE_ACK_SENT:
   1392  1.3  explorer 			sp->rst_counter[cp->protoidx] = sp->lcp.max_configure;
   1393  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_OPENED);
   1394  1.3  explorer 			if (debug)
   1395  1.3  explorer 				log(LOG_DEBUG, SPP_FMT "%s tlu\n",
   1396  1.3  explorer 				       SPP_ARGS(ifp), cp->name);
   1397  1.3  explorer 			(cp->tlu)(sp);
   1398  1.3  explorer 			break;
   1399  1.3  explorer 		default:
   1400  1.3  explorer 			printf(SPP_FMT "%s illegal %s in state %s\n",
   1401  1.3  explorer 			       SPP_ARGS(ifp), cp->name,
   1402  1.3  explorer 			       sppp_cp_type_name(h->type),
   1403  1.3  explorer 			       sppp_state_name(sp->state[cp->protoidx]));
   1404  1.3  explorer 			++ifp->if_ierrors;
   1405  1.3  explorer 		}
   1406  1.3  explorer 		break;
   1407  1.3  explorer 	case CONF_NAK:
   1408  1.3  explorer 	case CONF_REJ:
   1409  1.3  explorer 		if (h->ident != sp->confid[cp->protoidx]) {
   1410  1.3  explorer 			if (debug)
   1411  1.3  explorer 				addlog(SPP_FMT "%s id mismatch 0x%x != 0x%x\n",
   1412  1.3  explorer 				       SPP_ARGS(ifp), cp->name,
   1413  1.1  explorer 				       h->ident, sp->confid[cp->protoidx]);
   1414  1.3  explorer 			++ifp->if_ierrors;
   1415  1.3  explorer 			break;
   1416  1.3  explorer 		}
   1417  1.3  explorer 		if (h->type == CONF_NAK)
   1418  1.3  explorer 			(cp->RCN_nak)(sp, h, len);
   1419  1.3  explorer 		else /* CONF_REJ */
   1420  1.3  explorer 			(cp->RCN_rej)(sp, h, len);
   1421  1.3  explorer 
   1422  1.3  explorer 		switch (sp->state[cp->protoidx]) {
   1423  1.3  explorer 		case STATE_CLOSED:
   1424  1.3  explorer 		case STATE_STOPPED:
   1425  1.3  explorer 			sppp_cp_send(sp, cp->proto, TERM_ACK, h->ident, 0, 0);
   1426  1.3  explorer 			break;
   1427  1.3  explorer 		case STATE_REQ_SENT:
   1428  1.3  explorer 		case STATE_ACK_SENT:
   1429  1.3  explorer 			sp->rst_counter[cp->protoidx] = sp->lcp.max_configure;
   1430  1.3  explorer 			(cp->scr)(sp);
   1431  1.3  explorer 			break;
   1432  1.3  explorer 		case STATE_OPENED:
   1433  1.3  explorer 			(cp->tld)(sp);
   1434  1.3  explorer 			/* fall through */
   1435  1.3  explorer 		case STATE_ACK_RCVD:
   1436  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_ACK_SENT);
   1437  1.3  explorer 			(cp->scr)(sp);
   1438  1.3  explorer 			break;
   1439  1.3  explorer 		case STATE_CLOSING:
   1440  1.3  explorer 		case STATE_STOPPING:
   1441  1.3  explorer 			break;
   1442  1.3  explorer 		default:
   1443  1.3  explorer 			printf(SPP_FMT "%s illegal %s in state %s\n",
   1444  1.3  explorer 			       SPP_ARGS(ifp), cp->name,
   1445  1.3  explorer 			       sppp_cp_type_name(h->type),
   1446  1.3  explorer 			       sppp_state_name(sp->state[cp->protoidx]));
   1447  1.3  explorer 			++ifp->if_ierrors;
   1448  1.3  explorer 		}
   1449  1.3  explorer 		break;
   1450  1.3  explorer 
   1451  1.3  explorer 	case TERM_REQ:
   1452  1.3  explorer 		switch (sp->state[cp->protoidx]) {
   1453  1.3  explorer 		case STATE_ACK_RCVD:
   1454  1.3  explorer 		case STATE_ACK_SENT:
   1455  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_REQ_SENT);
   1456  1.3  explorer 			/* fall through */
   1457  1.3  explorer 		case STATE_CLOSED:
   1458  1.3  explorer 		case STATE_STOPPED:
   1459  1.3  explorer 		case STATE_CLOSING:
   1460  1.3  explorer 		case STATE_STOPPING:
   1461  1.3  explorer 		case STATE_REQ_SENT:
   1462  1.3  explorer 		  sta:
   1463  1.3  explorer 			/* Send Terminate-Ack packet. */
   1464  1.3  explorer 			if (debug)
   1465  1.3  explorer 				log(LOG_DEBUG, SPP_FMT "%s send terminate-ack\n",
   1466  1.3  explorer 				    SPP_ARGS(ifp), cp->name);
   1467  1.3  explorer 			sppp_cp_send(sp, cp->proto, TERM_ACK, h->ident, 0, 0);
   1468  1.3  explorer 			break;
   1469  1.3  explorer 		case STATE_OPENED:
   1470  1.3  explorer 			(cp->tld)(sp);
   1471  1.3  explorer 			sp->rst_counter[cp->protoidx] = 0;
   1472  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_STOPPING);
   1473  1.3  explorer 			goto sta;
   1474  1.3  explorer 			break;
   1475  1.3  explorer 		default:
   1476  1.3  explorer 			printf(SPP_FMT "%s illegal %s in state %s\n",
   1477  1.3  explorer 			       SPP_ARGS(ifp), cp->name,
   1478  1.1  explorer 			       sppp_cp_type_name(h->type),
   1479  1.1  explorer 			       sppp_state_name(sp->state[cp->protoidx]));
   1480  1.3  explorer 			++ifp->if_ierrors;
   1481  1.3  explorer 		}
   1482  1.3  explorer 		break;
   1483  1.3  explorer 	case TERM_ACK:
   1484  1.3  explorer 		switch (sp->state[cp->protoidx]) {
   1485  1.3  explorer 		case STATE_CLOSED:
   1486  1.3  explorer 		case STATE_STOPPED:
   1487  1.3  explorer 		case STATE_REQ_SENT:
   1488  1.3  explorer 		case STATE_ACK_SENT:
   1489  1.3  explorer 			break;
   1490  1.3  explorer 		case STATE_CLOSING:
   1491  1.3  explorer 			(cp->tlf)(sp);
   1492  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_CLOSED);
   1493  1.3  explorer 			break;
   1494  1.1  explorer 		case STATE_STOPPING:
   1495  1.3  explorer 			(cp->tlf)(sp);
   1496  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_STOPPED);
   1497  1.1  explorer 			break;
   1498  1.3  explorer 		case STATE_ACK_RCVD:
   1499  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_REQ_SENT);
   1500  1.3  explorer 			break;
   1501  1.3  explorer 		case STATE_OPENED:
   1502  1.1  explorer 			(cp->tld)(sp);
   1503  1.3  explorer 			(cp->scr)(sp);
   1504  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_ACK_RCVD);
   1505  1.3  explorer 			break;
   1506  1.3  explorer 		default:
   1507  1.3  explorer 			printf(SPP_FMT "%s illegal %s in state %s\n",
   1508  1.3  explorer 			       SPP_ARGS(ifp), cp->name,
   1509  1.1  explorer 			       sppp_cp_type_name(h->type),
   1510  1.1  explorer 			       sppp_state_name(sp->state[cp->protoidx]));
   1511  1.3  explorer 			++ifp->if_ierrors;
   1512  1.3  explorer 		}
   1513  1.3  explorer 		break;
   1514  1.3  explorer 	case CODE_REJ:
   1515  1.3  explorer 	case PROTO_REJ:
   1516  1.3  explorer 		/* XXX catastrophic rejects (RXJ-) aren't handled yet. */
   1517  1.3  explorer 		log(LOG_INFO,
   1518  1.3  explorer 		    SPP_FMT "%s: ignoring RXJ (%s) for proto 0x%x, "
   1519  1.3  explorer 		    "danger will robinson\n",
   1520  1.3  explorer 		    SPP_ARGS(ifp), cp->name,
   1521  1.3  explorer 		    sppp_cp_type_name(h->type), ntohs(*((u_short *)p)));
   1522  1.3  explorer 		switch (sp->state[cp->protoidx]) {
   1523  1.3  explorer 		case STATE_CLOSED:
   1524  1.3  explorer 		case STATE_STOPPED:
   1525  1.3  explorer 		case STATE_REQ_SENT:
   1526  1.3  explorer 		case STATE_ACK_SENT:
   1527  1.3  explorer 		case STATE_CLOSING:
   1528  1.3  explorer 		case STATE_STOPPING:
   1529  1.3  explorer 		case STATE_OPENED:
   1530  1.1  explorer 			break;
   1531  1.3  explorer 		case STATE_ACK_RCVD:
   1532  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_REQ_SENT);
   1533  1.3  explorer 			break;
   1534  1.3  explorer 		default:
   1535  1.3  explorer 			printf(SPP_FMT "%s illegal %s in state %s\n",
   1536  1.3  explorer 			       SPP_ARGS(ifp), cp->name,
   1537  1.3  explorer 			       sppp_cp_type_name(h->type),
   1538  1.1  explorer 			       sppp_state_name(sp->state[cp->protoidx]));
   1539  1.3  explorer 			++ifp->if_ierrors;
   1540  1.3  explorer 		}
   1541  1.3  explorer 		break;
   1542  1.3  explorer 	case DISC_REQ:
   1543  1.3  explorer 		if (cp->proto != PPP_LCP)
   1544  1.3  explorer 			goto illegal;
   1545  1.3  explorer 		/* Discard the packet. */
   1546  1.3  explorer 		break;
   1547  1.3  explorer 	case ECHO_REQ:
   1548  1.3  explorer 		if (cp->proto != PPP_LCP)
   1549  1.3  explorer 			goto illegal;
   1550  1.3  explorer 		if (sp->state[cp->protoidx] != STATE_OPENED) {
   1551  1.3  explorer 			if (debug)
   1552  1.3  explorer 				addlog(SPP_FMT "lcp echo req but lcp closed\n",
   1553  1.3  explorer 				       SPP_ARGS(ifp));
   1554  1.3  explorer 			++ifp->if_ierrors;
   1555  1.3  explorer 			break;
   1556  1.3  explorer 		}
   1557  1.3  explorer 		if (len < 8) {
   1558  1.3  explorer 			if (debug)
   1559  1.3  explorer 				addlog(SPP_FMT "invalid lcp echo request "
   1560  1.3  explorer 				       "packet length: %d bytes\n",
   1561  1.3  explorer 				       SPP_ARGS(ifp), len);
   1562  1.3  explorer 			break;
   1563  1.3  explorer 		}
   1564  1.3  explorer 		if (ntohl (*(long*)(h+1)) == sp->lcp.magic) {
   1565  1.3  explorer 			/* Line loopback mode detected. */
   1566  1.3  explorer 			printf(SPP_FMT "loopback\n", SPP_ARGS(ifp));
   1567  1.3  explorer 			if_down (ifp);
   1568  1.3  explorer 			sppp_qflush (&sp->pp_cpq);
   1569  1.3  explorer 
   1570  1.3  explorer 			/* Shut down the PPP link. */
   1571  1.3  explorer 			/* XXX */
   1572  1.3  explorer 			lcp.Down(sp);
   1573  1.3  explorer 			lcp.Up(sp);
   1574  1.3  explorer 			break;
   1575  1.3  explorer 		}
   1576  1.3  explorer 		*(long*)(h+1) = htonl (sp->lcp.magic);
   1577  1.3  explorer 		if (debug)
   1578  1.1  explorer 			addlog(SPP_FMT "got lcp echo req, sending echo rep\n",
   1579  1.3  explorer 			       SPP_ARGS(ifp));
   1580  1.3  explorer 		sppp_cp_send (sp, PPP_LCP, ECHO_REPLY, h->ident, len-4, h+1);
   1581  1.3  explorer 		break;
   1582  1.3  explorer 	case ECHO_REPLY:
   1583  1.3  explorer 		if (cp->proto != PPP_LCP)
   1584  1.3  explorer 			goto illegal;
   1585  1.3  explorer 		if (h->ident != sp->lcp.echoid) {
   1586  1.3  explorer 			++ifp->if_ierrors;
   1587  1.3  explorer 			break;
   1588  1.3  explorer 		}
   1589  1.3  explorer 		if (len < 8) {
   1590  1.3  explorer 			if (debug)
   1591  1.3  explorer 				addlog(SPP_FMT "lcp invalid echo reply "
   1592  1.3  explorer 				       "packet length: %d bytes\n",
   1593  1.3  explorer 				       SPP_ARGS(ifp), len);
   1594  1.3  explorer 			break;
   1595  1.3  explorer 		}
   1596  1.3  explorer 		if (debug)
   1597  1.3  explorer 			addlog(SPP_FMT "lcp got echo rep\n",
   1598  1.1  explorer 			       SPP_ARGS(ifp));
   1599  1.3  explorer 		if (ntohl (*(long*)(h+1)) != sp->lcp.magic)
   1600  1.3  explorer 			sp->pp_alivecnt = 0;
   1601  1.3  explorer 		break;
   1602  1.3  explorer 	default:
   1603  1.3  explorer 		/* Unknown packet type -- send Code-Reject packet. */
   1604  1.3  explorer 	  illegal:
   1605  1.3  explorer 		if (debug)
   1606  1.3  explorer 			addlog(SPP_FMT "%s send code-rej for 0x%x\n",
   1607  1.3  explorer 			       SPP_ARGS(ifp), cp->name, h->type);
   1608  1.1  explorer 		sppp_cp_send(sp, cp->proto, CODE_REJ, ++sp->pp_seq,
   1609  1.1  explorer 			     m->m_pkthdr.len, h);
   1610  1.1  explorer 		++ifp->if_ierrors;
   1611  1.3  explorer 	}
   1612  1.3  explorer }
   1613  1.3  explorer 
   1614  1.3  explorer 
   1615  1.3  explorer /*
   1616  1.1  explorer  * The generic part of all Up/Down/Open/Close/TO event handlers.
   1617  1.3  explorer  * Basically, the state transition handling in the automaton.
   1618  1.1  explorer  */
   1619  1.3  explorer static void
   1620  1.1  explorer sppp_up_event(const struct cp *cp, struct sppp *sp)
   1621  1.3  explorer {
   1622  1.3  explorer 	STDDCL;
   1623  1.3  explorer 
   1624  1.3  explorer 	if (debug)
   1625  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "%s up(%s)\n",
   1626  1.3  explorer 		    SPP_ARGS(ifp), cp->name,
   1627  1.3  explorer 		    sppp_state_name(sp->state[cp->protoidx]));
   1628  1.3  explorer 
   1629  1.3  explorer 	switch (sp->state[cp->protoidx]) {
   1630  1.3  explorer 	case STATE_INITIAL:
   1631  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_CLOSED);
   1632  1.3  explorer 		break;
   1633  1.3  explorer 	case STATE_STARTING:
   1634  1.3  explorer 		sp->rst_counter[cp->protoidx] = sp->lcp.max_configure;
   1635  1.3  explorer 		(cp->scr)(sp);
   1636  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_REQ_SENT);
   1637  1.3  explorer 		break;
   1638  1.3  explorer 	default:
   1639  1.3  explorer 		printf(SPP_FMT "%s illegal up in state %s\n",
   1640  1.1  explorer 		       SPP_ARGS(ifp), cp->name,
   1641  1.1  explorer 		       sppp_state_name(sp->state[cp->protoidx]));
   1642  1.1  explorer 	}
   1643  1.3  explorer }
   1644  1.1  explorer 
   1645  1.3  explorer static void
   1646  1.3  explorer sppp_down_event(const struct cp *cp, struct sppp *sp)
   1647  1.3  explorer {
   1648  1.3  explorer 	STDDCL;
   1649  1.3  explorer 
   1650  1.3  explorer 	if (debug)
   1651  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "%s down(%s)\n",
   1652  1.3  explorer 		    SPP_ARGS(ifp), cp->name,
   1653  1.3  explorer 		    sppp_state_name(sp->state[cp->protoidx]));
   1654  1.3  explorer 
   1655  1.3  explorer 	switch (sp->state[cp->protoidx]) {
   1656  1.3  explorer 	case STATE_CLOSED:
   1657  1.3  explorer 	case STATE_CLOSING:
   1658  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_INITIAL);
   1659  1.3  explorer 		break;
   1660  1.3  explorer 	case STATE_STOPPED:
   1661  1.3  explorer 		(cp->tls)(sp);
   1662  1.3  explorer 		/* fall through */
   1663  1.3  explorer 	case STATE_STOPPING:
   1664  1.3  explorer 	case STATE_REQ_SENT:
   1665  1.3  explorer 	case STATE_ACK_RCVD:
   1666  1.3  explorer 	case STATE_ACK_SENT:
   1667  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_STARTING);
   1668  1.3  explorer 		break;
   1669  1.3  explorer 	case STATE_OPENED:
   1670  1.3  explorer 		(cp->tld)(sp);
   1671  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_STARTING);
   1672  1.3  explorer 		break;
   1673  1.3  explorer 	default:
   1674  1.3  explorer 		printf(SPP_FMT "%s illegal down in state %s\n",
   1675  1.1  explorer 		       SPP_ARGS(ifp), cp->name,
   1676  1.1  explorer 		       sppp_state_name(sp->state[cp->protoidx]));
   1677  1.3  explorer 	}
   1678  1.1  explorer }
   1679  1.3  explorer 
   1680  1.1  explorer 
   1681  1.3  explorer static void
   1682  1.1  explorer sppp_open_event(const struct cp *cp, struct sppp *sp)
   1683  1.3  explorer {
   1684  1.3  explorer 	STDDCL;
   1685  1.3  explorer 
   1686  1.3  explorer 	if (debug)
   1687  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "%s open(%s)\n",
   1688  1.3  explorer 		    SPP_ARGS(ifp), cp->name,
   1689  1.3  explorer 		    sppp_state_name(sp->state[cp->protoidx]));
   1690  1.3  explorer 
   1691  1.3  explorer 	switch (sp->state[cp->protoidx]) {
   1692  1.3  explorer 	case STATE_INITIAL:
   1693  1.3  explorer 		(cp->tls)(sp);
   1694  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_STARTING);
   1695  1.3  explorer 		break;
   1696  1.3  explorer 	case STATE_STARTING:
   1697  1.3  explorer 		break;
   1698  1.3  explorer 	case STATE_CLOSED:
   1699  1.3  explorer 		sp->rst_counter[cp->protoidx] = sp->lcp.max_configure;
   1700  1.3  explorer 		(cp->scr)(sp);
   1701  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_REQ_SENT);
   1702  1.3  explorer 		break;
   1703  1.3  explorer 	case STATE_STOPPED:
   1704  1.3  explorer 	case STATE_STOPPING:
   1705  1.3  explorer 	case STATE_REQ_SENT:
   1706  1.3  explorer 	case STATE_ACK_RCVD:
   1707  1.3  explorer 	case STATE_ACK_SENT:
   1708  1.3  explorer 	case STATE_OPENED:
   1709  1.1  explorer 		break;
   1710  1.1  explorer 	case STATE_CLOSING:
   1711  1.1  explorer 		sppp_cp_change_state(cp, sp, STATE_STOPPING);
   1712  1.1  explorer 		break;
   1713  1.3  explorer 	}
   1714  1.3  explorer }
   1715  1.3  explorer 
   1716  1.1  explorer 
   1717  1.3  explorer static void
   1718  1.1  explorer sppp_close_event(const struct cp *cp, struct sppp *sp)
   1719  1.3  explorer {
   1720  1.3  explorer 	STDDCL;
   1721  1.3  explorer 
   1722  1.3  explorer 	if (debug)
   1723  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "%s close(%s)\n",
   1724  1.3  explorer 		    SPP_ARGS(ifp), cp->name,
   1725  1.3  explorer 		    sppp_state_name(sp->state[cp->protoidx]));
   1726  1.3  explorer 
   1727  1.3  explorer 	switch (sp->state[cp->protoidx]) {
   1728  1.3  explorer 	case STATE_INITIAL:
   1729  1.3  explorer 	case STATE_CLOSED:
   1730  1.3  explorer 	case STATE_CLOSING:
   1731  1.3  explorer 		break;
   1732  1.3  explorer 	case STATE_STARTING:
   1733  1.3  explorer 		(cp->tlf)(sp);
   1734  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_INITIAL);
   1735  1.3  explorer 		break;
   1736  1.3  explorer 	case STATE_STOPPED:
   1737  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_CLOSED);
   1738  1.3  explorer 		break;
   1739  1.3  explorer 	case STATE_STOPPING:
   1740  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_CLOSING);
   1741  1.3  explorer 		break;
   1742  1.3  explorer 	case STATE_OPENED:
   1743  1.3  explorer 		(cp->tld)(sp);
   1744  1.3  explorer 		/* fall through */
   1745  1.3  explorer 	case STATE_REQ_SENT:
   1746  1.3  explorer 	case STATE_ACK_RCVD:
   1747  1.3  explorer 	case STATE_ACK_SENT:
   1748  1.3  explorer 		sp->rst_counter[cp->protoidx] = sp->lcp.max_terminate;
   1749  1.3  explorer 		sppp_cp_send(sp, cp->proto, TERM_REQ, ++sp->pp_seq, 0, 0);
   1750  1.3  explorer 		sppp_cp_change_state(cp, sp, STATE_CLOSING);
   1751  1.3  explorer 		break;
   1752  1.3  explorer 	}
   1753  1.3  explorer }
   1754  1.3  explorer 
   1755  1.3  explorer static void
   1756  1.3  explorer sppp_to_event(const struct cp *cp, struct sppp *sp)
   1757  1.3  explorer {
   1758  1.3  explorer 	STDDCL;
   1759  1.3  explorer 	int s;
   1760  1.3  explorer 
   1761  1.3  explorer 	s = splimp();
   1762  1.3  explorer 	if (debug)
   1763  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "%s TO(%s) rst_counter = %d\n",
   1764  1.3  explorer 		    SPP_ARGS(ifp), cp->name,
   1765  1.3  explorer 		    sppp_state_name(sp->state[cp->protoidx]),
   1766  1.3  explorer 		    sp->rst_counter[cp->protoidx]);
   1767  1.3  explorer 
   1768  1.3  explorer 	if (--sp->rst_counter[cp->protoidx] < 0)
   1769  1.3  explorer 		/* TO- event */
   1770  1.3  explorer 		switch (sp->state[cp->protoidx]) {
   1771  1.3  explorer 		case STATE_CLOSING:
   1772  1.3  explorer 			(cp->tlf)(sp);
   1773  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_CLOSED);
   1774  1.3  explorer 			break;
   1775  1.3  explorer 		case STATE_STOPPING:
   1776  1.3  explorer 			(cp->tlf)(sp);
   1777  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_STOPPED);
   1778  1.3  explorer 			break;
   1779  1.3  explorer 		case STATE_REQ_SENT:
   1780  1.3  explorer 		case STATE_ACK_RCVD:
   1781  1.3  explorer 		case STATE_ACK_SENT:
   1782  1.3  explorer 			(cp->tlf)(sp);
   1783  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_STOPPED);
   1784  1.3  explorer 			break;
   1785  1.3  explorer 		}
   1786  1.3  explorer 	else
   1787  1.3  explorer 		/* TO+ event */
   1788  1.3  explorer 		switch (sp->state[cp->protoidx]) {
   1789  1.3  explorer 		case STATE_CLOSING:
   1790  1.7   thorpej 		case STATE_STOPPING:
   1791  1.7   thorpej 			sppp_cp_send(sp, cp->proto, TERM_REQ, ++sp->pp_seq,
   1792  1.7   thorpej 				     0, 0);
   1793  1.7   thorpej #if defined(__NetBSD__)
   1794  1.3  explorer 			callout_reset(&sp->ch[cp->protoidx], sp->lcp.timeout,
   1795  1.3  explorer 			    cp->TO, sp);
   1796  1.3  explorer #else
   1797  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   1798  1.7   thorpej 			sp->ch[cp->protoidx] =
   1799  1.3  explorer #endif
   1800  1.3  explorer 			timeout(cp->TO, (void *)sp, sp->lcp.timeout);
   1801  1.3  explorer #endif /* __NetBSD__ */
   1802  1.3  explorer 			break;
   1803  1.3  explorer 		case STATE_REQ_SENT:
   1804  1.3  explorer 		case STATE_ACK_RCVD:
   1805  1.3  explorer 			(cp->scr)(sp);
   1806  1.3  explorer 			/* sppp_cp_change_state() will restart the timer */
   1807  1.3  explorer 			sppp_cp_change_state(cp, sp, STATE_REQ_SENT);
   1808  1.7   thorpej 			break;
   1809  1.7   thorpej 		case STATE_ACK_SENT:
   1810  1.7   thorpej 			(cp->scr)(sp);
   1811  1.7   thorpej #if defined(__NetBSD__)
   1812  1.3  explorer 			callout_reset(&sp->ch[cp->protoidx], sp->lcp.timeout,
   1813  1.3  explorer 			    cp->TO, sp);
   1814  1.3  explorer #else
   1815  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   1816  1.7   thorpej 			sp->ch[cp->protoidx] =
   1817  1.3  explorer #endif
   1818  1.3  explorer 			timeout(cp->TO, (void *)sp, sp->lcp.timeout);
   1819  1.3  explorer #endif /* __NetBSD__ */
   1820  1.3  explorer 			break;
   1821  1.3  explorer 		}
   1822  1.3  explorer 
   1823  1.3  explorer 	splx(s);
   1824  1.3  explorer }
   1825  1.3  explorer 
   1826  1.3  explorer /*
   1827  1.3  explorer  * Change the state of a control protocol in the state automaton.
   1828  1.3  explorer  * Takes care of starting/stopping the restart timer.
   1829  1.3  explorer  */
   1830  1.3  explorer void
   1831  1.3  explorer sppp_cp_change_state(const struct cp *cp, struct sppp *sp, int newstate)
   1832  1.7   thorpej {
   1833  1.7   thorpej 	sp->state[cp->protoidx] = newstate;
   1834  1.7   thorpej 
   1835  1.3  explorer #if defined(__NetBSD__)
   1836  1.3  explorer 	callout_stop(&sp->ch[cp->protoidx]);
   1837  1.3  explorer #else
   1838  1.3  explorer 	untimeout(cp->TO, (void *)sp
   1839  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   1840  1.7   thorpej 	, sp->ch[cp->protoidx]
   1841  1.3  explorer #endif
   1842  1.3  explorer 	);
   1843  1.3  explorer #endif /* __NetBSD__ */
   1844  1.3  explorer 	switch (newstate) {
   1845  1.3  explorer 	case STATE_INITIAL:
   1846  1.3  explorer 	case STATE_STARTING:
   1847  1.3  explorer 	case STATE_CLOSED:
   1848  1.3  explorer 	case STATE_STOPPED:
   1849  1.3  explorer 	case STATE_OPENED:
   1850  1.3  explorer 		break;
   1851  1.3  explorer 	case STATE_CLOSING:
   1852  1.3  explorer 	case STATE_STOPPING:
   1853  1.7   thorpej 	case STATE_REQ_SENT:
   1854  1.7   thorpej 	case STATE_ACK_RCVD:
   1855  1.7   thorpej 	case STATE_ACK_SENT:
   1856  1.7   thorpej #if defined(__NetBSD__)
   1857  1.3  explorer 		callout_reset(&sp->ch[cp->protoidx], sp->lcp.timeout,
   1858  1.3  explorer 		    cp->TO, sp);
   1859  1.3  explorer #else
   1860  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   1861  1.7   thorpej 		sp->ch[cp->protoidx]  =
   1862  1.3  explorer #endif
   1863  1.3  explorer 		timeout(cp->TO, (void *)sp, sp->lcp.timeout);
   1864  1.3  explorer #endif /* __NetBSD__ */
   1865  1.3  explorer 		break;
   1866  1.3  explorer 	}
   1867  1.3  explorer }
   1868  1.3  explorer /*
   1870  1.3  explorer  *--------------------------------------------------------------------------*
   1871  1.3  explorer  *                                                                          *
   1872  1.3  explorer  *                         The LCP implementation.                          *
   1873  1.3  explorer  *                                                                          *
   1874  1.3  explorer  *--------------------------------------------------------------------------*
   1875  1.3  explorer  */
   1876  1.3  explorer static void
   1877  1.3  explorer sppp_lcp_init(struct sppp *sp)
   1878  1.3  explorer {
   1879  1.3  explorer 	sp->lcp.opts = (1 << LCP_OPT_MAGIC);
   1880  1.3  explorer 	sp->lcp.magic = 0;
   1881  1.3  explorer 	sp->state[IDX_LCP] = STATE_INITIAL;
   1882  1.3  explorer 	sp->fail_counter[IDX_LCP] = 0;
   1883  1.3  explorer 	sp->lcp.protos = 0;
   1884  1.3  explorer 	sp->lcp.mru = sp->lcp.their_mru = PP_MTU;
   1885  1.3  explorer 
   1886  1.3  explorer 	/*
   1887  1.3  explorer 	 * Initialize counters and timeout values.  Note that we don't
   1888  1.3  explorer 	 * use the 3 seconds suggested in RFC 1661 since we are likely
   1889  1.3  explorer 	 * running on a fast link.  XXX We should probably implement
   1890  1.3  explorer 	 * the exponential backoff option.  Note that these values are
   1891  1.3  explorer 	 * relevant for all control protocols, not just LCP only.
   1892  1.3  explorer 	 */
   1893  1.7   thorpej 	sp->lcp.timeout = 1 * hz;
   1894  1.7   thorpej 	sp->lcp.max_terminate = 2;
   1895  1.7   thorpej 	sp->lcp.max_configure = 10;
   1896  1.3  explorer 	sp->lcp.max_failure = 10;
   1897  1.3  explorer #if defined(__NetBSD__)
   1898  1.3  explorer 	callout_init(&sp->ch[IDX_LCP]);
   1899  1.3  explorer #endif
   1900  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   1901  1.3  explorer 	callout_handle_init(&sp->ch[IDX_LCP]);
   1902  1.3  explorer #endif
   1903  1.3  explorer }
   1904  1.3  explorer 
   1905  1.3  explorer static void
   1906  1.3  explorer sppp_lcp_up(struct sppp *sp)
   1907  1.3  explorer {
   1908  1.3  explorer 	STDDCL;
   1909  1.3  explorer 
   1910  1.3  explorer 	/*
   1911  1.3  explorer 	 * If this interface is passive or dial-on-demand, and we are
   1912  1.3  explorer 	 * still in Initial state, it means we've got an incoming
   1913  1.3  explorer 	 * call.  Activate the interface.
   1914  1.3  explorer 	 */
   1915  1.3  explorer 	if ((ifp->if_flags & (IFF_AUTO | IFF_PASSIVE)) != 0) {
   1916  1.3  explorer 		if (debug)
   1917  1.3  explorer 			log(LOG_DEBUG,
   1918  1.3  explorer 			    SPP_FMT "Up event", SPP_ARGS(ifp));
   1919  1.3  explorer 		ifp->if_flags |= IFF_RUNNING;
   1920  1.3  explorer 		if (sp->state[IDX_LCP] == STATE_INITIAL) {
   1921  1.3  explorer 			if (debug)
   1922  1.3  explorer 				addlog("(incoming call)\n");
   1923  1.3  explorer 			sp->pp_flags |= PP_CALLIN;
   1924  1.3  explorer 			lcp.Open(sp);
   1925  1.3  explorer 		} else if (debug)
   1926  1.3  explorer 			addlog("\n");
   1927  1.3  explorer 	}
   1928  1.3  explorer 
   1929  1.3  explorer 	sppp_up_event(&lcp, sp);
   1930  1.3  explorer }
   1931  1.3  explorer 
   1932  1.3  explorer static void
   1933  1.3  explorer sppp_lcp_down(struct sppp *sp)
   1934  1.3  explorer {
   1935  1.3  explorer 	STDDCL;
   1936  1.3  explorer 
   1937  1.3  explorer 	sppp_down_event(&lcp, sp);
   1938  1.3  explorer 
   1939  1.3  explorer 	/*
   1940  1.3  explorer 	 * If this is neither a dial-on-demand nor a passive
   1941  1.3  explorer 	 * interface, simulate an ``ifconfig down'' action, so the
   1942  1.3  explorer 	 * administrator can force a redial by another ``ifconfig
   1943  1.3  explorer 	 * up''.  XXX For leased line operation, should we immediately
   1944  1.3  explorer 	 * try to reopen the connection here?
   1945  1.3  explorer 	 */
   1946  1.3  explorer 	if ((ifp->if_flags & (IFF_AUTO | IFF_PASSIVE)) == 0) {
   1947  1.3  explorer 		log(LOG_INFO,
   1948  1.3  explorer 		    SPP_FMT "Down event (carrier loss), taking interface down.\n",
   1949  1.3  explorer 		    SPP_ARGS(ifp));
   1950  1.3  explorer 		if_down(ifp);
   1951  1.3  explorer 	} else {
   1952  1.3  explorer 		if (debug)
   1953  1.3  explorer 			log(LOG_DEBUG,
   1954  1.3  explorer 			    SPP_FMT "Down event (carrier loss)\n",
   1955  1.3  explorer 			    SPP_ARGS(ifp));
   1956  1.3  explorer 	}
   1957  1.3  explorer 	sp->pp_flags &= ~PP_CALLIN;
   1958  1.3  explorer 	if (sp->state[IDX_LCP] != STATE_INITIAL)
   1959  1.3  explorer 		lcp.Close(sp);
   1960  1.3  explorer 	ifp->if_flags &= ~IFF_RUNNING;
   1961  1.3  explorer }
   1962  1.3  explorer 
   1963  1.3  explorer static void
   1964  1.3  explorer sppp_lcp_open(struct sppp *sp)
   1965  1.3  explorer {
   1966  1.3  explorer 	/*
   1967  1.3  explorer 	 * If we are authenticator, negotiate LCP_AUTH
   1968  1.3  explorer 	 */
   1969  1.3  explorer 	if (sp->hisauth.proto != 0)
   1970  1.3  explorer 		sp->lcp.opts |= (1 << LCP_OPT_AUTH_PROTO);
   1971  1.3  explorer 	else
   1972  1.3  explorer 		sp->lcp.opts &= ~(1 << LCP_OPT_AUTH_PROTO);
   1973  1.3  explorer 	sp->pp_flags &= ~PP_NEEDAUTH;
   1974  1.3  explorer 	sppp_open_event(&lcp, sp);
   1975  1.3  explorer }
   1976  1.3  explorer 
   1977  1.3  explorer static void
   1978  1.3  explorer sppp_lcp_close(struct sppp *sp)
   1979  1.3  explorer {
   1980  1.3  explorer 	sppp_close_event(&lcp, sp);
   1981  1.3  explorer }
   1982  1.3  explorer 
   1983  1.3  explorer static void
   1984  1.3  explorer sppp_lcp_TO(void *cookie)
   1985  1.3  explorer {
   1986  1.3  explorer 	sppp_to_event(&lcp, (struct sppp *)cookie);
   1987  1.3  explorer }
   1988  1.3  explorer 
   1989  1.3  explorer /*
   1990  1.3  explorer  * Analyze a configure request.  Return true if it was agreeable, and
   1991  1.3  explorer  * caused action sca, false if it has been rejected or nak'ed, and
   1992  1.3  explorer  * caused action scn.  (The return value is used to make the state
   1993  1.3  explorer  * transition decision in the state automaton.)
   1994  1.3  explorer  */
   1995  1.3  explorer static int
   1996  1.3  explorer sppp_lcp_RCR(struct sppp *sp, struct lcp_header *h, int len)
   1997  1.3  explorer {
   1998  1.3  explorer 	STDDCL;
   1999  1.3  explorer 	u_char *buf, *r, *p;
   2000  1.3  explorer 	int origlen, rlen;
   2001  1.3  explorer 	u_long nmagic;
   2002  1.3  explorer 	u_short authproto;
   2003  1.3  explorer 
   2004  1.3  explorer 	len -= 4;
   2005  1.3  explorer 	origlen = len;
   2006  1.3  explorer 	buf = r = malloc (len, M_TEMP, M_NOWAIT);
   2007  1.3  explorer 	if (! buf)
   2008  1.3  explorer 		return (0);
   2009  1.3  explorer 
   2010  1.3  explorer 	if (debug)
   2011  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "lcp parse opts: ",
   2012  1.3  explorer 		    SPP_ARGS(ifp));
   2013  1.3  explorer 
   2014  1.3  explorer 	/* pass 1: check for things that need to be rejected */
   2015  1.3  explorer 	p = (void*) (h+1);
   2016  1.3  explorer 	for (rlen=0; len>1 && p[1]; len-=p[1], p+=p[1]) {
   2017  1.3  explorer 		if (debug)
   2018  1.3  explorer 			addlog(" %s ", sppp_lcp_opt_name(*p));
   2019  1.3  explorer 		switch (*p) {
   2020  1.3  explorer 		case LCP_OPT_MAGIC:
   2021  1.3  explorer 			/* Magic number. */
   2022  1.3  explorer 			/* fall through, both are same length */
   2023  1.3  explorer 		case LCP_OPT_ASYNC_MAP:
   2024  1.3  explorer 			/* Async control character map. */
   2025  1.3  explorer 			if (len >= 6 || p[1] == 6)
   2026  1.3  explorer 				continue;
   2027  1.3  explorer 			if (debug)
   2028  1.3  explorer 				addlog("[invalid] ");
   2029  1.3  explorer 			break;
   2030  1.3  explorer 		case LCP_OPT_MRU:
   2031  1.3  explorer 			/* Maximum receive unit. */
   2032  1.3  explorer 			if (len >= 4 && p[1] == 4)
   2033  1.3  explorer 				continue;
   2034  1.3  explorer 			if (debug)
   2035  1.3  explorer 				addlog("[invalid] ");
   2036  1.3  explorer 			break;
   2037  1.3  explorer 		case LCP_OPT_AUTH_PROTO:
   2038  1.3  explorer 			if (len < 4) {
   2039  1.3  explorer 				if (debug)
   2040  1.3  explorer 					addlog("[invalid] ");
   2041  1.3  explorer 				break;
   2042  1.3  explorer 			}
   2043  1.3  explorer 			authproto = (p[2] << 8) + p[3];
   2044  1.3  explorer 			if (authproto == PPP_CHAP && p[1] != 5) {
   2045  1.3  explorer 				if (debug)
   2046  1.3  explorer 					addlog("[invalid chap len] ");
   2047  1.3  explorer 				break;
   2048  1.3  explorer 			}
   2049  1.3  explorer 			if (sp->myauth.proto == 0) {
   2050  1.3  explorer 				/* we are not configured to do auth */
   2051  1.3  explorer 				if (debug)
   2052  1.3  explorer 					addlog("[not configured] ");
   2053  1.3  explorer 				break;
   2054  1.3  explorer 			}
   2055  1.3  explorer 			/*
   2056  1.3  explorer 			 * Remote want us to authenticate, remember this,
   2057  1.3  explorer 			 * so we stay in PHASE_AUTHENTICATE after LCP got
   2058  1.3  explorer 			 * up.
   2059  1.3  explorer 			 */
   2060  1.3  explorer 			sp->pp_flags |= PP_NEEDAUTH;
   2061  1.3  explorer 			continue;
   2062  1.3  explorer 		default:
   2063  1.3  explorer 			/* Others not supported. */
   2064  1.3  explorer 			if (debug)
   2065  1.3  explorer 				addlog("[rej] ");
   2066  1.3  explorer 			break;
   2067  1.3  explorer 		}
   2068  1.3  explorer 		/* Add the option to rejected list. */
   2069  1.3  explorer 		bcopy (p, r, p[1]);
   2070  1.3  explorer 		r += p[1];
   2071  1.3  explorer 		rlen += p[1];
   2072  1.3  explorer 	}
   2073  1.3  explorer 	if (rlen) {
   2074  1.3  explorer 		if (debug)
   2075  1.3  explorer 			addlog(" send conf-rej\n");
   2076  1.3  explorer 		sppp_cp_send (sp, PPP_LCP, CONF_REJ, h->ident, rlen, buf);
   2077  1.3  explorer 		return 0;
   2078  1.3  explorer 	} else if (debug)
   2079  1.3  explorer 		addlog("\n");
   2080  1.3  explorer 
   2081  1.3  explorer 	/*
   2082  1.3  explorer 	 * pass 2: check for option values that are unacceptable and
   2083  1.3  explorer 	 * thus require to be nak'ed.
   2084  1.3  explorer 	 */
   2085  1.3  explorer 	if (debug)
   2086  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "lcp parse opt values: ",
   2087  1.3  explorer 		    SPP_ARGS(ifp));
   2088  1.3  explorer 
   2089  1.3  explorer 	p = (void*) (h+1);
   2090  1.3  explorer 	len = origlen;
   2091  1.3  explorer 	for (rlen=0; len>1 && p[1]; len-=p[1], p+=p[1]) {
   2092  1.3  explorer 		if (debug)
   2093  1.3  explorer 			addlog(" %s ", sppp_lcp_opt_name(*p));
   2094  1.3  explorer 		switch (*p) {
   2095  1.3  explorer 		case LCP_OPT_MAGIC:
   2096  1.3  explorer 			/* Magic number -- extract. */
   2097  1.3  explorer 			nmagic = (u_long)p[2] << 24 |
   2098  1.3  explorer 				(u_long)p[3] << 16 | p[4] << 8 | p[5];
   2099  1.3  explorer 			if (nmagic != sp->lcp.magic) {
   2100  1.3  explorer 				if (debug)
   2101  1.3  explorer 					addlog("0x%lx ", nmagic);
   2102  1.3  explorer 				continue;
   2103  1.3  explorer 			}
   2104  1.3  explorer 			/*
   2105  1.3  explorer 			 * Local and remote magics equal -- loopback?
   2106  1.3  explorer 			 */
   2107  1.3  explorer 			if (sp->pp_loopcnt >= MAXALIVECNT*5) {
   2108  1.3  explorer 				printf (SPP_FMT "loopback\n",
   2109  1.3  explorer 					SPP_ARGS(ifp));
   2110  1.3  explorer 				sp->pp_loopcnt = 0;
   2111  1.3  explorer 				if (ifp->if_flags & IFF_UP) {
   2112  1.3  explorer 					if_down(ifp);
   2113  1.3  explorer 					sppp_qflush(&sp->pp_cpq);
   2114  1.3  explorer 					/* XXX ? */
   2115  1.3  explorer 					lcp.Down(sp);
   2116  1.3  explorer 					lcp.Up(sp);
   2117  1.3  explorer 				}
   2118  1.3  explorer 			} else if (debug)
   2119  1.3  explorer 				addlog("[glitch] ");
   2120  1.3  explorer 			++sp->pp_loopcnt;
   2121  1.3  explorer 			/*
   2122  1.3  explorer 			 * We negate our magic here, and NAK it.  If
   2123  1.3  explorer 			 * we see it later in an NAK packet, we
   2124  1.3  explorer 			 * suggest a new one.
   2125  1.3  explorer 			 */
   2126  1.3  explorer 			nmagic = ~sp->lcp.magic;
   2127  1.3  explorer 			/* Gonna NAK it. */
   2128  1.3  explorer 			p[2] = nmagic >> 24;
   2129  1.3  explorer 			p[3] = nmagic >> 16;
   2130  1.3  explorer 			p[4] = nmagic >> 8;
   2131  1.3  explorer 			p[5] = nmagic;
   2132  1.3  explorer 			break;
   2133  1.3  explorer 
   2134  1.3  explorer 		case LCP_OPT_ASYNC_MAP:
   2135  1.3  explorer 			/* Async control character map -- check to be zero. */
   2136  1.3  explorer 			if (! p[2] && ! p[3] && ! p[4] && ! p[5]) {
   2137  1.3  explorer 				if (debug)
   2138  1.3  explorer 					addlog("[empty] ");
   2139  1.3  explorer 				continue;
   2140  1.3  explorer 			}
   2141  1.3  explorer 			if (debug)
   2142  1.3  explorer 				addlog("[non-empty] ");
   2143  1.3  explorer 			/* suggest a zero one */
   2144  1.3  explorer 			p[2] = p[3] = p[4] = p[5] = 0;
   2145  1.3  explorer 			break;
   2146  1.3  explorer 
   2147  1.3  explorer 		case LCP_OPT_MRU:
   2148  1.3  explorer 			/*
   2149  1.3  explorer 			 * Maximum receive unit.  Always agreeable,
   2150  1.3  explorer 			 * but ignored by now.
   2151  1.3  explorer 			 */
   2152  1.3  explorer 			sp->lcp.their_mru = p[2] * 256 + p[3];
   2153  1.3  explorer 			if (debug)
   2154  1.3  explorer 				addlog("%ld ", sp->lcp.their_mru);
   2155  1.3  explorer 			continue;
   2156  1.3  explorer 
   2157  1.3  explorer 		case LCP_OPT_AUTH_PROTO:
   2158  1.3  explorer 			authproto = (p[2] << 8) + p[3];
   2159  1.3  explorer 			if (sp->myauth.proto != authproto) {
   2160  1.3  explorer 				/* not agreed, nak */
   2161  1.3  explorer 				if (debug)
   2162  1.3  explorer 					addlog("[mine %s != his %s] ",
   2163  1.3  explorer 					       sppp_proto_name(sp->hisauth.proto),
   2164  1.3  explorer 					       sppp_proto_name(authproto));
   2165  1.3  explorer 				p[2] = sp->myauth.proto >> 8;
   2166  1.3  explorer 				p[3] = sp->myauth.proto;
   2167  1.3  explorer 				break;
   2168  1.3  explorer 			}
   2169  1.3  explorer 			if (authproto == PPP_CHAP && p[4] != CHAP_MD5) {
   2170  1.3  explorer 				if (debug)
   2171  1.3  explorer 					addlog("[chap not MD5] ");
   2172  1.3  explorer 				p[4] = CHAP_MD5;
   2173  1.3  explorer 				break;
   2174  1.3  explorer 			}
   2175  1.3  explorer 			continue;
   2176  1.3  explorer 		}
   2177  1.3  explorer 		/* Add the option to nak'ed list. */
   2178  1.3  explorer 		bcopy (p, r, p[1]);
   2179  1.3  explorer 		r += p[1];
   2180  1.3  explorer 		rlen += p[1];
   2181  1.3  explorer 	}
   2182  1.3  explorer 	if (rlen) {
   2183  1.3  explorer 		if (++sp->fail_counter[IDX_LCP] >= sp->lcp.max_failure) {
   2184  1.3  explorer 			if (debug)
   2185  1.3  explorer 				addlog(" max_failure (%d) exceeded, "
   2186  1.3  explorer 				       "send conf-rej\n",
   2187  1.3  explorer 				       sp->lcp.max_failure);
   2188  1.3  explorer 			sppp_cp_send(sp, PPP_LCP, CONF_REJ, h->ident, rlen, buf);
   2189  1.3  explorer 		} else {
   2190  1.3  explorer 			if (debug)
   2191  1.3  explorer 				addlog(" send conf-nak\n");
   2192  1.3  explorer 			sppp_cp_send (sp, PPP_LCP, CONF_NAK, h->ident, rlen, buf);
   2193  1.3  explorer 		}
   2194  1.3  explorer 		return 0;
   2195  1.3  explorer 	} else {
   2196  1.3  explorer 		if (debug)
   2197  1.3  explorer 			addlog(" send conf-ack\n");
   2198  1.3  explorer 		sp->fail_counter[IDX_LCP] = 0;
   2199  1.3  explorer 		sp->pp_loopcnt = 0;
   2200  1.3  explorer 		sppp_cp_send (sp, PPP_LCP, CONF_ACK,
   2201  1.3  explorer 			      h->ident, origlen, h+1);
   2202  1.3  explorer 	}
   2203  1.3  explorer 
   2204  1.3  explorer 	free (buf, M_TEMP);
   2205  1.3  explorer 	return (rlen == 0);
   2206  1.3  explorer }
   2207  1.3  explorer 
   2208  1.3  explorer /*
   2209  1.3  explorer  * Analyze the LCP Configure-Reject option list, and adjust our
   2210  1.3  explorer  * negotiation.
   2211  1.3  explorer  */
   2212  1.3  explorer static void
   2213  1.3  explorer sppp_lcp_RCN_rej(struct sppp *sp, struct lcp_header *h, int len)
   2214  1.3  explorer {
   2215  1.3  explorer 	STDDCL;
   2216  1.3  explorer 	u_char *buf, *p;
   2217  1.3  explorer 
   2218  1.3  explorer 	len -= 4;
   2219  1.3  explorer 	buf = malloc (len, M_TEMP, M_NOWAIT);
   2220  1.3  explorer 	if (!buf)
   2221  1.3  explorer 		return;
   2222  1.3  explorer 
   2223  1.3  explorer 	if (debug)
   2224  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "lcp rej opts: ",
   2225  1.3  explorer 		    SPP_ARGS(ifp));
   2226  1.3  explorer 
   2227  1.3  explorer 	p = (void*) (h+1);
   2228  1.3  explorer 	for (; len > 1 && p[1]; len -= p[1], p += p[1]) {
   2229  1.3  explorer 		if (debug)
   2230  1.3  explorer 			addlog(" %s ", sppp_lcp_opt_name(*p));
   2231  1.3  explorer 		switch (*p) {
   2232  1.3  explorer 		case LCP_OPT_MAGIC:
   2233  1.3  explorer 			/* Magic number -- can't use it, use 0 */
   2234  1.3  explorer 			sp->lcp.opts &= ~(1 << LCP_OPT_MAGIC);
   2235  1.3  explorer 			sp->lcp.magic = 0;
   2236  1.3  explorer 			break;
   2237  1.3  explorer 		case LCP_OPT_MRU:
   2238  1.3  explorer 			/*
   2239  1.3  explorer 			 * Should not be rejected anyway, since we only
   2240  1.3  explorer 			 * negotiate a MRU if explicitly requested by
   2241  1.3  explorer 			 * peer.
   2242  1.3  explorer 			 */
   2243  1.3  explorer 			sp->lcp.opts &= ~(1 << LCP_OPT_MRU);
   2244  1.3  explorer 			break;
   2245  1.3  explorer 		case LCP_OPT_AUTH_PROTO:
   2246  1.3  explorer 			/*
   2247  1.3  explorer 			 * Peer doesn't want to authenticate himself,
   2248  1.3  explorer 			 * deny unless this is a dialout call, and
   2249  1.3  explorer 			 * AUTHFLAG_NOCALLOUT is set.
   2250  1.3  explorer 			 */
   2251  1.3  explorer 			if ((sp->pp_flags & PP_CALLIN) == 0 &&
   2252  1.3  explorer 			    (sp->hisauth.flags & AUTHFLAG_NOCALLOUT) != 0) {
   2253  1.3  explorer 				if (debug)
   2254  1.3  explorer 					addlog("[don't insist on auth "
   2255  1.3  explorer 					       "for callout]");
   2256  1.3  explorer 				sp->lcp.opts &= ~(1 << LCP_OPT_AUTH_PROTO);
   2257  1.3  explorer 				break;
   2258  1.3  explorer 			}
   2259  1.3  explorer 			if (debug)
   2260  1.3  explorer 				addlog("[access denied]\n");
   2261  1.3  explorer 			lcp.Close(sp);
   2262  1.3  explorer 			break;
   2263  1.3  explorer 		}
   2264  1.3  explorer 	}
   2265  1.3  explorer 	if (debug)
   2266  1.3  explorer 		addlog("\n");
   2267  1.3  explorer 	free (buf, M_TEMP);
   2268  1.3  explorer 	return;
   2269  1.3  explorer }
   2270  1.3  explorer 
   2271  1.3  explorer /*
   2272  1.3  explorer  * Analyze the LCP Configure-NAK option list, and adjust our
   2273  1.3  explorer  * negotiation.
   2274  1.3  explorer  */
   2275  1.3  explorer static void
   2276  1.3  explorer sppp_lcp_RCN_nak(struct sppp *sp, struct lcp_header *h, int len)
   2277  1.3  explorer {
   2278  1.3  explorer 	STDDCL;
   2279  1.3  explorer 	u_char *buf, *p;
   2280  1.3  explorer 	u_long magic;
   2281  1.3  explorer 
   2282  1.3  explorer 	len -= 4;
   2283  1.3  explorer 	buf = malloc (len, M_TEMP, M_NOWAIT);
   2284  1.3  explorer 	if (!buf)
   2285  1.3  explorer 		return;
   2286  1.3  explorer 
   2287  1.3  explorer 	if (debug)
   2288  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "lcp nak opts: ",
   2289  1.3  explorer 		    SPP_ARGS(ifp));
   2290  1.3  explorer 
   2291  1.3  explorer 	p = (void*) (h+1);
   2292  1.3  explorer 	for (; len > 1 && p[1]; len -= p[1], p += p[1]) {
   2293  1.3  explorer 		if (debug)
   2294  1.3  explorer 			addlog(" %s ", sppp_lcp_opt_name(*p));
   2295  1.3  explorer 		switch (*p) {
   2296  1.3  explorer 		case LCP_OPT_MAGIC:
   2297  1.3  explorer 			/* Magic number -- renegotiate */
   2298  1.3  explorer 			if ((sp->lcp.opts & (1 << LCP_OPT_MAGIC)) &&
   2299  1.3  explorer 			    len >= 6 && p[1] == 6) {
   2300  1.3  explorer 				magic = (u_long)p[2] << 24 |
   2301  1.3  explorer 					(u_long)p[3] << 16 | p[4] << 8 | p[5];
   2302  1.3  explorer 				/*
   2303  1.3  explorer 				 * If the remote magic is our negated one,
   2304  1.3  explorer 				 * this looks like a loopback problem.
   2305  1.3  explorer 				 * Suggest a new magic to make sure.
   2306  1.3  explorer 				 */
   2307  1.3  explorer 				if (magic == ~sp->lcp.magic) {
   2308  1.3  explorer 					if (debug)
   2309  1.3  explorer 						addlog("magic glitch ");
   2310  1.3  explorer #if defined(__NetBSD__) || (defined(__FreeBSD__) && __FreeBSD__ >= 3)
   2311  1.3  explorer 					sp->lcp.magic = random();
   2312  1.3  explorer #else
   2313  1.3  explorer 					sp->lcp.magic = time.tv_sec + time.tv_usec;
   2314  1.3  explorer #endif
   2315  1.3  explorer 				} else {
   2316  1.3  explorer 					sp->lcp.magic = magic;
   2317  1.3  explorer 					if (debug)
   2318  1.3  explorer 						addlog("%ld ", magic);
   2319  1.3  explorer 				}
   2320  1.3  explorer 			}
   2321  1.3  explorer 			break;
   2322  1.3  explorer 		case LCP_OPT_MRU:
   2323  1.3  explorer 			/*
   2324  1.3  explorer 			 * Peer wants to advise us to negotiate an MRU.
   2325  1.3  explorer 			 * Agree on it if it's reasonable, or use
   2326  1.3  explorer 			 * default otherwise.
   2327  1.3  explorer 			 */
   2328  1.3  explorer 			if (len >= 4 && p[1] == 4) {
   2329  1.3  explorer 				u_int mru = p[2] * 256 + p[3];
   2330  1.3  explorer 				if (debug)
   2331  1.3  explorer 					addlog("%d ", mru);
   2332  1.3  explorer 				if (mru < PP_MTU || mru > PP_MAX_MRU)
   2333  1.3  explorer 					mru = PP_MTU;
   2334  1.3  explorer 				sp->lcp.mru = mru;
   2335  1.3  explorer 				sp->lcp.opts |= (1 << LCP_OPT_MRU);
   2336  1.3  explorer 			}
   2337  1.3  explorer 			break;
   2338  1.3  explorer 		case LCP_OPT_AUTH_PROTO:
   2339  1.3  explorer 			/*
   2340  1.3  explorer 			 * Peer doesn't like our authentication method,
   2341  1.3  explorer 			 * deny.
   2342  1.3  explorer 			 */
   2343  1.3  explorer 			if (debug)
   2344  1.3  explorer 				addlog("[access denied]\n");
   2345  1.3  explorer 			lcp.Close(sp);
   2346  1.3  explorer 			break;
   2347  1.3  explorer 		}
   2348  1.3  explorer 	}
   2349  1.3  explorer 	if (debug)
   2350  1.3  explorer 		addlog("\n");
   2351  1.3  explorer 	free (buf, M_TEMP);
   2352  1.3  explorer 	return;
   2353  1.3  explorer }
   2354  1.3  explorer 
   2355  1.3  explorer static void
   2356  1.3  explorer sppp_lcp_tlu(struct sppp *sp)
   2357  1.3  explorer {
   2358  1.3  explorer 	STDDCL;
   2359  1.3  explorer 	int i;
   2360  1.3  explorer 	u_long mask;
   2361  1.3  explorer 
   2362  1.3  explorer 	/* XXX ? */
   2363  1.3  explorer 	if (! (ifp->if_flags & IFF_UP) &&
   2364  1.3  explorer 	    (ifp->if_flags & IFF_RUNNING)) {
   2365  1.3  explorer 		/* Coming out of loopback mode. */
   2366  1.3  explorer 		if_up(ifp);
   2367  1.3  explorer 		printf (SPP_FMT "up\n", SPP_ARGS(ifp));
   2368  1.3  explorer 	}
   2369  1.3  explorer 
   2370  1.3  explorer 	for (i = 0; i < IDX_COUNT; i++)
   2371  1.3  explorer 		if ((cps[i])->flags & CP_QUAL)
   2372  1.3  explorer 			(cps[i])->Open(sp);
   2373  1.3  explorer 
   2374  1.3  explorer 	if ((sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) != 0 ||
   2375  1.3  explorer 	    (sp->pp_flags & PP_NEEDAUTH) != 0)
   2376  1.3  explorer 		sp->pp_phase = PHASE_AUTHENTICATE;
   2377  1.3  explorer 	else
   2378  1.3  explorer 		sp->pp_phase = PHASE_NETWORK;
   2379  1.3  explorer 
   2380  1.3  explorer 	if(debug)
   2381  1.3  explorer 	{
   2382  1.3  explorer 		log(LOG_INFO, SPP_FMT "phase %s\n", SPP_ARGS(ifp),
   2383  1.3  explorer 		    sppp_phase_name(sp->pp_phase));
   2384  1.3  explorer 	}
   2385  1.3  explorer 
   2386  1.3  explorer 	/*
   2387  1.3  explorer 	 * Open all authentication protocols.  This is even required
   2388  1.3  explorer 	 * if we already proceeded to network phase, since it might be
   2389  1.3  explorer 	 * that remote wants us to authenticate, so we might have to
   2390  1.3  explorer 	 * send a PAP request.  Undesired authentication protocols
   2391  1.3  explorer 	 * don't do anything when they get an Open event.
   2392  1.3  explorer 	 */
   2393  1.3  explorer 	for (i = 0; i < IDX_COUNT; i++)
   2394  1.3  explorer 		if ((cps[i])->flags & CP_AUTH)
   2395  1.3  explorer 			(cps[i])->Open(sp);
   2396  1.3  explorer 
   2397  1.3  explorer 	if (sp->pp_phase == PHASE_NETWORK) {
   2398  1.3  explorer 		/* Notify all NCPs. */
   2399  1.3  explorer 		for (i = 0; i < IDX_COUNT; i++)
   2400  1.3  explorer 			if ((cps[i])->flags & CP_NCP)
   2401  1.3  explorer 				(cps[i])->Open(sp);
   2402  1.3  explorer 	}
   2403  1.3  explorer 
   2404  1.3  explorer 	/* Send Up events to all started protos. */
   2405  1.3  explorer 	for (i = 0, mask = 1; i < IDX_COUNT; i++, mask <<= 1)
   2406  1.3  explorer 		if (sp->lcp.protos & mask && ((cps[i])->flags & CP_LCP) == 0)
   2407  1.3  explorer 			(cps[i])->Up(sp);
   2408  1.3  explorer 
   2409  1.3  explorer 	/* notify low-level driver of state change */
   2410  1.3  explorer 	if (sp->pp_chg)
   2411  1.3  explorer 		sp->pp_chg(sp, (int)sp->pp_phase);
   2412  1.3  explorer 
   2413  1.3  explorer 	if (sp->pp_phase == PHASE_NETWORK)
   2414  1.3  explorer 		/* if no NCP is starting, close down */
   2415  1.3  explorer 		sppp_lcp_check_and_close(sp);
   2416  1.3  explorer }
   2417  1.3  explorer 
   2418  1.3  explorer static void
   2419  1.3  explorer sppp_lcp_tld(struct sppp *sp)
   2420  1.3  explorer {
   2421  1.3  explorer 	STDDCL;
   2422  1.3  explorer 	int i;
   2423  1.3  explorer 	u_long mask;
   2424  1.3  explorer 
   2425  1.3  explorer 	sp->pp_phase = PHASE_TERMINATE;
   2426  1.3  explorer 
   2427  1.3  explorer 	if(debug)
   2428  1.3  explorer 	{
   2429  1.3  explorer 		log(LOG_INFO, SPP_FMT "phase %s\n", SPP_ARGS(ifp),
   2430  1.3  explorer 			sppp_phase_name(sp->pp_phase));
   2431  1.3  explorer 	}
   2432  1.3  explorer 
   2433  1.3  explorer 	/*
   2434  1.3  explorer 	 * Take upper layers down.  We send the Down event first and
   2435  1.3  explorer 	 * the Close second to prevent the upper layers from sending
   2436  1.3  explorer 	 * ``a flurry of terminate-request packets'', as the RFC
   2437  1.3  explorer 	 * describes it.
   2438  1.3  explorer 	 */
   2439  1.3  explorer 	for (i = 0, mask = 1; i < IDX_COUNT; i++, mask <<= 1)
   2440  1.3  explorer 		if (sp->lcp.protos & mask && ((cps[i])->flags & CP_LCP) == 0) {
   2441  1.3  explorer 			(cps[i])->Down(sp);
   2442  1.3  explorer 			(cps[i])->Close(sp);
   2443  1.3  explorer 		}
   2444  1.3  explorer }
   2445  1.3  explorer 
   2446  1.3  explorer static void
   2447  1.3  explorer sppp_lcp_tls(struct sppp *sp)
   2448  1.3  explorer {
   2449  1.3  explorer 	STDDCL;
   2450  1.3  explorer 
   2451  1.3  explorer 	sp->pp_phase = PHASE_ESTABLISH;
   2452  1.3  explorer 
   2453  1.3  explorer 	if(debug)
   2454  1.3  explorer 	{
   2455  1.3  explorer 		log(LOG_INFO, SPP_FMT "phase %s\n", SPP_ARGS(ifp),
   2456  1.3  explorer 			sppp_phase_name(sp->pp_phase));
   2457  1.3  explorer 	}
   2458  1.3  explorer 
   2459  1.3  explorer 	/* Notify lower layer if desired. */
   2460  1.3  explorer 	if (sp->pp_tls)
   2461  1.3  explorer 		(sp->pp_tls)(sp);
   2462  1.3  explorer }
   2463  1.3  explorer 
   2464  1.3  explorer static void
   2465  1.3  explorer sppp_lcp_tlf(struct sppp *sp)
   2466  1.3  explorer {
   2467  1.3  explorer 	STDDCL;
   2468  1.3  explorer 
   2469  1.3  explorer 	sp->pp_phase = PHASE_DEAD;
   2470  1.3  explorer 
   2471  1.3  explorer 	if(debug)
   2472  1.3  explorer 	{
   2473  1.3  explorer 		log(LOG_INFO, SPP_FMT "phase %s\n", SPP_ARGS(ifp),
   2474  1.3  explorer 			sppp_phase_name(sp->pp_phase));
   2475  1.3  explorer 	}
   2476  1.3  explorer 
   2477  1.3  explorer 	/* Notify lower layer if desired. */
   2478  1.3  explorer 	if (sp->pp_tlf)
   2479  1.3  explorer 		(sp->pp_tlf)(sp);
   2480  1.3  explorer }
   2481  1.3  explorer 
   2482  1.3  explorer static void
   2483  1.3  explorer sppp_lcp_scr(struct sppp *sp)
   2484  1.3  explorer {
   2485  1.3  explorer 	char opt[6 /* magicnum */ + 4 /* mru */ + 5 /* chap */];
   2486  1.3  explorer 	int i = 0;
   2487  1.3  explorer 	u_short authproto;
   2488  1.3  explorer 
   2489  1.3  explorer 	if (sp->lcp.opts & (1 << LCP_OPT_MAGIC)) {
   2490  1.3  explorer 		if (! sp->lcp.magic)
   2491  1.3  explorer #if defined(__NetBSD__) || (defined(__FreeBSD__) && __FreeBSD__ >= 3)
   2492  1.3  explorer 			sp->lcp.magic = random();
   2493  1.3  explorer #else
   2494  1.3  explorer 			sp->lcp.magic = time.tv_sec + time.tv_usec;
   2495  1.3  explorer #endif
   2496  1.3  explorer 		opt[i++] = LCP_OPT_MAGIC;
   2497  1.3  explorer 		opt[i++] = 6;
   2498  1.3  explorer 		opt[i++] = sp->lcp.magic >> 24;
   2499  1.3  explorer 		opt[i++] = sp->lcp.magic >> 16;
   2500  1.3  explorer 		opt[i++] = sp->lcp.magic >> 8;
   2501  1.3  explorer 		opt[i++] = sp->lcp.magic;
   2502  1.3  explorer 	}
   2503  1.3  explorer 
   2504  1.3  explorer 	if (sp->lcp.opts & (1 << LCP_OPT_MRU)) {
   2505  1.3  explorer 		opt[i++] = LCP_OPT_MRU;
   2506  1.3  explorer 		opt[i++] = 4;
   2507  1.3  explorer 		opt[i++] = sp->lcp.mru >> 8;
   2508  1.3  explorer 		opt[i++] = sp->lcp.mru;
   2509  1.3  explorer 	}
   2510  1.3  explorer 
   2511  1.3  explorer 	if (sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) {
   2512  1.3  explorer 		authproto = sp->hisauth.proto;
   2513  1.3  explorer 		opt[i++] = LCP_OPT_AUTH_PROTO;
   2514  1.3  explorer 		opt[i++] = authproto == PPP_CHAP? 5: 4;
   2515  1.3  explorer 		opt[i++] = authproto >> 8;
   2516  1.3  explorer 		opt[i++] = authproto;
   2517  1.3  explorer 		if (authproto == PPP_CHAP)
   2518  1.3  explorer 			opt[i++] = CHAP_MD5;
   2519  1.3  explorer 	}
   2520  1.3  explorer 
   2521  1.3  explorer 	sp->confid[IDX_LCP] = ++sp->pp_seq;
   2522  1.3  explorer 	sppp_cp_send (sp, PPP_LCP, CONF_REQ, sp->confid[IDX_LCP], i, &opt);
   2523  1.3  explorer }
   2524  1.3  explorer 
   2525  1.3  explorer /*
   2526  1.3  explorer  * Check the open NCPs, return true if at least one NCP is open.
   2527  1.3  explorer  */
   2528  1.3  explorer static int
   2529  1.3  explorer sppp_ncp_check(struct sppp *sp)
   2530  1.3  explorer {
   2531  1.3  explorer 	int i, mask;
   2532  1.3  explorer 
   2533  1.3  explorer 	for (i = 0, mask = 1; i < IDX_COUNT; i++, mask <<= 1)
   2534  1.3  explorer 		if (sp->lcp.protos & mask && (cps[i])->flags & CP_NCP)
   2535  1.3  explorer 			return 1;
   2536  1.3  explorer 	return 0;
   2537  1.3  explorer }
   2538  1.3  explorer 
   2539  1.3  explorer /*
   2540  1.3  explorer  * Re-check the open NCPs and see if we should terminate the link.
   2541  1.3  explorer  * Called by the NCPs during their tlf action handling.
   2542  1.3  explorer  */
   2543  1.3  explorer static void
   2544  1.3  explorer sppp_lcp_check_and_close(struct sppp *sp)
   2545  1.3  explorer {
   2546  1.3  explorer 
   2547  1.3  explorer 	if (sp->pp_phase < PHASE_NETWORK)
   2548  1.3  explorer 		/* don't bother, we are already going down */
   2549  1.3  explorer 		return;
   2550  1.3  explorer 
   2551  1.3  explorer 	if (sppp_ncp_check(sp))
   2552  1.3  explorer 		return;
   2553  1.3  explorer 
   2554  1.3  explorer 	lcp.Close(sp);
   2555  1.3  explorer }
   2556  1.3  explorer /*
   2558  1.3  explorer  *--------------------------------------------------------------------------*
   2559  1.3  explorer  *                                                                          *
   2560  1.3  explorer  *                        The IPCP implementation.                          *
   2561  1.3  explorer  *                                                                          *
   2562  1.3  explorer  *--------------------------------------------------------------------------*
   2563  1.3  explorer  */
   2564  1.3  explorer 
   2565  1.3  explorer static void
   2566  1.3  explorer sppp_ipcp_init(struct sppp *sp)
   2567  1.7   thorpej {
   2568  1.7   thorpej 	sp->ipcp.opts = 0;
   2569  1.7   thorpej 	sp->ipcp.flags = 0;
   2570  1.3  explorer 	sp->state[IDX_IPCP] = STATE_INITIAL;
   2571  1.3  explorer 	sp->fail_counter[IDX_IPCP] = 0;
   2572  1.3  explorer #if defined(__NetBSD__)
   2573  1.3  explorer 	callout_init(&sp->ch[IDX_IPCP]);
   2574  1.3  explorer #endif
   2575  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   2576  1.3  explorer 	callout_handle_init(&sp->ch[IDX_IPCP]);
   2577  1.3  explorer #endif
   2578  1.3  explorer }
   2579  1.3  explorer 
   2580  1.3  explorer static void
   2581  1.3  explorer sppp_ipcp_up(struct sppp *sp)
   2582  1.3  explorer {
   2583  1.3  explorer 	sppp_up_event(&ipcp, sp);
   2584  1.3  explorer }
   2585  1.3  explorer 
   2586  1.3  explorer static void
   2587  1.3  explorer sppp_ipcp_down(struct sppp *sp)
   2588  1.3  explorer {
   2589  1.3  explorer 	sppp_down_event(&ipcp, sp);
   2590  1.3  explorer }
   2591  1.3  explorer 
   2592  1.3  explorer static void
   2593  1.3  explorer sppp_ipcp_open(struct sppp *sp)
   2594  1.3  explorer {
   2595  1.3  explorer 	STDDCL;
   2596  1.3  explorer 	u_long myaddr, hisaddr;
   2597  1.3  explorer 
   2598  1.3  explorer 	sp->ipcp.flags &= ~(IPCP_HISADDR_SEEN|IPCP_MYADDR_SEEN|IPCP_MYADDR_DYN);
   2599  1.3  explorer 
   2600  1.3  explorer 	sppp_get_ip_addrs(sp, &myaddr, &hisaddr, 0);
   2601  1.3  explorer 	/*
   2602  1.3  explorer 	 * If we don't have his address, this probably means our
   2603  1.3  explorer 	 * interface doesn't want to talk IP at all.  (This could
   2604  1.3  explorer 	 * be the case if somebody wants to speak only IPX, for
   2605  1.3  explorer 	 * example.)  Don't open IPCP in this case.
   2606  1.3  explorer 	 */
   2607  1.3  explorer 	if (hisaddr == 0L) {
   2608  1.3  explorer 		/* XXX this message should go away */
   2609  1.3  explorer 		if (debug)
   2610  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "ipcp_open(): no IP interface\n",
   2611  1.3  explorer 			    SPP_ARGS(ifp));
   2612  1.3  explorer 		return;
   2613  1.3  explorer 	}
   2614  1.3  explorer 
   2615  1.3  explorer 	if (myaddr == 0L) {
   2616  1.3  explorer 		/*
   2617  1.3  explorer 		 * I don't have an assigned address, so i need to
   2618  1.3  explorer 		 * negotiate my address.
   2619  1.3  explorer 		 */
   2620  1.3  explorer 		sp->ipcp.flags |= IPCP_MYADDR_DYN;
   2621  1.3  explorer 		sp->ipcp.opts |= (1 << IPCP_OPT_ADDRESS);
   2622  1.3  explorer 	} else
   2623  1.3  explorer 		sp->ipcp.flags |= IPCP_MYADDR_SEEN;
   2624  1.3  explorer 	sppp_open_event(&ipcp, sp);
   2625  1.3  explorer }
   2626  1.3  explorer 
   2627  1.3  explorer static void
   2628  1.3  explorer sppp_ipcp_close(struct sppp *sp)
   2629  1.3  explorer {
   2630  1.3  explorer 	sppp_close_event(&ipcp, sp);
   2631  1.3  explorer 	if (sp->ipcp.flags & IPCP_MYADDR_DYN)
   2632  1.3  explorer 		/*
   2633  1.3  explorer 		 * My address was dynamic, clear it again.
   2634  1.3  explorer 		 */
   2635  1.3  explorer 		sppp_set_ip_addr(sp, 0L);
   2636  1.3  explorer }
   2637  1.3  explorer 
   2638  1.3  explorer static void
   2639  1.3  explorer sppp_ipcp_TO(void *cookie)
   2640  1.3  explorer {
   2641  1.3  explorer 	sppp_to_event(&ipcp, (struct sppp *)cookie);
   2642  1.3  explorer }
   2643  1.3  explorer 
   2644  1.3  explorer /*
   2645  1.3  explorer  * Analyze a configure request.  Return true if it was agreeable, and
   2646  1.3  explorer  * caused action sca, false if it has been rejected or nak'ed, and
   2647  1.3  explorer  * caused action scn.  (The return value is used to make the state
   2648  1.3  explorer  * transition decision in the state automaton.)
   2649  1.3  explorer  */
   2650  1.3  explorer static int
   2651  1.3  explorer sppp_ipcp_RCR(struct sppp *sp, struct lcp_header *h, int len)
   2652  1.3  explorer {
   2653  1.3  explorer 	u_char *buf, *r, *p;
   2654  1.3  explorer 	struct ifnet *ifp = &sp->pp_if;
   2655  1.3  explorer 	int rlen, origlen, debug = ifp->if_flags & IFF_DEBUG;
   2656  1.3  explorer 	u_long hisaddr, desiredaddr;
   2657  1.3  explorer 	int gotmyaddr = 0;
   2658  1.3  explorer 
   2659  1.3  explorer 	len -= 4;
   2660  1.3  explorer 	origlen = len;
   2661  1.3  explorer 	/*
   2662  1.3  explorer 	 * Make sure to allocate a buf that can at least hold a
   2663  1.3  explorer 	 * conf-nak with an `address' option.  We might need it below.
   2664  1.3  explorer 	 */
   2665  1.3  explorer 	buf = r = malloc ((len < 6? 6: len), M_TEMP, M_NOWAIT);
   2666  1.3  explorer 	if (! buf)
   2667  1.3  explorer 		return (0);
   2668  1.3  explorer 
   2669  1.3  explorer 	/* pass 1: see if we can recognize them */
   2670  1.3  explorer 	if (debug)
   2671  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "ipcp parse opts: ",
   2672  1.3  explorer 		    SPP_ARGS(ifp));
   2673  1.3  explorer 	p = (void*) (h+1);
   2674  1.3  explorer 	for (rlen=0; len>1 && p[1]; len-=p[1], p+=p[1]) {
   2675  1.3  explorer 		if (debug)
   2676  1.3  explorer 			addlog(" %s ", sppp_ipcp_opt_name(*p));
   2677  1.3  explorer 		switch (*p) {
   2678  1.3  explorer #ifdef notyet
   2679  1.3  explorer 		case IPCP_OPT_COMPRESSION:
   2680  1.3  explorer 			if (len >= 6 && p[1] >= 6) {
   2681  1.3  explorer 				/* correctly formed compress option */
   2682  1.3  explorer 				continue;
   2683  1.3  explorer 			}
   2684  1.3  explorer 			if (debug)
   2685  1.3  explorer 				addlog("[invalid] ");
   2686  1.3  explorer 			break;
   2687  1.3  explorer #endif
   2688  1.3  explorer 		case IPCP_OPT_ADDRESS:
   2689  1.3  explorer 			if (len >= 6 && p[1] == 6) {
   2690  1.3  explorer 				/* correctly formed address option */
   2691  1.3  explorer 				continue;
   2692  1.3  explorer 			}
   2693  1.3  explorer 			if (debug)
   2694  1.3  explorer 				addlog("[invalid] ");
   2695  1.3  explorer 			break;
   2696  1.3  explorer 		default:
   2697  1.3  explorer 			/* Others not supported. */
   2698  1.3  explorer 			if (debug)
   2699  1.3  explorer 				addlog("[rej] ");
   2700  1.3  explorer 			break;
   2701  1.3  explorer 		}
   2702  1.3  explorer 		/* Add the option to rejected list. */
   2703  1.3  explorer 		bcopy (p, r, p[1]);
   2704  1.3  explorer 		r += p[1];
   2705  1.3  explorer 		rlen += p[1];
   2706  1.3  explorer 	}
   2707  1.3  explorer 	if (rlen) {
   2708  1.3  explorer 		if (debug)
   2709  1.3  explorer 			addlog(" send conf-rej\n");
   2710  1.3  explorer 		sppp_cp_send (sp, PPP_IPCP, CONF_REJ, h->ident, rlen, buf);
   2711  1.3  explorer 		return 0;
   2712  1.3  explorer 	} else if (debug)
   2713  1.3  explorer 		addlog("\n");
   2714  1.3  explorer 
   2715  1.3  explorer 	/* pass 2: parse option values */
   2716  1.3  explorer 	sppp_get_ip_addrs(sp, 0, &hisaddr, 0);
   2717  1.3  explorer 	if (debug)
   2718  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "ipcp parse opt values: ",
   2719  1.3  explorer 		       SPP_ARGS(ifp));
   2720  1.3  explorer 	p = (void*) (h+1);
   2721  1.3  explorer 	len = origlen;
   2722  1.3  explorer 	for (rlen=0; len>1 && p[1]; len-=p[1], p+=p[1]) {
   2723  1.3  explorer 		if (debug)
   2724  1.3  explorer 			addlog(" %s ", sppp_ipcp_opt_name(*p));
   2725  1.3  explorer 		switch (*p) {
   2726  1.3  explorer #ifdef notyet
   2727  1.3  explorer 		case IPCP_OPT_COMPRESSION:
   2728  1.3  explorer 			continue;
   2729  1.3  explorer #endif
   2730  1.3  explorer 		case IPCP_OPT_ADDRESS:
   2731  1.3  explorer 			desiredaddr = p[2] << 24 | p[3] << 16 |
   2732  1.3  explorer 				p[4] << 8 | p[5];
   2733  1.3  explorer 			if (!(sp->ipcp.flags & IPCP_MYADDR_SEEN) &&
   2734  1.3  explorer 			        (sp->ipcp.flags & IPCP_MYADDR_DYN)) {
   2735  1.3  explorer 				/*
   2736  1.3  explorer 				 * hopefully this is our address !!
   2737  1.3  explorer 				 */
   2738  1.3  explorer 			 	if (debug)
   2739  1.3  explorer 					addlog("[wantmyaddr %s] ",
   2740  1.3  explorer 						sppp_dotted_quad(desiredaddr));
   2741  1.3  explorer 				/*
   2742  1.3  explorer 				 * When doing dynamic address assignment,
   2743  1.3  explorer 			   	 * we accept his offer.  Otherwise, we
   2744  1.3  explorer 			    	 * ignore it and thus continue to negotiate
   2745  1.3  explorer 			     	 * our already existing value.
   2746  1.3  explorer 		      		 */
   2747  1.3  explorer 				sppp_set_ip_addr(sp, desiredaddr);
   2748  1.3  explorer 				if (debug)
   2749  1.3  explorer 					addlog("[agree] ");
   2750  1.3  explorer 				sp->ipcp.flags |= IPCP_MYADDR_SEEN;
   2751  1.3  explorer 				gotmyaddr++;
   2752  1.3  explorer 				continue;
   2753  1.3  explorer 			} else {
   2754  1.3  explorer 				if (desiredaddr == hisaddr ||
   2755  1.3  explorer 			    	(hisaddr == 1 && desiredaddr != 0)) {
   2756  1.3  explorer 					/*
   2757  1.3  explorer 				 	* Peer's address is same as our value,
   2758  1.3  explorer 				 	* this is agreeable.  Gonna conf-ack
   2759  1.3  explorer 				 	* it.
   2760  1.3  explorer 				 	*/
   2761  1.3  explorer 					if (debug)
   2762  1.3  explorer 						addlog("%s [ack] ",
   2763  1.3  explorer 					       		sppp_dotted_quad(hisaddr));
   2764  1.3  explorer 					/* record that we've seen it already */
   2765  1.3  explorer 					sp->ipcp.flags |= IPCP_HISADDR_SEEN;
   2766  1.3  explorer 					continue;
   2767  1.3  explorer 				}
   2768  1.3  explorer 				/*
   2769  1.3  explorer 			 	* The address wasn't agreeable.  This is either
   2770  1.3  explorer 			 	* he sent us 0.0.0.0, asking to assign him an
   2771  1.3  explorer 			 	* address, or he send us another address not
   2772  1.3  explorer 			 	* matching our value.  Either case, we gonna
   2773  1.3  explorer 			 	* conf-nak it with our value.
   2774  1.3  explorer 			 	*/
   2775  1.3  explorer 				if (debug) {
   2776  1.3  explorer 					if (desiredaddr == 0)
   2777  1.3  explorer 						addlog("[addr requested] ");
   2778  1.3  explorer 					else
   2779  1.3  explorer 						addlog("%s [not agreed] ",
   2780  1.3  explorer 					       		sppp_dotted_quad(desiredaddr));
   2781  1.3  explorer 				}
   2782  1.3  explorer 
   2783  1.3  explorer 				p[2] = hisaddr >> 24;
   2784  1.3  explorer 				p[3] = hisaddr >> 16;
   2785  1.3  explorer 				p[4] = hisaddr >> 8;
   2786  1.3  explorer 				p[5] = hisaddr;
   2787  1.3  explorer 				break;
   2788  1.3  explorer 			}
   2789  1.3  explorer 		}
   2790  1.3  explorer 		/* Add the option to nak'ed list. */
   2791  1.3  explorer 		bcopy (p, r, p[1]);
   2792  1.3  explorer 		r += p[1];
   2793  1.3  explorer 		rlen += p[1];
   2794  1.3  explorer 	}
   2795  1.3  explorer 
   2796  1.3  explorer 	/*
   2797  1.3  explorer 	 * If we are about to conf-ack the request, but haven't seen
   2798  1.3  explorer 	 * his address so far, gonna conf-nak it instead, with the
   2799  1.3  explorer 	 * `address' option present and our idea of his address being
   2800  1.3  explorer 	 * filled in there, to request negotiation of both addresses.
   2801  1.3  explorer 	 *
   2802  1.3  explorer 	 * XXX This can result in an endless req - nak loop if peer
   2803  1.3  explorer 	 * doesn't want to send us his address.  Q: What should we do
   2804  1.3  explorer 	 * about it?  XXX  A: implement the max-failure counter.
   2805  1.3  explorer 	 */
   2806  1.3  explorer 	if (rlen == 0 && !(sp->ipcp.flags & IPCP_HISADDR_SEEN) && !gotmyaddr) {
   2807  1.3  explorer 		buf[0] = IPCP_OPT_ADDRESS;
   2808  1.3  explorer 		buf[1] = 6;
   2809  1.3  explorer 		buf[2] = hisaddr >> 24;
   2810  1.3  explorer 		buf[3] = hisaddr >> 16;
   2811  1.3  explorer 		buf[4] = hisaddr >> 8;
   2812  1.3  explorer 		buf[5] = hisaddr;
   2813  1.3  explorer 		rlen = 6;
   2814  1.3  explorer 		if (debug)
   2815  1.3  explorer 			addlog("still need hisaddr ");
   2816  1.3  explorer 	}
   2817  1.3  explorer 
   2818  1.3  explorer 	if (rlen) {
   2819  1.3  explorer 		if (debug)
   2820  1.3  explorer 			addlog(" send conf-nak\n");
   2821  1.3  explorer 		sppp_cp_send (sp, PPP_IPCP, CONF_NAK, h->ident, rlen, buf);
   2822  1.3  explorer 	} else {
   2823  1.3  explorer 		if (debug)
   2824  1.3  explorer 			addlog(" send conf-ack\n");
   2825  1.3  explorer 		sppp_cp_send (sp, PPP_IPCP, CONF_ACK,
   2826  1.3  explorer 			      h->ident, origlen, h+1);
   2827  1.3  explorer 	}
   2828  1.3  explorer 
   2829  1.3  explorer 	free (buf, M_TEMP);
   2830  1.3  explorer 	return (rlen == 0);
   2831  1.3  explorer }
   2832  1.3  explorer 
   2833  1.3  explorer /*
   2834  1.3  explorer  * Analyze the IPCP Configure-Reject option list, and adjust our
   2835  1.3  explorer  * negotiation.
   2836  1.3  explorer  */
   2837  1.3  explorer static void
   2838  1.3  explorer sppp_ipcp_RCN_rej(struct sppp *sp, struct lcp_header *h, int len)
   2839  1.3  explorer {
   2840  1.3  explorer 	u_char *buf, *p;
   2841  1.3  explorer 	struct ifnet *ifp = &sp->pp_if;
   2842  1.3  explorer 	int debug = ifp->if_flags & IFF_DEBUG;
   2843  1.3  explorer 
   2844  1.3  explorer 	len -= 4;
   2845  1.3  explorer 	buf = malloc (len, M_TEMP, M_NOWAIT);
   2846  1.3  explorer 	if (!buf)
   2847  1.3  explorer 		return;
   2848  1.3  explorer 
   2849  1.3  explorer 	if (debug)
   2850  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "ipcp rej opts: ",
   2851  1.3  explorer 		    SPP_ARGS(ifp));
   2852  1.3  explorer 
   2853  1.3  explorer 	p = (void*) (h+1);
   2854  1.3  explorer 	for (; len > 1 && p[1]; len -= p[1], p += p[1]) {
   2855  1.3  explorer 		if (debug)
   2856  1.3  explorer 			addlog(" %s ", sppp_ipcp_opt_name(*p));
   2857  1.3  explorer 		switch (*p) {
   2858  1.3  explorer 		case IPCP_OPT_ADDRESS:
   2859  1.3  explorer 			/*
   2860  1.3  explorer 			 * Peer doesn't grok address option.  This is
   2861  1.3  explorer 			 * bad.  XXX  Should we better give up here?
   2862  1.3  explorer 			 */
   2863  1.3  explorer 			sp->ipcp.opts &= ~(1 << IPCP_OPT_ADDRESS);
   2864  1.3  explorer 			break;
   2865  1.3  explorer #ifdef notyet
   2866  1.3  explorer 		case IPCP_OPT_COMPRESS:
   2867  1.3  explorer 			sp->ipcp.opts &= ~(1 << IPCP_OPT_COMPRESS);
   2868  1.3  explorer 			break;
   2869  1.3  explorer #endif
   2870  1.3  explorer 		}
   2871  1.3  explorer 	}
   2872  1.3  explorer 	if (debug)
   2873  1.3  explorer 		addlog("\n");
   2874  1.3  explorer 	free (buf, M_TEMP);
   2875  1.3  explorer 	return;
   2876  1.3  explorer }
   2877  1.3  explorer 
   2878  1.3  explorer /*
   2879  1.3  explorer  * Analyze the IPCP Configure-NAK option list, and adjust our
   2880  1.3  explorer  * negotiation.
   2881  1.3  explorer  */
   2882  1.3  explorer static void
   2883  1.3  explorer sppp_ipcp_RCN_nak(struct sppp *sp, struct lcp_header *h, int len)
   2884  1.3  explorer {
   2885  1.3  explorer 	u_char *buf, *p;
   2886  1.3  explorer 	struct ifnet *ifp = &sp->pp_if;
   2887  1.3  explorer 	int debug = ifp->if_flags & IFF_DEBUG;
   2888  1.3  explorer 	u_long wantaddr;
   2889  1.3  explorer 
   2890  1.3  explorer 	len -= 4;
   2891  1.3  explorer 	buf = malloc (len, M_TEMP, M_NOWAIT);
   2892  1.3  explorer 	if (!buf)
   2893  1.3  explorer 		return;
   2894  1.3  explorer 
   2895  1.3  explorer 	if (debug)
   2896  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "ipcp nak opts: ",
   2897  1.3  explorer 		    SPP_ARGS(ifp));
   2898  1.3  explorer 
   2899  1.3  explorer 	p = (void*) (h+1);
   2900  1.3  explorer 	for (; len > 1 && p[1]; len -= p[1], p += p[1]) {
   2901  1.3  explorer 		if (debug)
   2902  1.3  explorer 			addlog(" %s ", sppp_ipcp_opt_name(*p));
   2903  1.3  explorer 		switch (*p) {
   2904  1.3  explorer 		case IPCP_OPT_ADDRESS:
   2905  1.3  explorer 			/*
   2906  1.3  explorer 			 * Peer doesn't like our local IP address.  See
   2907  1.3  explorer 			 * if we can do something for him.  We'll drop
   2908  1.3  explorer 			 * him our address then.
   2909  1.3  explorer 			 */
   2910  1.3  explorer 			if (len >= 6 && p[1] == 6) {
   2911  1.3  explorer 				wantaddr = p[2] << 24 | p[3] << 16 |
   2912  1.3  explorer 					p[4] << 8 | p[5];
   2913  1.3  explorer 				sp->ipcp.opts |= (1 << IPCP_OPT_ADDRESS);
   2914  1.3  explorer 				if (debug)
   2915  1.3  explorer 					addlog("[wantaddr %s] ",
   2916  1.3  explorer 					       sppp_dotted_quad(wantaddr));
   2917  1.3  explorer 				/*
   2918  1.3  explorer 				 * When doing dynamic address assignment,
   2919  1.3  explorer 				 * we accept his offer.  Otherwise, we
   2920  1.3  explorer 				 * ignore it and thus continue to negotiate
   2921  1.3  explorer 				 * our already existing value.
   2922  1.3  explorer 				 */
   2923  1.3  explorer 				if (sp->ipcp.flags & IPCP_MYADDR_DYN) {
   2924  1.3  explorer 					sppp_set_ip_addr(sp, wantaddr);
   2925  1.3  explorer 					if (debug)
   2926  1.3  explorer 						addlog("[agree] ");
   2927  1.3  explorer 					sp->ipcp.flags |= IPCP_MYADDR_SEEN;
   2928  1.3  explorer 				}
   2929  1.3  explorer 			}
   2930  1.3  explorer 			break;
   2931  1.3  explorer #ifdef notyet
   2932  1.3  explorer 		case IPCP_OPT_COMPRESS:
   2933  1.3  explorer 			/*
   2934  1.3  explorer 			 * Peer wants different compression parameters.
   2935  1.3  explorer 			 */
   2936  1.3  explorer 			break;
   2937  1.3  explorer #endif
   2938  1.3  explorer 		}
   2939  1.3  explorer 	}
   2940  1.3  explorer 	if (debug)
   2941  1.3  explorer 		addlog("\n");
   2942  1.3  explorer 	free (buf, M_TEMP);
   2943  1.3  explorer 	return;
   2944  1.3  explorer }
   2945  1.3  explorer 
   2946  1.3  explorer static void
   2947  1.3  explorer sppp_ipcp_tlu(struct sppp *sp)
   2948  1.3  explorer {
   2949  1.3  explorer 	/* we are up - notify isdn daemon */
   2950  1.3  explorer 	if (sp->pp_con)
   2951  1.3  explorer 		sp->pp_con(sp);
   2952  1.3  explorer }
   2953  1.3  explorer 
   2954  1.3  explorer static void
   2955  1.3  explorer sppp_ipcp_tld(struct sppp *sp)
   2956  1.3  explorer {
   2957  1.3  explorer }
   2958  1.3  explorer 
   2959  1.3  explorer static void
   2960  1.3  explorer sppp_ipcp_tls(struct sppp *sp)
   2961  1.3  explorer {
   2962  1.3  explorer 	/* indicate to LCP that it must stay alive */
   2963  1.3  explorer 	sp->lcp.protos |= (1 << IDX_IPCP);
   2964  1.3  explorer }
   2965  1.3  explorer 
   2966  1.3  explorer static void
   2967  1.3  explorer sppp_ipcp_tlf(struct sppp *sp)
   2968  1.3  explorer {
   2969  1.3  explorer 	/* we no longer need LCP */
   2970  1.3  explorer 	sp->lcp.protos &= ~(1 << IDX_IPCP);
   2971  1.3  explorer 	sppp_lcp_check_and_close(sp);
   2972  1.3  explorer }
   2973  1.3  explorer 
   2974  1.3  explorer static void
   2975  1.3  explorer sppp_ipcp_scr(struct sppp *sp)
   2976  1.3  explorer {
   2977  1.3  explorer 	char opt[6 /* compression */ + 6 /* address */];
   2978  1.3  explorer 	u_long ouraddr;
   2979  1.3  explorer 	int i = 0;
   2980  1.3  explorer 
   2981  1.3  explorer #ifdef notyet
   2982  1.3  explorer 	if (sp->ipcp.opts & (1 << IPCP_OPT_COMPRESSION)) {
   2983  1.3  explorer 		opt[i++] = IPCP_OPT_COMPRESSION;
   2984  1.3  explorer 		opt[i++] = 6;
   2985  1.3  explorer 		opt[i++] = 0;	/* VJ header compression */
   2986  1.3  explorer 		opt[i++] = 0x2d; /* VJ header compression */
   2987  1.3  explorer 		opt[i++] = max_slot_id;
   2988  1.3  explorer 		opt[i++] = comp_slot_id;
   2989  1.3  explorer 	}
   2990  1.3  explorer #endif
   2991  1.3  explorer 
   2992  1.3  explorer 	if (sp->ipcp.opts & (1 << IPCP_OPT_ADDRESS)) {
   2993  1.3  explorer 		sppp_get_ip_addrs(sp, &ouraddr, 0, 0);
   2994  1.3  explorer 		opt[i++] = IPCP_OPT_ADDRESS;
   2995  1.3  explorer 		opt[i++] = 6;
   2996  1.3  explorer 		opt[i++] = ouraddr >> 24;
   2997  1.3  explorer 		opt[i++] = ouraddr >> 16;
   2998  1.3  explorer 		opt[i++] = ouraddr >> 8;
   2999  1.3  explorer 		opt[i++] = ouraddr;
   3000  1.3  explorer 	}
   3001  1.3  explorer 
   3002  1.3  explorer 	sp->confid[IDX_IPCP] = ++sp->pp_seq;
   3003  1.3  explorer 	sppp_cp_send(sp, PPP_IPCP, CONF_REQ, sp->confid[IDX_IPCP], i, &opt);
   3004  1.3  explorer }
   3005  1.3  explorer 
   3006  1.3  explorer 
   3007  1.3  explorer /*
   3009  1.3  explorer  *--------------------------------------------------------------------------*
   3010  1.3  explorer  *                                                                          *
   3011  1.3  explorer  *                        The CHAP implementation.                          *
   3012  1.3  explorer  *                                                                          *
   3013  1.3  explorer  *--------------------------------------------------------------------------*
   3014  1.3  explorer  */
   3015  1.3  explorer 
   3016  1.3  explorer /*
   3017  1.3  explorer  * The authentication protocols don't employ a full-fledged state machine as
   3018  1.3  explorer  * the control protocols do, since they do have Open and Close events, but
   3019  1.3  explorer  * not Up and Down, nor are they explicitly terminated.  Also, use of the
   3020  1.3  explorer  * authentication protocols may be different in both directions (this makes
   3021  1.3  explorer  * sense, think of a machine that never accepts incoming calls but only
   3022  1.3  explorer  * calls out, it doesn't require the called party to authenticate itself).
   3023  1.3  explorer  *
   3024  1.3  explorer  * Our state machine for the local authentication protocol (we are requesting
   3025  1.3  explorer  * the peer to authenticate) looks like:
   3026  1.3  explorer  *
   3027  1.3  explorer  *						    RCA-
   3028  1.3  explorer  *	      +--------------------------------------------+
   3029  1.3  explorer  *	      V					    scn,tld|
   3030  1.3  explorer  *	  +--------+			       Close   +---------+ RCA+
   3031  1.3  explorer  *	  |	   |<----------------------------------|	 |------+
   3032  1.3  explorer  *   +--->| Closed |				TO*    | Opened	 | sca	|
   3033  1.3  explorer  *   |	  |	   |-----+		       +-------|	 |<-----+
   3034  1.3  explorer  *   |	  +--------+ irc |		       |       +---------+
   3035  1.3  explorer  *   |	    ^		 |		       |	   ^
   3036  1.3  explorer  *   |	    |		 |		       |	   |
   3037  1.3  explorer  *   |	    |		 |		       |	   |
   3038  1.3  explorer  *   |	 TO-|		 |		       |	   |
   3039  1.3  explorer  *   |	    |tld  TO+	 V		       |	   |
   3040  1.3  explorer  *   |	    |	+------->+		       |	   |
   3041  1.3  explorer  *   |	    |	|	 |		       |	   |
   3042  1.3  explorer  *   |	  +--------+	 V		       |	   |
   3043  1.3  explorer  *   |	  |	   |<----+<--------------------+	   |
   3044  1.3  explorer  *   |	  | Req-   | scr				   |
   3045  1.3  explorer  *   |	  | Sent   |					   |
   3046  1.3  explorer  *   |	  |	   |					   |
   3047  1.3  explorer  *   |	  +--------+					   |
   3048  1.3  explorer  *   | RCA- |	| RCA+					   |
   3049  1.3  explorer  *   +------+	+------------------------------------------+
   3050  1.3  explorer  *   scn,tld	  sca,irc,ict,tlu
   3051  1.3  explorer  *
   3052  1.3  explorer  *
   3053  1.3  explorer  *   with:
   3054  1.3  explorer  *
   3055  1.3  explorer  *	Open:	LCP reached authentication phase
   3056  1.3  explorer  *	Close:	LCP reached terminate phase
   3057  1.3  explorer  *
   3058  1.3  explorer  *	RCA+:	received reply (pap-req, chap-response), acceptable
   3059  1.3  explorer  *	RCN:	received reply (pap-req, chap-response), not acceptable
   3060  1.3  explorer  *	TO+:	timeout with restart counter >= 0
   3061  1.3  explorer  *	TO-:	timeout with restart counter < 0
   3062  1.3  explorer  *	TO*:	reschedule timeout for CHAP
   3063  1.3  explorer  *
   3064  1.3  explorer  *	scr:	send request packet (none for PAP, chap-challenge)
   3065  1.3  explorer  *	sca:	send ack packet (pap-ack, chap-success)
   3066  1.3  explorer  *	scn:	send nak packet (pap-nak, chap-failure)
   3067  1.3  explorer  *	ict:	initialize re-challenge timer (CHAP only)
   3068  1.3  explorer  *
   3069  1.3  explorer  *	tlu:	this-layer-up, LCP reaches network phase
   3070  1.3  explorer  *	tld:	this-layer-down, LCP enters terminate phase
   3071  1.3  explorer  *
   3072  1.3  explorer  * Note that in CHAP mode, after sending a new challenge, while the state
   3073  1.3  explorer  * automaton falls back into Req-Sent state, it doesn't signal a tld
   3074  1.3  explorer  * event to LCP, so LCP remains in network phase.  Only after not getting
   3075  1.3  explorer  * any response (or after getting an unacceptable response), CHAP closes,
   3076  1.3  explorer  * causing LCP to enter terminate phase.
   3077  1.3  explorer  *
   3078  1.3  explorer  * With PAP, there is no initial request that can be sent.  The peer is
   3079  1.3  explorer  * expected to send one based on the successful negotiation of PAP as
   3080  1.3  explorer  * the authentication protocol during the LCP option negotiation.
   3081  1.3  explorer  *
   3082  1.3  explorer  * Incoming authentication protocol requests (remote requests
   3083  1.3  explorer  * authentication, we are peer) don't employ a state machine at all,
   3084  1.3  explorer  * they are simply answered.  Some peers [Ascend P50 firmware rev
   3085  1.3  explorer  * 4.50] react allergically when sending IPCP requests while they are
   3086  1.3  explorer  * still in authentication phase (thereby violating the standard that
   3087  1.3  explorer  * demands that these NCP packets are to be discarded), so we keep
   3088  1.3  explorer  * track of the peer demanding us to authenticate, and only proceed to
   3089  1.3  explorer  * phase network once we've seen a positive acknowledge for the
   3090  1.3  explorer  * authentication.
   3091  1.3  explorer  */
   3092  1.3  explorer 
   3093  1.3  explorer /*
   3094  1.3  explorer  * Handle incoming CHAP packets.
   3095  1.3  explorer  */
   3096  1.3  explorer void
   3097  1.3  explorer sppp_chap_input(struct sppp *sp, struct mbuf *m)
   3098  1.3  explorer {
   3099  1.3  explorer 	STDDCL;
   3100  1.3  explorer 	struct lcp_header *h;
   3101  1.3  explorer 	int len, x;
   3102  1.3  explorer 	u_char *value, *name, digest[AUTHKEYLEN], dsize;
   3103  1.3  explorer 	int value_len, name_len;
   3104  1.3  explorer 	MD5_CTX ctx;
   3105  1.3  explorer 
   3106  1.3  explorer 	len = m->m_pkthdr.len;
   3107  1.3  explorer 	if (len < 4) {
   3108  1.3  explorer 		if (debug)
   3109  1.3  explorer 			log(LOG_DEBUG,
   3110  1.3  explorer 			    SPP_FMT "chap invalid packet length: %d bytes\n",
   3111  1.3  explorer 			    SPP_ARGS(ifp), len);
   3112  1.3  explorer 		return;
   3113  1.3  explorer 	}
   3114  1.3  explorer 	h = mtod (m, struct lcp_header*);
   3115  1.3  explorer 	if (len > ntohs (h->len))
   3116  1.3  explorer 		len = ntohs (h->len);
   3117  1.3  explorer 
   3118  1.3  explorer 	switch (h->type) {
   3119  1.3  explorer 	/* challenge, failure and success are his authproto */
   3120  1.3  explorer 	case CHAP_CHALLENGE:
   3121  1.3  explorer 		value = 1 + (u_char*)(h+1);
   3122  1.3  explorer 		value_len = value[-1];
   3123  1.3  explorer 		name = value + value_len;
   3124  1.3  explorer 		name_len = len - value_len - 5;
   3125  1.3  explorer 		if (name_len < 0) {
   3126  1.3  explorer 			if (debug) {
   3127  1.3  explorer 				log(LOG_DEBUG,
   3128  1.3  explorer 				    SPP_FMT "chap corrupted challenge "
   3129  1.3  explorer 				    "<%s id=0x%x len=%d",
   3130  1.3  explorer 				    SPP_ARGS(ifp),
   3131  1.3  explorer 				    sppp_auth_type_name(PPP_CHAP, h->type),
   3132  1.3  explorer 				    h->ident, ntohs(h->len));
   3133  1.3  explorer 				if (len > 4)
   3134  1.3  explorer 					sppp_print_bytes((u_char*) (h+1), len-4);
   3135  1.3  explorer 				addlog(">\n");
   3136  1.3  explorer 			}
   3137  1.3  explorer 			break;
   3138  1.3  explorer 		}
   3139  1.3  explorer 
   3140  1.3  explorer 		if (debug) {
   3141  1.3  explorer 			log(LOG_DEBUG,
   3142  1.3  explorer 			    SPP_FMT "chap input <%s id=0x%x len=%d name=",
   3143  1.3  explorer 			    SPP_ARGS(ifp),
   3144  1.3  explorer 			    sppp_auth_type_name(PPP_CHAP, h->type), h->ident,
   3145  1.3  explorer 			    ntohs(h->len));
   3146  1.3  explorer 			sppp_print_string((char*) name, name_len);
   3147  1.3  explorer 			addlog(" value-size=%d value=", value_len);
   3148  1.3  explorer 			sppp_print_bytes(value, value_len);
   3149  1.3  explorer 			addlog(">\n");
   3150  1.3  explorer 		}
   3151  1.3  explorer 
   3152  1.3  explorer 		/* Compute reply value. */
   3153  1.3  explorer 		MD5Init(&ctx);
   3154  1.3  explorer 		MD5Update(&ctx, &h->ident, 1);
   3155  1.3  explorer 		MD5Update(&ctx, sp->myauth.secret,
   3156  1.3  explorer 			  sppp_strnlen(sp->myauth.secret, AUTHKEYLEN));
   3157  1.3  explorer 		MD5Update(&ctx, value, value_len);
   3158  1.3  explorer 		MD5Final(digest, &ctx);
   3159  1.3  explorer 		dsize = sizeof digest;
   3160  1.3  explorer 
   3161  1.3  explorer 		sppp_auth_send(&chap, sp, CHAP_RESPONSE, h->ident,
   3162  1.3  explorer 			       sizeof dsize, (const char *)&dsize,
   3163  1.3  explorer 			       sizeof digest, digest,
   3164  1.3  explorer 			       (size_t)sppp_strnlen(sp->myauth.name, AUTHNAMELEN),
   3165  1.3  explorer 			       sp->myauth.name,
   3166  1.3  explorer 			       0);
   3167  1.3  explorer 		break;
   3168  1.3  explorer 
   3169  1.3  explorer 	case CHAP_SUCCESS:
   3170  1.3  explorer 		if (debug) {
   3171  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "chap success",
   3172  1.3  explorer 			    SPP_ARGS(ifp));
   3173  1.3  explorer 			if (len > 4) {
   3174  1.3  explorer 				addlog(": ");
   3175  1.3  explorer 				sppp_print_string((char*)(h + 1), len - 4);
   3176  1.3  explorer 			}
   3177  1.3  explorer 			addlog("\n");
   3178  1.3  explorer 		}
   3179  1.3  explorer 		x = splimp();
   3180  1.3  explorer 		sp->pp_flags &= ~PP_NEEDAUTH;
   3181  1.3  explorer 		if (sp->myauth.proto == PPP_CHAP &&
   3182  1.3  explorer 		    (sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) &&
   3183  1.3  explorer 		    (sp->lcp.protos & (1 << IDX_CHAP)) == 0) {
   3184  1.3  explorer 			/*
   3185  1.3  explorer 			 * We are authenticator for CHAP but didn't
   3186  1.3  explorer 			 * complete yet.  Leave it to tlu to proceed
   3187  1.3  explorer 			 * to network phase.
   3188  1.3  explorer 			 */
   3189  1.3  explorer 			splx(x);
   3190  1.3  explorer 			break;
   3191  1.3  explorer 		}
   3192  1.3  explorer 		splx(x);
   3193  1.3  explorer 		sppp_phase_network(sp);
   3194  1.3  explorer 		break;
   3195  1.3  explorer 
   3196  1.3  explorer 	case CHAP_FAILURE:
   3197  1.3  explorer 		if (debug) {
   3198  1.3  explorer 			log(LOG_INFO, SPP_FMT "chap failure",
   3199  1.3  explorer 			    SPP_ARGS(ifp));
   3200  1.3  explorer 			if (len > 4) {
   3201  1.3  explorer 				addlog(": ");
   3202  1.3  explorer 				sppp_print_string((char*)(h + 1), len - 4);
   3203  1.3  explorer 			}
   3204  1.3  explorer 			addlog("\n");
   3205  1.3  explorer 		} else
   3206  1.3  explorer 			log(LOG_INFO, SPP_FMT "chap failure\n",
   3207  1.3  explorer 			    SPP_ARGS(ifp));
   3208  1.3  explorer 		/* await LCP shutdown by authenticator */
   3209  1.3  explorer 		break;
   3210  1.3  explorer 
   3211  1.3  explorer 	/* response is my authproto */
   3212  1.3  explorer 	case CHAP_RESPONSE:
   3213  1.3  explorer 		value = 1 + (u_char*)(h+1);
   3214  1.3  explorer 		value_len = value[-1];
   3215  1.3  explorer 		name = value + value_len;
   3216  1.3  explorer 		name_len = len - value_len - 5;
   3217  1.3  explorer 		if (name_len < 0) {
   3218  1.3  explorer 			if (debug) {
   3219  1.3  explorer 				log(LOG_DEBUG,
   3220  1.3  explorer 				    SPP_FMT "chap corrupted response "
   3221  1.3  explorer 				    "<%s id=0x%x len=%d",
   3222  1.3  explorer 				    SPP_ARGS(ifp),
   3223  1.3  explorer 				    sppp_auth_type_name(PPP_CHAP, h->type),
   3224  1.3  explorer 				    h->ident, ntohs(h->len));
   3225  1.3  explorer 				if (len > 4)
   3226  1.3  explorer 					sppp_print_bytes((u_char*)(h+1), len-4);
   3227  1.3  explorer 				addlog(">\n");
   3228  1.3  explorer 			}
   3229  1.3  explorer 			break;
   3230  1.3  explorer 		}
   3231  1.3  explorer 		if (h->ident != sp->confid[IDX_CHAP]) {
   3232  1.3  explorer 			if (debug)
   3233  1.3  explorer 				log(LOG_DEBUG,
   3234  1.3  explorer 				    SPP_FMT "chap dropping response for old ID "
   3235  1.3  explorer 				    "(got %d, expected %d)\n",
   3236  1.3  explorer 				    SPP_ARGS(ifp),
   3237  1.3  explorer 				    h->ident, sp->confid[IDX_CHAP]);
   3238  1.3  explorer 			break;
   3239  1.3  explorer 		}
   3240  1.3  explorer 		if (name_len != sppp_strnlen(sp->hisauth.name, AUTHNAMELEN)
   3241  1.3  explorer 		    || bcmp(name, sp->hisauth.name, name_len) != 0) {
   3242  1.3  explorer 			log(LOG_INFO, SPP_FMT "chap response, his name ",
   3243  1.3  explorer 			    SPP_ARGS(ifp));
   3244  1.3  explorer 			sppp_print_string(name, name_len);
   3245  1.3  explorer 			addlog(" != expected ");
   3246  1.3  explorer 			sppp_print_string(sp->hisauth.name,
   3247  1.3  explorer 					  sppp_strnlen(sp->hisauth.name, AUTHNAMELEN));
   3248  1.3  explorer 			addlog("\n");
   3249  1.3  explorer 		}
   3250  1.3  explorer 		if (debug) {
   3251  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "chap input(%s) "
   3252  1.3  explorer 			    "<%s id=0x%x len=%d name=",
   3253  1.3  explorer 			    SPP_ARGS(ifp),
   3254  1.3  explorer 			    sppp_state_name(sp->state[IDX_CHAP]),
   3255  1.3  explorer 			    sppp_auth_type_name(PPP_CHAP, h->type),
   3256  1.3  explorer 			    h->ident, ntohs (h->len));
   3257  1.3  explorer 			sppp_print_string((char*)name, name_len);
   3258  1.3  explorer 			addlog(" value-size=%d value=", value_len);
   3259  1.3  explorer 			sppp_print_bytes(value, value_len);
   3260  1.3  explorer 			addlog(">\n");
   3261  1.3  explorer 		}
   3262  1.3  explorer 		if (value_len != AUTHKEYLEN) {
   3263  1.3  explorer 			if (debug)
   3264  1.3  explorer 				log(LOG_DEBUG,
   3265  1.3  explorer 				    SPP_FMT "chap bad hash value length: "
   3266  1.3  explorer 				    "%d bytes, should be %d\n",
   3267  1.3  explorer 				    SPP_ARGS(ifp), value_len,
   3268  1.3  explorer 				    AUTHKEYLEN);
   3269  1.3  explorer 			break;
   3270  1.3  explorer 		}
   3271  1.3  explorer 
   3272  1.3  explorer 		MD5Init(&ctx);
   3273  1.3  explorer 		MD5Update(&ctx, &h->ident, 1);
   3274  1.3  explorer 		MD5Update(&ctx, sp->hisauth.secret,
   3275  1.3  explorer 			  sppp_strnlen(sp->hisauth.secret, AUTHKEYLEN));
   3276  1.3  explorer 		MD5Update(&ctx, sp->myauth.challenge, AUTHKEYLEN);
   3277  1.3  explorer 		MD5Final(digest, &ctx);
   3278  1.3  explorer 
   3279  1.3  explorer #define FAILMSG "Failed..."
   3280  1.3  explorer #define SUCCMSG "Welcome!"
   3281  1.3  explorer 
   3282  1.3  explorer 		if (value_len != sizeof digest ||
   3283  1.3  explorer 		    bcmp(digest, value, value_len) != 0) {
   3284  1.3  explorer 			/* action scn, tld */
   3285  1.3  explorer 			sppp_auth_send(&chap, sp, CHAP_FAILURE, h->ident,
   3286  1.3  explorer 				       sizeof(FAILMSG) - 1, (u_char *)FAILMSG,
   3287  1.3  explorer 				       0);
   3288  1.3  explorer 			chap.tld(sp);
   3289  1.3  explorer 			break;
   3290  1.3  explorer 		}
   3291  1.3  explorer 		/* action sca, perhaps tlu */
   3292  1.3  explorer 		if (sp->state[IDX_CHAP] == STATE_REQ_SENT ||
   3293  1.3  explorer 		    sp->state[IDX_CHAP] == STATE_OPENED)
   3294  1.3  explorer 			sppp_auth_send(&chap, sp, CHAP_SUCCESS, h->ident,
   3295  1.3  explorer 				       sizeof(SUCCMSG) - 1, (u_char *)SUCCMSG,
   3296  1.3  explorer 				       0);
   3297  1.3  explorer 		if (sp->state[IDX_CHAP] == STATE_REQ_SENT) {
   3298  1.3  explorer 			sppp_cp_change_state(&chap, sp, STATE_OPENED);
   3299  1.3  explorer 			chap.tlu(sp);
   3300  1.3  explorer 		}
   3301  1.3  explorer 		break;
   3302  1.3  explorer 
   3303  1.3  explorer 	default:
   3304  1.3  explorer 		/* Unknown CHAP packet type -- ignore. */
   3305  1.3  explorer 		if (debug) {
   3306  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "chap unknown input(%s) "
   3307  1.3  explorer 			    "<0x%x id=0x%xh len=%d",
   3308  1.3  explorer 			    SPP_ARGS(ifp),
   3309  1.3  explorer 			    sppp_state_name(sp->state[IDX_CHAP]),
   3310  1.3  explorer 			    h->type, h->ident, ntohs(h->len));
   3311  1.3  explorer 			if (len > 4)
   3312  1.3  explorer 				sppp_print_bytes((u_char*)(h+1), len-4);
   3313  1.3  explorer 			addlog(">\n");
   3314  1.3  explorer 		}
   3315  1.3  explorer 		break;
   3316  1.3  explorer 
   3317  1.3  explorer 	}
   3318  1.3  explorer }
   3319  1.3  explorer 
   3320  1.7   thorpej static void
   3321  1.7   thorpej sppp_chap_init(struct sppp *sp)
   3322  1.7   thorpej {
   3323  1.3  explorer 	/* Chap doesn't have STATE_INITIAL at all. */
   3324  1.3  explorer 	sp->state[IDX_CHAP] = STATE_CLOSED;
   3325  1.3  explorer 	sp->fail_counter[IDX_CHAP] = 0;
   3326  1.3  explorer #if defined(__NetBSD__)
   3327  1.3  explorer 	callout_init(&sp->ch[IDX_CHAP]);
   3328  1.3  explorer #endif
   3329  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   3330  1.3  explorer 	callout_handle_init(&sp->ch[IDX_CHAP]);
   3331  1.3  explorer #endif
   3332  1.3  explorer }
   3333  1.3  explorer 
   3334  1.3  explorer static void
   3335  1.3  explorer sppp_chap_open(struct sppp *sp)
   3336  1.3  explorer {
   3337  1.3  explorer 	if (sp->myauth.proto == PPP_CHAP &&
   3338  1.3  explorer 	    (sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) != 0) {
   3339  1.3  explorer 		/* we are authenticator for CHAP, start it */
   3340  1.3  explorer 		chap.scr(sp);
   3341  1.3  explorer 		sp->rst_counter[IDX_CHAP] = sp->lcp.max_configure;
   3342  1.3  explorer 		sppp_cp_change_state(&chap, sp, STATE_REQ_SENT);
   3343  1.3  explorer 	}
   3344  1.3  explorer 	/* nothing to be done if we are peer, await a challenge */
   3345  1.3  explorer }
   3346  1.3  explorer 
   3347  1.3  explorer static void
   3348  1.3  explorer sppp_chap_close(struct sppp *sp)
   3349  1.3  explorer {
   3350  1.3  explorer 	if (sp->state[IDX_CHAP] != STATE_CLOSED)
   3351  1.3  explorer 		sppp_cp_change_state(&chap, sp, STATE_CLOSED);
   3352  1.3  explorer }
   3353  1.3  explorer 
   3354  1.3  explorer static void
   3355  1.3  explorer sppp_chap_TO(void *cookie)
   3356  1.3  explorer {
   3357  1.3  explorer 	struct sppp *sp = (struct sppp *)cookie;
   3358  1.3  explorer 	STDDCL;
   3359  1.3  explorer 	int s;
   3360  1.3  explorer 
   3361  1.3  explorer 	s = splimp();
   3362  1.3  explorer 	if (debug)
   3363  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "chap TO(%s) rst_counter = %d\n",
   3364  1.3  explorer 		    SPP_ARGS(ifp),
   3365  1.3  explorer 		    sppp_state_name(sp->state[IDX_CHAP]),
   3366  1.3  explorer 		    sp->rst_counter[IDX_CHAP]);
   3367  1.3  explorer 
   3368  1.3  explorer 	if (--sp->rst_counter[IDX_CHAP] < 0)
   3369  1.3  explorer 		/* TO- event */
   3370  1.3  explorer 		switch (sp->state[IDX_CHAP]) {
   3371  1.3  explorer 		case STATE_REQ_SENT:
   3372  1.3  explorer 			chap.tld(sp);
   3373  1.3  explorer 			sppp_cp_change_state(&chap, sp, STATE_CLOSED);
   3374  1.3  explorer 			break;
   3375  1.3  explorer 		}
   3376  1.3  explorer 	else
   3377  1.3  explorer 		/* TO+ (or TO*) event */
   3378  1.3  explorer 		switch (sp->state[IDX_CHAP]) {
   3379  1.3  explorer 		case STATE_OPENED:
   3380  1.3  explorer 			/* TO* event */
   3381  1.3  explorer 			sp->rst_counter[IDX_CHAP] = sp->lcp.max_configure;
   3382  1.3  explorer 			/* fall through */
   3383  1.3  explorer 		case STATE_REQ_SENT:
   3384  1.3  explorer 			chap.scr(sp);
   3385  1.3  explorer 			/* sppp_cp_change_state() will restart the timer */
   3386  1.3  explorer 			sppp_cp_change_state(&chap, sp, STATE_REQ_SENT);
   3387  1.3  explorer 			break;
   3388  1.3  explorer 		}
   3389  1.3  explorer 
   3390  1.3  explorer 	splx(s);
   3391  1.3  explorer }
   3392  1.3  explorer 
   3393  1.3  explorer static void
   3394  1.3  explorer sppp_chap_tlu(struct sppp *sp)
   3395  1.3  explorer {
   3396  1.3  explorer 	STDDCL;
   3397  1.3  explorer 	int i, x;
   3398  1.3  explorer 
   3399  1.3  explorer 	i = 0;
   3400  1.3  explorer 	sp->rst_counter[IDX_CHAP] = sp->lcp.max_configure;
   3401  1.3  explorer 
   3402  1.3  explorer 	/*
   3403  1.3  explorer 	 * Some broken CHAP implementations (Conware CoNet, firmware
   3404  1.3  explorer 	 * 4.0.?) don't want to re-authenticate their CHAP once the
   3405  1.3  explorer 	 * initial challenge-response exchange has taken place.
   3406  1.3  explorer 	 * Provide for an option to avoid rechallenges.
   3407  1.3  explorer 	 */
   3408  1.3  explorer 	if ((sp->hisauth.flags & AUTHFLAG_NORECHALLENGE) == 0) {
   3409  1.7   thorpej 		/*
   3410  1.7   thorpej 		 * Compute the re-challenge timeout.  This will yield
   3411  1.7   thorpej 		 * a number between 300 and 810 seconds.
   3412  1.3  explorer 		 */
   3413  1.3  explorer 		i = 300 + ((unsigned)(random() & 0xff00) >> 7);
   3414  1.3  explorer 
   3415  1.3  explorer #if defined(__NetBSD__)
   3416  1.7   thorpej 		callout_reset(&sp->ch[IDX_CHAP], i * hz, chap.TO, sp);
   3417  1.3  explorer #else
   3418  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   3419  1.3  explorer 		sp->ch[IDX_CHAP] =
   3420  1.3  explorer #endif
   3421  1.3  explorer 		timeout(chap.TO, (void *)sp, i * hz);
   3422  1.3  explorer #endif /* __NetBSD__ */
   3423  1.3  explorer 	}
   3424  1.3  explorer 
   3425  1.3  explorer 	if (debug) {
   3426  1.3  explorer 		log(LOG_DEBUG,
   3427  1.3  explorer 		    SPP_FMT "chap %s, ",
   3428  1.3  explorer 		    SPP_ARGS(ifp),
   3429  1.3  explorer 		    sp->pp_phase == PHASE_NETWORK? "reconfirmed": "tlu");
   3430  1.3  explorer 		if ((sp->hisauth.flags & AUTHFLAG_NORECHALLENGE) == 0)
   3431  1.3  explorer 			addlog("next re-challenge in %d seconds\n", i);
   3432  1.3  explorer 		else
   3433  1.3  explorer 			addlog("re-challenging supressed\n");
   3434  1.3  explorer 	}
   3435  1.3  explorer 
   3436  1.3  explorer 	x = splimp();
   3437  1.3  explorer 	/* indicate to LCP that we need to be closed down */
   3438  1.3  explorer 	sp->lcp.protos |= (1 << IDX_CHAP);
   3439  1.3  explorer 
   3440  1.3  explorer 	if (sp->pp_flags & PP_NEEDAUTH) {
   3441  1.3  explorer 		/*
   3442  1.3  explorer 		 * Remote is authenticator, but his auth proto didn't
   3443  1.3  explorer 		 * complete yet.  Defer the transition to network
   3444  1.3  explorer 		 * phase.
   3445  1.3  explorer 		 */
   3446  1.3  explorer 		splx(x);
   3447  1.3  explorer 		return;
   3448  1.3  explorer 	}
   3449  1.3  explorer 	splx(x);
   3450  1.3  explorer 
   3451  1.3  explorer 	/*
   3452  1.3  explorer 	 * If we are already in phase network, we are done here.  This
   3453  1.3  explorer 	 * is the case if this is a dummy tlu event after a re-challenge.
   3454  1.3  explorer 	 */
   3455  1.3  explorer 	if (sp->pp_phase != PHASE_NETWORK)
   3456  1.3  explorer 		sppp_phase_network(sp);
   3457  1.3  explorer }
   3458  1.3  explorer 
   3459  1.3  explorer static void
   3460  1.7   thorpej sppp_chap_tld(struct sppp *sp)
   3461  1.7   thorpej {
   3462  1.7   thorpej 	STDDCL;
   3463  1.3  explorer 
   3464  1.3  explorer 	if (debug)
   3465  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "chap tld\n", SPP_ARGS(ifp));
   3466  1.3  explorer #if defined(__NetBSD__)
   3467  1.3  explorer 	callout_stop(&sp->ch[IDX_CHAP]);
   3468  1.7   thorpej #else
   3469  1.3  explorer 	untimeout(chap.TO, (void *)sp
   3470  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   3471  1.3  explorer 	, sp->ch[IDX_CHAP]
   3472  1.3  explorer #endif
   3473  1.3  explorer 	);
   3474  1.3  explorer #endif /* __NetBSD__ */
   3475  1.3  explorer 	sp->lcp.protos &= ~(1 << IDX_CHAP);
   3476  1.3  explorer 
   3477  1.3  explorer 	lcp.Close(sp);
   3478  1.3  explorer }
   3479  1.3  explorer 
   3480  1.3  explorer static void
   3481  1.3  explorer sppp_chap_scr(struct sppp *sp)
   3482  1.3  explorer {
   3483  1.3  explorer 	struct timeval tv;
   3484  1.3  explorer 	u_long *ch, seed;
   3485  1.3  explorer 	u_char clen;
   3486  1.3  explorer 
   3487  1.3  explorer 	/* Compute random challenge. */
   3488  1.3  explorer 	ch = (u_long *)sp->myauth.challenge;
   3489  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   3490  1.3  explorer 	read_random(&seed, sizeof seed);
   3491  1.3  explorer #else
   3492  1.3  explorer 	microtime(&tv);
   3493  1.3  explorer 	seed = tv.tv_sec ^ tv.tv_usec;
   3494  1.3  explorer #endif
   3495  1.3  explorer 	ch[0] = seed ^ random();
   3496  1.3  explorer 	ch[1] = seed ^ random();
   3497  1.3  explorer 	ch[2] = seed ^ random();
   3498  1.3  explorer 	ch[3] = seed ^ random();
   3499  1.3  explorer 	clen = AUTHKEYLEN;
   3500  1.3  explorer 
   3501  1.3  explorer 	sp->confid[IDX_CHAP] = ++sp->pp_seq;
   3502  1.3  explorer 
   3503  1.3  explorer 	sppp_auth_send(&chap, sp, CHAP_CHALLENGE, sp->confid[IDX_CHAP],
   3504  1.3  explorer 		       sizeof clen, (const char *)&clen,
   3505  1.3  explorer 		       (size_t)AUTHKEYLEN, sp->myauth.challenge,
   3506  1.3  explorer 		       (size_t)sppp_strnlen(sp->myauth.name, AUTHNAMELEN),
   3507  1.3  explorer 		       sp->myauth.name,
   3508  1.3  explorer 		       0);
   3509  1.3  explorer }
   3510  1.3  explorer /*
   3512  1.3  explorer  *--------------------------------------------------------------------------*
   3513  1.3  explorer  *                                                                          *
   3514  1.3  explorer  *                        The PAP implementation.                           *
   3515  1.3  explorer  *                                                                          *
   3516  1.3  explorer  *--------------------------------------------------------------------------*
   3517  1.3  explorer  */
   3518  1.3  explorer /*
   3519  1.3  explorer  * For PAP, we need to keep a little state also if we are the peer, not the
   3520  1.3  explorer  * authenticator.  This is since we don't get a request to authenticate, but
   3521  1.3  explorer  * have to repeatedly authenticate ourself until we got a response (or the
   3522  1.3  explorer  * retry counter is expired).
   3523  1.3  explorer  */
   3524  1.3  explorer 
   3525  1.3  explorer /*
   3526  1.3  explorer  * Handle incoming PAP packets.  */
   3527  1.3  explorer static void
   3528  1.3  explorer sppp_pap_input(struct sppp *sp, struct mbuf *m)
   3529  1.3  explorer {
   3530  1.3  explorer 	STDDCL;
   3531  1.3  explorer 	struct lcp_header *h;
   3532  1.3  explorer 	int len, x;
   3533  1.3  explorer 	u_char *name, *passwd, mlen;
   3534  1.3  explorer 	int name_len, passwd_len;
   3535  1.3  explorer 
   3536  1.3  explorer 	len = m->m_pkthdr.len;
   3537  1.3  explorer 	if (len < 5) {
   3538  1.3  explorer 		if (debug)
   3539  1.3  explorer 			log(LOG_DEBUG,
   3540  1.3  explorer 			    SPP_FMT "pap invalid packet length: %d bytes\n",
   3541  1.3  explorer 			    SPP_ARGS(ifp), len);
   3542  1.3  explorer 		return;
   3543  1.3  explorer 	}
   3544  1.3  explorer 	h = mtod (m, struct lcp_header*);
   3545  1.3  explorer 	if (len > ntohs (h->len))
   3546  1.3  explorer 		len = ntohs (h->len);
   3547  1.3  explorer 	switch (h->type) {
   3548  1.3  explorer 	/* PAP request is my authproto */
   3549  1.3  explorer 	case PAP_REQ:
   3550  1.3  explorer 		name = 1 + (u_char*)(h+1);
   3551  1.3  explorer 		name_len = name[-1];
   3552  1.3  explorer 		passwd = name + name_len + 1;
   3553  1.3  explorer 		if (name_len > len - 6 ||
   3554  1.3  explorer 		    (passwd_len = passwd[-1]) > len - 6 - name_len) {
   3555  1.3  explorer 			if (debug) {
   3556  1.3  explorer 				log(LOG_DEBUG, SPP_FMT "pap corrupted input "
   3557  1.3  explorer 				    "<%s id=0x%x len=%d",
   3558  1.3  explorer 				    SPP_ARGS(ifp),
   3559  1.3  explorer 				    sppp_auth_type_name(PPP_PAP, h->type),
   3560  1.3  explorer 				    h->ident, ntohs(h->len));
   3561  1.3  explorer 				if (len > 4)
   3562  1.3  explorer 					sppp_print_bytes((u_char*)(h+1), len-4);
   3563  1.3  explorer 				addlog(">\n");
   3564  1.3  explorer 			}
   3565  1.3  explorer 			break;
   3566  1.3  explorer 		}
   3567  1.3  explorer 		if (debug) {
   3568  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "pap input(%s) "
   3569  1.3  explorer 			    "<%s id=0x%x len=%d name=",
   3570  1.3  explorer 			    SPP_ARGS(ifp),
   3571  1.3  explorer 			    sppp_state_name(sp->state[IDX_PAP]),
   3572  1.3  explorer 			    sppp_auth_type_name(PPP_PAP, h->type),
   3573  1.3  explorer 			    h->ident, ntohs(h->len));
   3574  1.3  explorer 			sppp_print_string((char*)name, name_len);
   3575  1.3  explorer 			addlog(" passwd=");
   3576  1.3  explorer 			sppp_print_string((char*)passwd, passwd_len);
   3577  1.3  explorer 			addlog(">\n");
   3578  1.3  explorer 		}
   3579  1.3  explorer 		if (name_len > AUTHNAMELEN ||
   3580  1.3  explorer 		    passwd_len > AUTHKEYLEN ||
   3581  1.3  explorer 		    bcmp(name, sp->hisauth.name, name_len) != 0 ||
   3582  1.3  explorer 		    bcmp(passwd, sp->hisauth.secret, passwd_len) != 0) {
   3583  1.3  explorer 			/* action scn, tld */
   3584  1.3  explorer 			mlen = sizeof(FAILMSG) - 1;
   3585  1.3  explorer 			sppp_auth_send(&pap, sp, PAP_NAK, h->ident,
   3586  1.3  explorer 				       sizeof mlen, (const char *)&mlen,
   3587  1.3  explorer 				       sizeof(FAILMSG) - 1, (u_char *)FAILMSG,
   3588  1.3  explorer 				       0);
   3589  1.3  explorer 			pap.tld(sp);
   3590  1.3  explorer 			break;
   3591  1.3  explorer 		}
   3592  1.3  explorer 		/* action sca, perhaps tlu */
   3593  1.3  explorer 		if (sp->state[IDX_PAP] == STATE_REQ_SENT ||
   3594  1.3  explorer 		    sp->state[IDX_PAP] == STATE_OPENED) {
   3595  1.3  explorer 			mlen = sizeof(SUCCMSG) - 1;
   3596  1.3  explorer 			sppp_auth_send(&pap, sp, PAP_ACK, h->ident,
   3597  1.3  explorer 				       sizeof mlen, (const char *)&mlen,
   3598  1.3  explorer 				       sizeof(SUCCMSG) - 1, (u_char *)SUCCMSG,
   3599  1.3  explorer 				       0);
   3600  1.3  explorer 		}
   3601  1.3  explorer 		if (sp->state[IDX_PAP] == STATE_REQ_SENT) {
   3602  1.7   thorpej 			sppp_cp_change_state(&pap, sp, STATE_OPENED);
   3603  1.7   thorpej 			pap.tlu(sp);
   3604  1.7   thorpej 		}
   3605  1.3  explorer 		break;
   3606  1.3  explorer 
   3607  1.3  explorer 	/* ack and nak are his authproto */
   3608  1.3  explorer 	case PAP_ACK:
   3609  1.3  explorer #if defined(__NetBSD__)
   3610  1.7   thorpej 		callout_stop(&sp->pap_my_to_ch);
   3611  1.3  explorer #else
   3612  1.3  explorer 		untimeout(sppp_pap_my_TO, (void *)sp
   3613  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   3614  1.3  explorer 		, sp->pap_my_to_ch
   3615  1.3  explorer #endif
   3616  1.3  explorer 		);
   3617  1.3  explorer #endif /* __NetBSD__ */
   3618  1.3  explorer 		if (debug) {
   3619  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "pap success",
   3620  1.3  explorer 			    SPP_ARGS(ifp));
   3621  1.3  explorer 			name_len = *((char *)h);
   3622  1.3  explorer 			if (len > 5 && name_len) {
   3623  1.3  explorer 				addlog(": ");
   3624  1.3  explorer 				sppp_print_string((char*)(h+1), name_len);
   3625  1.3  explorer 			}
   3626  1.3  explorer 			addlog("\n");
   3627  1.3  explorer 		}
   3628  1.3  explorer 		x = splimp();
   3629  1.3  explorer 		sp->pp_flags &= ~PP_NEEDAUTH;
   3630  1.3  explorer 		if (sp->myauth.proto == PPP_PAP &&
   3631  1.3  explorer 		    (sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) &&
   3632  1.3  explorer 		    (sp->lcp.protos & (1 << IDX_PAP)) == 0) {
   3633  1.3  explorer 			/*
   3634  1.3  explorer 			 * We are authenticator for PAP but didn't
   3635  1.3  explorer 			 * complete yet.  Leave it to tlu to proceed
   3636  1.3  explorer 			 * to network phase.
   3637  1.3  explorer 			 */
   3638  1.3  explorer 			splx(x);
   3639  1.7   thorpej 			break;
   3640  1.7   thorpej 		}
   3641  1.7   thorpej 		splx(x);
   3642  1.3  explorer 		sppp_phase_network(sp);
   3643  1.3  explorer 		break;
   3644  1.3  explorer 
   3645  1.3  explorer 	case PAP_NAK:
   3646  1.3  explorer #if defined(__NetBSD__)
   3647  1.7   thorpej 		callout_stop(&sp->pap_my_to_ch);
   3648  1.3  explorer #else
   3649  1.3  explorer 		untimeout(sppp_pap_my_TO, (void *)sp
   3650  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   3651  1.3  explorer 		, sp->pap_my_to_ch
   3652  1.3  explorer #endif
   3653  1.3  explorer 		);
   3654  1.3  explorer #endif /* __NetBSD__ */
   3655  1.3  explorer 		if (debug) {
   3656  1.3  explorer 			log(LOG_INFO, SPP_FMT "pap failure",
   3657  1.3  explorer 			    SPP_ARGS(ifp));
   3658  1.3  explorer 			name_len = *((char *)h);
   3659  1.3  explorer 			if (len > 5 && name_len) {
   3660  1.3  explorer 				addlog(": ");
   3661  1.3  explorer 				sppp_print_string((char*)(h+1), name_len);
   3662  1.3  explorer 			}
   3663  1.3  explorer 			addlog("\n");
   3664  1.3  explorer 		} else
   3665  1.3  explorer 			log(LOG_INFO, SPP_FMT "pap failure\n",
   3666  1.3  explorer 			    SPP_ARGS(ifp));
   3667  1.3  explorer 		/* await LCP shutdown by authenticator */
   3668  1.3  explorer 		break;
   3669  1.3  explorer 
   3670  1.3  explorer 	default:
   3671  1.3  explorer 		/* Unknown PAP packet type -- ignore. */
   3672  1.3  explorer 		if (debug) {
   3673  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "pap corrupted input "
   3674  1.3  explorer 			    "<0x%x id=0x%x len=%d",
   3675  1.3  explorer 			    SPP_ARGS(ifp),
   3676  1.3  explorer 			    h->type, h->ident, ntohs(h->len));
   3677  1.3  explorer 			if (len > 4)
   3678  1.3  explorer 				sppp_print_bytes((u_char*)(h+1), len-4);
   3679  1.3  explorer 			addlog(">\n");
   3680  1.3  explorer 		}
   3681  1.3  explorer 		break;
   3682  1.3  explorer 
   3683  1.3  explorer 	}
   3684  1.3  explorer }
   3685  1.7   thorpej 
   3686  1.7   thorpej static void
   3687  1.7   thorpej sppp_pap_init(struct sppp *sp)
   3688  1.7   thorpej {
   3689  1.3  explorer 	/* PAP doesn't have STATE_INITIAL at all. */
   3690  1.3  explorer 	sp->state[IDX_PAP] = STATE_CLOSED;
   3691  1.3  explorer 	sp->fail_counter[IDX_PAP] = 0;
   3692  1.3  explorer #if defined(__NetBSD__)
   3693  1.3  explorer 	callout_init(&sp->ch[IDX_PAP]);
   3694  1.3  explorer 	callout_init(&sp->pap_my_to_ch);
   3695  1.3  explorer #endif
   3696  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   3697  1.3  explorer 	callout_handle_init(&sp->ch[IDX_PAP]);
   3698  1.3  explorer 	callout_handle_init(&sp->pap_my_to_ch);
   3699  1.3  explorer #endif
   3700  1.3  explorer }
   3701  1.3  explorer 
   3702  1.3  explorer static void
   3703  1.3  explorer sppp_pap_open(struct sppp *sp)
   3704  1.3  explorer {
   3705  1.3  explorer 	if (sp->hisauth.proto == PPP_PAP &&
   3706  1.3  explorer 	    (sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) != 0) {
   3707  1.7   thorpej 		/* we are authenticator for PAP, start our timer */
   3708  1.7   thorpej 		sp->rst_counter[IDX_PAP] = sp->lcp.max_configure;
   3709  1.7   thorpej 		sppp_cp_change_state(&pap, sp, STATE_REQ_SENT);
   3710  1.7   thorpej 	}
   3711  1.3  explorer 	if (sp->myauth.proto == PPP_PAP) {
   3712  1.3  explorer 		/* we are peer, send a request, and start a timer */
   3713  1.3  explorer 		pap.scr(sp);
   3714  1.3  explorer #if defined(__NetBSD__)
   3715  1.7   thorpej 		callout_reset(&sp->pap_my_to_ch, sp->lcp.timeout,
   3716  1.3  explorer 		    sppp_pap_my_TO, sp);
   3717  1.3  explorer #else
   3718  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   3719  1.3  explorer 		sp->pap_my_to_ch =
   3720  1.3  explorer #endif
   3721  1.3  explorer 		timeout(sppp_pap_my_TO, (void *)sp, sp->lcp.timeout);
   3722  1.3  explorer #endif /* __NetBSD__ */
   3723  1.3  explorer 	}
   3724  1.3  explorer }
   3725  1.3  explorer 
   3726  1.3  explorer static void
   3727  1.3  explorer sppp_pap_close(struct sppp *sp)
   3728  1.3  explorer {
   3729  1.3  explorer 	if (sp->state[IDX_PAP] != STATE_CLOSED)
   3730  1.3  explorer 		sppp_cp_change_state(&pap, sp, STATE_CLOSED);
   3731  1.3  explorer }
   3732  1.3  explorer 
   3733  1.3  explorer /*
   3734  1.3  explorer  * That's the timeout routine if we are authenticator.  Since the
   3735  1.3  explorer  * authenticator is basically passive in PAP, we can't do much here.
   3736  1.3  explorer  */
   3737  1.3  explorer static void
   3738  1.3  explorer sppp_pap_TO(void *cookie)
   3739  1.3  explorer {
   3740  1.3  explorer 	struct sppp *sp = (struct sppp *)cookie;
   3741  1.3  explorer 	STDDCL;
   3742  1.3  explorer 	int s;
   3743  1.3  explorer 
   3744  1.3  explorer 	s = splimp();
   3745  1.3  explorer 	if (debug)
   3746  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "pap TO(%s) rst_counter = %d\n",
   3747  1.3  explorer 		    SPP_ARGS(ifp),
   3748  1.3  explorer 		    sppp_state_name(sp->state[IDX_PAP]),
   3749  1.3  explorer 		    sp->rst_counter[IDX_PAP]);
   3750  1.3  explorer 
   3751  1.3  explorer 	if (--sp->rst_counter[IDX_PAP] < 0)
   3752  1.3  explorer 		/* TO- event */
   3753  1.3  explorer 		switch (sp->state[IDX_PAP]) {
   3754  1.3  explorer 		case STATE_REQ_SENT:
   3755  1.3  explorer 			pap.tld(sp);
   3756  1.3  explorer 			sppp_cp_change_state(&pap, sp, STATE_CLOSED);
   3757  1.3  explorer 			break;
   3758  1.3  explorer 		}
   3759  1.3  explorer 	else
   3760  1.3  explorer 		/* TO+ event, not very much we could do */
   3761  1.3  explorer 		switch (sp->state[IDX_PAP]) {
   3762  1.3  explorer 		case STATE_REQ_SENT:
   3763  1.3  explorer 			/* sppp_cp_change_state() will restart the timer */
   3764  1.3  explorer 			sppp_cp_change_state(&pap, sp, STATE_REQ_SENT);
   3765  1.3  explorer 			break;
   3766  1.3  explorer 		}
   3767  1.3  explorer 
   3768  1.3  explorer 	splx(s);
   3769  1.3  explorer }
   3770  1.3  explorer 
   3771  1.3  explorer /*
   3772  1.3  explorer  * That's the timeout handler if we are peer.  Since the peer is active,
   3773  1.3  explorer  * we need to retransmit our PAP request since it is apparently lost.
   3774  1.3  explorer  * XXX We should impose a max counter.
   3775  1.3  explorer  */
   3776  1.3  explorer static void
   3777  1.3  explorer sppp_pap_my_TO(void *cookie)
   3778  1.3  explorer {
   3779  1.3  explorer 	struct sppp *sp = (struct sppp *)cookie;
   3780  1.3  explorer 	STDDCL;
   3781  1.3  explorer 
   3782  1.3  explorer 	if (debug)
   3783  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "pap peer TO\n",
   3784  1.3  explorer 		    SPP_ARGS(ifp));
   3785  1.3  explorer 
   3786  1.3  explorer 	pap.scr(sp);
   3787  1.3  explorer }
   3788  1.3  explorer 
   3789  1.3  explorer static void
   3790  1.3  explorer sppp_pap_tlu(struct sppp *sp)
   3791  1.3  explorer {
   3792  1.3  explorer 	STDDCL;
   3793  1.3  explorer 	int x;
   3794  1.3  explorer 
   3795  1.3  explorer 	sp->rst_counter[IDX_PAP] = sp->lcp.max_configure;
   3796  1.3  explorer 
   3797  1.3  explorer 	if (debug)
   3798  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "%s tlu\n",
   3799  1.3  explorer 		    SPP_ARGS(ifp), pap.name);
   3800  1.3  explorer 
   3801  1.3  explorer 	x = splimp();
   3802  1.3  explorer 	/* indicate to LCP that we need to be closed down */
   3803  1.3  explorer 	sp->lcp.protos |= (1 << IDX_PAP);
   3804  1.3  explorer 
   3805  1.3  explorer 	if (sp->pp_flags & PP_NEEDAUTH) {
   3806  1.3  explorer 		/*
   3807  1.3  explorer 		 * Remote is authenticator, but his auth proto didn't
   3808  1.3  explorer 		 * complete yet.  Defer the transition to network
   3809  1.3  explorer 		 * phase.
   3810  1.3  explorer 		 */
   3811  1.3  explorer 		splx(x);
   3812  1.3  explorer 		return;
   3813  1.3  explorer 	}
   3814  1.3  explorer 	splx(x);
   3815  1.3  explorer 	sppp_phase_network(sp);
   3816  1.3  explorer }
   3817  1.3  explorer 
   3818  1.7   thorpej static void
   3819  1.7   thorpej sppp_pap_tld(struct sppp *sp)
   3820  1.7   thorpej {
   3821  1.3  explorer 	STDDCL;
   3822  1.3  explorer 
   3823  1.3  explorer 	if (debug)
   3824  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "pap tld\n", SPP_ARGS(ifp));
   3825  1.3  explorer #if defined(__NetBSD__)
   3826  1.7   thorpej 	callout_stop(&sp->ch[IDX_PAP]);
   3827  1.7   thorpej #else
   3828  1.7   thorpej 	untimeout(pap.TO, (void *)sp
   3829  1.7   thorpej #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   3830  1.7   thorpej 	, sp->ch[IDX_PAP]
   3831  1.3  explorer #endif
   3832  1.3  explorer 	);
   3833  1.3  explorer #endif /* __NetBSD__ */
   3834  1.3  explorer 
   3835  1.3  explorer #if defined(__NetBSD__)
   3836  1.7   thorpej 	callout_stop(&sp->pap_my_to_ch);
   3837  1.3  explorer #else
   3838  1.3  explorer 	untimeout(sppp_pap_my_TO, (void *)sp
   3839  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   3840  1.3  explorer 	, sp->pap_my_to_ch
   3841  1.3  explorer #endif
   3842  1.3  explorer 	);
   3843  1.3  explorer #endif /* __NetBSD__ */
   3844  1.3  explorer 	sp->lcp.protos &= ~(1 << IDX_PAP);
   3845  1.3  explorer 
   3846  1.3  explorer 	lcp.Close(sp);
   3847  1.3  explorer }
   3848  1.3  explorer 
   3849  1.3  explorer static void
   3850  1.3  explorer sppp_pap_scr(struct sppp *sp)
   3851  1.3  explorer {
   3852  1.3  explorer 	u_char idlen, pwdlen;
   3853  1.3  explorer 
   3854  1.3  explorer 	sp->confid[IDX_PAP] = ++sp->pp_seq;
   3855  1.3  explorer 	pwdlen = sppp_strnlen(sp->myauth.secret, AUTHKEYLEN);
   3856  1.3  explorer 	idlen = sppp_strnlen(sp->myauth.name, AUTHNAMELEN);
   3857  1.3  explorer 
   3858  1.3  explorer 	sppp_auth_send(&pap, sp, PAP_REQ, sp->confid[IDX_PAP],
   3859  1.3  explorer 		       sizeof idlen, (const char *)&idlen,
   3860  1.3  explorer 		       (size_t)idlen, sp->myauth.name,
   3861  1.3  explorer 		       sizeof pwdlen, (const char *)&pwdlen,
   3862  1.3  explorer 		       (size_t)pwdlen, sp->myauth.secret,
   3863  1.3  explorer 		       0);
   3864  1.3  explorer }
   3865  1.3  explorer /*
   3867  1.3  explorer  * Random miscellaneous functions.
   3868  1.3  explorer  */
   3869  1.3  explorer 
   3870  1.3  explorer /*
   3871  1.3  explorer  * Send a PAP or CHAP proto packet.
   3872  1.3  explorer  *
   3873  1.3  explorer  * Varadic function, each of the elements for the ellipsis is of type
   3874  1.3  explorer  * ``size_t mlen, const u_char *msg''.  Processing will stop iff
   3875  1.3  explorer  * mlen == 0.
   3876  1.3  explorer  * NOTE: never declare variadic functions with types subject to type
   3877  1.3  explorer  * promotion (i.e. u_char). This is asking for big trouble depending
   3878  1.3  explorer  * on the architecture you are on...
   3879  1.3  explorer  */
   3880  1.3  explorer 
   3881  1.3  explorer static void
   3882  1.3  explorer sppp_auth_send(const struct cp *cp, struct sppp *sp,
   3883  1.3  explorer                unsigned int type, unsigned int id,
   3884  1.3  explorer 	       ...)
   3885  1.3  explorer {
   3886  1.3  explorer 	STDDCL;
   3887  1.3  explorer 	struct ppp_header *h;
   3888  1.3  explorer 	struct lcp_header *lh;
   3889  1.3  explorer 	struct mbuf *m;
   3890  1.3  explorer 	u_char *p;
   3891  1.3  explorer 	int len;
   3892  1.3  explorer 	unsigned int mlen;
   3893  1.3  explorer 	const char *msg;
   3894  1.3  explorer 	va_list ap;
   3895  1.3  explorer 
   3896  1.3  explorer 	MGETHDR (m, M_DONTWAIT, MT_DATA);
   3897  1.3  explorer 	if (! m)
   3898  1.3  explorer 		return;
   3899  1.3  explorer 	m->m_pkthdr.rcvif = 0;
   3900  1.3  explorer 
   3901  1.3  explorer 	h = mtod (m, struct ppp_header*);
   3902  1.3  explorer 	h->address = PPP_ALLSTATIONS;		/* broadcast address */
   3903  1.3  explorer 	h->control = PPP_UI;			/* Unnumbered Info */
   3904  1.3  explorer 	h->protocol = htons(cp->proto);
   3905  1.3  explorer 
   3906  1.3  explorer 	lh = (struct lcp_header*)(h + 1);
   3907  1.3  explorer 	lh->type = type;
   3908  1.3  explorer 	lh->ident = id;
   3909  1.3  explorer 	p = (u_char*) (lh+1);
   3910  1.3  explorer 
   3911  1.3  explorer 	va_start(ap, id);
   3912  1.3  explorer 	len = 0;
   3913  1.3  explorer 
   3914  1.3  explorer 	while ((mlen = (unsigned int)va_arg(ap, size_t)) != 0) {
   3915  1.3  explorer 		msg = va_arg(ap, const char *);
   3916  1.3  explorer 		len += mlen;
   3917  1.3  explorer 		if (len > MHLEN - PPP_HEADER_LEN - LCP_HEADER_LEN) {
   3918  1.3  explorer 			va_end(ap);
   3919  1.3  explorer 			m_freem(m);
   3920  1.3  explorer 			return;
   3921  1.3  explorer 		}
   3922  1.3  explorer 
   3923  1.3  explorer 		bcopy(msg, p, mlen);
   3924  1.3  explorer 		p += mlen;
   3925  1.3  explorer 	}
   3926  1.3  explorer 	va_end(ap);
   3927  1.3  explorer 
   3928  1.3  explorer 	m->m_pkthdr.len = m->m_len = PPP_HEADER_LEN + LCP_HEADER_LEN + len;
   3929  1.3  explorer 	lh->len = htons (LCP_HEADER_LEN + len);
   3930  1.3  explorer 
   3931  1.3  explorer 	if (debug) {
   3932  1.3  explorer 		log(LOG_DEBUG, SPP_FMT "%s output <%s id=0x%x len=%d",
   3933  1.3  explorer 		    SPP_ARGS(ifp), cp->name,
   3934  1.3  explorer 		    sppp_auth_type_name(cp->proto, lh->type),
   3935  1.3  explorer 		    lh->ident, ntohs(lh->len));
   3936  1.3  explorer 		if (len)
   3937  1.3  explorer 			sppp_print_bytes((u_char*) (lh+1), len);
   3938  1.3  explorer 		addlog(">\n");
   3939  1.3  explorer 	}
   3940  1.3  explorer 	if (IF_QFULL (&sp->pp_cpq)) {
   3941  1.3  explorer 		IF_DROP (&sp->pp_fastq);
   3942  1.3  explorer 		IF_DROP (&ifp->if_snd);
   3943  1.3  explorer 		m_freem (m);
   3944  1.3  explorer 		++ifp->if_oerrors;
   3945  1.3  explorer 	} else
   3946  1.3  explorer 		IF_ENQUEUE (&sp->pp_cpq, m);
   3947  1.3  explorer 	if (! (ifp->if_flags & IFF_OACTIVE))
   3948  1.3  explorer 		(*ifp->if_start) (ifp);
   3949  1.3  explorer 	ifp->if_obytes += m->m_pkthdr.len + 3;
   3950  1.3  explorer }
   3951  1.3  explorer 
   3952  1.3  explorer /*
   3953  1.3  explorer  * Flush interface queue.
   3954  1.3  explorer  */
   3955  1.3  explorer static void
   3956  1.3  explorer sppp_qflush(struct ifqueue *ifq)
   3957  1.3  explorer {
   3958  1.3  explorer 	struct mbuf *m, *n;
   3959  1.3  explorer 
   3960  1.3  explorer 	n = ifq->ifq_head;
   3961  1.3  explorer 	while ((m = n)) {
   3962  1.3  explorer 		n = m->m_act;
   3963  1.3  explorer 		m_freem (m);
   3964  1.3  explorer 	}
   3965  1.3  explorer 	ifq->ifq_head = 0;
   3966  1.3  explorer 	ifq->ifq_tail = 0;
   3967  1.3  explorer 	ifq->ifq_len = 0;
   3968  1.3  explorer }
   3969  1.3  explorer 
   3970  1.3  explorer /*
   3971  1.3  explorer  * Send keepalive packets, every 10 seconds.
   3972  1.3  explorer  */
   3973  1.3  explorer static void
   3974  1.3  explorer sppp_keepalive(void *dummy)
   3975  1.3  explorer {
   3976  1.3  explorer 	struct sppp *sp;
   3977  1.3  explorer 	int s;
   3978  1.3  explorer 
   3979  1.3  explorer 	s = splimp();
   3980  1.3  explorer 	for (sp=spppq; sp; sp=sp->pp_next) {
   3981  1.3  explorer 		struct ifnet *ifp = &sp->pp_if;
   3982  1.3  explorer 
   3983  1.3  explorer 		/* Keepalive mode disabled or channel down? */
   3984  1.3  explorer 		if (! (sp->pp_flags & PP_KEEPALIVE) ||
   3985  1.3  explorer 		    ! (ifp->if_flags & IFF_RUNNING))
   3986  1.3  explorer 			continue;
   3987  1.3  explorer 
   3988  1.3  explorer 		/* No keepalive in PPP mode if LCP not opened yet. */
   3989  1.3  explorer 		if (! (sp->pp_flags & PP_CISCO) &&
   3990  1.3  explorer 		    sp->pp_phase < PHASE_AUTHENTICATE)
   3991  1.3  explorer 			continue;
   3992  1.3  explorer 
   3993  1.3  explorer 		if (sp->pp_alivecnt == MAXALIVECNT) {
   3994  1.3  explorer 			/* No keepalive packets got.  Stop the interface. */
   3995  1.3  explorer 			printf (SPP_FMT "down\n", SPP_ARGS(ifp));
   3996  1.3  explorer 			if_down (ifp);
   3997  1.3  explorer 			sppp_qflush (&sp->pp_cpq);
   3998  1.3  explorer 			if (! (sp->pp_flags & PP_CISCO)) {
   3999  1.3  explorer 				/* XXX */
   4000  1.3  explorer 				/* Shut down the PPP link. */
   4001  1.3  explorer 				lcp.Down(sp);
   4002  1.3  explorer 				/* Initiate negotiation. XXX */
   4003  1.3  explorer 				lcp.Up(sp);
   4004  1.3  explorer 			}
   4005  1.3  explorer 		}
   4006  1.3  explorer 		if (sp->pp_alivecnt <= MAXALIVECNT)
   4007  1.3  explorer 			++sp->pp_alivecnt;
   4008  1.3  explorer 		if (sp->pp_flags & PP_CISCO)
   4009  1.3  explorer 			sppp_cisco_send (sp, CISCO_KEEPALIVE_REQ, ++sp->pp_seq,
   4010  1.3  explorer 				sp->pp_rseq);
   4011  1.7   thorpej 		else if (sp->pp_phase >= PHASE_AUTHENTICATE) {
   4012  1.7   thorpej 			long nmagic = htonl (sp->lcp.magic);
   4013  1.7   thorpej 			sp->lcp.echoid = ++sp->pp_seq;
   4014  1.3  explorer 			sppp_cp_send (sp, PPP_LCP, ECHO_REQ,
   4015  1.3  explorer 				sp->lcp.echoid, 4, &nmagic);
   4016  1.3  explorer 		}
   4017  1.3  explorer 	}
   4018  1.7   thorpej 	splx(s);
   4019  1.3  explorer #if defined(__NetBSD__)
   4020  1.3  explorer 	callout_reset(&keepalive_ch, hz * 10, sppp_keepalive, NULL);
   4021  1.3  explorer #else
   4022  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   4023  1.3  explorer 	keepalive_ch =
   4024  1.3  explorer #endif
   4025  1.3  explorer 	timeout(sppp_keepalive, 0, hz * 10);
   4026  1.3  explorer #endif /* __NetBSD__ */
   4027  1.3  explorer }
   4028  1.3  explorer 
   4029  1.3  explorer /*
   4030  1.3  explorer  * Get both IP addresses.
   4031  1.3  explorer  */
   4032  1.3  explorer static void
   4033  1.3  explorer sppp_get_ip_addrs(struct sppp *sp, u_long *src, u_long *dst, u_long *srcmask)
   4034  1.3  explorer {
   4035  1.3  explorer 	struct ifnet *ifp = &sp->pp_if;
   4036  1.3  explorer 	struct ifaddr *ifa;
   4037  1.3  explorer 	struct sockaddr_in *si, *sm;
   4038  1.3  explorer 	u_long ssrc, ddst;
   4039  1.3  explorer 
   4040  1.3  explorer 	sm = NULL;
   4041  1.3  explorer 	ssrc = ddst = 0L;
   4042  1.3  explorer 	/*
   4043  1.3  explorer 	 * Pick the first AF_INET address from the list,
   4044  1.3  explorer 	 * aliases don't make any sense on a p2p link anyway.
   4045  1.3  explorer 	 */
   4046  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   4047  1.3  explorer 	for (ifa = ifp->if_addrhead.tqh_first, si = 0;
   4048  1.3  explorer 	     ifa;
   4049  1.3  explorer 	     ifa = ifa->ifa_link.tqe_next)
   4050  1.3  explorer #elif defined(__NetBSD__) || defined (__OpenBSD__)
   4051  1.3  explorer 	for (ifa = ifp->if_addrlist.tqh_first, si = 0;
   4052  1.3  explorer 	     ifa;
   4053  1.3  explorer 	     ifa = ifa->ifa_list.tqe_next)
   4054  1.3  explorer #else
   4055  1.3  explorer 	for (ifa = ifp->if_addrlist, si = 0;
   4056  1.3  explorer 	     ifa;
   4057  1.3  explorer 	     ifa = ifa->ifa_next)
   4058  1.3  explorer #endif
   4059  1.3  explorer 		if (ifa->ifa_addr->sa_family == AF_INET) {
   4060  1.3  explorer 			si = (struct sockaddr_in *)ifa->ifa_addr;
   4061  1.3  explorer 			sm = (struct sockaddr_in *)ifa->ifa_netmask;
   4062  1.3  explorer 			if (si)
   4063  1.3  explorer 				break;
   4064  1.3  explorer 		}
   4065  1.3  explorer 	if (ifa) {
   4066  1.3  explorer 		if (si && si->sin_addr.s_addr) {
   4067  1.3  explorer 			ssrc = si->sin_addr.s_addr;
   4068  1.3  explorer 			if (srcmask)
   4069  1.3  explorer 				*srcmask = ntohl(sm->sin_addr.s_addr);
   4070  1.3  explorer 		}
   4071  1.3  explorer 
   4072  1.3  explorer 		si = (struct sockaddr_in *)ifa->ifa_dstaddr;
   4073  1.3  explorer 		if (si && si->sin_addr.s_addr)
   4074  1.3  explorer 			ddst = si->sin_addr.s_addr;
   4075  1.3  explorer 	}
   4076  1.3  explorer 
   4077  1.3  explorer 	if (dst) *dst = ntohl(ddst);
   4078  1.3  explorer 	if (src) *src = ntohl(ssrc);
   4079  1.3  explorer }
   4080  1.3  explorer 
   4081  1.3  explorer /*
   4082  1.3  explorer  * Set my IP address.  Must be called at splimp.
   4083  1.3  explorer  */
   4084  1.3  explorer static void
   4085  1.3  explorer sppp_set_ip_addr(struct sppp *sp, u_long src)
   4086  1.3  explorer {
   4087  1.3  explorer 	STDDCL;
   4088  1.3  explorer 	struct ifaddr *ifa;
   4089  1.3  explorer 	struct sockaddr_in *si;
   4090  1.3  explorer 
   4091  1.3  explorer 	/*
   4092  1.3  explorer 	 * Pick the first AF_INET address from the list,
   4093  1.3  explorer 	 * aliases don't make any sense on a p2p link anyway.
   4094  1.3  explorer 	 */
   4095  1.3  explorer 
   4096  1.3  explorer #if defined(__FreeBSD__) && __FreeBSD__ >= 3
   4097  1.3  explorer 	for (ifa = ifp->if_addrhead.tqh_first, si = 0;
   4098  1.3  explorer 	     ifa;
   4099  1.3  explorer 	     ifa = ifa->ifa_link.tqe_next)
   4100  1.3  explorer #elif defined(__NetBSD__) || defined (__OpenBSD__)
   4101  1.3  explorer 	for (ifa = ifp->if_addrlist.tqh_first, si = 0;
   4102  1.3  explorer 	     ifa;
   4103  1.3  explorer 	     ifa = ifa->ifa_list.tqe_next)
   4104  1.3  explorer #else
   4105  1.3  explorer 	for (ifa = ifp->if_addrlist, si = 0;
   4106  1.3  explorer 	     ifa;
   4107  1.3  explorer 	     ifa = ifa->ifa_next)
   4108  1.3  explorer #endif
   4109  1.3  explorer 	{
   4110  1.3  explorer 		if (ifa->ifa_addr->sa_family == AF_INET)
   4111  1.3  explorer 		{
   4112  1.3  explorer 			si = (struct sockaddr_in *)ifa->ifa_addr;
   4113  1.3  explorer 			if (si)
   4114  1.3  explorer 				break;
   4115  1.3  explorer 		}
   4116  1.3  explorer 	}
   4117  1.3  explorer 
   4118  1.3  explorer 	if (ifa && si)
   4119  1.3  explorer 	{
   4120  1.3  explorer 		int error;
   4121  1.3  explorer #if __NetBSD_Version__ >= 103080000
   4122  1.3  explorer 		struct sockaddr_in new_sin = *si;
   4123  1.3  explorer 
   4124  1.3  explorer 		new_sin.sin_addr.s_addr = htonl(src);
   4125  1.3  explorer 		error = in_ifinit(ifp, ifatoia(ifa), &new_sin, 1);
   4126  1.3  explorer 		if(debug && error)
   4127  1.3  explorer 		{
   4128  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "sppp_set_ip_addr: in_ifinit "
   4129  1.3  explorer 			" failed, error=%d\n", SPP_ARGS(ifp), error);
   4130  1.3  explorer 		}
   4131  1.3  explorer #else
   4132  1.3  explorer 		/* delete old route */
   4133  1.3  explorer 		error = rtinit(ifa, (int)RTM_DELETE, RTF_HOST);
   4134  1.3  explorer 		if(debug && error)
   4135  1.3  explorer 		{
   4136  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "sppp_set_ip_addr: rtinit DEL failed, error=%d\n",
   4137  1.3  explorer 		    		SPP_ARGS(ifp), error);
   4138  1.3  explorer 		}
   4139  1.3  explorer 
   4140  1.3  explorer 		/* set new address */
   4141  1.3  explorer 		si->sin_addr.s_addr = htonl(src);
   4142  1.3  explorer 
   4143  1.3  explorer 		/* add new route */
   4144  1.3  explorer 		error = rtinit(ifa, (int)RTM_ADD, RTF_HOST);
   4145  1.3  explorer 		if (debug && error)
   4146  1.3  explorer 		{
   4147  1.3  explorer 			log(LOG_DEBUG, SPP_FMT "sppp_set_ip_addr: rtinit ADD failed, error=%d",
   4148  1.3  explorer 		    		SPP_ARGS(ifp), error);
   4149  1.3  explorer 		}
   4150  1.3  explorer #endif
   4151  1.3  explorer 	}
   4152  1.3  explorer }
   4153  1.3  explorer 
   4154  1.3  explorer static int
   4155  1.3  explorer sppp_params(struct sppp *sp, int cmd, void *data)
   4156  1.3  explorer {
   4157  1.3  explorer 	int subcmd;
   4158  1.3  explorer 	struct ifreq *ifr = (struct ifreq *)data;
   4159  1.3  explorer 	struct spppreq spr;
   4160  1.3  explorer 
   4161  1.3  explorer 	/*
   4162  1.3  explorer 	 * ifr->ifr_data is supposed to point to a struct spppreq.
   4163  1.3  explorer 	 * Check the cmd word first before attempting to fetch all the
   4164  1.3  explorer 	 * data.
   4165  1.3  explorer 	 */
   4166  1.3  explorer 	if ((subcmd = fuword(ifr->ifr_data)) == -1)
   4167  1.3  explorer 		return EFAULT;
   4168  1.3  explorer 
   4169  1.3  explorer 	if (copyin((caddr_t)ifr->ifr_data, &spr, sizeof spr) != 0)
   4170  1.3  explorer 		return EFAULT;
   4171  1.3  explorer 
   4172  1.3  explorer 	switch (subcmd) {
   4173  1.3  explorer 	case SPPPIOGDEFS:
   4174  1.3  explorer 		if (cmd != SIOCGIFGENERIC)
   4175  1.3  explorer 			return EINVAL;
   4176  1.3  explorer 		/*
   4177  1.3  explorer 		 * We copy over the entire current state, but clean
   4178  1.3  explorer 		 * out some of the stuff we don't wanna pass up.
   4179  1.3  explorer 		 * Remember, SIOCGIFGENERIC is unprotected, and can be
   4180  1.3  explorer 		 * called by any user.  No need to ever get PAP or
   4181  1.3  explorer 		 * CHAP secrets back to userland anyway.
   4182  1.3  explorer 		 */
   4183  1.3  explorer 		bcopy(sp, &spr.defs, sizeof(struct sppp));
   4184  1.3  explorer 		bzero(spr.defs.myauth.secret, AUTHKEYLEN);
   4185  1.3  explorer 		bzero(spr.defs.myauth.challenge, AUTHKEYLEN);
   4186  1.3  explorer 		bzero(spr.defs.hisauth.secret, AUTHKEYLEN);
   4187  1.3  explorer 		bzero(spr.defs.hisauth.challenge, AUTHKEYLEN);
   4188  1.3  explorer 		return copyout(&spr, (caddr_t)ifr->ifr_data, sizeof spr);
   4189  1.3  explorer 
   4190  1.3  explorer 	case SPPPIOSDEFS:
   4191  1.3  explorer 		if (cmd != SIOCSIFGENERIC)
   4192  1.3  explorer 			return EINVAL;
   4193  1.3  explorer 		/*
   4194  1.3  explorer 		 * We have a very specific idea of which fields we allow
   4195  1.3  explorer 		 * being passed back from userland, so to not clobber our
   4196  1.3  explorer 		 * current state.  For one, we only allow setting
   4197  1.3  explorer 		 * anything if LCP is in dead phase.  Once the LCP
   4198  1.3  explorer 		 * negotiations started, the authentication settings must
   4199  1.3  explorer 		 * not be changed again.  (The administrator can force an
   4200  1.3  explorer 		 * ifconfig down in order to get LCP back into dead
   4201  1.3  explorer 		 * phase.)
   4202  1.3  explorer 		 *
   4203  1.3  explorer 		 * Also, we only allow for authentication parameters to be
   4204  1.3  explorer 		 * specified.
   4205  1.3  explorer 		 *
   4206  1.3  explorer 		 * XXX Should allow to set or clear pp_flags.
   4207  1.3  explorer 		 *
   4208  1.3  explorer 		 * Finally, if the respective authentication protocol to
   4209  1.3  explorer 		 * be used is set differently than 0, but the secret is
   4210  1.3  explorer 		 * passed as all zeros, we don't trash the existing secret.
   4211  1.3  explorer 		 * This allows an administrator to change the system name
   4212  1.3  explorer 		 * only without clobbering the secret (which he didn't get
   4213  1.3  explorer 		 * back in a previous SPPPIOGDEFS call).  However, the
   4214  1.3  explorer 		 * secrets are cleared if the authentication protocol is
   4215  1.3  explorer 		 * reset to 0.
   4216  1.3  explorer 		 */
   4217  1.3  explorer 		if (sp->pp_phase != PHASE_DEAD)
   4218  1.3  explorer 			return EBUSY;
   4219  1.3  explorer 
   4220  1.3  explorer 		if ((spr.defs.myauth.proto != 0 && spr.defs.myauth.proto != PPP_PAP &&
   4221  1.3  explorer 		     spr.defs.myauth.proto != PPP_CHAP) ||
   4222  1.3  explorer 		    (spr.defs.hisauth.proto != 0 && spr.defs.hisauth.proto != PPP_PAP &&
   4223  1.3  explorer 		     spr.defs.hisauth.proto != PPP_CHAP))
   4224  1.3  explorer 			return EINVAL;
   4225  1.3  explorer 
   4226  1.3  explorer 		if (spr.defs.myauth.proto == 0)
   4227  1.3  explorer 			/* resetting myauth */
   4228  1.3  explorer 			bzero(&sp->myauth, sizeof sp->myauth);
   4229  1.3  explorer 		else {
   4230  1.3  explorer 			/* setting/changing myauth */
   4231  1.3  explorer 			sp->myauth.proto = spr.defs.myauth.proto;
   4232  1.3  explorer 			bcopy(spr.defs.myauth.name, sp->myauth.name, AUTHNAMELEN);
   4233  1.3  explorer 			if (spr.defs.myauth.secret[0] != '\0')
   4234  1.3  explorer 				bcopy(spr.defs.myauth.secret, sp->myauth.secret,
   4235  1.3  explorer 				      AUTHKEYLEN);
   4236  1.3  explorer 		}
   4237  1.3  explorer 		if (spr.defs.hisauth.proto == 0)
   4238  1.3  explorer 			/* resetting hisauth */
   4239  1.3  explorer 			bzero(&sp->hisauth, sizeof sp->hisauth);
   4240  1.3  explorer 		else {
   4241  1.3  explorer 			/* setting/changing hisauth */
   4242  1.3  explorer 			sp->hisauth.proto = spr.defs.hisauth.proto;
   4243  1.3  explorer 			sp->hisauth.flags = spr.defs.hisauth.flags;
   4244  1.3  explorer 			bcopy(spr.defs.hisauth.name, sp->hisauth.name, AUTHNAMELEN);
   4245  1.3  explorer 			if (spr.defs.hisauth.secret[0] != '\0')
   4246  1.3  explorer 				bcopy(spr.defs.hisauth.secret, sp->hisauth.secret,
   4247  1.3  explorer 				      AUTHKEYLEN);
   4248  1.3  explorer 		}
   4249  1.3  explorer 		break;
   4250  1.3  explorer 
   4251  1.3  explorer 	default:
   4252  1.3  explorer 		return EINVAL;
   4253  1.3  explorer 	}
   4254  1.3  explorer 
   4255  1.3  explorer 	return 0;
   4256  1.3  explorer }
   4257  1.3  explorer 
   4258  1.3  explorer static void
   4259  1.3  explorer sppp_phase_network(struct sppp *sp)
   4260  1.3  explorer {
   4261  1.3  explorer 	STDDCL;
   4262  1.3  explorer 	int i;
   4263  1.3  explorer 	u_long mask;
   4264  1.3  explorer 
   4265  1.3  explorer 	sp->pp_phase = PHASE_NETWORK;
   4266  1.3  explorer 
   4267  1.3  explorer 	if(debug)
   4268  1.3  explorer 	{
   4269  1.3  explorer 		log(LOG_INFO, SPP_FMT "phase %s\n", SPP_ARGS(ifp),
   4270  1.3  explorer 			sppp_phase_name(sp->pp_phase));
   4271  1.3  explorer 	}
   4272  1.3  explorer 
   4273  1.3  explorer 	/* Notify NCPs now. */
   4274  1.3  explorer 	for (i = 0; i < IDX_COUNT; i++)
   4275  1.3  explorer 		if ((cps[i])->flags & CP_NCP)
   4276  1.3  explorer 			(cps[i])->Open(sp);
   4277  1.3  explorer 
   4278  1.3  explorer 	/* Send Up events to all NCPs. */
   4279  1.3  explorer 	for (i = 0, mask = 1; i < IDX_COUNT; i++, mask <<= 1)
   4280  1.3  explorer 		if (sp->lcp.protos & mask && ((cps[i])->flags & CP_NCP))
   4281  1.3  explorer 			(cps[i])->Up(sp);
   4282  1.1  explorer 
   4283  1.3  explorer 	/* if no NCP is starting, all this was in vain, close down */
   4284  1.1  explorer 	sppp_lcp_check_and_close(sp);
   4285  1.3  explorer }
   4286  1.3  explorer 
   4287  1.3  explorer 
   4288  1.3  explorer static const char *
   4289  1.3  explorer sppp_cp_type_name(u_char type)
   4290  1.3  explorer {
   4291  1.3  explorer 	static char buf[12];
   4292  1.3  explorer 	switch (type) {
   4293  1.3  explorer 	case CONF_REQ:   return "conf-req";
   4294  1.3  explorer 	case CONF_ACK:   return "conf-ack";
   4295  1.3  explorer 	case CONF_NAK:   return "conf-nak";
   4296  1.3  explorer 	case CONF_REJ:   return "conf-rej";
   4297  1.3  explorer 	case TERM_REQ:   return "term-req";
   4298  1.3  explorer 	case TERM_ACK:   return "term-ack";
   4299  1.3  explorer 	case CODE_REJ:   return "code-rej";
   4300  1.3  explorer 	case PROTO_REJ:  return "proto-rej";
   4301  1.3  explorer 	case ECHO_REQ:   return "echo-req";
   4302  1.3  explorer 	case ECHO_REPLY: return "echo-reply";
   4303  1.3  explorer 	case DISC_REQ:   return "discard-req";
   4304  1.3  explorer 	}
   4305  1.3  explorer 	sprintf (buf, "0x%x", type);
   4306  1.3  explorer 	return buf;
   4307  1.3  explorer }
   4308  1.3  explorer 
   4309  1.3  explorer static const char *
   4310  1.3  explorer sppp_auth_type_name(u_short proto, u_char type)
   4311  1.3  explorer {
   4312  1.3  explorer 	static char buf[12];
   4313  1.3  explorer 	switch (proto) {
   4314  1.3  explorer 	case PPP_CHAP:
   4315  1.3  explorer 		switch (type) {
   4316  1.3  explorer 		case CHAP_CHALLENGE:	return "challenge";
   4317  1.3  explorer 		case CHAP_RESPONSE:	return "response";
   4318  1.3  explorer 		case CHAP_SUCCESS:	return "success";
   4319  1.3  explorer 		case CHAP_FAILURE:	return "failure";
   4320  1.3  explorer 		}
   4321  1.3  explorer 	case PPP_PAP:
   4322  1.3  explorer 		switch (type) {
   4323  1.3  explorer 		case PAP_REQ:		return "req";
   4324  1.3  explorer 		case PAP_ACK:		return "ack";
   4325  1.3  explorer 		case PAP_NAK:		return "nak";
   4326  1.3  explorer 		}
   4327  1.3  explorer 	}
   4328  1.3  explorer 	sprintf (buf, "0x%x", type);
   4329  1.3  explorer 	return buf;
   4330  1.3  explorer }
   4331  1.3  explorer 
   4332  1.3  explorer static const char *
   4333  1.3  explorer sppp_lcp_opt_name(u_char opt)
   4334  1.3  explorer {
   4335  1.3  explorer 	static char buf[12];
   4336  1.3  explorer 	switch (opt) {
   4337  1.3  explorer 	case LCP_OPT_MRU:		return "mru";
   4338  1.3  explorer 	case LCP_OPT_ASYNC_MAP:		return "async-map";
   4339  1.3  explorer 	case LCP_OPT_AUTH_PROTO:	return "auth-proto";
   4340  1.3  explorer 	case LCP_OPT_QUAL_PROTO:	return "qual-proto";
   4341  1.3  explorer 	case LCP_OPT_MAGIC:		return "magic";
   4342  1.3  explorer 	case LCP_OPT_PROTO_COMP:	return "proto-comp";
   4343  1.3  explorer 	case LCP_OPT_ADDR_COMP:		return "addr-comp";
   4344  1.3  explorer 	}
   4345  1.3  explorer 	sprintf (buf, "0x%x", opt);
   4346  1.3  explorer 	return buf;
   4347  1.3  explorer }
   4348  1.3  explorer 
   4349  1.3  explorer static const char *
   4350  1.3  explorer sppp_ipcp_opt_name(u_char opt)
   4351  1.3  explorer {
   4352  1.3  explorer 	static char buf[12];
   4353  1.3  explorer 	switch (opt) {
   4354  1.3  explorer 	case IPCP_OPT_ADDRESSES:	return "addresses";
   4355  1.3  explorer 	case IPCP_OPT_COMPRESSION:	return "compression";
   4356  1.3  explorer 	case IPCP_OPT_ADDRESS:		return "address";
   4357  1.3  explorer 	}
   4358  1.3  explorer 	sprintf (buf, "0x%x", opt);
   4359  1.3  explorer 	return buf;
   4360  1.3  explorer }
   4361  1.3  explorer 
   4362  1.3  explorer static const char *
   4363  1.3  explorer sppp_state_name(int state)
   4364  1.3  explorer {
   4365  1.3  explorer 	switch (state) {
   4366  1.3  explorer 	case STATE_INITIAL:	return "initial";
   4367  1.3  explorer 	case STATE_STARTING:	return "starting";
   4368  1.3  explorer 	case STATE_CLOSED:	return "closed";
   4369  1.3  explorer 	case STATE_STOPPED:	return "stopped";
   4370  1.3  explorer 	case STATE_CLOSING:	return "closing";
   4371  1.3  explorer 	case STATE_STOPPING:	return "stopping";
   4372  1.3  explorer 	case STATE_REQ_SENT:	return "req-sent";
   4373  1.3  explorer 	case STATE_ACK_RCVD:	return "ack-rcvd";
   4374  1.3  explorer 	case STATE_ACK_SENT:	return "ack-sent";
   4375  1.3  explorer 	case STATE_OPENED:	return "opened";
   4376  1.3  explorer 	}
   4377  1.3  explorer 	return "illegal";
   4378  1.3  explorer }
   4379  1.3  explorer 
   4380  1.3  explorer static const char *
   4381  1.3  explorer sppp_phase_name(enum ppp_phase phase)
   4382  1.3  explorer {
   4383  1.3  explorer 	switch (phase) {
   4384  1.3  explorer 	case PHASE_DEAD:	return "dead";
   4385  1.3  explorer 	case PHASE_ESTABLISH:	return "establish";
   4386  1.3  explorer 	case PHASE_TERMINATE:	return "terminate";
   4387  1.3  explorer 	case PHASE_AUTHENTICATE: return "authenticate";
   4388  1.3  explorer 	case PHASE_NETWORK:	return "network";
   4389  1.3  explorer 	}
   4390  1.3  explorer 	return "illegal";
   4391  1.3  explorer }
   4392  1.3  explorer 
   4393  1.3  explorer static const char *
   4394  1.1  explorer sppp_proto_name(u_short proto)
   4395  1.3  explorer {
   4396  1.3  explorer 	static char buf[12];
   4397  1.1  explorer 	switch (proto) {
   4398  1.1  explorer 	case PPP_LCP:	return "lcp";
   4399  1.1  explorer 	case PPP_IPCP:	return "ipcp";
   4400  1.3  explorer 	case PPP_PAP:	return "pap";
   4401  1.1  explorer 	case PPP_CHAP:	return "chap";
   4402  1.3  explorer 	}
   4403  1.1  explorer 	sprintf(buf, "0x%x", (unsigned)proto);
   4404  1.3  explorer 	return buf;
   4405  1.3  explorer }
   4406  1.3  explorer 
   4407  1.3  explorer static void
   4408  1.3  explorer sppp_print_bytes(const u_char *p, u_short len)
   4409  1.3  explorer {
   4410  1.3  explorer 	addlog(" %02x", *p++);
   4411  1.3  explorer 	while (--len > 0)
   4412  1.3  explorer 		addlog("-%02x", *p++);
   4413  1.3  explorer }
   4414  1.3  explorer 
   4415  1.3  explorer static void
   4416  1.3  explorer sppp_print_string(const char *p, u_short len)
   4417  1.3  explorer {
   4418  1.3  explorer 	u_char c;
   4419  1.3  explorer 
   4420  1.3  explorer 	while (len-- > 0) {
   4421  1.3  explorer 		c = *p++;
   4422  1.3  explorer 		/*
   4423  1.3  explorer 		 * Print only ASCII chars directly.  RFC 1994 recommends
   4424  1.3  explorer 		 * using only them, but we don't rely on it.  */
   4425  1.3  explorer 		if (c < ' ' || c > '~')
   4426  1.3  explorer 			addlog("\\x%x", c);
   4427  1.3  explorer 		else
   4428  1.3  explorer 			addlog("%c", c);
   4429  1.3  explorer 	}
   4430  1.3  explorer }
   4431  1.3  explorer 
   4432  1.3  explorer static const char *
   4433  1.3  explorer sppp_dotted_quad(u_long addr)
   4434  1.3  explorer {
   4435  1.3  explorer 	static char s[16];
   4436  1.3  explorer 	sprintf(s, "%d.%d.%d.%d",
   4437  1.3  explorer 		(int)((addr >> 24) & 0xff),
   4438  1.3  explorer 		(int)((addr >> 16) & 0xff),
   4439  1.3  explorer 		(int)((addr >> 8) & 0xff),
   4440  1.3  explorer 		(int)(addr & 0xff));
   4441  1.3  explorer 	return s;
   4442  1.3  explorer }
   4443  1.3  explorer 
   4444  1.3  explorer static int
   4445  1.3  explorer sppp_strnlen(u_char *p, int max)
   4446  1.3  explorer {
   4447  1.3  explorer 	int len;
   4448  1.3  explorer 
   4449  1.3  explorer 	for (len = 0; len < max && *p; ++p)
   4450  1.3  explorer 		++len;
   4451  1.1  explorer 	return len;
   4452  1.3  explorer }
   4453  1.3  explorer 
   4454  1.3  explorer /* a dummy, used to drop uninteresting events */
   4455  1.3  explorer static void
   4456  1.3  explorer sppp_null(struct sppp *unused)
   4457  1.3  explorer {
   4458  1.3  explorer 	/* do just nothing */
   4459                }
   4460                /*
   4461                 * This file is large.  Tell emacs to highlight it nevertheless.
   4462                 *
   4463                 * Local Variables:
   4464                 * hilit-auto-highlight-maxout: 120000
   4465                 * End:
   4466                 */
   4467