datalink.h revision 37007
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 *
2637007Sbrian *	$Id: datalink.h,v 1.3 1998/05/28 23:15:35 brian Exp $
2736285Sbrian */
2836285Sbrian
2936285Sbrian#define DATALINK_CLOSED  (0)
3036285Sbrian#define DATALINK_OPENING (1)
3136285Sbrian#define DATALINK_HANGUP  (2)
3236285Sbrian#define DATALINK_DIAL    (3)
3336285Sbrian#define DATALINK_LOGIN   (4)
3436285Sbrian#define DATALINK_READY   (5)
3536285Sbrian#define DATALINK_LCP     (6)
3636285Sbrian#define DATALINK_AUTH    (7)
3736285Sbrian#define DATALINK_OPEN    (8)
3836285Sbrian
3937007Sbrian#define DATALINK_MAXNAME (20)   /* Maximum datalink::name length */
4036285Sbrian
4137007Sbrian/* How to close the link */
4237007Sbrian#define CLOSE_NORMAL		0
4337007Sbrian#define CLOSE_STAYDOWN		1
4437007Sbrian#define CLOSE_LCP		2
4537007Sbrian
4636285Sbrianstruct iovec;
4736285Sbrianstruct prompt;
4836285Sbrianstruct physical;
4936285Sbrianstruct bundle;
5036285Sbrian
5136285Sbrianstruct datalink {
5236285Sbrian  struct descriptor desc;       /* We play either a physical or a chat */
5336285Sbrian  int state;			/* Our DATALINK_* state */
5436285Sbrian  struct physical *physical;	/* Our link */
5536285Sbrian
5636285Sbrian  struct chat chat;		/* For bringing the link up & down */
5736285Sbrian
5837007Sbrian  unsigned stayonline : 1;	/* stay online when LCP is closed ? */
5936285Sbrian  struct {
6036285Sbrian    unsigned run : 1;		/* run scripts ? */
6136285Sbrian    unsigned packetmode : 1;	/* Go into packet mode after login ? */
6236285Sbrian  } script;
6336285Sbrian
6436285Sbrian  struct pppTimer dial_timer;	/* For timing between opens & scripts */
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 */
7836285Sbrian      int timeout;		/* Redial timeout value (end of phone list) */
7936285Sbrian    } dial;
8036285Sbrian    struct {
8136285Sbrian      int max;			/* initially try again this number of times */
8236285Sbrian      int timeout;		/* Timeout before reconnect on carrier loss */
8336285Sbrian    } reconnect;
8436285Sbrian  } cfg;			/* All our config data is in here */
8536285Sbrian
8636285Sbrian  struct {
8736285Sbrian    char list[SCRIPT_LEN];	/* copy of cfg.list for strsep() */
8836285Sbrian    char *next;			/* Next phone from the list */
8936285Sbrian    char *alt;			/* Next phone from the list */
9036285Sbrian    const char *chosen;		/* Chosen phone number after DIAL */
9136285Sbrian  } phone;
9236285Sbrian
9336285Sbrian  int dial_tries;		/* currently try again this number of times */
9436285Sbrian  unsigned reconnect_tries;	/* currently try again this number of times */
9536285Sbrian
9636285Sbrian  char *name;			/* Our name */
9736285Sbrian
9836285Sbrian  struct peerid peer;		/* Peer identification */
9936285Sbrian
10036285Sbrian  struct fsm_parent fsmp;	   /* Our callback functions */
10136285Sbrian  const struct fsm_parent *parent; /* Our parent */
10236285Sbrian
10336285Sbrian  struct authinfo pap;             /* Authentication using pap */
10436285Sbrian  struct chap chap;                /* Authentication using chap */
10536285Sbrian
10636285Sbrian  struct mp_link mp;               /* multilink data */
10736285Sbrian
10836285Sbrian  struct bundle *bundle;	   /* for the moment */
10936285Sbrian  struct datalink *next;	   /* Next in the list */
11036285Sbrian};
11136285Sbrian
11236285Sbrian#define descriptor2datalink(d) \
11336285Sbrian  ((d)->type == DATALINK_DESCRIPTOR ? (struct datalink *)(d) : NULL)
11436285Sbrian
11536285Sbrianextern struct datalink *datalink_Create(const char *name, struct bundle *, int);
11636285Sbrianextern struct datalink *datalink_Clone(struct datalink *, const char *);
11736285Sbrianextern struct datalink *iov2datalink(struct bundle *, struct iovec *, int *,
11836285Sbrian                                     int, int);
11936450Sbrianextern int datalink2iov(struct datalink *, struct iovec *, int *, int, pid_t);
12036285Sbrianextern struct datalink *datalink_Destroy(struct datalink *);
12136285Sbrianextern void datalink_GotAuthname(struct datalink *, const char *, int);
12236285Sbrianextern void datalink_Up(struct datalink *, int, int);
12336285Sbrianextern void datalink_Close(struct datalink *, int);
12436285Sbrianextern void datalink_Down(struct datalink *, int);
12536285Sbrianextern void datalink_StayDown(struct datalink *);
12637007Sbrianextern void datalink_DontHangup(struct datalink *);
12736285Sbrianextern void datalink_AuthOk(struct datalink *);
12836285Sbrianextern void datalink_AuthNotOk(struct datalink *);
12936285Sbrianextern int datalink_Show(struct cmdargs const *);
13036285Sbrianextern int datalink_SetRedial(struct cmdargs const *);
13136285Sbrianextern int datalink_SetReconnect(struct cmdargs const *);
13236285Sbrianextern const char *datalink_State(struct datalink *);
13336285Sbrianextern void datalink_Rename(struct datalink *, const char *);
13436285Sbrianextern char *datalink_NextName(struct datalink *);
13536285Sbrianextern int datalink_RemoveFromSet(struct datalink *, fd_set *, fd_set *,
13636285Sbrian                                  fd_set *);
13736285Sbrianextern int datalink_SetMode(struct datalink *, int);
138