136285Sbrian/*-
236285Sbrian * Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
336285Sbrian * All rights reserved.
436285Sbrian *
536285Sbrian * Redistribution and use in source and binary forms, with or without
636285Sbrian * modification, are permitted provided that the following conditions
736285Sbrian * are met:
836285Sbrian * 1. Redistributions of source code must retain the above copyright
936285Sbrian *    notice, this list of conditions and the following disclaimer.
1036285Sbrian * 2. Redistributions in binary form must reproduce the above copyright
1136285Sbrian *    notice, this list of conditions and the following disclaimer in the
1236285Sbrian *    documentation and/or other materials provided with the distribution.
1336285Sbrian *
1436285Sbrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1536285Sbrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1636285Sbrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1736285Sbrian * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1836285Sbrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1936285Sbrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2036285Sbrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2136285Sbrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2236285Sbrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2336285Sbrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2436285Sbrian * SUCH DAMAGE.
2536285Sbrian *
2650479Speter * $FreeBSD$
2736285Sbrian */
2836285Sbrian
2936285Sbrian#define DATALINK_CLOSED  (0)
3036285Sbrian#define DATALINK_OPENING (1)
3136285Sbrian#define DATALINK_HANGUP  (2)
3236285Sbrian#define DATALINK_DIAL    (3)
3349472Sbrian#define DATALINK_CARRIER (4)
3452488Sbrian#define DATALINK_LOGOUT  (5)
3552488Sbrian#define DATALINK_LOGIN   (6)
3652488Sbrian#define DATALINK_READY   (7)
3752488Sbrian#define DATALINK_LCP     (8)
3852488Sbrian#define DATALINK_AUTH    (9)
3952488Sbrian#define DATALINK_CBCP    (10)
4052488Sbrian#define DATALINK_OPEN    (11)
4136285Sbrian
4237007Sbrian#define DATALINK_MAXNAME (20)   /* Maximum datalink::name length */
4336285Sbrian
4437007Sbrian/* How to close the link */
4537007Sbrian#define CLOSE_NORMAL		0
4637007Sbrian#define CLOSE_STAYDOWN		1
4737007Sbrian#define CLOSE_LCP		2
4837007Sbrian
4936285Sbrianstruct iovec;
5036285Sbrianstruct prompt;
5136285Sbrianstruct physical;
5236285Sbrianstruct bundle;
5336285Sbrian
5436285Sbrianstruct datalink {
5593418Sbrian  struct fdescriptor desc;	/* We play either a physical or a chat */
56134789Sbrian  unsigned state;		/* Our DATALINK_* state */
5736285Sbrian  struct physical *physical;	/* Our link */
5836285Sbrian
5936285Sbrian  struct chat chat;		/* For bringing the link up & down */
6036285Sbrian
6137007Sbrian  unsigned stayonline : 1;	/* stay online when LCP is closed ? */
6236285Sbrian  struct {
6336285Sbrian    unsigned run : 1;		/* run scripts ? */
6436285Sbrian    unsigned packetmode : 1;	/* Go into packet mode after login ? */
6536285Sbrian  } script;
6636285Sbrian
6736285Sbrian  struct {
6836285Sbrian    struct {
6952488Sbrian      char dial[SCRIPT_LEN];
7052488Sbrian      char login[SCRIPT_LEN];
7152488Sbrian      char logout[SCRIPT_LEN];
7252488Sbrian      char hangup[SCRIPT_LEN];
7352488Sbrian    } script;			/* various chat scripts */
7436285Sbrian    struct {
7536285Sbrian      char list[SCRIPT_LEN];	/* Telephone Numbers */
7636285Sbrian    } phone;
7736285Sbrian    struct {
7836285Sbrian      int max;			/* initially try again this number of times */
7936285Sbrian      int next_timeout;		/* Redial next timeout value */
8044468Sbrian      int inc;			/* Increment timeout by `inc' each time read */
8144468Sbrian      int maxinc;		/* Maximum number of increments */
8236285Sbrian      int timeout;		/* Redial timeout value (end of phone list) */
8336285Sbrian    } dial;
8436285Sbrian    struct {
8536285Sbrian      int max;			/* initially try again this number of times */
8636285Sbrian      int timeout;		/* Timeout before reconnect on carrier loss */
8736285Sbrian    } reconnect;
8838174Sbrian    struct callback callback;	/* Direction depends on physical type */
8938174Sbrian    struct cbcpcfg cbcp;	/* Direction depends on phys type & callback */
9036285Sbrian  } cfg;			/* All our config data is in here */
9136285Sbrian
9236285Sbrian  struct {
9336285Sbrian    char list[SCRIPT_LEN];	/* copy of cfg.list for strsep() */
9436285Sbrian    char *next;			/* Next phone from the list */
9544468Sbrian    char *alt;			/* Alternate (after fail) phone from the list */
9636285Sbrian    const char *chosen;		/* Chosen phone number after DIAL */
9736285Sbrian  } phone;
9836285Sbrian
9938174Sbrian  struct cbcp cbcp;
10038174Sbrian
10144468Sbrian  struct {
10244468Sbrian    struct pppTimer timer;	/* For timing between close & open */
10344468Sbrian    int tries;			/* currently try again this number of times */
10444468Sbrian    int incs;			/* # times our timeout has been incremented */
10544468Sbrian  } dial;
10644468Sbrian
10736285Sbrian  unsigned reconnect_tries;	/* currently try again this number of times */
10836285Sbrian
10936285Sbrian  char *name;			/* Our name */
11036285Sbrian
11136285Sbrian  struct peerid peer;		/* Peer identification */
11236285Sbrian
11336285Sbrian  struct fsm_parent fsmp;	   /* Our callback functions */
11436285Sbrian  const struct fsm_parent *parent; /* Our parent */
11536285Sbrian
11636285Sbrian  struct authinfo pap;             /* Authentication using pap */
11736285Sbrian  struct chap chap;                /* Authentication using chap */
11836285Sbrian
11936285Sbrian  struct mp_link mp;               /* multilink data */
12036285Sbrian
12136285Sbrian  struct bundle *bundle;	   /* for the moment */
12236285Sbrian  struct datalink *next;	   /* Next in the list */
12336285Sbrian};
12436285Sbrian
12536285Sbrian#define descriptor2datalink(d) \
12636285Sbrian  ((d)->type == DATALINK_DESCRIPTOR ? (struct datalink *)(d) : NULL)
12736285Sbrian
12836285Sbrianextern struct datalink *datalink_Create(const char *name, struct bundle *, int);
12936285Sbrianextern struct datalink *datalink_Clone(struct datalink *, const char *);
13036285Sbrianextern struct datalink *iov2datalink(struct bundle *, struct iovec *, int *,
13152942Sbrian                                     int, int, int *, int *);
13252942Sbrianextern int datalink2iov(struct datalink *, struct iovec *, int *, int, int *,
13353684Sbrian                        int *);
13436285Sbrianextern struct datalink *datalink_Destroy(struct datalink *);
13543693Sbrianextern void datalink_GotAuthname(struct datalink *, const char *);
13636285Sbrianextern void datalink_Up(struct datalink *, int, int);
13736285Sbrianextern void datalink_Close(struct datalink *, int);
13836285Sbrianextern void datalink_Down(struct datalink *, int);
13936285Sbrianextern void datalink_StayDown(struct datalink *);
14037007Sbrianextern void datalink_DontHangup(struct datalink *);
14136285Sbrianextern void datalink_AuthOk(struct datalink *);
14236285Sbrianextern void datalink_AuthNotOk(struct datalink *);
14338174Sbrianextern void datalink_NCPUp(struct datalink *);
14438174Sbrianextern void datalink_CBCPComplete(struct datalink *);
14538174Sbrianextern void datalink_CBCPFailed(struct datalink *);
14636285Sbrianextern int datalink_Show(struct cmdargs const *);
14736285Sbrianextern int datalink_SetRedial(struct cmdargs const *);
14836285Sbrianextern int datalink_SetReconnect(struct cmdargs const *);
14936285Sbrianextern const char *datalink_State(struct datalink *);
15036285Sbrianextern void datalink_Rename(struct datalink *, const char *);
15136285Sbrianextern int datalink_RemoveFromSet(struct datalink *, fd_set *, fd_set *,
15236285Sbrian                                  fd_set *);
15336285Sbrianextern int datalink_SetMode(struct datalink *, int);
15444468Sbrianextern int datalink_GetDialTimeout(struct datalink *);
15549472Sbrianextern const char *datalink_ChoosePhoneNumber(struct datalink *);
15693418Sbrianextern void datalink_ComeDown(struct datalink *, int);
157