/*-
 * Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $FreeBSD: src/usr.sbin/ppp/datalink.h,v 1.16.26.1 2010/12/21 17:10:29 kensmith Exp $
 */

#define DATALINK_CLOSED  (0)
#define DATALINK_OPENING (1)
#define DATALINK_HANGUP  (2)
#define DATALINK_DIAL    (3)
#define DATALINK_CARRIER (4)
#define DATALINK_LOGOUT  (5)
#define DATALINK_LOGIN   (6)
#define DATALINK_READY   (7)
#define DATALINK_LCP     (8)
#define DATALINK_AUTH    (9)
#define DATALINK_CBCP    (10)
#define DATALINK_OPEN    (11)

#define DATALINK_MAXNAME (20)   /* Maximum datalink::name length */

/* How to close the link */
#define CLOSE_NORMAL		0
#define CLOSE_STAYDOWN		1
#define CLOSE_LCP		2

struct iovec;
struct prompt;
struct physical;
struct bundle;

struct datalink {
  struct fdescriptor desc;	/* We play either a physical or a chat */
  unsigned state;		/* Our DATALINK_* state */
  struct physical *physical;	/* Our link */

  struct chat chat;		/* For bringing the link up & down */

  unsigned stayonline : 1;	/* stay online when LCP is closed ? */
  struct {
    unsigned run : 1;		/* run scripts ? */
    unsigned packetmode : 1;	/* Go into packet mode after login ? */
  } script;

  struct {
    struct {
      char dial[SCRIPT_LEN];
      char login[SCRIPT_LEN];
      char logout[SCRIPT_LEN];
      char hangup[SCRIPT_LEN];
    } script;			/* various chat scripts */
    struct {
      char list[SCRIPT_LEN];	/* Telephone Numbers */
    } phone;
    struct {
      int max;			/* initially try again this number of times */
      int next_timeout;		/* Redial next timeout value */
      int inc;			/* Increment timeout by `inc' each time read */
      int maxinc;		/* Maximum number of increments */
      int timeout;		/* Redial timeout value (end of phone list) */
    } dial;
    struct {
      int max;			/* initially try again this number of times */
      int timeout;		/* Timeout before reconnect on carrier loss */
    } reconnect;
    struct callback callback;	/* Direction depends on physical type */
    struct cbcpcfg cbcp;	/* Direction depends on phys type & callback */
  } cfg;			/* All our config data is in here */

  struct {
    char list[SCRIPT_LEN];	/* copy of cfg.list for strsep() */
    char *next;			/* Next phone from the list */
    char *alt;			/* Alternate (after fail) phone from the list */
    const char *chosen;		/* Chosen phone number after DIAL */
  } phone;

  struct cbcp cbcp;

  struct {
    struct pppTimer timer;	/* For timing between close & open */
    int tries;			/* currently try again this number of times */
    int incs;			/* # times our timeout has been incremented */
  } dial;

  unsigned reconnect_tries;	/* currently try again this number of times */

  char *name;			/* Our name */

  struct peerid peer;		/* Peer identification */

  struct fsm_parent fsmp;	   /* Our callback functions */
  const struct fsm_parent *parent; /* Our parent */

  struct authinfo pap;             /* Authentication using pap */
  struct chap chap;                /* Authentication using chap */

  struct mp_link mp;               /* multilink data */

  struct bundle *bundle;	   /* for the moment */
  struct datalink *next;	   /* Next in the list */
};

#define descriptor2datalink(d) \
  ((d)->type == DATALINK_DESCRIPTOR ? (struct datalink *)(d) : NULL)

extern struct datalink *datalink_Create(const char *name, struct bundle *, int);
extern struct datalink *datalink_Clone(struct datalink *, const char *);
extern struct datalink *iov2datalink(struct bundle *, struct iovec *, int *,
                                     int, int, int *, int *);
extern int datalink2iov(struct datalink *, struct iovec *, int *, int, int *,
                        int *);
extern struct datalink *datalink_Destroy(struct datalink *);
extern void datalink_GotAuthname(struct datalink *, const char *);
extern void datalink_Up(struct datalink *, int, int);
extern void datalink_Close(struct datalink *, int);
extern void datalink_Down(struct datalink *, int);
extern void datalink_StayDown(struct datalink *);
extern void datalink_DontHangup(struct datalink *);
extern void datalink_AuthOk(struct datalink *);
extern void datalink_AuthNotOk(struct datalink *);
extern void datalink_NCPUp(struct datalink *);
extern void datalink_CBCPComplete(struct datalink *);
extern void datalink_CBCPFailed(struct datalink *);
extern int datalink_Show(struct cmdargs const *);
extern int datalink_SetRedial(struct cmdargs const *);
extern int datalink_SetReconnect(struct cmdargs const *);
extern const char *datalink_State(struct datalink *);
extern void datalink_Rename(struct datalink *, const char *);
extern int datalink_RemoveFromSet(struct datalink *, fd_set *, fd_set *,
                                  fd_set *);
extern int datalink_SetMode(struct datalink *, int);
extern int datalink_GetDialTimeout(struct datalink *);
extern const char *datalink_ChoosePhoneNumber(struct datalink *);
extern void datalink_ComeDown(struct datalink *, int);
