Handle LCP echo reqs properly again (broken with the

layering changes).
This commit is contained in:
Brian Somers 1999-05-14 09:36:06 +00:00
parent 76d9853864
commit 6471628d59
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=47169
2 changed files with 24 additions and 25 deletions

View File

@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* $Id: fsm.c,v 1.42 1999/05/08 11:06:35 brian Exp $
* $Id: fsm.c,v 1.43 1999/05/09 20:02:18 brian Exp $
*
* TODO:
*/
@ -900,23 +900,9 @@ FsmRecvEchoReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp)
static void
FsmRecvEchoRep(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp)
{
struct lcp *lcp = fsm2lcp(fp);
u_int32_t magic;
if (lcp && mbuf_Length(bp) >= 4) {
mbuf_Read(bp, &magic, 4);
magic = ntohl(magic);
/* Tolerate echo replies with either magic number */
if (magic != 0 && magic != lcp->his_magic && magic != lcp->want_magic) {
log_Printf(LogWARN, "%s: RecvEchoRep: Bad magic: expected 0x%08x,"
" got 0x%08x\n", fp->link->name, lcp->his_magic, magic);
/*
* XXX: We should send terminate request. But poor implementations may
* die as a result.
*/
}
if (fsm2lcp(fp))
bp = lqr_RecvEcho(fp, bp);
}
mbuf_Free(bp);
}

View File

@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* $Id: lqr.c,v 1.33 1999/05/08 11:07:02 brian Exp $
* $Id: lqr.c,v 1.34 1999/05/09 20:02:23 brian Exp $
*
* o LQR based on RFC1333
*
@ -82,18 +82,31 @@ struct mbuf *
lqr_RecvEcho(struct fsm *fp, struct mbuf *bp)
{
struct hdlc *hdlc = &link2physical(fp->link)->hdlc;
struct lcp *lcp = fsm2lcp(fp);
struct echolqr lqr;
u_int32_t seq;
if (mbuf_Length(bp) == sizeof lqr) {
mbuf_Read(bp, &lqr, sizeof lqr);
if (ntohl(lqr.signature) == SIGNATURE) {
seq = ntohl(lqr.sequence);
bp = mbuf_Read(bp, &lqr, sizeof lqr);
lqr.magic = ntohl(lqr.magic);
lqr.signature = ntohl(lqr.signature);
lqr.sequence = ntohl(lqr.sequence);
/* Tolerate echo replies with either magic number */
if (lqr.magic != 0 && lqr.magic != lcp->his_magic &&
lqr.magic != lcp->want_magic) {
log_Printf(LogWARN, "%s: lqr_RecvEcho: Bad magic: expected 0x%08x,"
" got 0x%08x\n", fp->link->name, lcp->his_magic, lqr.magic);
/*
* XXX: We should send a terminate request. But poor implementations may
* die as a result.
*/
}
if (lqr.signature == SIGNATURE) {
/* careful not to update lqm.echo.seq_recv with older values */
if ((hdlc->lqm.echo.seq_recv > (u_int32_t)0 - 5 && seq < 5) ||
if ((hdlc->lqm.echo.seq_recv > (u_int32_t)0 - 5 && lqr.sequence < 5) ||
(hdlc->lqm.echo.seq_recv <= (u_int32_t)0 - 5 &&
seq > hdlc->lqm.echo.seq_recv))
hdlc->lqm.echo.seq_recv = seq;
lqr.sequence > hdlc->lqm.echo.seq_recv))
hdlc->lqm.echo.seq_recv = lqr.sequence;
} else
log_Printf(LogWARN, "lqr_RecvEcho: Got sig 0x%08lx, not 0x%08lx !\n",
(u_long)ntohl(lqr.signature), (u_long)SIGNATURE);