datalink.h revision 49472
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 *
2649472Sbrian *	$Id: datalink.h,v 1.7 1999/03/04 17:42:15 brian Exp $
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)
3449472Sbrian#define DATALINK_LOGIN   (5)
3549472Sbrian#define DATALINK_READY   (6)
3649472Sbrian#define DATALINK_LCP     (7)
3749472Sbrian#define DATALINK_AUTH    (8)
3849472Sbrian#define DATALINK_CBCP    (9)
3949472Sbrian#define DATALINK_OPEN    (10)
4036285Sbrian
4137007Sbrian#define DATALINK_MAXNAME (20)   /* Maximum datalink::name length */
4236285Sbrian
4337007Sbrian/* How to close the link */
4437007Sbrian#define CLOSE_NORMAL		0
4537007Sbrian#define CLOSE_STAYDOWN		1
4637007Sbrian#define CLOSE_LCP		2
4737007Sbrian
4836285Sbrianstruct iovec;
4936285Sbrianstruct prompt;
5036285Sbrianstruct physical;
5136285Sbrianstruct bundle;
5236285Sbrian
5336285Sbrianstruct datalink {
5436285Sbrian  struct descriptor desc;       /* We play either a physical or a chat */
5536285Sbrian  int state;			/* Our DATALINK_* state */
5636285Sbrian  struct physical *physical;	/* Our link */
5736285Sbrian
5836285Sbrian  struct chat chat;		/* For bringing the link up & down */
5936285Sbrian
6037007Sbrian  unsigned stayonline : 1;	/* stay online when LCP is closed ? */
6136285Sbrian  struct {
6236285Sbrian    unsigned run : 1;		/* run scripts ? */
6336285Sbrian    unsigned packetmode : 1;	/* Go into packet mode after login ? */
6436285Sbrian  } script;
6536285Sbrian
6636285Sbrian  struct {
6736285Sbrian    struct {
6836285Sbrian      char dial[SCRIPT_LEN];	/* dial */
6936285Sbrian      char login[SCRIPT_LEN];	/* login */
7036285Sbrian      char hangup[SCRIPT_LEN];	/* hangup */
7136285Sbrian    } script;
7236285Sbrian    struct {
7336285Sbrian      char list[SCRIPT_LEN];	/* Telephone Numbers */
7436285Sbrian    } phone;
7536285Sbrian    struct {
7636285Sbrian      int max;			/* initially try again this number of times */
7736285Sbrian      int next_timeout;		/* Redial next timeout value */
7844468Sbrian      int inc;			/* Increment timeout by `inc' each time read */
7944468Sbrian      int maxinc;		/* Maximum number of increments */
8036285Sbrian      int timeout;		/* Redial timeout value (end of phone list) */
8136285Sbrian    } dial;
8236285Sbrian    struct {
8336285Sbrian      int max;			/* initially try again this number of times */
8436285Sbrian      int timeout;		/* Timeout before reconnect on carrier loss */
8536285Sbrian    } reconnect;
8638174Sbrian    struct callback callback;	/* Direction depends on physical type */
8738174Sbrian    struct cbcpcfg cbcp;	/* Direction depends on phys type & callback */
8836285Sbrian  } cfg;			/* All our config data is in here */
8936285Sbrian
9036285Sbrian  struct {
9136285Sbrian    char list[SCRIPT_LEN];	/* copy of cfg.list for strsep() */
9236285Sbrian    char *next;			/* Next phone from the list */
9344468Sbrian    char *alt;			/* Alternate (after fail) phone from the list */
9436285Sbrian    const char *chosen;		/* Chosen phone number after DIAL */
9536285Sbrian  } phone;
9636285Sbrian
9738174Sbrian  struct cbcp cbcp;
9838174Sbrian
9944468Sbrian  struct {
10044468Sbrian    struct pppTimer timer;	/* For timing between close & open */
10144468Sbrian    int tries;			/* currently try again this number of times */
10244468Sbrian    int incs;			/* # times our timeout has been incremented */
10344468Sbrian  } dial;
10444468Sbrian
10536285Sbrian  unsigned reconnect_tries;	/* currently try again this number of times */
10636285Sbrian
10736285Sbrian  char *name;			/* Our name */
10836285Sbrian
10936285Sbrian  struct peerid peer;		/* Peer identification */
11036285Sbrian
11136285Sbrian  struct fsm_parent fsmp;	   /* Our callback functions */
11236285Sbrian  const struct fsm_parent *parent; /* Our parent */
11336285Sbrian
11436285Sbrian  struct authinfo pap;             /* Authentication using pap */
11536285Sbrian  struct chap chap;                /* Authentication using chap */
11636285Sbrian
11736285Sbrian  struct mp_link mp;               /* multilink data */
11836285Sbrian
11936285Sbrian  struct bundle *bundle;	   /* for the moment */
12036285Sbrian  struct datalink *next;	   /* Next in the list */
12136285Sbrian};
12236285Sbrian
12336285Sbrian#define descriptor2datalink(d) \
12436285Sbrian  ((d)->type == DATALINK_DESCRIPTOR ? (struct datalink *)(d) : NULL)
12536285Sbrian
12636285Sbrianextern struct datalink *datalink_Create(const char *name, struct bundle *, int);
12736285Sbrianextern struct datalink *datalink_Clone(struct datalink *, const char *);
12836285Sbrianextern struct datalink *iov2datalink(struct bundle *, struct iovec *, int *,
12936285Sbrian                                     int, int);
13036450Sbrianextern int datalink2iov(struct datalink *, struct iovec *, int *, int, pid_t);
13136285Sbrianextern struct datalink *datalink_Destroy(struct datalink *);
13243693Sbrianextern void datalink_GotAuthname(struct datalink *, const char *);
13336285Sbrianextern void datalink_Up(struct datalink *, int, int);
13436285Sbrianextern void datalink_Close(struct datalink *, int);
13536285Sbrianextern void datalink_Down(struct datalink *, int);
13636285Sbrianextern void datalink_StayDown(struct datalink *);
13737007Sbrianextern void datalink_DontHangup(struct datalink *);
13836285Sbrianextern void datalink_AuthOk(struct datalink *);
13936285Sbrianextern void datalink_AuthNotOk(struct datalink *);
14038174Sbrianextern void datalink_NCPUp(struct datalink *);
14138174Sbrianextern void datalink_CBCPComplete(struct datalink *);
14238174Sbrianextern void datalink_CBCPFailed(struct datalink *);
14336285Sbrianextern int datalink_Show(struct cmdargs const *);
14436285Sbrianextern int datalink_SetRedial(struct cmdargs const *);
14536285Sbrianextern int datalink_SetReconnect(struct cmdargs const *);
14636285Sbrianextern const char *datalink_State(struct datalink *);
14736285Sbrianextern void datalink_Rename(struct datalink *, const char *);
14836285Sbrianextern char *datalink_NextName(struct datalink *);
14936285Sbrianextern int datalink_RemoveFromSet(struct datalink *, fd_set *, fd_set *,
15036285Sbrian                                  fd_set *);
15136285Sbrianextern int datalink_SetMode(struct datalink *, int);
15244468Sbrianextern int datalink_GetDialTimeout(struct datalink *);
15349472Sbrianextern const char *datalink_ChoosePhoneNumber(struct datalink *);
154