void ccp_SendResetReq(struct fsm *fp) { /* We can't read our input - ask peer to reset */ struct ccp *ccp = fsm2ccp(fp); ccp->reset_sent = fp->reqid; ccp->last_reset = -1; fsm_Output(fp, CODE_RESETREQ, fp->reqid, NULL, 0, MB_CCPOUT); }
static void CcpSendConfigReq(struct fsm *fp) { /* Send config REQ please */ struct ccp *ccp = fsm2ccp(fp); struct ccp_opt **o; u_char *cp, buff[100]; unsigned f; int alloc; cp = buff; o = &ccp->out.opt; alloc = ccp->his_reject == 0 && ccp->out.opt == NULL; ccp->my_proto = -1; ccp->out.algorithm = -1; for (f = 0; f < NALGORITHMS; f++) if (IsEnabled(ccp->cfg.neg[algorithm[f]->Neg]) && !REJECTED(ccp, algorithm[f]->id) && (*algorithm[f]->Usable)(fp)) { if (!alloc) for (o = &ccp->out.opt; *o != NULL; o = &(*o)->next) if ((*o)->val.hdr.id == algorithm[f]->id && (*o)->algorithm == (int)f) break; if (alloc || *o == NULL) { if ((*o = (struct ccp_opt *)malloc(sizeof(struct ccp_opt))) == NULL) { log_Printf(LogERROR, "%s: Not enough memory for CCP REQ !\n", fp->link->name); break; } (*o)->val.hdr.id = algorithm[f]->id; (*o)->val.hdr.len = 2; (*o)->next = NULL; (*o)->algorithm = f; (*algorithm[f]->o.OptInit)(fp->bundle, &(*o)->val, &ccp->cfg); } if (cp + (*o)->val.hdr.len > buff + sizeof buff) { log_Printf(LogERROR, "%s: CCP REQ buffer overrun !\n", fp->link->name); break; } memcpy(cp, &(*o)->val, (*o)->val.hdr.len); cp += (*o)->val.hdr.len; ccp->my_proto = (*o)->val.hdr.id; ccp->out.algorithm = f; if (alloc) o = &(*o)->next; } fsm_Output(fp, CODE_CONFIGREQ, fp->reqid, buff, cp - buff, MB_CCPOUT); }
static void SendEchoReq(struct lcp *lcp) { struct hdlc *hdlc = &link2physical(lcp->fsm.link)->hdlc; struct echolqr echo; echo.magic = htonl(lcp->want_magic); echo.signature = htonl(SIGNATURE); echo.sequence = htonl(hdlc->lqm.echo.seq_sent); fsm_Output(&lcp->fsm, CODE_ECHOREQ, hdlc->lqm.echo.seq_sent++, (u_char *)&echo, sizeof echo, MB_ECHOOUT); }
static void ipv6cp_SendConfigReq(struct fsm *fp) { /* Send config REQ please */ struct physical *p = link2physical(fp->link); struct ipv6cp *ipv6cp = fsm2ipv6cp(fp); u_char buff[IPV6CP_IFIDLEN+2]; struct fsm_opt *o; o = (struct fsm_opt *)buff; if ((p && !physical_IsSync(p)) || !REJECTED(ipv6cp, TY_TOKEN)) { memcpy(o->data, ipv6cp->my_ifid, IPV6CP_IFIDLEN); INC_FSM_OPT(TY_TOKEN, IPV6CP_IFIDLEN + 2, o); } fsm_Output(fp, CODE_CONFIGREQ, fp->reqid, buff, (u_char *)o - buff, MB_IPV6CPOUT); }
static void ipv6cp_SendTerminateAck(struct fsm *fp, u_char id) { /* Send Term ACK please */ fsm_Output(fp, CODE_TERMACK, id, NULL, 0, MB_IPV6CPOUT); }