Deleted Added
full compact
datalink.c (53830) datalink.c (54055)
1/*-
2 * Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/usr.sbin/ppp/datalink.c 53830 1999-11-28 15:50:08Z brian $
26 * $FreeBSD: head/usr.sbin/ppp/datalink.c 54055 1999-12-03 06:33:10Z brian $
27 */
28
29#include <sys/param.h>
30#include <netinet/in.h>
31#include <netinet/in_systm.h>
32#include <netinet/ip.h>
33#include <sys/un.h>
34

--- 80 unchanged lines hidden (view full) ---

115{
116 if (dl->physical->type == PHYS_DEDICATED && !dl->bundle->CleaningUp &&
117 dl->physical->fd != -1) {
118 /* Don't close our device if the link is dedicated */
119 datalink_LoginDone(dl);
120 return;
121 }
122
27 */
28
29#include <sys/param.h>
30#include <netinet/in.h>
31#include <netinet/in_systm.h>
32#include <netinet/ip.h>
33#include <sys/un.h>
34

--- 80 unchanged lines hidden (view full) ---

115{
116 if (dl->physical->type == PHYS_DEDICATED && !dl->bundle->CleaningUp &&
117 dl->physical->fd != -1) {
118 /* Don't close our device if the link is dedicated */
119 datalink_LoginDone(dl);
120 return;
121 }
122
123 chat_Destroy(&dl->chat);
123 chat_Finish(&dl->chat);
124 physical_Close(dl->physical);
125 dl->phone.chosen = "N/A";
126
127 if (dl->cbcp.required) {
128 log_Printf(LogPHASE, "Call peer back on %s\n", dl->cbcp.fsm.phone);
129 dl->cfg.callback.opmask = 0;
130 strncpy(dl->cfg.phone.list, dl->cbcp.fsm.phone,
131 sizeof dl->cfg.phone.list - 1);

--- 66 unchanged lines hidden (view full) ---

198 if (*phone)
199 log_Printf(LogPHASE, "Phone: %s\n", phone);
200 return phone;
201}
202
203static void
204datalink_LoginDone(struct datalink *dl)
205{
124 physical_Close(dl->physical);
125 dl->phone.chosen = "N/A";
126
127 if (dl->cbcp.required) {
128 log_Printf(LogPHASE, "Call peer back on %s\n", dl->cbcp.fsm.phone);
129 dl->cfg.callback.opmask = 0;
130 strncpy(dl->cfg.phone.list, dl->cbcp.fsm.phone,
131 sizeof dl->cfg.phone.list - 1);

--- 66 unchanged lines hidden (view full) ---

198 if (*phone)
199 log_Printf(LogPHASE, "Phone: %s\n", phone);
200 return phone;
201}
202
203static void
204datalink_LoginDone(struct datalink *dl)
205{
206 chat_Destroy(&dl->chat);
206 chat_Finish(&dl->chat);
207
208 if (!dl->script.packetmode) {
209 dl->dial.tries = -1;
210 dl->dial.incs = 0;
211 datalink_NewState(dl, DATALINK_READY);
212 } else if (!physical_Raw(dl->physical)) {
213 dl->dial.tries = 0;
214 log_Printf(LogWARN, "datalink_LoginDone: Not connected.\n");
215 if (dl->script.run) {
216 datalink_NewState(dl, DATALINK_LOGOUT);
207
208 if (!dl->script.packetmode) {
209 dl->dial.tries = -1;
210 dl->dial.incs = 0;
211 datalink_NewState(dl, DATALINK_READY);
212 } else if (!physical_Raw(dl->physical)) {
213 dl->dial.tries = 0;
214 log_Printf(LogWARN, "datalink_LoginDone: Not connected.\n");
215 if (dl->script.run) {
216 datalink_NewState(dl, DATALINK_LOGOUT);
217 chat_Init(&dl->chat, dl->physical, dl->cfg.script.logout, NULL);
217 chat_Setup(&dl->chat, dl->cfg.script.logout, NULL);
218 } else {
219 physical_StopDeviceTimer(dl->physical);
220 if (dl->physical->type == PHYS_DEDICATED)
221 /* force a redial timeout */
222 physical_Close(dl->physical);
223 datalink_HangupDone(dl);
224 }
225 } else {

--- 42 unchanged lines hidden (view full) ---

268 if (--dl->dial.tries < 0)
269 dl->dial.tries = 0;
270 if (physical_Open(dl->physical, dl->bundle) >= 0) {
271 log_WritePrompts(dl, "%s: Entering terminal mode on %s\r\n"
272 "Type `~?' for help\r\n", dl->name,
273 dl->physical->name.full);
274 if (dl->script.run) {
275 datalink_NewState(dl, DATALINK_DIAL);
218 } else {
219 physical_StopDeviceTimer(dl->physical);
220 if (dl->physical->type == PHYS_DEDICATED)
221 /* force a redial timeout */
222 physical_Close(dl->physical);
223 datalink_HangupDone(dl);
224 }
225 } else {

--- 42 unchanged lines hidden (view full) ---

268 if (--dl->dial.tries < 0)
269 dl->dial.tries = 0;
270 if (physical_Open(dl->physical, dl->bundle) >= 0) {
271 log_WritePrompts(dl, "%s: Entering terminal mode on %s\r\n"
272 "Type `~?' for help\r\n", dl->name,
273 dl->physical->name.full);
274 if (dl->script.run) {
275 datalink_NewState(dl, DATALINK_DIAL);
276 chat_Init(&dl->chat, dl->physical, dl->cfg.script.dial,
277 *dl->cfg.script.dial ?
278 datalink_ChoosePhoneNumber(dl) : "");
276 chat_Setup(&dl->chat, dl->cfg.script.dial, *dl->cfg.script.dial ?
277 datalink_ChoosePhoneNumber(dl) : "");
279 if (!(dl->physical->type & (PHYS_DDIAL|PHYS_DEDICATED)) &&
280 dl->cfg.dial.max)
281 log_Printf(LogCHAT, "%s: Dial attempt %u of %d\n",
282 dl->name, dl->cfg.dial.max - dl->dial.tries,
283 dl->cfg.dial.max);
284 } else
285 datalink_NewState(dl, DATALINK_CARRIER);
286 return datalink_UpdateSet(d, r, w, e, n);

--- 31 unchanged lines hidden (view full) ---

318 switch (physical_AwaitCarrier(dl->physical)) {
319 case CARRIER_PENDING:
320 log_Printf(LogDEBUG, "Waiting for carrier\n");
321 return 0; /* A device timer is running to wake us up again */
322
323 case CARRIER_OK:
324 if (dl->script.run) {
325 datalink_NewState(dl, DATALINK_LOGIN);
278 if (!(dl->physical->type & (PHYS_DDIAL|PHYS_DEDICATED)) &&
279 dl->cfg.dial.max)
280 log_Printf(LogCHAT, "%s: Dial attempt %u of %d\n",
281 dl->name, dl->cfg.dial.max - dl->dial.tries,
282 dl->cfg.dial.max);
283 } else
284 datalink_NewState(dl, DATALINK_CARRIER);
285 return datalink_UpdateSet(d, r, w, e, n);

--- 31 unchanged lines hidden (view full) ---

317 switch (physical_AwaitCarrier(dl->physical)) {
318 case CARRIER_PENDING:
319 log_Printf(LogDEBUG, "Waiting for carrier\n");
320 return 0; /* A device timer is running to wake us up again */
321
322 case CARRIER_OK:
323 if (dl->script.run) {
324 datalink_NewState(dl, DATALINK_LOGIN);
326 chat_Init(&dl->chat, dl->physical, dl->cfg.script.login, NULL);
325 chat_Setup(&dl->chat, dl->cfg.script.login, NULL);
327 } else
328 datalink_LoginDone(dl);
329 return datalink_UpdateSet(d, r, w, e, n);
330
331 case CARRIER_LOST:
332 physical_Offline(dl->physical); /* Is this required ? */
333 if (dl->script.run) {
334 datalink_NewState(dl, DATALINK_HANGUP);
326 } else
327 datalink_LoginDone(dl);
328 return datalink_UpdateSet(d, r, w, e, n);
329
330 case CARRIER_LOST:
331 physical_Offline(dl->physical); /* Is this required ? */
332 if (dl->script.run) {
333 datalink_NewState(dl, DATALINK_HANGUP);
335 chat_Init(&dl->chat, dl->physical, dl->cfg.script.hangup, NULL);
334 chat_Setup(&dl->chat, dl->cfg.script.hangup, NULL);
336 return datalink_UpdateSet(d, r, w, e, n);
337 } else {
338 datalink_HangupDone(dl);
339 return 0; /* Maybe bundle_CleanDatalinks() has something to do */
340 }
341 }
342
343 case DATALINK_HANGUP:

--- 9 unchanged lines hidden (view full) ---

353 datalink_HangupDone(dl);
354 break;
355 case DATALINK_DIAL:
356 datalink_NewState(dl, DATALINK_CARRIER);
357 return datalink_UpdateSet(d, r, w, e, n);
358 case DATALINK_LOGOUT:
359 datalink_NewState(dl, DATALINK_HANGUP);
360 physical_Offline(dl->physical);
335 return datalink_UpdateSet(d, r, w, e, n);
336 } else {
337 datalink_HangupDone(dl);
338 return 0; /* Maybe bundle_CleanDatalinks() has something to do */
339 }
340 }
341
342 case DATALINK_HANGUP:

--- 9 unchanged lines hidden (view full) ---

352 datalink_HangupDone(dl);
353 break;
354 case DATALINK_DIAL:
355 datalink_NewState(dl, DATALINK_CARRIER);
356 return datalink_UpdateSet(d, r, w, e, n);
357 case DATALINK_LOGOUT:
358 datalink_NewState(dl, DATALINK_HANGUP);
359 physical_Offline(dl->physical);
361 chat_Init(&dl->chat, dl->physical, dl->cfg.script.hangup, NULL);
360 chat_Setup(&dl->chat, dl->cfg.script.hangup, NULL);
362 return datalink_UpdateSet(d, r, w, e, n);
363 case DATALINK_LOGIN:
364 dl->phone.alt = NULL;
365 datalink_LoginDone(dl);
366 return datalink_UpdateSet(d, r, w, e, n);
367 }
368 break;
369 case CHAT_FAILED:
370 /* Going down - script failed */
371 log_Printf(LogWARN, "Chat script failed\n");
372 switch(dl->state) {
373 case DATALINK_HANGUP:
374 datalink_HangupDone(dl);
375 break;
376 case DATALINK_DIAL:
377 case DATALINK_LOGOUT:
378 case DATALINK_LOGIN:
379 datalink_NewState(dl, DATALINK_HANGUP);
380 physical_Offline(dl->physical);
361 return datalink_UpdateSet(d, r, w, e, n);
362 case DATALINK_LOGIN:
363 dl->phone.alt = NULL;
364 datalink_LoginDone(dl);
365 return datalink_UpdateSet(d, r, w, e, n);
366 }
367 break;
368 case CHAT_FAILED:
369 /* Going down - script failed */
370 log_Printf(LogWARN, "Chat script failed\n");
371 switch(dl->state) {
372 case DATALINK_HANGUP:
373 datalink_HangupDone(dl);
374 break;
375 case DATALINK_DIAL:
376 case DATALINK_LOGOUT:
377 case DATALINK_LOGIN:
378 datalink_NewState(dl, DATALINK_HANGUP);
379 physical_Offline(dl->physical);
381 chat_Init(&dl->chat, dl->physical, dl->cfg.script.hangup, NULL);
380 chat_Setup(&dl->chat, dl->cfg.script.hangup, NULL);
382 return datalink_UpdateSet(d, r, w, e, n);
383 }
384 break;
385 }
386 break;
387
388 case DATALINK_READY:
389 case DATALINK_LCP:

--- 117 unchanged lines hidden (view full) ---

507 dl->stayonline = 0;
508 physical_StopDeviceTimer(dl->physical);
509 datalink_NewState(dl, DATALINK_READY);
510 } else if (dl->state != DATALINK_CLOSED && dl->state != DATALINK_HANGUP) {
511 physical_Offline(dl->physical);
512 if (dl->script.run && dl->state != DATALINK_OPENING) {
513 if (dl->state == DATALINK_LOGOUT) {
514 datalink_NewState(dl, DATALINK_HANGUP);
381 return datalink_UpdateSet(d, r, w, e, n);
382 }
383 break;
384 }
385 break;
386
387 case DATALINK_READY:
388 case DATALINK_LCP:

--- 117 unchanged lines hidden (view full) ---

506 dl->stayonline = 0;
507 physical_StopDeviceTimer(dl->physical);
508 datalink_NewState(dl, DATALINK_READY);
509 } else if (dl->state != DATALINK_CLOSED && dl->state != DATALINK_HANGUP) {
510 physical_Offline(dl->physical);
511 if (dl->script.run && dl->state != DATALINK_OPENING) {
512 if (dl->state == DATALINK_LOGOUT) {
513 datalink_NewState(dl, DATALINK_HANGUP);
515 chat_Init(&dl->chat, dl->physical, dl->cfg.script.hangup, NULL);
514 chat_Setup(&dl->chat, dl->cfg.script.hangup, NULL);
516 } else {
517 datalink_NewState(dl, DATALINK_LOGOUT);
515 } else {
516 datalink_NewState(dl, DATALINK_LOGOUT);
518 chat_Init(&dl->chat, dl->physical, dl->cfg.script.logout, NULL);
517 chat_Setup(&dl->chat, dl->cfg.script.logout, NULL);
519 }
520 } else
521 datalink_HangupDone(dl);
522 }
523}
524
525static void
526datalink_LayerStart(void *v, struct fsm *fp)

--- 293 unchanged lines hidden (view full) ---

820 return NULL;
821 }
822
823 pap_Init(&dl->pap, dl->physical);
824 chap_Init(&dl->chap, dl->physical);
825 cbcp_Init(&dl->cbcp, dl->physical);
826
827 memset(&dl->chat, '\0', sizeof dl->chat); /* Force buf{start,end} reset */
518 }
519 } else
520 datalink_HangupDone(dl);
521 }
522}
523
524static void
525datalink_LayerStart(void *v, struct fsm *fp)

--- 293 unchanged lines hidden (view full) ---

819 return NULL;
820 }
821
822 pap_Init(&dl->pap, dl->physical);
823 chap_Init(&dl->chap, dl->physical);
824 cbcp_Init(&dl->cbcp, dl->physical);
825
826 memset(&dl->chat, '\0', sizeof dl->chat); /* Force buf{start,end} reset */
828 chat_Init(&dl->chat, dl->physical, NULL, NULL);
827 chat_Init(&dl->chat, dl->physical);
829
830 log_Printf(LogPHASE, "%s: Created in %s state\n",
831 dl->name, datalink_State(dl));
832
833 return dl;
834}
835
836struct datalink *

--- 47 unchanged lines hidden (view full) ---

884 memcpy(&dl->physical->link.ccp.cfg, &odl->physical->link.ccp.cfg,
885 sizeof dl->physical->link.ccp.cfg);
886 memcpy(&dl->physical->async.cfg, &odl->physical->async.cfg,
887 sizeof dl->physical->async.cfg);
888
889 cbcp_Init(&dl->cbcp, dl->physical);
890
891 memset(&dl->chat, '\0', sizeof dl->chat); /* Force buf{start,end} reset */
828
829 log_Printf(LogPHASE, "%s: Created in %s state\n",
830 dl->name, datalink_State(dl));
831
832 return dl;
833}
834
835struct datalink *

--- 47 unchanged lines hidden (view full) ---

883 memcpy(&dl->physical->link.ccp.cfg, &odl->physical->link.ccp.cfg,
884 sizeof dl->physical->link.ccp.cfg);
885 memcpy(&dl->physical->async.cfg, &odl->physical->async.cfg,
886 sizeof dl->physical->async.cfg);
887
888 cbcp_Init(&dl->cbcp, dl->physical);
889
890 memset(&dl->chat, '\0', sizeof dl->chat); /* Force buf{start,end} reset */
892 chat_Init(&dl->chat, dl->physical, NULL, NULL);
891 chat_Init(&dl->chat, dl->physical);
893
894 log_Printf(LogPHASE, "%s: Cloned in %s state\n",
895 dl->name, datalink_State(dl));
896
897 return dl;
898}
899
900struct datalink *
901datalink_Destroy(struct datalink *dl)
902{
903 struct datalink *result;
904
905 if (dl->state != DATALINK_CLOSED) {
906 log_Printf(LogERROR, "Oops, destroying a datalink in state %s\n",
907 datalink_State(dl));
908 switch (dl->state) {
909 case DATALINK_HANGUP:
910 case DATALINK_DIAL:
911 case DATALINK_LOGIN:
892
893 log_Printf(LogPHASE, "%s: Cloned in %s state\n",
894 dl->name, datalink_State(dl));
895
896 return dl;
897}
898
899struct datalink *
900datalink_Destroy(struct datalink *dl)
901{
902 struct datalink *result;
903
904 if (dl->state != DATALINK_CLOSED) {
905 log_Printf(LogERROR, "Oops, destroying a datalink in state %s\n",
906 datalink_State(dl));
907 switch (dl->state) {
908 case DATALINK_HANGUP:
909 case DATALINK_DIAL:
910 case DATALINK_LOGIN:
912 chat_Destroy(&dl->chat); /* Gotta blat the timers ! */
911 chat_Finish(&dl->chat); /* Gotta blat the timers ! */
913 break;
914 }
915 }
916
912 break;
913 }
914 }
915
916 chat_Destroy(&dl->chat);
917 timer_Stop(&dl->dial.timer);
918 result = dl->next;
919 physical_Destroy(dl->physical);
920 free(dl->name);
921 free(dl);
922
923 return result;
924}

--- 397 unchanged lines hidden (view full) ---

1322
1323 copy = dl->chap.auth.cfg.fsm;
1324 chap_Init(&dl->chap, dl->physical);
1325 dl->chap.auth.cfg.fsm = copy;
1326
1327 cbcp_Init(&dl->cbcp, dl->physical);
1328
1329 memset(&dl->chat, '\0', sizeof dl->chat); /* Force buf{start,end} reset */
917 timer_Stop(&dl->dial.timer);
918 result = dl->next;
919 physical_Destroy(dl->physical);
920 free(dl->name);
921 free(dl);
922
923 return result;
924}

--- 397 unchanged lines hidden (view full) ---

1322
1323 copy = dl->chap.auth.cfg.fsm;
1324 chap_Init(&dl->chap, dl->physical);
1325 dl->chap.auth.cfg.fsm = copy;
1326
1327 cbcp_Init(&dl->cbcp, dl->physical);
1328
1329 memset(&dl->chat, '\0', sizeof dl->chat); /* Force buf{start,end} reset */
1330 chat_Init(&dl->chat, dl->physical, NULL, NULL);
1330 chat_Init(&dl->chat, dl->physical);
1331
1332 log_Printf(LogPHASE, "%s: Transferred in %s state\n",
1333 dl->name, datalink_State(dl));
1334 }
1335
1336 return dl;
1337}
1338

--- 91 unchanged lines hidden ---
1331
1332 log_Printf(LogPHASE, "%s: Transferred in %s state\n",
1333 dl->name, datalink_State(dl));
1334 }
1335
1336 return dl;
1337}
1338

--- 91 unchanged lines hidden ---