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 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); }
/* * When LCP is reached to opened state, We'll start LQM activity. */ static void lqr_Setup(struct lcp *lcp) { struct physical *physical = link2physical(lcp->fsm.link); int period; physical->hdlc.lqm.lqr.resent = 0; physical->hdlc.lqm.echo.seq_sent = 0; physical->hdlc.lqm.echo.seq_recv = 0; memset(&physical->hdlc.lqm.lqr.peer, '\0', sizeof physical->hdlc.lqm.lqr.peer); physical->hdlc.lqm.method = lcp->cfg.echo ? LQM_ECHO : 0; if (IsEnabled(lcp->cfg.lqr) && !REJECTED(lcp, TY_QUALPROTO)) physical->hdlc.lqm.method |= LQM_LQR; timer_Stop(&physical->hdlc.lqm.timer); physical->hdlc.lqm.lqr.peer_timeout = lcp->his_lqrperiod; if (lcp->his_lqrperiod) log_Printf(LogLQM, "%s: Expecting LQR every %d.%02d secs\n", physical->link.name, lcp->his_lqrperiod / 100, lcp->his_lqrperiod % 100); period = lcp->want_lqrperiod ? lcp->want_lqrperiod : lcp->cfg.lqrperiod * 100; physical->hdlc.lqm.timer.func = SendLqrReport; physical->hdlc.lqm.timer.name = "lqm"; physical->hdlc.lqm.timer.arg = lcp; if (lcp->want_lqrperiod || physical->hdlc.lqm.method & LQM_ECHO) { log_Printf(LogLQM, "%s: Will send %s every %d.%02d secs\n", physical->link.name, lcp->want_lqrperiod ? "LQR" : "LCP ECHO", period / 100, period % 100); physical->hdlc.lqm.timer.load = period * SECTICKS / 100; } else { physical->hdlc.lqm.timer.load = 0; if (!lcp->his_lqrperiod) log_Printf(LogLQM, "%s: LQR/LCP ECHO not negotiated\n", physical->link.name); } }