Support link identification from rfc1570

Two new commands are available; ``ident'' and ``sendident''.
This commit is contained in:
Brian Somers 2000-07-19 02:10:35 +00:00
parent 5523e1ab86
commit 1038894eb0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=63484
17 changed files with 176 additions and 22 deletions

View File

@ -39,10 +39,10 @@
#include "mbuf.h"
#include "acf.h"
#include "proto.h"
#include "lcp.h"
#include "throughput.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "ccp.h"
#include "link.h"
#include "descriptor.h"

View File

@ -41,9 +41,9 @@
#include "lqr.h"
#include "mbuf.h"
#include "fsm.h"
#include "lcp.h"
#include "throughput.h"
#include "hdlc.h"
#include "lcp.h"
#include "ccp.h"
#include "link.h"
#include "async.h"

View File

@ -41,8 +41,6 @@
#include "timer.h"
#include "fsm.h"
#include "proto.h"
#include "lcp.h"
#include "ccp.h"
#include "pred.h"
#include "deflate.h"
#include "throughput.h"
@ -50,6 +48,8 @@
#include "slcompress.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "ccp.h"
#include "ipcp.h"
#include "filter.h"
#include "descriptor.h"

View File

@ -49,9 +49,9 @@
#include "timer.h"
#include "fsm.h"
#include "proto.h"
#include "lcp.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "auth.h"
#include "async.h"
#include "throughput.h"

View File

@ -61,12 +61,12 @@
#include "log.h"
#include "timer.h"
#include "fsm.h"
#include "lcp.h"
#include "iplist.h"
#include "throughput.h"
#include "slcompress.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "ipcp.h"
#ifndef NONAT
#include "nat_cmd.h"
@ -241,6 +241,31 @@ HelpCommand(struct cmdargs const *arg)
return 0;
}
static int
IdentCommand(struct cmdargs const *arg)
{
int f, pos;
*arg->cx->physical->link.lcp.cfg.ident = '\0';
for (pos = 0, f = arg->argn; f < arg->argc; f++)
pos += snprintf(arg->cx->physical->link.lcp.cfg.ident + pos,
sizeof arg->cx->physical->link.lcp.cfg.ident - pos, "%s%s",
f == arg->argn ? "" : " ", arg->argv[f]);
return 0;
}
static int
SendIdentification(struct cmdargs const *arg)
{
if (arg->cx->state < DATALINK_LCP) {
log_Printf(LogWARN, "sendident: link has not reached LCP\n");
return 2;
}
return lcp_SendIdentification(&arg->cx->physical->link.lcp) ? 0 : 1;
}
static int
CloneCommand(struct cmdargs const *arg)
{
@ -441,6 +466,8 @@ command_Expand(char **nargv, int argc, char const *const *oargv,
inet_ntoa(bundle->ncp.ipcp.ns.dns[0]));
nargv[arg] = subst(nargv[arg], "DNS1",
inet_ntoa(bundle->ncp.ipcp.ns.dns[1]));
nargv[arg] = subst(nargv[arg], "VERSION", Version);
nargv[arg] = subst(nargv[arg], "COMPILATIONDATE", __DATE__);
}
nargv[arg] = NULL;
}
@ -681,6 +708,8 @@ static struct cmdtab const Commands[] = {
"Generate a down event", "down [ccp|lcp]"},
{"enable", NULL, NegotiateCommand, LOCAL_AUTH | LOCAL_CX_OPT,
"Enable option", "enable option .."},
{"ident", NULL, IdentCommand, LOCAL_AUTH | LOCAL_CX,
"Set the link identity", "ident text..."},
{"iface", "interface", RunListCommand, LOCAL_AUTH,
"interface control", "iface option ...", IfaceCommands},
{"link", "datalink", LinkCommand, LOCAL_AUTH,
@ -705,6 +734,8 @@ static struct cmdtab const Commands[] = {
"Manipulate resolv.conf", "resolv readonly|reload|restore|rewrite|writable"},
{"save", NULL, SaveCommand, LOCAL_AUTH,
"Save settings", "save"},
{"sendident", NULL, SendIdentification, LOCAL_AUTH | LOCAL_CX,
"Transmit the link identity", "sendident"},
{"set", "setup", SetCommand, LOCAL_AUTH | LOCAL_CX_OPT,
"Set parameters", "set[up] var value"},
{"shell", "!", FgShellCommand, LOCAL_AUTH,

View File

@ -45,10 +45,10 @@
#include "defs.h"
#include "timer.h"
#include "fsm.h"
#include "lcp.h"
#include "descriptor.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "async.h"
#include "throughput.h"
#include "ccp.h"

View File

@ -38,6 +38,8 @@
#include "log.h"
#include "timer.h"
#include "fsm.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "ccp.h"
#include "deflate.h"

View File

@ -86,7 +86,7 @@ static const struct fsmcodedesc {
{ FsmRecvEchoReq, 0, 0, "EchoRequest" },
{ FsmRecvEchoRep, 0, 0, "EchoReply" },
{ FsmRecvDiscReq, 0, 0, "DiscardReq" },
{ FsmRecvIdent, 0, 0, "Ident" },
{ FsmRecvIdent, 0, 1, "Ident" },
{ FsmRecvTimeRemain,0, 0, "TimeRemain" },
{ FsmRecvResetReq, 0, 0, "ResetReq" },
{ FsmRecvResetAck, 0, 1, "ResetAck" }
@ -208,6 +208,9 @@ fsm_Output(struct fsm *fp, u_int code, u_int id, u_char *ptr, int count,
log_DumpBp(LogDEBUG, "fsm_Output", bp);
link_PushPacket(fp->link, bp, fp->bundle, LINK_QUEUES(fp->link) - 1,
fp->proto);
if (code == CODE_CONFIGREJ)
lcp_SendIdentification(&fp->link->lcp);
}
static void
@ -374,6 +377,7 @@ FsmSendConfigReq(struct fsm *fp)
if (fp->more.reqs < 0)
log_Printf(LogPHASE, "%s: Too many %s REQs sent - abandoning "
"negotiation\n", fp->link->name, fp->name);
lcp_SendIdentification(&fp->link->lcp);
fsm_Close(fp);
}
}
@ -562,6 +566,7 @@ FsmRecvConfigReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp)
FsmInitRestartCounter(fp, FSM_TRM_TIMER);
FsmSendTerminateReq(fp);
NewState(fp, ST_CLOSING);
lcp_SendIdentification(&fp->link->lcp);
}
}
break;
@ -575,12 +580,14 @@ FsmRecvConfigReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp)
if (dec.rejend != dec.rej && --fp->more.rejs <= 0) {
log_Printf(LogPHASE, "%s: Too many %s REJs sent - abandoning negotiation\n",
fp->link->name, fp->name);
lcp_SendIdentification(&fp->link->lcp);
fsm_Close(fp);
}
if (dec.nakend != dec.nak && --fp->more.naks <= 0) {
log_Printf(LogPHASE, "%s: Too many %s NAKs sent - abandoning negotiation\n",
fp->link->name, fp->name);
lcp_SendIdentification(&fp->link->lcp);
fsm_Close(fp);
}
}
@ -615,6 +622,7 @@ FsmRecvConfigAck(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp)
FsmInitRestartCounter(fp, FSM_TRM_TIMER);
FsmSendTerminateReq(fp);
NewState(fp, ST_CLOSING);
lcp_SendIdentification(&fp->link->lcp);
}
break;
case ST_OPENED:
@ -769,6 +777,8 @@ FsmRecvConfigRej(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp)
return;
}
lcp_SendIdentification(&fp->link->lcp);
/*
* Check and process easy case
*/
@ -932,6 +942,22 @@ FsmRecvDiscReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp)
static void
FsmRecvIdent(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp)
{
u_int32_t magic;
u_short len;
u_char *cp;
len = ntohs(lhp->length) - sizeof *lhp;
if (len >= 4) {
bp = m_pullup(m_append(bp, "", 1));
cp = MBUF_CTOP(bp);
ua_ntohl(cp, &magic);
if (magic != fp->link->lcp.his_magic)
log_Printf(fp->LogLevel, "%s: RecvIdent: magic 0x%08lx is wrong,"
" expecting 0x%08lx\n", fp->link->name, (u_long)magic,
(u_long)fp->link->lcp.his_magic);
cp[len] = '\0';
lcp_RecvIdentification(&fp->link->lcp, cp + 4);
}
m_freem(bp);
}
@ -976,13 +1002,11 @@ fsm_Input(struct fsm *fp, struct mbuf *bp)
}
bp = mbuf_Read(bp, &lh, sizeof lh);
if (ntohs(lh.length) != len) {
if (ntohs(lh.length) > len) {
log_Printf(LogWARN, "%s: Oops: Got %d bytes but %d byte payload "
"- dropped\n", fp->link->name, len, (int)ntohs(lh.length));
m_freem(bp);
return;
}
if (ntohs(lh.length) > len) {
log_Printf(LogWARN, "%s: Oops: Got %d bytes but %d byte payload "
"- dropped\n", fp->link->name, len, (int)ntohs(lh.length));
m_freem(bp);
return;
}
if (lh.code < fp->min_code || lh.code > fp->max_code ||

View File

@ -59,12 +59,12 @@
#include "timer.h"
#include "fsm.h"
#include "proto.h"
#include "lcp.h"
#include "iplist.h"
#include "throughput.h"
#include "slcompress.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "ipcp.h"
#include "filter.h"
#include "descriptor.h"

View File

@ -43,12 +43,12 @@
#include "timer.h"
#include "fsm.h"
#include "iplist.h"
#include "lcp.h"
#include "throughput.h"
#include "proto.h"
#include "descriptor.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "ccp.h"
#include "async.h"
#include "link.h"
@ -182,6 +182,7 @@ lcp_ReportStatus(struct cmdargs const *arg)
" REQ%s, %u Term REQ%s\n", lcp->cfg.fsm.timeout,
lcp->cfg.fsm.maxreq, lcp->cfg.fsm.maxreq == 1 ? "" : "s",
lcp->cfg.fsm.maxtrm, lcp->cfg.fsm.maxtrm == 1 ? "" : "s");
prompt_Printf(arg->prompt, " Ident: %s\n", lcp->cfg.ident);
prompt_Printf(arg->prompt, "\n Negotiation:\n");
prompt_Printf(arg->prompt, " ACFCOMP = %s\n",
command_ShowNegval(lcp->cfg.acfcomp));
@ -247,6 +248,7 @@ lcp_Init(struct lcp *lcp, struct bundle *bundle, struct link *l,
lcp->cfg.lqr = NEG_ACCEPTED;
lcp->cfg.pap = NEG_ACCEPTED;
lcp->cfg.protocomp = NEG_ENABLED|NEG_ACCEPTED;
*lcp->cfg.ident = '\0';
lcp_Setup(lcp, lcp->cfg.openmode);
}
@ -451,6 +453,40 @@ lcp_SendProtoRej(struct lcp *lcp, u_char *option, int count)
MB_LCPOUT);
}
int
lcp_SendIdentification(struct lcp *lcp)
{
static u_char id; /* Use a private id */
u_char msg[DEF_MRU - 3];
const char *argv[2];
char *exp[2];
if (*lcp->cfg.ident == '\0')
return 0;
argv[0] = lcp->cfg.ident;
argv[1] = NULL;
command_Expand(exp, 1, argv, lcp->fsm.bundle, 1, getpid());
ua_htonl(&lcp->want_magic, msg);
strncpy(msg + 4, exp[0], sizeof msg - 5);
msg[sizeof msg - 1] = '\0';
log_Printf(LogLCP, "Sending ident magic %08x text %s\n", lcp->want_magic,
msg + 4);
fsm_Output(&lcp->fsm, CODE_IDENT, id++, msg, 4 + strlen(msg + 4), MB_LCPOUT);
free(exp[0]);
return 1;
}
void
lcp_RecvIdentification(struct lcp *lcp, char *data)
{
log_Printf(LogLCP, "Received ident: %s\n", data);
}
static void
LcpSentTerminateReq(struct fsm *fp)
{
@ -500,6 +536,8 @@ LcpLayerUp(struct fsm *fp)
hdlc_StartTimer(&p->hdlc);
fp->more.reqs = fp->more.naks = fp->more.rejs = lcp->cfg.fsm.maxreq * 3;
lcp_SendIdentification(lcp);
return 1;
}

View File

@ -87,10 +87,11 @@ struct lcp {
unsigned lqr : 2; /* Link Quality Report */
unsigned pap : 2; /* Password Authentication protocol */
unsigned protocomp : 2; /* Protocol field compression */
char ident[DEF_MRU - 7]; /* SendIdentification() data */
} cfg;
};
#define LCP_MAXCODE CODE_DISCREQ
#define LCP_MAXCODE CODE_IDENT
#define LCP_MINMPCODE CODE_CODEREJ
#define TY_MRU 1 /* Maximum-Receive-Unit */
@ -135,6 +136,8 @@ extern void lcp_Init(struct lcp *, struct bundle *, struct link *,
extern void lcp_Setup(struct lcp *, int);
extern void lcp_SendProtoRej(struct lcp *, u_char *, int);
extern int lcp_SendIdentification(struct lcp *);
extern void lcp_RecvIdentification(struct lcp *, char *);
extern int lcp_ReportStatus(struct cmdargs const *);
extern struct mbuf *lcp_Input(struct bundle *, struct link *, struct mbuf *);
extern void lcp_SetupCallbacks(struct lcp *);

View File

@ -40,9 +40,9 @@
#include "fsm.h"
#include "acf.h"
#include "proto.h"
#include "lcp.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "async.h"
#include "throughput.h"
#include "ccp.h"

View File

@ -38,11 +38,11 @@
#include "defs.h"
#include "timer.h"
#include "fsm.h"
#include "lcp.h"
#include "auth.h"
#include "pap.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "proto.h"
#include "async.h"
#include "throughput.h"

View File

@ -3404,6 +3404,16 @@ Show a list of available commands.
If
.Ar command
is specified, show the usage string for that command.
.It ident Op Ar text Ns No ...
Identify the link to the peer using
.Ar text .
If
.Ar text
is empty, link identification is disabled. Refer to the
.Ic sendident
command for details of when
.Nm
identifies itself to the peer.
.It iface Ar command Op args
This command is used to control the interface used by
.Nm ppp .
@ -3697,6 +3707,24 @@ command.
.El
.It save
This option is not (yet) implemented.
.It sendident
This command tells
.Nm
to identify itself to the peer. The link must be in LCP state or higher.
If no identity has been set (via the
.Ic ident
command),
.Ic sendident
will fail.
.Pp
When an identity has been set,
.Nm
will automatically identify itself when it sends or receives a configure
reject, when negotiation fails or when LCP reaches the opened state.
.Pp
Received identification packets are logged to the LCP log (see
.Ic set log
for details) and are never responded to.
.It set Ns Xo
.No Op up
.Ar var value

View File

@ -3404,6 +3404,16 @@ Show a list of available commands.
If
.Ar command
is specified, show the usage string for that command.
.It ident Op Ar text Ns No ...
Identify the link to the peer using
.Ar text .
If
.Ar text
is empty, link identification is disabled. Refer to the
.Ic sendident
command for details of when
.Nm
identifies itself to the peer.
.It iface Ar command Op args
This command is used to control the interface used by
.Nm ppp .
@ -3697,6 +3707,24 @@ command.
.El
.It save
This option is not (yet) implemented.
.It sendident
This command tells
.Nm
to identify itself to the peer. The link must be in LCP state or higher.
If no identity has been set (via the
.Ic ident
command),
.Ic sendident
will fail.
.Pp
When an identity has been set,
.Nm
will automatically identify itself when it sends or receives a configure
reject, when negotiation fails or when LCP reaches the opened state.
.Pp
Received identification packets are logged to the LCP log (see
.Ic set log
for details) and are never responded to.
.It set Ns Xo
.No Op up
.Ar var value

View File

@ -49,7 +49,6 @@
#include "descriptor.h"
#include "prompt.h"
#include "fsm.h"
#include "lcp.h"
#include "auth.h"
#include "iplist.h"
#include "throughput.h"
@ -57,6 +56,7 @@
#include "mbuf.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "ipcp.h"
#include "filter.h"
#include "async.h"

View File

@ -39,10 +39,10 @@
#include "fsm.h"
#include "mbuf.h"
#include "proto.h"
#include "lcp.h"
#include "throughput.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
#include "ccp.h"
#include "link.h"