1706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh/* 2706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Written by Eivind Eklund <eivind@yes.no> 3706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * for Yes Interactive 4706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 5706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Copyright (C) 1998, Yes Interactive. All rights reserved. 6706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 7706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Redistribution and use in any form is permitted. Redistribution in 8706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * source form should include the above copyright and this set of 9706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * conditions, because large sections american law seems to have been 10706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * created by a bunch of jerks on drugs that are now illegal, forcing 11706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * me to include this copyright-stuff instead of placing this in the 12706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * public domain. The name of of 'Yes Interactive' or 'Eivind Eklund' 13706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * may not be used to endorse or promote products derived from this 14706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * software without specific prior written permission. 15706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 16706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 17706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 18706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 19706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * $FreeBSD: src/usr.sbin/ppp/physical.h,v 1.28.24.1 2010/12/21 17:10:29 kensmith Exp $ 20706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 21706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh */ 22706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 23706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct datalink; 24706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct bundle; 25706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct iovec; 26706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct physical; 27706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct bundle; 28706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct ccp; 29706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct cmdargs; 30706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 31706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh/* Device types (don't use zero, it'll be confused with NULL in physical2iov */ 32706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define I4B_DEVICE 1 33706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define TTY_DEVICE 2 34706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define TCP_DEVICE 3 35706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define UDP_DEVICE 4 36706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define ETHER_DEVICE 5 37706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define EXEC_DEVICE 6 38706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define ATM_DEVICE 7 39706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define NG_DEVICE 8 40706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 41706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh/* Returns from awaitcarrier() */ 42706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define CARRIER_PENDING 1 43706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define CARRIER_OK 2 44706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define CARRIER_LOST 3 45706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 46706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh/* A cd ``necessity'' value */ 47706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define CD_VARIABLE 0 48706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define CD_REQUIRED 1 49706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define CD_NOTREQUIRED 2 50706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define CD_DEFAULT 3 51706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 52706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct cd { 53706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unsigned necessity : 2; /* A CD_ value */ 54706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int delay; /* Wait this many seconds after login script */ 55706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}; 56706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 57706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct device { 58706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int type; 59706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh const char *name; 60706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh u_short mtu; 61706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct cd cd; 62706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 63706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int (*awaitcarrier)(struct physical *); 64706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int (*removefromset)(struct physical *, fd_set *, fd_set *, fd_set *); 65706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int (*raw)(struct physical *); 66706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh void (*offline)(struct physical *); 67706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh void (*cooked)(struct physical *); 68706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh void (*setasyncparams)(struct physical *, u_int32_t, u_int32_t); 69706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh void (*stoptimer)(struct physical *); 70706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh void (*destroy)(struct physical *); 71706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ssize_t (*read)(struct physical *, void *, size_t); 72706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ssize_t (*write)(struct physical *, const void *, size_t); 73706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh void (*device2iov)(struct device *, struct iovec *, int *, int, int *, int *); 74706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unsigned (*speed)(struct physical *); 75706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh const char *(*openinfo)(struct physical *); 76706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int (*slot)(struct physical *); 77706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}; 78706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 79706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct physical { 80706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct link link; 81706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct fdescriptor desc; 82706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int type; /* What sort of PHYS_* link are we ? */ 83706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct async async; /* Our async state */ 84706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct hdlc hdlc; /* Our hdlc state */ 85706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int fd; /* File descriptor for this device */ 86706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct mbuf *out; /* mbuf that suffered a short write */ 87706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int connect_count; 88706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct datalink *dl; /* my owner */ 89706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 90706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct { 91706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh u_char buf[MAX_MRU]; /* Our input data buffer */ 92706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh size_t sz; 93706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } input; 94706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 95706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct { 96706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh char full[DEVICE_LEN]; /* Our current device name */ 97706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh char *base; 98706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } name; 99706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 100706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh time_t Utmp; /* Are we in utmp ? */ 101706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh pid_t session_owner; /* HUP this when closing the link */ 102706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 103706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct device *handler; /* device specific handler */ 104706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 105706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct { 106706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unsigned rts_cts : 1; /* Is rts/cts enabled ? */ 107706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unsigned nonstandard_pppoe : 1; /* Is PPPoE mode nonstandard */ 108706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unsigned pppoe_configured : 1; /* temporary hack */ 109706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unsigned parity; /* What parity is enabled? (tty flags) */ 110706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unsigned speed; /* tty speed */ 111706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 112706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh char devlist[LINE_LEN]; /* NUL separated list of devices */ 113706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int ndev; /* number of devices in list */ 114706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct cd cd; 115706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } cfg; 116706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}; 117706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 118706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define field2phys(fp, name) \ 119706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ((struct physical *)((char *)fp - (int)(&((struct physical *)0)->name))) 120706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 121706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define link2physical(l) \ 122706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ((l)->type == PHYSICAL_LINK ? field2phys(l, link) : NULL) 123706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 124706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define descriptor2physical(d) \ 125706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ((d)->type == PHYSICAL_DESCRIPTOR ? field2phys(d, desc) : NULL) 126706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 127706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define PHYSICAL_NOFORCE 1 128706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define PHYSICAL_FORCE_ASYNC 2 129706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define PHYSICAL_FORCE_SYNC 3 130706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define PHYSICAL_FORCE_SYNCNOACF 4 131706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 132706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern struct physical *physical_Create(struct datalink *, int); 133706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_Open(struct physical *); 134706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_Raw(struct physical *); 135706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern unsigned physical_GetSpeed(struct physical *); 136706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_SetSpeed(struct physical *, unsigned); 137706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_SetParity(struct physical *, const char *); 138706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_SetRtsCts(struct physical *, int); 139706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_SetSync(struct physical *); 140706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_ShowStatus(struct cmdargs const *); 141706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_Offline(struct physical *); 142706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_Close(struct physical *); 143706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_Destroy(struct physical *); 144706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern struct physical *iov2physical(struct datalink *, struct iovec *, int *, 145706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int, int, int *, int *); 146706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical2iov(struct physical *, struct iovec *, int *, int, int *, 147706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int *); 148706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern const char *physical_LockedDevice(struct physical *); 149706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_ChangedPid(struct physical *, pid_t); 150706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 151706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_IsSync(struct physical *); 152706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern u_short physical_DeviceMTU(struct physical *); 153706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern const char *physical_GetDevice(struct physical *); 154706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_SetDeviceList(struct physical *, int, const char *const *); 155706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_SetDevice(struct physical *, const char *); 156706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 157706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern ssize_t physical_Read(struct physical *, void *, size_t); 158706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern ssize_t physical_Write(struct physical *, const void *, size_t); 159706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_doUpdateSet(struct fdescriptor *, fd_set *, fd_set *, 160706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh fd_set *, int *, int); 161706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_IsSet(struct fdescriptor *, const fd_set *); 162706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_DescriptorRead(struct fdescriptor *, struct bundle *, 163706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh const fd_set *); 164706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_Login(struct physical *, const char *); 165706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_RemoveFromSet(struct physical *, fd_set *, fd_set *, 166706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh fd_set *); 167706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_SetMode(struct physical *, int); 168706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_DeleteQueue(struct physical *); 169706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_SetupStack(struct physical *, const char *, int); 170706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_StopDeviceTimer(struct physical *); 171706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern unsigned physical_MaxDeviceSize(void); 172706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_AwaitCarrier(struct physical *); 173706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_SetDescriptor(struct physical *); 174706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern void physical_SetAsyncParams(struct physical *, u_int32_t, u_int32_t); 175706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_Slot(struct physical *); 176706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehextern int physical_SetPPPoEnonstandard(struct physical *, int); 177