2001-06-13 21:52:19 +00:00
|
|
|
/*-
|
|
|
|
* Copyright (c) 1996 - 2001 Brian Somers <brian@Awfulhak.org>
|
|
|
|
* based on work by Toshiharu OHNO <tony-o@iij.ad.jp>
|
|
|
|
* Internet Initiative Japan, Inc (IIJ)
|
|
|
|
* All rights reserved.
|
1995-01-31 06:29:58 +00:00
|
|
|
*
|
2001-06-13 21:52:19 +00:00
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
1995-01-31 06:29:58 +00:00
|
|
|
*
|
2001-06-13 21:52:19 +00:00
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
1995-01-31 06:29:58 +00:00
|
|
|
*
|
1999-08-28 01:35:59 +00:00
|
|
|
* $FreeBSD$
|
1995-01-31 06:29:58 +00:00
|
|
|
*/
|
|
|
|
|
1998-08-07 18:42:51 +00:00
|
|
|
/* callback::opmask values */
|
|
|
|
#define CALLBACK_AUTH (0)
|
|
|
|
#define CALLBACK_DIALSTRING (1) /* Don't do this */
|
|
|
|
#define CALLBACK_LOCATION (2) /* Don't do this */
|
|
|
|
#define CALLBACK_E164 (3)
|
|
|
|
#define CALLBACK_NAME (4) /* Don't do this */
|
|
|
|
#define CALLBACK_CBCP (6)
|
|
|
|
#define CALLBACK_NONE (14) /* No callback is ok */
|
|
|
|
|
|
|
|
#define CALLBACK_BIT(n) ((n) < 0 ? 0 : 1 << (n))
|
|
|
|
|
|
|
|
struct callback {
|
|
|
|
int opmask; /* want these types of callback */
|
|
|
|
char msg[SCRIPT_LEN]; /* with this data (E.164) */
|
|
|
|
};
|
|
|
|
|
1997-12-04 18:49:28 +00:00
|
|
|
#define REJECTED(p, x) ((p)->his_reject & (1<<(x)))
|
1997-12-03 10:23:54 +00:00
|
|
|
|
1998-02-08 11:05:01 +00:00
|
|
|
struct lcp {
|
1998-01-31 02:48:30 +00:00
|
|
|
struct fsm fsm; /* The finite state machine */
|
1998-01-30 01:33:46 +00:00
|
|
|
u_int16_t his_mru; /* Peers maximum packet size */
|
1998-04-23 03:23:03 +00:00
|
|
|
u_int16_t his_mrru; /* Peers maximum reassembled packet size (MP) */
|
1998-01-30 01:33:46 +00:00
|
|
|
u_int32_t his_accmap; /* Peeers async char control map */
|
|
|
|
u_int32_t his_magic; /* Peers magic number */
|
1998-06-27 23:48:54 +00:00
|
|
|
u_int32_t his_lqrperiod; /* Peers LQR frequency (100ths of seconds) */
|
1998-04-23 03:23:03 +00:00
|
|
|
u_short his_auth; /* Peer wants this type of authentication */
|
1999-02-18 00:52:15 +00:00
|
|
|
u_char his_authtype; /* Fifth octet of REQ/NAK/REJ */
|
1998-08-07 18:42:51 +00:00
|
|
|
struct callback his_callback; /* Peer wants callback ? */
|
1998-04-23 03:23:03 +00:00
|
|
|
unsigned his_shortseq : 1; /* Peer would like only 12bit seqs (MP) */
|
1998-04-05 19:02:49 +00:00
|
|
|
unsigned his_protocomp : 1; /* Does peer do Protocol field compression */
|
|
|
|
unsigned his_acfcomp : 1; /* Does peer do addr & cntrl fld compression */
|
1998-01-30 01:33:46 +00:00
|
|
|
|
|
|
|
u_short want_mru; /* Our maximum packet size */
|
1998-04-23 03:23:03 +00:00
|
|
|
u_short want_mrru; /* Our maximum reassembled packet size (MP) */
|
1998-01-30 01:33:46 +00:00
|
|
|
u_int32_t want_accmap; /* Our async char control map */
|
|
|
|
u_int32_t want_magic; /* Our magic number */
|
1998-06-27 23:48:54 +00:00
|
|
|
u_int32_t want_lqrperiod; /* Our LQR frequency (100ths of seconds) */
|
1998-04-23 03:23:03 +00:00
|
|
|
u_short want_auth; /* We want this type of authentication */
|
1999-02-18 00:52:15 +00:00
|
|
|
u_char want_authtype; /* Fifth octet of REQ/NAK/REJ */
|
1998-08-07 18:42:51 +00:00
|
|
|
struct callback want_callback;/* We want callback ? */
|
1998-04-23 03:23:03 +00:00
|
|
|
unsigned want_shortseq : 1; /* I'd like only 12bit seqs (MP) */
|
1998-04-03 19:24:07 +00:00
|
|
|
unsigned want_protocomp : 1; /* Do we do protocol field compression */
|
|
|
|
unsigned want_acfcomp : 1; /* Do we do addr & cntrl fld compression */
|
1995-01-31 06:29:58 +00:00
|
|
|
|
1998-01-11 17:50:49 +00:00
|
|
|
u_int32_t his_reject; /* Request codes rejected by peer */
|
|
|
|
u_int32_t my_reject; /* Request codes I have rejected */
|
1995-01-31 06:29:58 +00:00
|
|
|
|
1998-01-30 01:33:46 +00:00
|
|
|
u_short auth_iwait; /* I must authenticate to the peer */
|
|
|
|
u_short auth_ineed; /* I require that the peer authenticates */
|
|
|
|
|
|
|
|
int LcpFailedMagic; /* Number of `magic is same' errors */
|
1998-04-03 19:24:07 +00:00
|
|
|
|
|
|
|
struct {
|
|
|
|
u_short mru; /* Preferred MRU value */
|
|
|
|
u_int32_t accmap; /* Initial ACCMAP value */
|
|
|
|
int openmode; /* when to start CFG REQs */
|
1998-06-27 23:48:54 +00:00
|
|
|
u_int32_t lqrperiod; /* LQR frequency (seconds) */
|
Allow control over the number of ConfigREQ & TermREQ attempts
that are made in each of the FSMs (LCP, CCP & IPCP) and the
number of REQs/Challenges for PAP/CHAP by accepting more arguments
in the ``set {c,ip,l}cpretry'' and ``set {ch,p}apretry'' commands.
Change the non-convergence thresholds to 3 times the number of configured
REQ tries (rather than the previous fixed ``10''). We now notice
repeated NAKs and REJs rather than just REQs.
Don't suggest that CHAP 0x05 isn't supported when it's not configured.
Fix some bugs that expose themselves with smaller numbers of retries:
o Handle instantaneous disconnects (set device /dev/null) correctly
by stopping all fsm timers in fsm2initial.
o Don't forget to uu_unlock() devices that are files but are not
ttys (set device /dev/zero).
Fix a *HORRENDOUS* bug in RFC1661 (already fixed for an Open event in state
``Closed''):
According to the state transition table, a RCR+ or RCR- received in
the ``Stopped'' state are supposed to InitRestartCounter, SendConfigReq
and SendConfig{Ack,Nak}. However, in ``Stopped'', we haven't yet
done a TLS (or the last thing we did is a TLF). We must therefore
do the TLS at this point !
This was never noticed before because LCP and CCP used not use
LayerStart() for anything interesting, and IPCP tends to go into
Stopped then get a Down because of an LCP RTR rather than getting a
RCR again.
1999-02-26 21:28:14 +00:00
|
|
|
struct fsm_retry fsm; /* How often/frequently to resend requests */
|
1998-04-16 00:26:21 +00:00
|
|
|
unsigned acfcomp : 2; /* Address & Control Field Compression neg */
|
1999-02-18 00:52:15 +00:00
|
|
|
unsigned chap05 : 2; /* Challenge Handshake Authentication proto */
|
|
|
|
#ifdef HAVE_DES
|
|
|
|
unsigned chap80nt : 2; /* Microsoft (NT) CHAP */
|
|
|
|
unsigned chap80lm : 2; /* Microsoft (LANMan) CHAP */
|
2000-10-30 00:15:04 +00:00
|
|
|
unsigned chap81 : 2; /* Microsoft CHAP v2 */
|
1999-02-18 00:52:15 +00:00
|
|
|
#endif
|
1998-04-16 00:26:21 +00:00
|
|
|
unsigned lqr : 2; /* Link Quality Report */
|
|
|
|
unsigned pap : 2; /* Password Authentication protocol */
|
|
|
|
unsigned protocomp : 2; /* Protocol field compression */
|
2000-07-19 02:10:35 +00:00
|
|
|
char ident[DEF_MRU - 7]; /* SendIdentification() data */
|
1998-04-03 19:24:07 +00:00
|
|
|
} cfg;
|
1995-01-31 06:29:58 +00:00
|
|
|
};
|
|
|
|
|
2000-07-19 02:10:35 +00:00
|
|
|
#define LCP_MAXCODE CODE_IDENT
|
1998-04-03 19:21:56 +00:00
|
|
|
#define LCP_MINMPCODE CODE_CODEREJ
|
1995-01-31 06:29:58 +00:00
|
|
|
|
|
|
|
#define TY_MRU 1 /* Maximum-Receive-Unit */
|
|
|
|
#define TY_ACCMAP 2 /* Async-Control-Character-Map */
|
|
|
|
#define TY_AUTHPROTO 3 /* Authentication-Protocol */
|
|
|
|
#define TY_QUALPROTO 4 /* Quality-Protocol */
|
|
|
|
#define TY_MAGICNUM 5 /* Magic-Number */
|
|
|
|
#define TY_RESERVED 6 /* RESERVED */
|
|
|
|
#define TY_PROTOCOMP 7 /* Protocol-Field-Compression */
|
|
|
|
#define TY_ACFCOMP 8 /* Address-and-Control-Field-Compression */
|
|
|
|
#define TY_FCSALT 9 /* FCS-Alternatives */
|
1997-11-14 15:39:15 +00:00
|
|
|
#define TY_SDP 10 /* Self-Describing-Padding */
|
1998-08-07 18:42:51 +00:00
|
|
|
#define TY_CALLBACK 13 /* Callback */
|
|
|
|
#define TY_CFRAMES 15 /* Compound-frames */
|
1998-04-23 03:23:03 +00:00
|
|
|
#define TY_MRRU 17 /* Max Reconstructed Receive Unit (MP) */
|
|
|
|
#define TY_SHORTSEQ 18 /* Want short seqs (12bit) please (see mp.h) */
|
|
|
|
#define TY_ENDDISC 19 /* Endpoint discriminator */
|
1995-01-31 06:29:58 +00:00
|
|
|
|
1998-08-07 18:42:51 +00:00
|
|
|
#define MAX_LCP_OPT_LEN 20
|
1997-12-03 10:23:54 +00:00
|
|
|
struct lcp_opt {
|
|
|
|
u_char id;
|
|
|
|
u_char len;
|
|
|
|
u_char data[MAX_LCP_OPT_LEN-2];
|
1995-01-31 06:29:58 +00:00
|
|
|
};
|
|
|
|
|
1998-03-20 19:47:10 +00:00
|
|
|
#define INC_LCP_OPT(ty, length, o) \
|
|
|
|
do { \
|
|
|
|
(o)->id = (ty); \
|
|
|
|
(o)->len = (length); \
|
|
|
|
(o) = (struct lcp_opt *)((char *)(o) + (length)); \
|
|
|
|
} while (0)
|
|
|
|
|
1998-04-07 00:54:26 +00:00
|
|
|
struct mbuf;
|
|
|
|
struct link;
|
|
|
|
struct bundle;
|
|
|
|
struct cmdargs;
|
1998-01-29 00:44:16 +00:00
|
|
|
|
1998-02-08 11:05:01 +00:00
|
|
|
#define fsm2lcp(fp) (fp->proto == PROTO_LCP ? (struct lcp *)fp : NULL)
|
1997-12-03 10:23:54 +00:00
|
|
|
|
1998-04-03 19:21:56 +00:00
|
|
|
extern void lcp_Init(struct lcp *, struct bundle *, struct link *,
|
1998-02-27 01:22:39 +00:00
|
|
|
const struct fsm_parent *);
|
1998-02-21 01:45:26 +00:00
|
|
|
extern void lcp_Setup(struct lcp *, int);
|
1995-01-31 06:29:58 +00:00
|
|
|
|
1998-03-13 21:07:14 +00:00
|
|
|
extern void lcp_SendProtoRej(struct lcp *, u_char *, int);
|
2000-07-19 02:10:35 +00:00
|
|
|
extern int lcp_SendIdentification(struct lcp *);
|
|
|
|
extern void lcp_RecvIdentification(struct lcp *, char *);
|
1998-03-13 21:07:14 +00:00
|
|
|
extern int lcp_ReportStatus(struct cmdargs const *);
|
1999-05-08 11:07:56 +00:00
|
|
|
extern struct mbuf *lcp_Input(struct bundle *, struct link *, struct mbuf *);
|
1998-04-30 23:53:56 +00:00
|
|
|
extern void lcp_SetupCallbacks(struct lcp *);
|