ccp
cipher_init(struct sshcipher_ctx **ccp, const struct sshcipher *cipher,
*ccp = NULL;
*ccp = cc;
cipher_free(*ccp);
*ccp = NULL;
if ((r = cipher_init(ccp, enc->cipher, enc->key, enc->key_len,
(wmsg = cipher_warning_message(*ccp)) != NULL) {
struct sshcipher_ctx **ccp;
ccp = &state->send_context;
ccp = &state->receive_context;
char *filename, *mode = NULL, *option, *ccp;
for (i = 2, ccp = cp; i > 0; ccp++) {
if (ccp >= buf + size) {
} else if (*ccp == '\0')
cp = ccp-1;
overhead = ccp_MTUOverhead(&dl->physical->link.ccp);
overhead = ccp_MTUOverhead(&bundle->ncp.mp.link.ccp);
struct ccp *ccp;
ccp = &l->ccp;
prompt_Printf(arg->prompt, "%s: %s [%s]\n", l->name, ccp->fsm.name,
State2Nam(ccp->fsm.state));
if (ccp->fsm.state == ST_OPENED) {
protoname(ccp->my_proto), protoname(ccp->his_proto));
ccp->uncompout, ccp->compout,
ccp->compin, ccp->uncompin);
if (ccp->in.algorithm != -1)
(*algorithm[ccp->in.algorithm]->Disp)(&ccp->in.opt));
if (ccp->out.algorithm != -1) {
o = &ccp->out.opt;
for (f = 0; f < ccp->out.algorithm; f++)
if (IsEnabled(ccp->cfg.neg[algorithm[f]->Neg]))
(*algorithm[ccp->out.algorithm]->Disp)(&(*o)->val));
" REQ%s, %u Term REQ%s\n", ccp->cfg.fsm.timeout,
ccp->cfg.fsm.maxreq, ccp->cfg.fsm.maxreq == 1 ? "" : "s",
ccp->cfg.fsm.maxtrm, ccp->cfg.fsm.maxtrm == 1 ? "" : "s");
prompt_Printf(arg->prompt, "incoming = %d, ", ccp->cfg.deflate.in.winsize);
prompt_Printf(arg->prompt, "outgoing = %d\n", ccp->cfg.deflate.out.winsize);
if (ccp->cfg.mppe.keybits)
prompt_Printf(arg->prompt, "%d bits, ", ccp->cfg.mppe.keybits);
switch (ccp->cfg.mppe.state) {
ccp->cfg.mppe.required ? ", required" : "");
command_ShowNegval(ccp->cfg.neg[CCP_NEG_DEFLATE]));
command_ShowNegval(ccp->cfg.neg[CCP_NEG_PRED1]));
command_ShowNegval(ccp->cfg.neg[CCP_NEG_DEFLATE24]));
command_ShowNegval(ccp->cfg.neg[CCP_NEG_MPPE]));
ccp_SetupCallbacks(struct ccp *ccp)
ccp->fsm.fn = &ccp_Callbacks;
ccp->fsm.FsmTimer.name = ccp_TimerNames[0];
ccp->fsm.OpenTimer.name = ccp_TimerNames[1];
ccp->fsm.StoppedTimer.name = ccp_TimerNames[2];
ccp_Init(struct ccp *ccp, struct bundle *bundle, struct link *l,
fsm_Init(&ccp->fsm, "CCP", PROTO_CCP, 1, CCP_MAXCODE, LogCCP,
ccp->cfg.deflate.in.winsize = 0;
ccp->cfg.deflate.out.winsize = 15;
ccp->cfg.fsm.timeout = DEF_FSMRETRY;
ccp->cfg.fsm.maxreq = DEF_FSMTRIES;
ccp->cfg.fsm.maxtrm = DEF_FSMTRIES;
ccp->cfg.neg[CCP_NEG_DEFLATE] = NEG_ENABLED|NEG_ACCEPTED;
ccp->cfg.neg[CCP_NEG_PRED1] = NEG_ENABLED|NEG_ACCEPTED;
ccp->cfg.neg[CCP_NEG_DEFLATE24] = 0;
ccp->cfg.mppe.keybits = 0;
ccp->cfg.mppe.state = MPPE_ANYSTATE;
ccp->cfg.mppe.required = 0;
ccp->cfg.neg[CCP_NEG_MPPE] = NEG_ENABLED|NEG_ACCEPTED;
ccp_Setup(ccp);
ccp_Setup(struct ccp *ccp)
ccp->fsm.open_mode = 0;
ccp->his_proto = ccp->my_proto = -1;
ccp->reset_sent = ccp->last_reset = -1;
ccp->in.algorithm = ccp->out.algorithm = -1;
ccp->in.state = ccp->out.state = NULL;
ccp->in.opt.hdr.id = -1;
ccp->out.opt = NULL;
ccp->his_reject = ccp->my_reject = 0;
ccp->uncompout = ccp->compout = 0;
ccp->uncompin = ccp->compin = 0;
ccp_Required(struct ccp *ccp)
if (IsEnabled(ccp->cfg.neg[algorithm[f]->Neg]) &&
(*algorithm[f]->Required)(&ccp->fsm))
ccp_MTUOverhead(struct ccp *ccp)
if (ccp->fsm.state == ST_OPENED && ccp->out.algorithm >= 0)
return algorithm[ccp->out.algorithm]->o.MTUOverhead;
struct ccp *ccp = fsm2ccp(fp);
fp->FsmTimer.load = ccp->cfg.fsm.timeout * SECTICKS;
fp->restart = ccp->cfg.fsm.maxreq;
fp->restart = ccp->cfg.fsm.maxtrm;
struct ccp *ccp = fsm2ccp(fp);
o = &ccp->out.opt;
alloc = ccp->his_reject == 0 && ccp->out.opt == NULL;
ccp->my_proto = -1;
ccp->out.algorithm = -1;
if (IsEnabled(ccp->cfg.neg[algorithm[f]->Neg]) &&
!REJECTED(ccp, algorithm[f]->id) &&
for (o = &ccp->out.opt; *o != NULL; o = &(*o)->next)
(*algorithm[f]->o.OptInit)(fp->bundle, &(*o)->val, &ccp->cfg);
ccp->my_proto = (*o)->val.hdr.id;
ccp->out.algorithm = f;
struct ccp *ccp = fsm2ccp(fp);
ccp->reset_sent = fp->reqid;
ccp->last_reset = -1;
struct ccp *ccp = fsm2ccp(fp);
if (ccp->out.state == NULL)
return (*algorithm[ccp->out.algorithm]->o.Reset)(ccp->out.state);
struct ccp *ccp = fsm2ccp(fp);
fp->more.reqs = fp->more.naks = fp->more.rejs = ccp->cfg.fsm.maxreq * 3;
struct ccp *ccp = fsm2ccp(fp);
if (ccp->in.state != NULL) {
(*algorithm[ccp->in.algorithm]->i.Term)(ccp->in.state);
ccp->in.state = NULL;
ccp->in.algorithm = -1;
if (ccp->out.state != NULL) {
(*algorithm[ccp->out.algorithm]->o.Term)(ccp->out.state);
ccp->out.state = NULL;
ccp->out.algorithm = -1;
ccp->his_reject = ccp->my_reject = 0;
while (ccp->out.opt) {
next = ccp->out.opt->next;
free(ccp->out.opt);
ccp->out.opt = next;
ccp_Setup(ccp);
struct ccp *ccp = fsm2ccp(fp);
while (ccp->out.opt) {
next = ccp->out.opt->next;
free(ccp->out.opt);
ccp->out.opt = next;
if (ccp_Required(ccp)) {
struct ccp *ccp = fsm2ccp(fp);
if (IsEnabled(ccp->cfg.neg[algorithm[f]->Neg]) &&
(*algorithm[f]->Required)(&ccp->fsm) &&
(ccp->in.algorithm != (int)f || ccp->out.algorithm != (int)f)) {
ccp->his_proto = ccp->my_proto = -1;
if (ccp->in.state == NULL && ccp->in.algorithm >= 0 &&
ccp->in.algorithm < (int)NALGORITHMS) {
ccp->in.state = (*algorithm[ccp->in.algorithm]->i.Init)
(fp->bundle, &ccp->in.opt);
if (ccp->in.state == NULL) {
fp->link->name, protoname(ccp->his_proto));
ccp->his_proto = ccp->my_proto = -1;
o = &ccp->out.opt;
if (ccp->out.algorithm > 0)
for (f = 0; f < (unsigned)ccp->out.algorithm; f++)
if (IsEnabled(ccp->cfg.neg[algorithm[f]->Neg]))
if (ccp->out.state == NULL && ccp->out.algorithm >= 0 &&
ccp->out.algorithm < (int)NALGORITHMS) {
ccp->out.state = (*algorithm[ccp->out.algorithm]->o.Init)
if (ccp->out.state == NULL) {
fp->link->name, protoname(ccp->my_proto));
ccp->his_proto = ccp->my_proto = -1;
fp->more.reqs = fp->more.naks = fp->more.rejs = ccp->cfg.fsm.maxreq * 3;
fp->link->name, protoname(ccp->my_proto), ccp->my_proto,
protoname(ccp->his_proto), ccp->his_proto);
struct ccp *ccp = fsm2ccp(fp);
ccp->in.algorithm = -1; /* In case we've received two REQs in a row */
ccp->my_reject |= (1 << opt->hdr.id);
if (IsAccepted(ccp->cfg.neg[algorithm[f]->Neg]) &&
ccp->in.algorithm == -1) {
memcpy(&ccp->in.opt, opt, opt->hdr.len);
switch ((*algorithm[f]->i.Set)(fp->bundle, &ccp->in.opt, &ccp->cfg)) {
fsm_rej(dec, &ccp->in.opt);
fsm_nak(dec, &ccp->in.opt);
fsm_ack(dec, &ccp->in.opt);
ccp->his_proto = opt->hdr.id;
ccp->in.algorithm = (int)f; /* This one'll do :-) */
for (o = ccp->out.opt; o != NULL; o = o->next)
if ((*algorithm[f]->o.Set)(fp->bundle, &o->val, &ccp->cfg) ==
ccp->my_proto = algorithm[f]->id;
ccp->his_reject |= (1 << opt->hdr.id);
ccp->my_proto = -1;
ccp->his_reject |= (1 << opt->hdr.id);
ccp->my_proto = -1;
if (ccp->in.state == NULL) {
ccp->his_proto = -1;
ccp->in.algorithm = -1;
fsm_Input(&l->ccp.fsm, bp);
l->ccp.fsm.link->name, bundle_PhaseName(bundle));
struct ccp *ccp = fsm2ccp(fp);
if (ccp->reset_sent != -1) {
if (id != ccp->reset_sent) {
" ignored\n", fp->link->name, id, ccp->reset_sent);
} else if (id == ccp->last_reset)
ccp->last_reset = ccp->reset_sent;
ccp->reset_sent = -1;
if (ccp->in.state != NULL)
(*algorithm[ccp->in.algorithm]->i.Reset)(ccp->in.state);
if (l->ccp.fsm.state != ST_OPENED) {
if (ccp_Required(&l->ccp)) {
} else if (l->ccp.out.state != NULL) {
bp = (*algorithm[l->ccp.out.algorithm]->o.Write)
(l->ccp.out.state, &l->ccp, l, pri, proto, bp);
if (l->ccp.fsm.state == ST_OPENED) {
if (l->ccp.reset_sent != -1)
fsm_Output(&l->ccp.fsm, CODE_RESETREQ, l->ccp.reset_sent, NULL, 0,
else if (l->ccp.in.state != NULL) {
bp = (*algorithm[l->ccp.in.algorithm]->i.Read)
(l->ccp.in.state, &l->ccp, proto, bp);
} else if (PROTO_COMPRESSIBLE(*proto) && l->ccp.in.state != NULL) {
(*algorithm[l->ccp.in.algorithm]->i.DictSetup)
(l->ccp.in.state, &l->ccp, *proto, bp);
ccp_Proto(struct ccp *ccp)
return !link2physical(ccp->fsm.link) || !ccp->fsm.bundle->ncp.mp.active ?
ccp_SetOpenMode(struct ccp *ccp)
if (IsEnabled(ccp->cfg.neg[f])) {
ccp->fsm.open_mode = 0;
ccp->fsm.open_mode = OPEN_PASSIVE; /* Go straight to ST_STOPPED ? */
if (IsAccepted(ccp->cfg.neg[f]))
#define fsm2ccp(fp) (fp->proto == PROTO_CCP ? (struct ccp *)fp : NULL)
struct mbuf *(*Read)(void *, struct ccp *, u_short *, struct mbuf *);
void (*DictSetup)(void *, struct ccp *, u_short, struct mbuf *);
struct mbuf *(*Write)(void *, struct ccp *, struct link *, int, u_short *,
extern void ccp_Init(struct ccp *, struct bundle *, struct link *,
extern void ccp_Setup(struct ccp *);
extern int ccp_Required(struct ccp *);
extern int ccp_MTUOverhead(struct ccp *);
extern u_short ccp_Proto(struct ccp *);
extern void ccp_SetupCallbacks(struct ccp *);
extern int ccp_SetOpenMode(struct ccp *);
fp = &command_ChooseLink(arg)->ccp.fsm;
fp = &command_ChooseLink(arg)->ccp.fsm;
struct fsm *fp = arg->cx ? &arg->cx->physical->link.ccp.fsm :
&arg->bundle->ncp.mp.link.ccp.fsm;
l->ccp.fsm.StoppedTimer.load = 0;
l->ccp.fsm.StoppedTimer.load = atoi(arg->argv[arg->argn+1]) * SECTICKS;
l->ccp.cfg.deflate.out.winsize = atoi(arg->argv[arg->argn]);
if (l->ccp.cfg.deflate.out.winsize < 8 ||
l->ccp.cfg.deflate.out.winsize > 15) {
l->ccp.cfg.deflate.out.winsize);
l->ccp.cfg.deflate.out.winsize = 15;
l->ccp.cfg.deflate.in.winsize = atoi(arg->argv[arg->argn+1]);
if (l->ccp.cfg.deflate.in.winsize < 8 ||
l->ccp.cfg.deflate.in.winsize > 15) {
l->ccp.cfg.deflate.in.winsize);
l->ccp.cfg.deflate.in.winsize = 15;
l->ccp.cfg.deflate.in.winsize = 0;
l->ccp.cfg.mppe.keybits = 0;
l->ccp.cfg.mppe.state = MPPE_ANYSTATE;
l->ccp.cfg.mppe.required = 0;
l->ccp.cfg.mppe.state = MPPE_ANYSTATE;
l->ccp.cfg.mppe.state = MPPE_STATELESS;
l->ccp.cfg.mppe.state = MPPE_STATEFUL;
l->ccp.cfg.mppe.state = MPPE_ANYSTATE;
l->ccp.cfg.mppe.keybits = long_val;
l->ccp.cfg.mppe.required = 1;
&l->ccp.cfg.fsm.timeout, &l->ccp.cfg.fsm.maxreq,
&l->ccp.cfg.fsm.maxtrm, DEF_FSMTRIES);
l->ccp.cfg.neg[CCP_NEG_MPPE] &= keep;
l->ccp.cfg.neg[CCP_NEG_MPPE] |= add;
l->ccp.cfg.neg[CCP_NEG_DEFLATE] &= keep;
l->ccp.cfg.neg[CCP_NEG_DEFLATE] |= add;
l->ccp.cfg.neg[CCP_NEG_DEFLATE24] &= keep;
l->ccp.cfg.neg[CCP_NEG_DEFLATE24] |= add;
l->ccp.cfg.neg[CCP_NEG_PRED1] &= keep;
l->ccp.cfg.neg[CCP_NEG_PRED1] |= add;
if (!arg->cx->physical->link.ccp.fsm.StoppedTimer.load)
arg->cx->physical->link.ccp.fsm.StoppedTimer.load / SECTICKS);
fsm2initial(&dl->physical->link.ccp.fsm);
fsm2initial(&dl->physical->link.ccp.fsm);
ccp_Setup(&dl->physical->link.ccp);
(*dl->parent->LayerUp)(dl->parent->object, &dl->physical->link.ccp.fsm);
int ccpok = ccp_SetOpenMode(&dl->physical->link.ccp);
dl->physical->link.ccp.fsm.open_mode = OPEN_PASSIVE; /* override */
fsm_Up(&dl->physical->link.ccp.fsm);
fsm_Open(&dl->physical->link.ccp.fsm);
fsm2initial(&dl->physical->link.ccp.fsm);
memcpy(&dl->physical->link.ccp.cfg, &odl->physical->link.ccp.cfg,
sizeof dl->physical->link.ccp.cfg);
ccp->uncompout += ilen;
ccp->compout += ilen; /* We measure this stuff too */
ccp->uncompout += ilen;
ccp->compout += olen;
*proto = ccp_Proto(ccp);
DeflateInput(void *v, struct ccp *ccp, u_short *proto, struct mbuf *mi)
ccp_SendResetReq(&ccp->fsm);
ccp_SendResetReq(&ccp->fsm);
ccp_SendResetReq(&ccp->fsm);
ccp->compin += ilen;
ccp->uncompin += olen;
DeflateDictSetup(void *v, struct ccp *ccp, u_short proto, struct mbuf *mi)
ccp_SendResetReq(&ccp->fsm);
ccp->compin += len;
ccp->uncompin += len;
DeflateOutput(void *v, struct ccp *ccp, struct link *l __unused,
fp = &fp->link->ccp.fsm;
if (l->ccp.fsm.state != ST_OPENED && ccp_Required(&l->ccp)) {
if (l->ccp.fsm.state != ST_OPENED && ccp_Required(&l->ccp)) {
struct ccp ccp; /* Our compression FSM */
ccp_Init(&mp->link.ccp, mp->bundle, &mp->link, &mp->fsmp);
if (ccp_SetOpenMode(&mp->link.ccp)) {
fsm_Up(&mp->link.ccp.fsm);
fsm_Open(&mp->link.ccp.fsm);
fsm2initial(&mp->link.ccp.fsm);
if (l->ccp.fsm.state != ST_OPENED && ccp_Required(&l->ccp)) {
MPPEOutput(void *v, struct ccp *ccp, struct link *l __unused, int pri __unused,
ccp->compout += ilen;
ccp->uncompout += ilen;
*proto = ccp_Proto(ccp);
ccp->uncompout += ilen;
ccp->compout += len;
MPPEInput(void *v, struct ccp *ccp, u_short *proto, struct mbuf *mp)
ccp->compin += ilen;
fsm_Output(&ccp->fsm, CODE_RESETREQ, ccp->fsm.reqid++, NULL, 0,
fsm_Output(&ccp->fsm, CODE_RESETREQ, ccp->fsm.reqid++, NULL, 0,
ccp->uncompin += len;
MPPEDictSetup(void *v __unused, struct ccp *ccp __unused,
return fp->link->ccp.cfg.mppe.required;
ccp_Init(&p->link.ccp, dl->bundle, &p->link, &dl->fsmp);
p->link.ccp.fsm.bundle = dl->bundle;
p->link.ccp.fsm.link = &p->link;
memset(&p->link.ccp.fsm.FsmTimer, '\0', sizeof p->link.ccp.fsm.FsmTimer);
memset(&p->link.ccp.fsm.OpenTimer, '\0', sizeof p->link.ccp.fsm.OpenTimer);
memset(&p->link.ccp.fsm.StoppedTimer, '\0',
sizeof p->link.ccp.fsm.StoppedTimer);
p->link.ccp.fsm.parent = &dl->fsmp;
ccp_SetupCallbacks(&p->link.ccp);
timer_Stop(&p->link.ccp.fsm.FsmTimer);
timer_Stop(&p->link.ccp.fsm.OpenTimer);
timer_Stop(&p->link.ccp.fsm.StoppedTimer);
struct ccp;
Pred1Output(void *v, struct ccp *ccp, struct link *l __unused, int pri __unused, u_short *proto,
ccp->uncompout += orglen;
ccp->compout += len;
ccp->compout += orglen;
*proto = ccp_Proto(ccp);
Pred1Input(void *v, struct ccp *ccp, u_short *proto, struct mbuf *bp)
ccp->uncompin += len & 0x7fff;
ccp->compin += olen;
fsm_Reopen(&ccp->fsm);
fsm_Reopen(&ccp->fsm);
ccp->compin += len;
ccp->fsm.link->name, pre);
fsm_Reopen(&ccp->fsm);
Pred1DictSetup(void *v __unused, struct ccp *ccp __unused, u_short proto __unused, struct mbuf *bp __unused)