13006ec67SBrian Somers /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 31de7b4b8SPedro F. Giffuni * 43006ec67SBrian Somers * Copyright (c) 1998 Brian Somers <brian@Awfulhak.org> 53006ec67SBrian Somers * All rights reserved. 63006ec67SBrian Somers * 73006ec67SBrian Somers * Redistribution and use in source and binary forms, with or without 83006ec67SBrian Somers * modification, are permitted provided that the following conditions 93006ec67SBrian Somers * are met: 103006ec67SBrian Somers * 1. Redistributions of source code must retain the above copyright 113006ec67SBrian Somers * notice, this list of conditions and the following disclaimer. 123006ec67SBrian Somers * 2. Redistributions in binary form must reproduce the above copyright 133006ec67SBrian Somers * notice, this list of conditions and the following disclaimer in the 143006ec67SBrian Somers * documentation and/or other materials provided with the distribution. 153006ec67SBrian Somers * 163006ec67SBrian Somers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 173006ec67SBrian Somers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 183006ec67SBrian Somers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 193006ec67SBrian Somers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 203006ec67SBrian Somers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 213006ec67SBrian Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 223006ec67SBrian Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 233006ec67SBrian Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 243006ec67SBrian Somers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 253006ec67SBrian Somers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 263006ec67SBrian Somers * SUCH DAMAGE. 273006ec67SBrian Somers */ 283006ec67SBrian Somers 293006ec67SBrian Somers #define DATALINK_CLOSED (0) 303006ec67SBrian Somers #define DATALINK_OPENING (1) 313006ec67SBrian Somers #define DATALINK_HANGUP (2) 323006ec67SBrian Somers #define DATALINK_DIAL (3) 33eb6e5e05SBrian Somers #define DATALINK_CARRIER (4) 34c116e0c0SBrian Somers #define DATALINK_LOGOUT (5) 35c116e0c0SBrian Somers #define DATALINK_LOGIN (6) 36c116e0c0SBrian Somers #define DATALINK_READY (7) 37c116e0c0SBrian Somers #define DATALINK_LCP (8) 38c116e0c0SBrian Somers #define DATALINK_AUTH (9) 39c116e0c0SBrian Somers #define DATALINK_CBCP (10) 40c116e0c0SBrian Somers #define DATALINK_OPEN (11) 413006ec67SBrian Somers 429c81b87dSBrian Somers #define DATALINK_MAXNAME (20) /* Maximum datalink::name length */ 439c81b87dSBrian Somers 449c81b87dSBrian Somers /* How to close the link */ 459c81b87dSBrian Somers #define CLOSE_NORMAL 0 469c81b87dSBrian Somers #define CLOSE_STAYDOWN 1 479c81b87dSBrian Somers #define CLOSE_LCP 2 4896c9bb21SBrian Somers 4996c9bb21SBrian Somers struct iovec; 502764b86aSBrian Somers struct prompt; 512764b86aSBrian Somers struct physical; 522764b86aSBrian Somers struct bundle; 532764b86aSBrian Somers 543006ec67SBrian Somers struct datalink { 55f013f33eSBrian Somers struct fdescriptor desc; /* We play either a physical or a chat */ 56057f1760SBrian Somers unsigned state; /* Our DATALINK_* state */ 573006ec67SBrian Somers struct physical *physical; /* Our link */ 585b8b8060SBrian Somers 593006ec67SBrian Somers struct chat chat; /* For bringing the link up & down */ 6073a13b5cSBrian Somers 619c81b87dSBrian Somers unsigned stayonline : 1; /* stay online when LCP is closed ? */ 625b8b8060SBrian Somers struct { 63c5a5a6caSBrian Somers unsigned run : 1; /* run scripts ? */ 64c5a5a6caSBrian Somers unsigned packetmode : 1; /* Go into packet mode after login ? */ 655b8b8060SBrian Somers } script; 665b8b8060SBrian Somers 6773a13b5cSBrian Somers struct { 6873a13b5cSBrian Somers struct { 69c116e0c0SBrian Somers char dial[SCRIPT_LEN]; 70c116e0c0SBrian Somers char login[SCRIPT_LEN]; 71c116e0c0SBrian Somers char logout[SCRIPT_LEN]; 72c116e0c0SBrian Somers char hangup[SCRIPT_LEN]; 73c116e0c0SBrian Somers } script; /* various chat scripts */ 74f9545805SBrian Somers struct { 75f9545805SBrian Somers char list[SCRIPT_LEN]; /* Telephone Numbers */ 76f9545805SBrian Somers } phone; 77565e35e5SBrian Somers struct { 78565e35e5SBrian Somers int max; /* initially try again this number of times */ 79565e35e5SBrian Somers int next_timeout; /* Redial next timeout value */ 80c11e57a3SBrian Somers int inc; /* Increment timeout by `inc' each time read */ 81c11e57a3SBrian Somers int maxinc; /* Maximum number of increments */ 82565e35e5SBrian Somers int timeout; /* Redial timeout value (end of phone list) */ 83565e35e5SBrian Somers } dial; 84565e35e5SBrian Somers struct { 85565e35e5SBrian Somers int max; /* initially try again this number of times */ 86565e35e5SBrian Somers int timeout; /* Timeout before reconnect on carrier loss */ 87565e35e5SBrian Somers } reconnect; 8892b09558SBrian Somers struct callback callback; /* Direction depends on physical type */ 8992b09558SBrian Somers struct cbcpcfg cbcp; /* Direction depends on phys type & callback */ 9073a13b5cSBrian Somers } cfg; /* All our config data is in here */ 9173a13b5cSBrian Somers 92f9545805SBrian Somers struct { 93f9545805SBrian Somers char list[SCRIPT_LEN]; /* copy of cfg.list for strsep() */ 94f9545805SBrian Somers char *next; /* Next phone from the list */ 95c11e57a3SBrian Somers char *alt; /* Alternate (after fail) phone from the list */ 96cdbbb6b5SBrian Somers const char *chosen; /* Chosen phone number after DIAL */ 97f9545805SBrian Somers } phone; 98f9545805SBrian Somers 9992b09558SBrian Somers struct cbcp cbcp; 10092b09558SBrian Somers 101c11e57a3SBrian Somers struct { 102c11e57a3SBrian Somers struct pppTimer timer; /* For timing between close & open */ 103c11e57a3SBrian Somers int tries; /* currently try again this number of times */ 104c11e57a3SBrian Somers int incs; /* # times our timeout has been incremented */ 105c11e57a3SBrian Somers } dial; 106c11e57a3SBrian Somers 10773a13b5cSBrian Somers unsigned reconnect_tries; /* currently try again this number of times */ 1083006ec67SBrian Somers 1093006ec67SBrian Somers char *name; /* Our name */ 1103006ec67SBrian Somers 111643f4904SBrian Somers struct peerid peer; /* Peer identification */ 112643f4904SBrian Somers 1133b0f8d2eSBrian Somers struct fsm_parent fsmp; /* Our callback functions */ 1146d666775SBrian Somers const struct fsm_parent *parent; /* Our parent */ 1153006ec67SBrian Somers 116e2ebb036SBrian Somers struct authinfo pap; /* Authentication using pap */ 117e2ebb036SBrian Somers struct chap chap; /* Authentication using chap */ 118e2ebb036SBrian Somers 1193b0f8d2eSBrian Somers struct mp_link mp; /* multilink data */ 1203b0f8d2eSBrian Somers 1213006ec67SBrian Somers struct bundle *bundle; /* for the moment */ 1223006ec67SBrian Somers struct datalink *next; /* Next in the list */ 1233006ec67SBrian Somers }; 1243006ec67SBrian Somers 1253006ec67SBrian Somers #define descriptor2datalink(d) \ 1263006ec67SBrian Somers ((d)->type == DATALINK_DESCRIPTOR ? (struct datalink *)(d) : NULL) 1273006ec67SBrian Somers 1286f384573SBrian Somers extern struct datalink *datalink_Create(const char *name, struct bundle *, int); 129cd7bd93aSBrian Somers extern struct datalink *datalink_Clone(struct datalink *, const char *); 13096c9bb21SBrian Somers extern struct datalink *iov2datalink(struct bundle *, struct iovec *, int *, 13187c3786eSBrian Somers int, int, int *, int *); 13287c3786eSBrian Somers extern int datalink2iov(struct datalink *, struct iovec *, int *, int, int *, 1332cb305afSBrian Somers int *); 1343006ec67SBrian Somers extern struct datalink *datalink_Destroy(struct datalink *); 135f0cdd9c0SBrian Somers extern void datalink_GotAuthname(struct datalink *, const char *); 136c5a5a6caSBrian Somers extern void datalink_Up(struct datalink *, int, int); 1373006ec67SBrian Somers extern void datalink_Close(struct datalink *, int); 1383006ec67SBrian Somers extern void datalink_Down(struct datalink *, int); 1393006ec67SBrian Somers extern void datalink_StayDown(struct datalink *); 1409c81b87dSBrian Somers extern void datalink_DontHangup(struct datalink *); 141e2ebb036SBrian Somers extern void datalink_AuthOk(struct datalink *); 142e2ebb036SBrian Somers extern void datalink_AuthNotOk(struct datalink *); 14392b09558SBrian Somers extern void datalink_NCPUp(struct datalink *); 14492b09558SBrian Somers extern void datalink_CBCPComplete(struct datalink *); 14592b09558SBrian Somers extern void datalink_CBCPFailed(struct datalink *); 146643f4904SBrian Somers extern int datalink_Show(struct cmdargs const *); 147565e35e5SBrian Somers extern int datalink_SetRedial(struct cmdargs const *); 148565e35e5SBrian Somers extern int datalink_SetReconnect(struct cmdargs const *); 149643f4904SBrian Somers extern const char *datalink_State(struct datalink *); 15058d55334SBrian Somers extern void datalink_Rename(struct datalink *, const char *); 151ea722969SBrian Somers extern int datalink_RemoveFromSet(struct datalink *, fd_set *, fd_set *, 152ea722969SBrian Somers fd_set *); 153dd0645c5SBrian Somers extern int datalink_SetMode(struct datalink *, int); 154c11e57a3SBrian Somers extern int datalink_GetDialTimeout(struct datalink *); 155eb6e5e05SBrian Somers extern const char *datalink_ChoosePhoneNumber(struct datalink *); 156fb11a9c2SBrian Somers extern void datalink_ComeDown(struct datalink *, int); 157