xref: /freebsd/usr.sbin/ppp/bundle.h (revision 783d3ff6d7fae619db8a7990b8a6387de0c677b5)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #define	PHASE_DEAD		0	/* Link is dead */
30 #define	PHASE_ESTABLISH		1	/* Establishing link */
31 #define	PHASE_AUTHENTICATE	2	/* Being authenticated */
32 #define	PHASE_NETWORK		3	/* We're alive ! */
33 #define	PHASE_TERMINATE		4	/* Terminating link */
34 
35 /* cfg.opt bit settings */
36 #define OPT_FILTERDECAP		1
37 #define OPT_FORCE_SCRIPTS	2 /* force chat scripts */
38 #define OPT_IDCHECK		3
39 #define OPT_IFACEALIAS		4
40 #ifndef NOINET6
41 #define OPT_IPCP		5
42 #define OPT_IPV6CP		6
43 #endif
44 #define OPT_KEEPSESSION		7
45 #define OPT_LOOPBACK		8
46 #define OPT_NAS_IP_ADDRESS	9
47 #define OPT_NAS_IDENTIFIER	10
48 #define OPT_PASSWDAUTH		11
49 #define OPT_PROXY		12
50 #define OPT_PROXYALL		13
51 #define OPT_SROUTES		14
52 #define OPT_TCPMSSFIXUP		15
53 #define OPT_THROUGHPUT		16
54 #define OPT_UTMP		17
55 #define OPT_MAX			17
56 
57 #define MAX_ENDDISC_CLASS 5
58 
59 #define Enabled(b, o)		((b)->cfg.optmask & (1ull << (o)))
60 #define opt_enable(b, o)	((b)->cfg.optmask |= (1ull << (o)))
61 #define opt_disable(b, o)	((b)->cfg.optmask &= ~(1ull << (o)))
62 
63 /* AutoAdjust() values */
64 #define AUTO_UP		1
65 #define AUTO_DOWN	2
66 
67 struct sockaddr_un;
68 struct datalink;
69 struct physical;
70 struct link;
71 struct server;
72 struct prompt;
73 struct iface;
74 
75 struct bundle {
76   struct fdescriptor desc;    /* really all our datalinks */
77   int unit;                   /* The device/interface unit number */
78 
79   struct {
80     char Name[20];            /* The /dev/XXXX name */
81     int fd;                   /* The /dev/XXXX descriptor */
82     unsigned header : 1;      /* Family header sent & received ? */
83   } dev;
84 
85   u_long bandwidth;           /* struct tuninfo speed */
86   struct iface *iface;        /* Interface information */
87 
88   int routing_seq;            /* The current routing sequence number */
89   u_int phase;                /* Curent phase */
90 
91   struct {
92     int all;                  /* Union of all physical::type's */
93     int open;                 /* Union of all open physical::type's */
94   } phys_type;
95 
96   unsigned CleaningUp : 1;    /* Going to exit.... */
97   unsigned NatEnabled : 1;    /* Are we using libalias ? */
98 
99   struct fsm_parent fsm;      /* Our callback functions */
100   struct datalink *links;     /* Our data links */
101 
102   time_t upat;                /* When the link came up */
103 
104   struct {
105     struct {
106       unsigned timeout;          /* NCP Idle timeout value */
107       unsigned min_timeout;      /* Don't idle out before this */
108     } idle;
109     struct {
110       char name[AUTHLEN];        /* PAP/CHAP system name */
111       char key[AUTHLEN];         /* PAP/CHAP key */
112     } auth;
113     unsigned long long optmask;  /* Uses OPT_ bits from above */
114     char label[50];              /* last thing `load'ed */
115     u_short ifqueue;             /* Interface queue size */
116 
117     struct {
118       unsigned timeout;          /* How long to leave the output queue choked */
119     } choked;
120   } cfg;
121 
122   struct ncp ncp;
123 
124   struct {
125     struct filter in;         /* incoming packet filter */
126     struct filter out;        /* outgoing packet filter */
127     struct filter dial;       /* dial-out packet filter */
128     struct filter alive;      /* keep-alive packet filter */
129   } filter;
130 
131   struct {
132     struct pppTimer timer;    /* timeout after cfg.idle_timeout */
133     time_t done;
134   } idle;
135 
136 #ifndef NORADIUS
137   struct {
138     struct pppTimer timer;
139     time_t done;
140   } session;
141 #endif
142 
143   struct {
144     int fd;                   /* write status here */
145   } notify;
146 
147   struct {
148     struct pppTimer timer;    /* choked output queue timer */
149   } choked;
150 
151 #ifndef NORADIUS
152   struct radius radius;       /* Info retrieved from radius server */
153   struct radacct radacct;
154 #ifndef NOINET6
155   struct radacct radacct6;
156 #endif
157 #endif
158 };
159 
160 #define descriptor2bundle(d) \
161   ((d)->type == BUNDLE_DESCRIPTOR ? (struct bundle *)(d) : NULL)
162 
163 extern struct bundle *bundle_Create(const char *, int, int);
164 extern void bundle_Destroy(struct bundle *);
165 extern const char *bundle_PhaseName(struct bundle *);
166 #define bundle_Phase(b) ((b)->phase)
167 extern void bundle_NewPhase(struct bundle *, u_int);
168 extern void bundle_LinksRemoved(struct bundle *);
169 extern void bundle_Close(struct bundle *, const char *, int);
170 extern void bundle_Down(struct bundle *, int);
171 extern void bundle_Open(struct bundle *, const char *, int, int);
172 extern void bundle_LinkClosed(struct bundle *, struct datalink *);
173 
174 extern int bundle_ShowLinks(struct cmdargs const *);
175 extern int bundle_ShowStatus(struct cmdargs const *);
176 extern void bundle_StartIdleTimer(struct bundle *, unsigned secs);
177 extern void bundle_SetIdleTimer(struct bundle *, unsigned, unsigned);
178 extern void bundle_StopIdleTimer(struct bundle *);
179 extern int bundle_IsDead(struct bundle *);
180 extern struct datalink *bundle2datalink(struct bundle *, const char *);
181 
182 #ifndef NORADIUS
183 extern void bundle_StartSessionTimer(struct bundle *, unsigned secs);
184 extern void bundle_StopSessionTimer(struct bundle *);
185 #endif
186 
187 extern void bundle_RegisterDescriptor(struct bundle *, struct fdescriptor *);
188 extern void bundle_UnRegisterDescriptor(struct bundle *, struct fdescriptor *);
189 
190 extern void bundle_SetTtyCommandMode(struct bundle *, struct datalink *);
191 
192 extern int bundle_DatalinkClone(struct bundle *, struct datalink *,
193                                 const char *);
194 extern void bundle_DatalinkRemove(struct bundle *, struct datalink *);
195 extern void bundle_CleanDatalinks(struct bundle *);
196 extern void bundle_SetLabel(struct bundle *, const char *);
197 extern const char *bundle_GetLabel(struct bundle *);
198 extern void bundle_SendDatalink(struct datalink *, int, struct sockaddr_un *);
199 extern int bundle_LinkSize(void);
200 extern void bundle_ReceiveDatalink(struct bundle *, int);
201 extern int bundle_SetMode(struct bundle *, struct datalink *, int);
202 extern int bundle_RenameDatalink(struct bundle *, struct datalink *,
203                                  const char *);
204 extern void bundle_setsid(struct bundle *, int);
205 extern void bundle_LockTun(struct bundle *);
206 extern unsigned bundle_HighestState(struct bundle *);
207 extern int bundle_Exception(struct bundle *, int);
208 extern void bundle_AdjustFilters(struct bundle *, struct ncpaddr *,
209                                  struct ncpaddr *);
210 extern void bundle_AdjustDNS(struct bundle *);
211 extern void bundle_CalculateBandwidth(struct bundle *);
212 extern void bundle_AutoAdjust(struct bundle *, int, int);
213 extern int bundle_WantAutoloadTimer(struct bundle *);
214 extern void bundle_ChangedPID(struct bundle *);
215 extern void bundle_Notify(struct bundle *, char);
216 extern int bundle_Uptime(struct bundle *);
217