~ubuntu-branches/ubuntu/trusty/virtualbox-lts-xenial/trusty-updates

« back to all changes in this revision

Viewing changes to src/VBox/Devices/Network/lwip/src/netif/ppp/ppp.h

  • Committer: Package Import Robot
  • Author(s): Gianfranco Costamagna
  • Date: 2016-02-23 14:28:26 UTC
  • Revision ID: package-import@ubuntu.com-20160223142826-bdu69el2z6wa2a44
Tags: upstream-4.3.36-dfsg
ImportĀ upstreamĀ versionĀ 4.3.36-dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*****************************************************************************
 
2
* ppp.h - Network Point to Point Protocol header file.
 
3
*
 
4
* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
 
5
* portions Copyright (c) 1997 Global Election Systems Inc.
 
6
*
 
7
* The authors hereby grant permission to use, copy, modify, distribute,
 
8
* and license this software and its documentation for any purpose, provided
 
9
* that existing copyright notices are retained in all copies and that this
 
10
* notice and the following disclaimer are included verbatim in any 
 
11
* distributions. No written agreement, license, or royalty fee is required
 
12
* for any of the authorized uses.
 
13
*
 
14
* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
 
15
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
16
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
 
17
* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 
18
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
19
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
20
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
21
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
22
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 
23
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
24
*
 
25
******************************************************************************
 
26
* REVISION HISTORY
 
27
*
 
28
* 03-01-01 Marc Boucher <marc@mbsi.ca>
 
29
*   Ported to lwIP.
 
30
* 97-11-05 Guy Lancaster <glanca@gesn.com>, Global Election Systems Inc.
 
31
*       Original derived from BSD codes.
 
32
*****************************************************************************/
 
33
 
 
34
#ifndef PPP_H
 
35
#define PPP_H
 
36
 
 
37
#include "lwip/opt.h"
 
38
 
 
39
#if PPP_SUPPORT > 0
 
40
#include "lwip/sio.h"
 
41
#include "lwip/api.h"
 
42
#include "lwip/sockets.h"
 
43
#include "lwip/stats.h"
 
44
#include "lwip/mem.h"
 
45
#include "lwip/tcpip.h"
 
46
#include "lwip/netif.h"
 
47
 
 
48
/*
 
49
 * pppd.h - PPP daemon global declarations.
 
50
 *
 
51
 * Copyright (c) 1989 Carnegie Mellon University.
 
52
 * All rights reserved.
 
53
 *
 
54
 * Redistribution and use in source and binary forms are permitted
 
55
 * provided that the above copyright notice and this paragraph are
 
56
 * duplicated in all such forms and that any documentation,
 
57
 * advertising materials, and other materials related to such
 
58
 * distribution and use acknowledge that the software was developed
 
59
 * by Carnegie Mellon University.  The name of the
 
60
 * University may not be used to endorse or promote products derived
 
61
 * from this software without specific prior written permission.
 
62
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 
63
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 
64
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 
65
 *
 
66
 */
 
67
/*
 
68
 * ppp_defs.h - PPP definitions.
 
69
 *
 
70
 * Copyright (c) 1994 The Australian National University.
 
71
 * All rights reserved.
 
72
 *
 
73
 * Permission to use, copy, modify, and distribute this software and its
 
74
 * documentation is hereby granted, provided that the above copyright
 
75
 * notice appears in all copies.  This software is provided without any
 
76
 * warranty, express or implied. The Australian National University
 
77
 * makes no representations about the suitability of this software for
 
78
 * any purpose.
 
79
 *
 
80
 * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
 
81
 * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 
82
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
 
83
 * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
 
84
 * OF SUCH DAMAGE.
 
85
 *
 
86
 * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
 
87
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 
88
 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 
89
 * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
 
90
 * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
 
91
 * OR MODIFICATIONS.
 
92
 */
 
93
 
 
94
#define TIMEOUT(f, a, t)    sys_untimeout((f), (a)), sys_timeout((t)*1000, (f), (a))
 
95
#define UNTIMEOUT(f, a)     sys_untimeout((f), (a))
 
96
 
 
97
 
 
98
# ifndef __u_char_defined
 
99
 
 
100
/* Type definitions for BSD code. */
 
101
typedef unsigned long u_long;
 
102
typedef unsigned int u_int;
 
103
typedef unsigned short u_short;
 
104
typedef unsigned char u_char;
 
105
 
 
106
#endif
 
107
 
 
108
/*
 
109
 * Constants and structures defined by the internet system,
 
110
 * Per RFC 790, September 1981, and numerous additions.
 
111
 */
 
112
 
 
113
/*
 
114
 * The basic PPP frame.
 
115
 */
 
116
#define PPP_HDRLEN  4       /* octets for standard ppp header */
 
117
#define PPP_FCSLEN  2       /* octets for FCS */
 
118
 
 
119
 
 
120
/*
 
121
 * Significant octet values.
 
122
 */
 
123
#define PPP_ALLSTATIONS 0xff    /* All-Stations broadcast address */
 
124
#define PPP_UI          0x03    /* Unnumbered Information */
 
125
#define PPP_FLAG        0x7e    /* Flag Sequence */
 
126
#define PPP_ESCAPE      0x7d    /* Asynchronous Control Escape */
 
127
#define PPP_TRANS       0x20    /* Asynchronous transparency modifier */
 
128
 
 
129
/*
 
130
 * Protocol field values.
 
131
 */
 
132
#define PPP_IP          0x21    /* Internet Protocol */
 
133
#define PPP_AT          0x29    /* AppleTalk Protocol */
 
134
#define PPP_VJC_COMP    0x2d    /* VJ compressed TCP */
 
135
#define PPP_VJC_UNCOMP  0x2f    /* VJ uncompressed TCP */
 
136
#define PPP_COMP        0xfd    /* compressed packet */
 
137
#define PPP_IPCP        0x8021  /* IP Control Protocol */
 
138
#define PPP_ATCP        0x8029  /* AppleTalk Control Protocol */
 
139
#define PPP_CCP         0x80fd  /* Compression Control Protocol */
 
140
#define PPP_LCP         0xc021  /* Link Control Protocol */
 
141
#define PPP_PAP         0xc023  /* Password Authentication Protocol */
 
142
#define PPP_LQR         0xc025  /* Link Quality Report protocol */
 
143
#define PPP_CHAP        0xc223  /* Cryptographic Handshake Auth. Protocol */
 
144
#define PPP_CBCP        0xc029  /* Callback Control Protocol */
 
145
 
 
146
/*
 
147
 * Values for FCS calculations.
 
148
 */
 
149
#define PPP_INITFCS 0xffff  /* Initial FCS value */
 
150
#define PPP_GOODFCS 0xf0b8  /* Good final FCS value */
 
151
#define PPP_FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
 
152
 
 
153
/*
 
154
 * Extended asyncmap - allows any character to be escaped.
 
155
 */
 
156
typedef u_char  ext_accm[32];
 
157
 
 
158
/*
 
159
 * What to do with network protocol (NP) packets.
 
160
 */
 
161
enum NPmode {
 
162
    NPMODE_PASS,        /* pass the packet through */
 
163
    NPMODE_DROP,        /* silently drop the packet */
 
164
    NPMODE_ERROR,       /* return an error */
 
165
    NPMODE_QUEUE        /* save it up for later. */
 
166
};
 
167
 
 
168
/*
 
169
 * Inline versions of get/put char/short/long.
 
170
 * Pointer is advanced; we assume that both arguments
 
171
 * are lvalues and will already be in registers.
 
172
 * cp MUST be u_char *.
 
173
 */
 
174
#define GETCHAR(c, cp) { \
 
175
    (c) = *(cp)++; \
 
176
}
 
177
#define PUTCHAR(c, cp) { \
 
178
    *(cp)++ = (u_char) (c); \
 
179
}
 
180
 
 
181
 
 
182
#define GETSHORT(s, cp) { \
 
183
    (s) = *(cp); (cp)++; (s) << 8; \
 
184
    (s) |= *(cp); (cp)++; \
 
185
}
 
186
#define PUTSHORT(s, cp) { \
 
187
    *(cp)++ = (u_char) ((s) >> 8); \
 
188
    *(cp)++ = (u_char) (s); \
 
189
}
 
190
 
 
191
#define GETLONG(l, cp) { \
 
192
    (l) = *(cp); (cp)++; (l) << 8; \
 
193
    (l) |= *(cp); (cp)++; (l) <<= 8; \
 
194
    (l) |= *(cp); (cp)++; (l) <<= 8; \
 
195
    (l) |= *(cp); (cp)++; \
 
196
}
 
197
#define PUTLONG(l, cp) { \
 
198
    *(cp)++ = (u_char) ((l) >> 24); \
 
199
    *(cp)++ = (u_char) ((l) >> 16); \
 
200
    *(cp)++ = (u_char) ((l) >> 8); \
 
201
    *(cp)++ = (u_char) (l); \
 
202
}
 
203
 
 
204
 
 
205
#define INCPTR(n, cp)   ((cp) += (n))
 
206
#define DECPTR(n, cp)   ((cp) -= (n))
 
207
 
 
208
#define BCMP(s0, s1, l)     memcmp((u_char *)(s0), (u_char *)(s1), (l))
 
209
#define BCOPY(s, d, l)      memcpy((d), (s), (l))
 
210
#define BZERO(s, n)         memset(s, 0, n)
 
211
#if PPP_DEBUG
 
212
#define PRINTMSG(m, l)  { m[l] = '\0'; ppp_trace(LOG_INFO, "Remote message: %s\n", m); }
 
213
#else
 
214
#define PRINTMSG(m, l)
 
215
#endif
 
216
 
 
217
/*
 
218
 * MAKEHEADER - Add PPP Header fields to a packet.
 
219
 */
 
220
#define MAKEHEADER(p, t) { \
 
221
    PUTCHAR(PPP_ALLSTATIONS, p); \
 
222
    PUTCHAR(PPP_UI, p); \
 
223
    PUTSHORT(t, p); }
 
224
 
 
225
/*************************
 
226
*** PUBLIC DEFINITIONS ***
 
227
*************************/
 
228
 
 
229
/* Error codes. */
 
230
#define PPPERR_NONE 0                           /* No error. */
 
231
#define PPPERR_PARAM -1                         /* Invalid parameter. */
 
232
#define PPPERR_OPEN -2                          /* Unable to open PPP session. */
 
233
#define PPPERR_DEVICE -3                        /* Invalid I/O device for PPP. */
 
234
#define PPPERR_ALLOC -4                         /* Unable to allocate resources. */
 
235
#define PPPERR_USER -5                          /* User interrupt. */
 
236
#define PPPERR_CONNECT -6                       /* Connection lost. */
 
237
#define PPPERR_AUTHFAIL -7                      /* Failed authentication challenge. */
 
238
#define PPPERR_PROTOCOL -8                      /* Failed to meet protocol. */
 
239
 
 
240
/*
 
241
 * PPP IOCTL commands.
 
242
 */
 
243
/*
 
244
 * Get the up status - 0 for down, non-zero for up.  The argument must
 
245
 * point to an int.
 
246
 */
 
247
#define PPPCTLG_UPSTATUS 100    /* Get the up status - 0 down else up */
 
248
#define PPPCTLS_ERRCODE 101             /* Set the error code */
 
249
#define PPPCTLG_ERRCODE 102             /* Get the error code */
 
250
#define PPPCTLG_FD              103             /* Get the fd associated with the ppp */
 
251
 
 
252
/************************
 
253
*** PUBLIC DATA TYPES ***
 
254
************************/
 
255
 
 
256
/*
 
257
 * The following struct gives the addresses of procedures to call
 
258
 * for a particular protocol.
 
259
 */
 
260
struct protent {
 
261
    u_short protocol;       /* PPP protocol number */
 
262
    /* Initialization procedure */
 
263
    void (*init) (int unit);
 
264
    /* Process a received packet */
 
265
    void (*input) (int unit, u_char *pkt, int len);
 
266
    /* Process a received protocol-reject */
 
267
    void (*protrej) (int unit);
 
268
    /* Lower layer has come up */
 
269
    void (*lowerup) (int unit);
 
270
    /* Lower layer has gone down */
 
271
    void (*lowerdown) (int unit);
 
272
    /* Open the protocol */
 
273
    void (*open) (int unit);
 
274
    /* Close the protocol */
 
275
    void (*close) (int unit, char *reason);
 
276
#if 0
 
277
    /* Print a packet in readable form */
 
278
    int  (*printpkt) (u_char *pkt, int len,
 
279
              void (*printer) (void *, char *, ...),
 
280
              void *arg);
 
281
    /* Process a received data packet */
 
282
    void (*datainput) (int unit, u_char *pkt, int len);
 
283
#endif
 
284
    int  enabled_flag;      /* 0 iff protocol is disabled */
 
285
    char *name;         /* Text name of protocol */
 
286
#if 0
 
287
    /* Check requested options, assign defaults */
 
288
    void (*check_options) (u_long);
 
289
    /* Configure interface for demand-dial */
 
290
    int  (*demand_conf) (int unit);
 
291
    /* Say whether to bring up link for this pkt */
 
292
    int  (*active_pkt) (u_char *pkt, int len);
 
293
#endif
 
294
};
 
295
 
 
296
/*
 
297
 * The following structure records the time in seconds since
 
298
 * the last NP packet was sent or received.
 
299
 */
 
300
struct ppp_idle {
 
301
    u_short xmit_idle;      /* seconds since last NP packet sent */
 
302
    u_short recv_idle;      /* seconds since last NP packet received */
 
303
};
 
304
 
 
305
struct ppp_settings {
 
306
 
 
307
        u_int  disable_defaultip : 1;   /* Don't use hostname for default IP addrs */
 
308
        u_int  auth_required : 1;      /* Peer is required to authenticate */
 
309
        u_int  explicit_remote : 1;    /* remote_name specified with remotename opt */
 
310
        u_int  refuse_pap : 1;         /* Don't wanna auth. ourselves with PAP */
 
311
        u_int  refuse_chap : 1;        /* Don't wanna auth. ourselves with CHAP */
 
312
        u_int  usehostname : 1;        /* Use hostname for our_name */
 
313
        u_int  usepeerdns : 1;         /* Ask peer for DNS adds */
 
314
 
 
315
        u_short idle_time_limit; /* Shut down link if idle for this long */
 
316
        int  maxconnect;         /* Maximum connect time (seconds) */
 
317
 
 
318
        char user[MAXNAMELEN + 1];/* Username for PAP */
 
319
        char passwd[MAXSECRETLEN + 1];           /* Password for PAP, secret for CHAP */
 
320
        char our_name[MAXNAMELEN + 1];         /* Our name for authentication purposes */
 
321
        char remote_name[MAXNAMELEN + 1];      /* Peer's name for authentication */
 
322
};
 
323
 
 
324
struct ppp_addrs {
 
325
    struct ip_addr our_ipaddr, his_ipaddr, netmask, dns1, dns2;
 
326
};
 
327
 
 
328
/*****************************
 
329
*** PUBLIC DATA STRUCTURES ***
 
330
*****************************/
 
331
/* Buffers for outgoing packets. */
 
332
extern u_char outpacket_buf[NUM_PPP][PPP_MRU+PPP_HDRLEN];
 
333
 
 
334
extern struct ppp_settings ppp_settings;
 
335
 
 
336
extern struct protent *ppp_protocols[];/* Table of pointers to supported protocols */
 
337
 
 
338
 
 
339
/***********************
 
340
*** PUBLIC FUNCTIONS ***
 
341
***********************/
 
342
 
 
343
/* Initialize the PPP subsystem. */
 
344
void pppInit(void);
 
345
 
 
346
/* Warning: Using PPPAUTHTYPE_ANY might have security consequences.
 
347
 * RFC 1994 says:
 
348
 *
 
349
 * In practice, within or associated with each PPP server, there is a
 
350
 * database which associates "user" names with authentication
 
351
 * information ("secrets").  It is not anticipated that a particular
 
352
 * named user would be authenticated by multiple methods.  This would
 
353
 * make the user vulnerable to attacks which negotiate the least secure
 
354
 * method from among a set (such as PAP rather than CHAP).  If the same
 
355
 * secret was used, PAP would reveal the secret to be used later with
 
356
 * CHAP.
 
357
 *
 
358
 * Instead, for each user name there should be an indication of exactly
 
359
 * one method used to authenticate that user name.  If a user needs to
 
360
 * make use of different authentication methods under different
 
361
 * circumstances, then distinct user names SHOULD be employed, each of
 
362
 * which identifies exactly one authentication method.
 
363
 *
 
364
 */
 
365
enum pppAuthType {
 
366
    PPPAUTHTYPE_NONE,
 
367
    PPPAUTHTYPE_ANY,
 
368
    PPPAUTHTYPE_PAP,
 
369
    PPPAUTHTYPE_CHAP
 
370
};
 
371
 
 
372
void pppSetAuth(enum pppAuthType authType, const char *user, const char *passwd);
 
373
 
 
374
/*
 
375
 * Open a new PPP connection using the given I/O device.
 
376
 * This initializes the PPP control block but does not
 
377
 * attempt to negotiate the LCP session.
 
378
 * Return a new PPP connection descriptor on success or
 
379
 * an error code (negative) on failure. 
 
380
 */
 
381
int pppOpen(sio_fd_t fd, void (*linkStatusCB)(void *ctx, int errCode, void *arg), void *linkStatusCtx);
 
382
 
 
383
/*
 
384
 * Close a PPP connection and release the descriptor. 
 
385
 * Any outstanding packets in the queues are dropped.
 
386
 * Return 0 on success, an error code on failure. 
 
387
 */
 
388
int pppClose(int pd);
 
389
 
 
390
/*
 
391
 * Indicate to the PPP process that the line has disconnected.
 
392
 */
 
393
void pppSigHUP(int pd);
 
394
 
 
395
/*
 
396
 * Get and set parameters for the given connection.
 
397
 * Return 0 on success, an error code on failure. 
 
398
 */
 
399
int  pppIOCtl(int pd, int cmd, void *arg);
 
400
 
 
401
/*
 
402
 * Return the Maximum Transmission Unit for the given PPP connection.
 
403
 */
 
404
u_int pppMTU(int pd);
 
405
 
 
406
/*
 
407
 * Write n characters to a ppp link.
 
408
 *      RETURN: >= 0 Number of characters written
 
409
 *                       -1 Failed to write to device
 
410
 */
 
411
int pppWrite(int pd, const u_char *s, int n);
 
412
 
 
413
void pppMainWakeup(int pd);
 
414
 
 
415
/* Configure i/f transmit parameters */
 
416
void ppp_send_config (int, int, u32_t, int, int);
 
417
/* Set extended transmit ACCM */
 
418
void ppp_set_xaccm (int, ext_accm *);
 
419
/* Configure i/f receive parameters */
 
420
void ppp_recv_config (int, int, u32_t, int, int);
 
421
/* Find out how long link has been idle */
 
422
int  get_idle_time (int, struct ppp_idle *);
 
423
 
 
424
/* Configure VJ TCP header compression */
 
425
int  sifvjcomp (int, int, int, int);
 
426
/* Configure i/f down (for IP) */
 
427
int  sifup (int);               
 
428
/* Set mode for handling packets for proto */
 
429
int  sifnpmode (int u, int proto, enum NPmode mode);
 
430
/* Configure i/f down (for IP) */
 
431
int  sifdown (int);     
 
432
/* Configure IP addresses for i/f */
 
433
int  sifaddr (int, u32_t, u32_t, u32_t, u32_t, u32_t);
 
434
/* Reset i/f IP addresses */
 
435
int  cifaddr (int, u32_t, u32_t);
 
436
/* Create default route through i/f */
 
437
int  sifdefaultroute (int, u32_t, u32_t);
 
438
/* Delete default route through i/f */
 
439
int  cifdefaultroute (int, u32_t, u32_t);
 
440
 
 
441
/* Get appropriate netmask for address */
 
442
u32_t GetMask (u32_t); 
 
443
 
 
444
#endif /* PPP_SUPPORT */
 
445
 
 
446
#endif /* PPP_H */