version 1.1.1.1, 2013/07/22 08:44:29
|
version 1.1.1.3.2.1, 2023/09/27 11:08:00
|
Line 26
|
Line 26
|
|
|
#define LCP_ECHO_INTERVAL 5 /* Enable keep alive by default */ |
#define LCP_ECHO_INTERVAL 5 /* Enable keep alive by default */ |
#define LCP_ECHO_TIMEOUT 40 |
#define LCP_ECHO_TIMEOUT 40 |
|
#define LCP_MAX_RESETS 3 |
|
|
#define LCP_KNOWN_CODES ( (1 << CODE_CONFIGREQ) \ |
#define LCP_KNOWN_CODES ( (1 << CODE_CONFIGREQ) \ |
| (1 << CODE_CONFIGACK) \ |
| (1 << CODE_CONFIGACK) \ |
Line 100
|
Line 101
|
{ "MULTILINKHEADERFMT", TY_MULTILINKHEADERFMT, 0, 0, FALSE }, |
{ "MULTILINKHEADERFMT", TY_MULTILINKHEADERFMT, 0, 0, FALSE }, |
{ "INTERNAT", TY_INTERNAT, 0, 0, FALSE }, |
{ "INTERNAT", TY_INTERNAT, 0, 0, FALSE }, |
{ "SDATALINKSONET", TY_SDATALINKSONET, 0, 0, FALSE }, |
{ "SDATALINKSONET", TY_SDATALINKSONET, 0, 0, FALSE }, |
{ NULL } | { NULL, 0, 0, 0, 0 } |
}; |
}; |
|
|
static struct fsmtype gLcpFsmType = { |
static struct fsmtype gLcpFsmType = { |
Line 126
|
Line 127
|
NULL, |
NULL, |
NULL, |
NULL, |
LcpRecvIdent, |
LcpRecvIdent, |
|
NULL, NULL, NULL |
}; |
}; |
|
|
/* List of possible Authentication Protocols */ |
/* List of possible Authentication Protocols */ |
Line 179 LcpInit(Link l)
|
Line 181 LcpInit(Link l)
|
FsmInit(&lcp->fsm, &gLcpFsmType, l); |
FsmInit(&lcp->fsm, &gLcpFsmType, l); |
lcp->fsm.conf.echo_int = LCP_ECHO_INTERVAL; |
lcp->fsm.conf.echo_int = LCP_ECHO_INTERVAL; |
lcp->fsm.conf.echo_max = LCP_ECHO_TIMEOUT; |
lcp->fsm.conf.echo_max = LCP_ECHO_TIMEOUT; |
|
lcp->resets = LCP_MAX_RESETS; |
lcp->phase = PHASE_DEAD; |
lcp->phase = PHASE_DEAD; |
|
|
AuthInit(l); |
AuthInit(l); |
Line 224 LcpConfigure(Fsm fp)
|
Line 227 LcpConfigure(Fsm fp)
|
lcp->fsm.conf.check_magic = |
lcp->fsm.conf.check_magic = |
Enabled(&l->conf.options, LINK_CONF_CHECK_MAGIC); |
Enabled(&l->conf.options, LINK_CONF_CHECK_MAGIC); |
lcp->peer_reject = 0; |
lcp->peer_reject = 0; |
|
lcp->need_reset = 0; |
|
|
/* Initialize normal LCP stuff */ |
/* Initialize normal LCP stuff */ |
lcp->peer_mru = l->conf.mtu; | lcp->peer_mru = PhysGetMtu(l, 1); |
lcp->want_mru = l->conf.mru; | lcp->want_mru = PhysGetMru(l, 1); |
if (l->type && (lcp->want_mru > l->type->mru)) | if (l->type && (lcp->want_mru > PhysGetMru(l, 0))) |
lcp->want_mru = l->type->mru; | lcp->want_mru = PhysGetMru(l, 0); |
lcp->peer_accmap = 0xffffffff; |
lcp->peer_accmap = 0xffffffff; |
lcp->want_accmap = l->conf.accmap; |
lcp->want_accmap = l->conf.accmap; |
lcp->peer_acfcomp = FALSE; |
lcp->peer_acfcomp = FALSE; |
Line 526 LcpAuthResult(Link l, int success)
|
Line 530 LcpAuthResult(Link l, int success)
|
*/ |
*/ |
|
|
int |
int |
LcpStat(Context ctx, int ac, char *av[], void *arg) | LcpStat(Context ctx, int ac, const char *const av[], const void *arg) |
{ |
{ |
Link const l = ctx->lnk; |
Link const l = ctx->lnk; |
LcpState const lcp = &l->lcp; |
LcpState const lcp = &l->lcp; |
char buf[64]; |
char buf[64]; |
|
|
|
(void)ac; |
|
(void)av; |
|
(void)arg; |
|
|
Printf("%s [%s]\r\n", lcp->fsm.type->name, FsmStateName(lcp->fsm.state)); |
Printf("%s [%s]\r\n", lcp->fsm.type->name, FsmStateName(lcp->fsm.state)); |
|
|
Printf("Self:\r\n"); |
Printf("Self:\r\n"); |
Line 681 static void
|
Line 689 static void
|
LcpLayerDown(Fsm fp) |
LcpLayerDown(Fsm fp) |
{ |
{ |
Link l = (Link)fp->arg; |
Link l = (Link)fp->arg; |
|
LcpState const lcp = &l->lcp; |
|
|
LcpStopActivity(l); |
LcpStopActivity(l); |
|
if (lcp->phase == PHASE_AUTHENTICATE || lcp->phase == PHASE_NETWORK) { |
|
lcp->need_reset = 1; |
|
if (lcp->resets > 0) { |
|
Log(LG_LCP2, ("[%s] LCP: Reset (%u left)", l->name, (int)lcp->resets)); |
|
lcp->resets--; |
|
} else { |
|
Log(LG_LCP2, ("[%s] LCP: Too many resets", l->name)); |
|
FsmFailure(&lcp->fsm, FAIL_NEGOT_FAILURE); |
|
lcp->resets = LCP_MAX_RESETS; |
|
} |
|
} |
} |
} |
|
|
void LcpOpen(Link l) |
void LcpOpen(Link l) |
Line 711 void LcpDown(Link l)
|
Line 732 void LcpDown(Link l)
|
static int |
static int |
LcpRecvProtoRej(Fsm fp, int proto, Mbuf bp) |
LcpRecvProtoRej(Fsm fp, int proto, Mbuf bp) |
{ |
{ |
Link l = (Link)fp->arg; | Link l = (Link)fp->arg; |
int fatal = FALSE; |
int fatal = FALSE; |
Fsm rej = NULL; |
Fsm rej = NULL; |
|
|
|
(void)bp; |
|
|
/* Which protocol? */ |
/* Which protocol? */ |
switch (proto) { |
switch (proto) { |
case PROTO_CCP: |
case PROTO_CCP: |
Line 749 static void
|
Line 772 static void
|
LcpRecvIdent(Fsm fp, Mbuf bp) |
LcpRecvIdent(Fsm fp, Mbuf bp) |
{ |
{ |
Link l = (Link)fp->arg; |
Link l = (Link)fp->arg; |
int len, clen; | unsigned len, clen; |
|
|
if (bp == NULL) |
if (bp == NULL) |
return; |
return; |
Line 793 LcpDecodeConfig(Fsm fp, FsmOption list, int num, int m
|
Line 816 LcpDecodeConfig(Fsm fp, FsmOption list, int num, int m
|
|
|
/* If we have got request, forget the previous values */ |
/* If we have got request, forget the previous values */ |
if (mode == MODE_REQ) { |
if (mode == MODE_REQ) { |
lcp->peer_mru = l->conf.mtu; | if (lcp->need_reset) /* perform complete reset when going back */ |
| LcpConfigure(fp); /* from PHASE_AUTHENTICATE or PHASE_NETWORK */ |
| else { |
| lcp->peer_mru = PhysGetMtu(l, 1); |
lcp->peer_accmap = 0xffffffff; |
lcp->peer_accmap = 0xffffffff; |
lcp->peer_acfcomp = FALSE; |
lcp->peer_acfcomp = FALSE; |
lcp->peer_protocomp = FALSE; |
lcp->peer_protocomp = FALSE; |
Line 802 LcpDecodeConfig(Fsm fp, FsmOption list, int num, int m
|
Line 828 LcpDecodeConfig(Fsm fp, FsmOption list, int num, int m
|
lcp->peer_alg = 0; |
lcp->peer_alg = 0; |
lcp->peer_mrru = 0; |
lcp->peer_mrru = 0; |
lcp->peer_shortseq = FALSE; |
lcp->peer_shortseq = FALSE; |
|
} |
} |
} |
|
|
/* Decode each config option */ |
/* Decode each config option */ |
Line 1127 LcpDecodeConfig(Fsm fp, FsmOption list, int num, int m
|
Line 1154 LcpDecodeConfig(Fsm fp, FsmOption list, int num, int m
|
|
|
memcpy(&magic, opt->data, 4); |
memcpy(&magic, opt->data, 4); |
magic = ntohl(magic); |
magic = ntohl(magic); |
Log(LG_LCP, ("[%s] %s %08x", l->name, oi->name, magic)); | Log(LG_LCP, ("[%s] %s 0x%08x", l->name, oi->name, magic)); |
switch (mode) { |
switch (mode) { |
case MODE_REQ: |
case MODE_REQ: |
if (lcp->want_magic) { |
if (lcp->want_magic) { |
Line 1245 LcpInput(Link l, Mbuf bp)
|
Line 1272 LcpInput(Link l, Mbuf bp)
|
static const struct fsmoption * |
static const struct fsmoption * |
LcpAuthProtoNak(ushort proto, u_char alg) |
LcpAuthProtoNak(ushort proto, u_char alg) |
{ |
{ |
static const u_char chapmd5cf[] = | static u_char chapmd5cf[] = |
{ PROTO_CHAP >> 8, PROTO_CHAP & 0xff, CHAP_ALG_MD5 }; |
{ PROTO_CHAP >> 8, PROTO_CHAP & 0xff, CHAP_ALG_MD5 }; |
static const struct fsmoption chapmd5Nak = |
static const struct fsmoption chapmd5Nak = |
{ TY_AUTHPROTO, 2 + sizeof(chapmd5cf), (u_char *) chapmd5cf }; |
{ TY_AUTHPROTO, 2 + sizeof(chapmd5cf), (u_char *) chapmd5cf }; |
|
|
static const u_char chapmsv1cf[] = | static u_char chapmsv1cf[] = |
{ PROTO_CHAP >> 8, PROTO_CHAP & 0xff, CHAP_ALG_MSOFT }; |
{ PROTO_CHAP >> 8, PROTO_CHAP & 0xff, CHAP_ALG_MSOFT }; |
static const struct fsmoption chapmsv1Nak = |
static const struct fsmoption chapmsv1Nak = |
{ TY_AUTHPROTO, 2 + sizeof(chapmsv1cf), (u_char *) chapmsv1cf }; |
{ TY_AUTHPROTO, 2 + sizeof(chapmsv1cf), (u_char *) chapmsv1cf }; |
|
|
static const u_char chapmsv2cf[] = | static u_char chapmsv2cf[] = |
{ PROTO_CHAP >> 8, PROTO_CHAP & 0xff, CHAP_ALG_MSOFTv2 }; |
{ PROTO_CHAP >> 8, PROTO_CHAP & 0xff, CHAP_ALG_MSOFTv2 }; |
static const struct fsmoption chapmsv2Nak = | static struct fsmoption chapmsv2Nak = |
{ TY_AUTHPROTO, 2 + sizeof(chapmsv2cf), (u_char *) chapmsv2cf }; |
{ TY_AUTHPROTO, 2 + sizeof(chapmsv2cf), (u_char *) chapmsv2cf }; |
|
|
static const u_char papcf[] = | static u_char papcf[] = |
{ PROTO_PAP >> 8, PROTO_PAP & 0xff }; |
{ PROTO_PAP >> 8, PROTO_PAP & 0xff }; |
static const struct fsmoption papNak = | static struct fsmoption papNak = |
{ TY_AUTHPROTO, 2 + sizeof(papcf), (u_char *) papcf }; |
{ TY_AUTHPROTO, 2 + sizeof(papcf), (u_char *) papcf }; |
|
|
static const u_char eapcf[] = | static u_char eapcf[] = |
{ PROTO_EAP >> 8, PROTO_EAP & 0xff }; |
{ PROTO_EAP >> 8, PROTO_EAP & 0xff }; |
static const struct fsmoption eapNak = | static struct fsmoption eapNak = |
{ TY_AUTHPROTO, 2 + sizeof(eapcf), (u_char *) eapcf }; |
{ TY_AUTHPROTO, 2 + sizeof(eapcf), (u_char *) eapcf }; |
|
|
if (proto == PROTO_PAP) { |
if (proto == PROTO_PAP) { |