Lines Matching defs:cbcp

26  * $FreeBSD: releng/10.2/usr.sbin/ppp/cbcp.c 228990 2011-12-30 10:58:14Z uqs $
55 #include "cbcp.h"
63 cbcp_Init(struct cbcp *cbcp, struct physical *p)
65 cbcp->required = 0;
66 cbcp->fsm.state = CBCP_CLOSED;
67 cbcp->fsm.id = 0;
68 cbcp->fsm.delay = 0;
69 *cbcp->fsm.phone = '\0';
70 memset(&cbcp->fsm.timer, '\0', sizeof cbcp->fsm.timer);
71 cbcp->p = p;
74 static void cbcp_SendReq(struct cbcp *);
75 static void cbcp_SendResponse(struct cbcp *);
76 static void cbcp_SendAck(struct cbcp *);
81 struct cbcp *cbcp = (struct cbcp *)v;
83 timer_Stop(&cbcp->fsm.timer);
84 if (cbcp->fsm.restart) {
85 switch (cbcp->fsm.state) {
89 cbcp->p->dl->name);
93 cbcp_SendReq(cbcp);
96 cbcp_SendResponse(cbcp);
99 cbcp_SendAck(cbcp);
105 switch (cbcp->fsm.state) {
120 cbcp->p->dl->name);
126 cbcp->p->dl->name, missed);
127 datalink_CBCPFailed(cbcp->p->dl);
132 cbcp_StartTimer(struct cbcp *cbcp, int timeout)
134 timer_Stop(&cbcp->fsm.timer);
135 cbcp->fsm.timer.func = cbcp_Timeout;
136 cbcp->fsm.timer.name = "cbcp";
137 cbcp->fsm.timer.load = timeout * SECTICKS;
138 cbcp->fsm.timer.arg = cbcp;
139 timer_Start(&cbcp->fsm.timer);
161 cbcp_NewPhase(struct cbcp *cbcp, int new)
163 if (cbcp->fsm.state != new) {
164 log_Printf(LogCBCP, "%s: State change %s --> %s\n", cbcp->p->dl->name,
165 cbcpstate(cbcp->fsm.state), cbcpstate(new));
166 cbcp->fsm.state = new;
196 cbcp_Output(struct cbcp *cbcp, u_char code, struct cbcp_data *data)
204 head->id = cbcp->fsm.id;
208 link_PushPacket(&cbcp->p->link, bp, cbcp->p->dl->bundle,
209 LINK_QUEUES(&cbcp->p->link) - 1, PROTO_CBCP);
256 cbcp_SendReq(struct cbcp *cbcp)
260 char list[sizeof cbcp->fsm.phone], *next;
265 log_Printf(LogCBCP, "%s: SendReq(%d) state = %s\n", cbcp->p->dl->name,
266 cbcp->fsm.id, cbcpstate(cbcp->fsm.state));
267 data.type = cbcp->fsm.type;
269 strncpy(list, cbcp->fsm.phone, sizeof list - 1);
307 cbcp_Output(cbcp, CBCP_REQ, &data);
308 cbcp->fsm.restart--;
309 cbcp_StartTimer(cbcp, cbcp->fsm.delay);
310 cbcp_NewPhase(cbcp, CBCP_REQSENT); /* Wait for a RESPONSE */
314 cbcp_Up(struct cbcp *cbcp)
316 struct lcp *lcp = &cbcp->p->link.lcp;
318 cbcp->fsm.delay = cbcp->p->dl->cfg.cbcp.delay;
319 if (*cbcp->p->dl->peer.authname == '\0' ||
320 !auth_SetPhoneList(cbcp->p->dl->peer.authname, cbcp->fsm.phone,
321 sizeof cbcp->fsm.phone)) {
322 strncpy(cbcp->fsm.phone, cbcp->p->dl->cfg.cbcp.phone,
323 sizeof cbcp->fsm.phone - 1);
324 cbcp->fsm.phone[sizeof cbcp->fsm.phone - 1] = '\0';
328 if (*cbcp->fsm.phone == '\0')
329 cbcp->fsm.type = CBCP_NONUM;
330 else if (!strcmp(cbcp->fsm.phone, "*")) {
331 cbcp->fsm.type = CBCP_SERVERNUM;
332 *cbcp->fsm.phone = '\0';
334 cbcp->fsm.type = CBCP_CLIENTNUM;
335 cbcp_NewPhase(cbcp, CBCP_STOPPED); /* Wait for a REQ */
336 cbcp_StartTimer(cbcp, cbcp->fsm.delay * DEF_FSMTRIES);
338 if (*cbcp->fsm.phone == '\0')
339 cbcp->fsm.type = CBCP_NONUM;
340 else if (!strcmp(cbcp->fsm.phone, "*")) {
341 cbcp->fsm.type = CBCP_CLIENTNUM;
342 *cbcp->fsm.phone = '\0';
343 } else if (strchr(cbcp->fsm.phone, ','))
344 cbcp->fsm.type = CBCP_LISTNUM;
346 cbcp->fsm.type = CBCP_SERVERNUM;
347 cbcp->fsm.restart = DEF_FSMTRIES;
348 cbcp_SendReq(cbcp);
353 cbcp_AdjustResponse(struct cbcp *cbcp, struct cbcp_data *data)
356 * We've received a REQ (data). Adjust our response (cbcp->fsm.*)
363 if (cbcp->p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_NONE))
366 * (ie, ``set callback cbcp none''), go along with the callees
369 cbcp->fsm.type = CBCP_NONUM;
380 if (cbcp->fsm.type == CBCP_CLIENTNUM) {
396 ptr = strchr(cbcp->fsm.phone, ',');
405 if (cbcp->fsm.type == CBCP_SERVERNUM) {
406 *cbcp->fsm.phone = '\0';
421 } else if (cbcp->fsm.type == CBCP_CLIENTNUM) {
427 char list[sizeof cbcp->fsm.phone], *next;
429 strncpy(list, cbcp->fsm.phone, sizeof list - 1);
433 cbcp->fsm.type = CBCP_SERVERNUM;
434 strcpy(cbcp->fsm.phone, next);
443 if (cbcp->fsm.type == CBCP_CLIENTNUM || cbcp->fsm.type == CBCP_LISTNUM) {
445 * Search through ``data''s addresses and see if cbcp->fsm.phone
448 char list[sizeof cbcp->fsm.phone], *next, *end;
455 strncpy(list, cbcp->fsm.phone, sizeof list - 1);
459 cbcp->fsm.type = CBCP_LISTNUM;
460 strcpy(cbcp->fsm.phone, next);
478 cbcp_SendResponse(struct cbcp *cbcp)
485 log_Printf(LogCBCP, "%s: SendResponse(%d) state = %s\n", cbcp->p->dl->name,
486 cbcp->fsm.id, cbcpstate(cbcp->fsm.state));
488 data.type = cbcp->fsm.type;
489 data.delay = cbcp->fsm.delay;
493 else if (*cbcp->fsm.phone) {
495 strncpy(addr->addr, cbcp->fsm.phone, sizeof addr->addr - 1);
502 cbcp_Output(cbcp, CBCP_RESPONSE, &data);
503 cbcp->fsm.restart--;
504 cbcp_StartTimer(cbcp, cbcp->fsm.delay);
505 cbcp_NewPhase(cbcp, CBCP_RESPSENT); /* Wait for an ACK */
514 cbcp_CheckResponse(struct cbcp *cbcp, struct cbcp_data *data)
518 * our REQ (cbcp->fsm)
524 if (data->type == cbcp->fsm.type) {
525 switch (cbcp->fsm.type) {
536 strncpy(cbcp->fsm.phone, addr->addr, sizeof cbcp->fsm.phone - 1);
537 cbcp->fsm.phone[sizeof cbcp->fsm.phone - 1] = '\0';
538 cbcp->fsm.delay = data->delay;
544 cbcp->fsm.delay = data->delay;
554 char list[sizeof cbcp->fsm.phone], *next;
556 strncpy(list, cbcp->fsm.phone, sizeof list - 1);
560 strcpy(cbcp->fsm.phone, next);
561 cbcp->fsm.delay = data->delay;
570 (int)cbcp->fsm.type);
572 } else if (data->type == CBCP_NONUM && cbcp->fsm.type == CBCP_CLIENTNUM) {
575 * We only allow this when ``set cbcp *'' has been specified.
577 cbcp->fsm.type = CBCP_NONUM;
585 cbcp_SendAck(struct cbcp *cbcp)
592 log_Printf(LogCBCP, "%s: SendAck(%d) state = %s\n", cbcp->p->dl->name,
593 cbcp->fsm.id, cbcpstate(cbcp->fsm.state));
595 data.type = cbcp->fsm.type;
603 strncpy(addr->addr, cbcp->fsm.phone, sizeof addr->addr - 1);
605 data.delay = cbcp->fsm.delay;
609 data.delay = cbcp->fsm.delay;
615 cbcp_Output(cbcp, CBCP_ACK, &data);
616 cbcp->fsm.restart--;
617 cbcp_StartTimer(cbcp, cbcp->fsm.delay);
618 cbcp_NewPhase(cbcp, CBCP_ACKSENT); /* Wait for an ACK */
627 struct cbcp *cbcp = &p->dl->cbcp;
660 p->dl->name, head->id, cbcpstate(cbcp->fsm.state));
662 if (cbcp->fsm.state == CBCP_STOPPED || cbcp->fsm.state == CBCP_RESPSENT) {
663 timer_Stop(&cbcp->fsm.timer);
664 if (cbcp_AdjustResponse(cbcp, data)) {
665 cbcp->fsm.restart = DEF_FSMTRIES;
666 cbcp->fsm.id = head->id;
667 cbcp_SendResponse(cbcp);
669 datalink_CBCPFailed(cbcp->p->dl);
676 p->dl->name, head->id, cbcpstate(cbcp->fsm.state));
678 if (cbcp->fsm.id != head->id) {
680 cbcp->fsm.id, head->id);
681 cbcp->fsm.id = head->id;
683 if (cbcp->fsm.state == CBCP_REQSENT || cbcp->fsm.state == CBCP_ACKSENT) {
684 timer_Stop(&cbcp->fsm.timer);
685 switch (cbcp_CheckResponse(cbcp, data)) {
687 cbcp_SendReq(cbcp);
691 cbcp->fsm.restart = DEF_FSMTRIES;
692 cbcp_SendAck(cbcp);
693 if (cbcp->fsm.type == CBCP_NONUM) {
698 timer_Stop(&cbcp->fsm.timer);
699 datalink_NCPUp(cbcp->p->dl);
704 datalink_CBCPFailed(cbcp->p->dl);
713 p->dl->name, head->id, cbcpstate(cbcp->fsm.state));
715 if (cbcp->fsm.id != head->id) {
717 cbcp->fsm.id, head->id);
718 cbcp->fsm.id = head->id;
720 if (cbcp->fsm.type == CBCP_NONUM) {
725 timer_Stop(&cbcp->fsm.timer);
726 datalink_NCPUp(cbcp->p->dl);
727 } else if (cbcp->fsm.state == CBCP_RESPSENT) {
728 timer_Stop(&cbcp->fsm.timer);
729 datalink_CBCPComplete(cbcp->p->dl);
746 cbcp_Down(struct cbcp *cbcp)
748 timer_Stop(&cbcp->fsm.timer);
749 cbcp_NewPhase(cbcp, CBCP_CLOSED);
750 cbcp->required = 0;
756 if (p->dl->cbcp.fsm.state == CBCP_ACKSENT) {
758 p->dl->cbcp.required = 1;
760 p->dl->cbcp.fsm.phone);
762 cbcp_NewPhase(&p->dl->cbcp, CBCP_CLOSED);