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