]> git.karo-electronics.de Git - karo-tx-redboot.git/blob - packages/net/lwip_tcpip/v2_0/src/netif/ppp/ppp.h
Initial revision
[karo-tx-redboot.git] / packages / net / lwip_tcpip / v2_0 / src / netif / ppp / ppp.h
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)++ << 8; \
184     (s) |= *(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)++ << 8; \
193     (l) |= *(cp)++; (l) <<= 8; \
194     (l) |= *(cp)++; (l) <<= 8; \
195     (l) |= *(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 */