annotate packages/net/ppp/current/src/sys-ecos.c @ 1586:e0d88dc6a92f

Added PPP network support.
author nickg
date Wed, 14 Apr 2004 15:08:56 +0000
parents
children 2e1811d4f88c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1586
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
2 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
3 // src/sys-ecos.c
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
4 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
5 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
6 //####ECOSGPLCOPYRIGHTBEGIN####
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
7 // -------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
8 // This file is part of eCos, the Embedded Configurable Operating System.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
9 // Portions created by Nick Garnett are
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
10 // Copyright (C) 2003, 2004 eCosCentric Ltd.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
11 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
12 // eCos is free software; you can redistribute it and/or modify it under
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
13 // the terms of the GNU General Public License as published by the Free
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
14 // Software Foundation; either version 2 or (at your option) any later version.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
15 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
16 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
17 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
18 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
19 // for more details.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
20 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
21 // You should have received a copy of the GNU General Public License along
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
22 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
23 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
24 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
25 // As a special exception, if other files instantiate templates or use macros
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
26 // or inline functions from this file, or you compile this file and link it
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
27 // with other works to produce a work based on this file, this file does not
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
28 // by itself cause the resulting work to be covered by the GNU General Public
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
29 // License. However the source code for this file must still be made available
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
30 // in accordance with section (3) of the GNU General Public License.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
31 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
32 // This exception does not invalidate any other reasons why a work based on
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
33 // this file might be covered by the GNU General Public License.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
34 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
35 // -------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
36 //####ECOSGPLCOPYRIGHTEND####
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
37 //####BSDCOPYRIGHTBEGIN####
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
38 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
39 // -------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
40 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
41 // Portions of this software may have been derived from OpenBSD,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
42 // FreeBSD or other sources, and are covered by the appropriate
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
43 // copyright disclaimers included herein.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
44 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
45 // -------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
46 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
47 //####BSDCOPYRIGHTEND####
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
48 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
49
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
50 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
51 * sys-bsd.c - System-dependent procedures for setting up
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
52 * PPP interfaces on bsd-4.4-ish systems (including 386BSD, NetBSD, etc.)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
53 *
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
54 * Copyright (c) 1989 Carnegie Mellon University.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
55 * Copyright (c) 1995 The Australian National University.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
56 * All rights reserved.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
57 *
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
58 * Redistribution and use in source and binary forms are permitted
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
59 * provided that the above copyright notice and this paragraph are
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
60 * duplicated in all such forms and that any documentation,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
61 * advertising materials, and other materials related to such
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
62 * distribution and use acknowledge that the software was developed
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
63 * by Carnegie Mellon University and The Australian National University.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
64 * The names of the Universities may not be used to endorse or promote
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
65 * products derived from this software without specific prior written
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
66 * permission.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
67 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
68 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
69 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
70 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
71
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
72 #ifndef lint
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
73 //static char rcsid[] = "$FreeBSD: src/usr.sbin/pppd/sys-bsd.c,v 1.17 1999/08/28 01:19:08 peter Exp $";
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
74 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
75 /* $NetBSD: sys-bsd.c,v 1.1.1.3 1997/09/26 18:53:04 christos Exp $ */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
76
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
77 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
78 * TODO:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
79 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
80
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
81 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
82
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
83 #include <pkgconf/system.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
84 #include <pkgconf/net.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
85 #include <pkgconf/ppp.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
86
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
87 #include <stdio.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
88 #include <string.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
89 #include <stdlib.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
90 #include <unistd.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
91 #include <errno.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
92 #include <fcntl.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
93 #include <termios.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
94 #include <signal.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
95 #define _KERNEL 1
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
96 #include <sys/param.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
97 #undef _KERNEL
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
98 #include <sys/ioctl.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
99 #include <sys/types.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
100 #include <sys/socket.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
101 #include <sys/time.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
102 #include <sys/stat.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
103 #ifdef NetBSD1_2
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
104 #include <util.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
105 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
106 #ifdef PPP_FILTER
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
107 #include <net/bpf.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
108 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
109
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
110 #include <cyg/ppp/syslog.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
111
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
112 #include <net/if.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
113 #include <cyg/ppp/net/ppp_defs.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
114 #include <cyg/ppp/net/if_ppp.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
115 #include <net/route.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
116 #include <net/if_dl.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
117 #include <netinet/in.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
118
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
119 #ifdef IPX_CHANGE
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
120 #include <netipx/ipx.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
121 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
122
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
123 #if RTM_VERSION >= 3
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
124 #include <sys/param.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
125 #if defined(NetBSD) && (NetBSD >= 199703)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
126 #include <netinet/if_inarp.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
127 #else /* NetBSD 1.2D or later */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
128 #include <netinet/if_ether.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
129 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
130 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
131
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
132 #include "cyg/ppp/pppd.h"
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
133 #include "cyg/ppp/fsm.h"
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
134 #include "cyg/ppp/ipcp.h"
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
135
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
136 #include "cyg/ppp/ppp_io.h"
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
137
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
138 #include <cyg/ppp/ppp.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
139
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
140 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
141
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
142 static int rtm_seq;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
143
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
144 static cyg_io_handle_t ppp_handle; /* IO subsystem handle to PPP stream */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
145 struct tty ppp_tty; /* dummy TTY structure */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
146
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
147 static cyg_handle_t ppp_rtc;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
148 static cyg_resolution_t ppp_rtc_resolution;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
149
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
150 static int loop_slave = -1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
151 static int loop_master;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
152
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
153 static unsigned char inbuf[PPP_MTU + PPP_HDRLEN + 100]; /* buffer for chars read from input */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
154
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
155 static int sockfd = -1; /* socket for doing interface ioctls */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
156
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
157 static int if_is_up; /* the interface is currently up */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
158 static u_int32_t ifaddrs[2]; /* local and remote addresses we set */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
159 static u_int32_t default_route_gateway; /* gateway addr for default route */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
160 static u_int32_t proxy_arp_addr; /* remote addr for proxy arp */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
161
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
162 /* Prototypes for procedures local to this file. */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
163 static int dodefaultroute __P((u_int32_t, int));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
164 static int get_ether_addr __P((u_int32_t, struct sockaddr_dl *));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
165
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
166 static void wait_input_alarm(cyg_handle_t alarm, cyg_addrword_t data);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
167 #ifdef CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
168 void cyg_ppp_serial_callback( cyg_serial_line_status_t *s,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
169 CYG_ADDRWORD priv );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
170 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
171
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
172 u_int32_t netmask; /* IP netmask to set on interface */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
173
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
174 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
175 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
176 * sys_init - System-dependent initialization.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
177 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
178 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
179 sys_init()
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
180 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
181 if( sockfd == -1 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
182 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
183 /* Get an internet socket for doing socket ioctl's on. */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
184 if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
185 syslog(LOG_ERR, "Couldn't create IP socket: %d",errno);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
186 die(1);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
187 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
188 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
189
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
190 ppp_tty.pppd_wakeup = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
191 ppp_tty.pppd_thread_running = true;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
192
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
193 ppp_rtc = cyg_real_time_clock();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
194 ppp_rtc_resolution = cyg_clock_get_resolution( ppp_rtc );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
195
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
196 cyg_alarm_create( ppp_rtc,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
197 wait_input_alarm,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
198 (cyg_addrword_t)&ppp_tty,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
199 &ppp_tty.alarm,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
200 &ppp_tty.alarm_obj);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
201 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
202
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
203 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
204 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
205 * sys_cleanup - restore any system state we modified before exiting:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
206 * mark the interface down, delete default route and/or proxy arp entry.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
207 * This should call die() because it's called from die().
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
208 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
209 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
210 sys_cleanup()
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
211 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
212 struct ifreq ifr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
213
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
214 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
215 if (if_is_up) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
216 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
217 if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) >= 0
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
218 && ((ifr.ifr_flags & IFF_UP) != 0)) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
219 ifr.ifr_flags &= ~IFF_UP;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
220 ioctl(sockfd, SIOCSIFFLAGS, &ifr);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
221 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
222 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
223 if (ifaddrs[0] != 0)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
224 cifaddr(0, ifaddrs[0], ifaddrs[1]);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
225 if (default_route_gateway)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
226 cifdefaultroute(0, 0, default_route_gateway);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
227 if (proxy_arp_addr)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
228 cifproxyarp(0, proxy_arp_addr);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
229
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
230 if( sockfd != -1 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
231 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
232 close(sockfd);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
233 sockfd = -1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
234 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
235 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
236
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
237 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
238
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
239 #ifdef __ECOS
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
240
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
241 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
242 sys_exit(void)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
243 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
244 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
245 phase = PHASE_DEAD;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
246 while( ppp_tty.tx_thread_running )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
247 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
248 db_printf("kick tx thread\n");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
249 cyg_semaphore_post( &ppp_tty.tx_sem );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
250 cyg_thread_delay(100);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
251 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
252 ppp_tty.pppd_thread_running = false;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
253 cyg_thread_exit();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
254 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
255 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
256
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
257 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
258 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
259 * sys_close - Clean up in a child process before execing.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
260 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
261 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
262 sys_close()
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
263 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
264 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
265 if (loop_slave >= 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
266 close(loop_slave);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
267 close(loop_master);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
268 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
269 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
270
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
271 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
272 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
273 * sys_check_options - check the options that the user specified
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
274 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
275 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
276 sys_check_options()
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
277 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
278 //db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
279 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
280
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
281 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
282 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
283 * ppp_available - check whether the system has any ppp interfaces
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
284 * (in fact we check whether we can do an ioctl on ppp0).
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
285 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
286 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
287 ppp_available()
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
288 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
289 int s, ok;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
290 struct ifreq ifr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
291 extern char *no_ppp_msg;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
292
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
293 if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
294 return 1; /* can't tell */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
295
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
296 strncpy(ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
297 ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
298 close(s);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
299
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
300 no_ppp_msg = "\
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
301 This system lacks kernel support for PPP. To include PPP support\n\
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
302 in the kernel, please follow the steps detailed in the README.bsd\n\
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
303 file in the ppp-2.2 distribution.\n";
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
304 return ok;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
305 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
306
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
307 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
308 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
309 * establish_ppp - Turn the serial port into a ppp interface.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
310 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
311 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
312 establish_ppp(cyg_io_handle_t handle)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
313 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
314 int s;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
315 int x;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
316 int err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
317
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
318 //db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
319
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
320 ppp_handle = ppp_tty.t_handle = handle;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
321 ppp_tty.t_sc = NULL;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
322
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
323 s = splsoftnet();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
324
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
325 err = cyg_ppp_pppopen( &ppp_tty );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
326
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
327 if( err != 0 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
328 syslog( LOG_ERR, "Couldn't establish PPP interface: %d", err );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
329
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
330 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
331 * Enable debug in the driver if requested.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
332 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
333 if (kdebugflag) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
334 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCGFLAGS, (caddr_t) &x, 0)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
335 syslog(LOG_WARNING, "ioctl (PPPIOCGFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
336 } else {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
337 x |= (kdebugflag & 0xFF) * SC_DEBUG;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
338 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSFLAGS, (caddr_t) &x, 0)) < 0)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
339 syslog(LOG_WARNING, "ioctl(PPPIOCSFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
340 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
341 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
342
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
343 splx(s);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
344 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
345
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
346 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
347 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
348 * restore_loop - reattach the ppp unit to the loopback.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
349 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
350 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
351 restore_loop()
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
352 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
353 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
354 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
355
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
356
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
357 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
358 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
359 * disestablish_ppp - Restore the serial port to normal operation.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
360 * This shouldn't call die() because it's called from die().
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
361 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
362 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
363 disestablish_ppp(cyg_io_handle_t handle)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
364 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
365 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
366 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
367
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
368 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
369 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
370 * Check whether the link seems not to be 8-bit clean.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
371 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
372 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
373 clean_check()
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
374 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
375 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
376 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
377
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
378 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
379 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
380 * set_up_tty: Set up the serial port on `fd' for 8 bits, no parity,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
381 * at the requested speed, etc. If `local' is true, set CLOCAL
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
382 * regardless of whether the modem option was specified.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
383 *
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
384 * For *BSD, we assume that speed_t values numerically equal bits/second.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
385 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
386 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
387 set_up_tty(cyg_io_handle_t handle, int local)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
388 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
389 cyg_serial_info_t cfg;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
390 int err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
391 int len = sizeof(cfg);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
392
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
393 err = cyg_io_get_config( handle,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
394 CYG_IO_GET_CONFIG_SERIAL_INFO,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
395 &cfg,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
396 &len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
397
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
398 if( err != 0 ) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
399 syslog(LOG_ERR, "cyg_io_get_config: %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
400 die(1);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
401 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
402
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
403 switch ( flowctl )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
404 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
405 case CYG_PPP_FLOWCTL_DEFAULT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
406 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
407
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
408 case CYG_PPP_FLOWCTL_NONE:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
409 cfg.flags &= ~(CYGNUM_SERIAL_FLOW_RTSCTS_RX|CYGNUM_SERIAL_FLOW_RTSCTS_TX|
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
410 CYGNUM_SERIAL_FLOW_XONXOFF_RX|CYGNUM_SERIAL_FLOW_XONXOFF_TX);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
411 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
412
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
413 case CYG_PPP_FLOWCTL_HARDWARE:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
414 cfg.flags &= ~(CYGNUM_SERIAL_FLOW_XONXOFF_RX|CYGNUM_SERIAL_FLOW_XONXOFF_TX);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
415 cfg.flags |= CYGNUM_SERIAL_FLOW_RTSCTS_RX|CYGNUM_SERIAL_FLOW_RTSCTS_TX;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
416 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
417
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
418 case CYG_PPP_FLOWCTL_SOFTWARE:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
419 cfg.flags &= ~(CYGNUM_SERIAL_FLOW_RTSCTS_RX|CYGNUM_SERIAL_FLOW_RTSCTS_TX);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
420 cfg.flags |= CYGNUM_SERIAL_FLOW_XONXOFF_RX|CYGNUM_SERIAL_FLOW_XONXOFF_TX;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
421 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
422 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
423
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
424 if( inspeed != 0 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
425 cfg.baud = inspeed;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
426
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
427 err = cyg_io_set_config( handle,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
428 CYG_IO_SET_CONFIG_SERIAL_INFO,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
429 &cfg,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
430 &len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
431
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
432 if( err != 0 ) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
433 syslog(LOG_ERR, "cyg_io_set_config: %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
434 die(1);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
435 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
436 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
437
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
438 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
439 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
440 * restore_tty - restore the terminal to the saved settings.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
441 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
442 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
443 restore_tty(cyg_io_handle_t handle)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
444 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
445 #ifdef CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
446 if( modem )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
447 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
448 // Restore callback handler if it was set.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
449
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
450 Cyg_ErrNo err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
451 cyg_uint32 len = sizeof(ppp_tty.serial_callbacks);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
452
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
453 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
454
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
455 err = cyg_io_set_config( handle,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
456 CYG_IO_SET_CONFIG_SERIAL_STATUS_CALLBACK,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
457 &ppp_tty.serial_callbacks,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
458 &len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
459
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
460 if( err != 0 ) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
461 syslog(LOG_ERR, "cyg_io_set_config(restore serial callbacks): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
462 die(1);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
463 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
464 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
465 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
466 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
467
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
468 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
469 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
470 * setdtr - control the DTR line on the serial port.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
471 * This is called from die(), so it shouldn't call die().
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
472 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
473 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
474 setdtr(fd, on)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
475 int fd, on;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
476 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
477 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
478 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
479
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
480 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
481 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
482 * output - Output PPP packet.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
483 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
484 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
485 output(unit, p, len)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
486 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
487 u_char *p;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
488 int len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
489 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
490 Cyg_ErrNo err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
491 struct uio uio;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
492 struct iovec iov;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
493 int s;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
494
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
495 if (debug)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
496 log_packet(p, len, "sent ", LOG_DEBUG);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
497
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
498
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
499 iov.iov_base = p;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
500 iov.iov_len = len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
501 uio.uio_iov = &iov;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
502 uio.uio_iovcnt = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
503 uio.uio_resid = len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
504 uio.uio_segflg = UIO_USERSPACE;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
505 uio.uio_rw = UIO_WRITE;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
506
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
507 s = splsoftnet();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
508
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
509 err = cyg_ppp_pppwrite( &ppp_tty, &uio, 0 );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
510
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
511 splx(s);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
512
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
513 if( err != 0 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
514 syslog(LOG_ERR, "write: %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
515
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
516 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
517
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
518 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
519
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
520 #ifdef __ECOS
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
521
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
522 static void wait_input_alarm(cyg_handle_t alarm, cyg_addrword_t data)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
523 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
524 cyg_thread_release( ppp_tty.pppd_thread );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
525 ppp_tty.pppd_wakeup = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
526 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
527
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
528 #ifdef CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
529 void cyg_ppp_serial_callback( cyg_serial_line_status_t *s,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
530 CYG_ADDRWORD priv )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
531 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
532 externC int kill_link;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
533
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
534 // db_printf("serial callback %d %x\n",s->which, s->value );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
535
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
536 if( s->which == CYGNUM_SERIAL_STATUS_CARRIERDETECT )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
537 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
538 if( s->value == 0 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
539 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
540 // CD lost
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
541 kill_link = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
542 cyg_thread_release( ppp_tty.pppd_thread );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
543 ppp_tty.pppd_wakeup = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
544 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
545 else
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
546 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
547 // CD up
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
548 ppp_tty.carrier_detected = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
549 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
550 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
551 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
552 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
553
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
554 static void cyg_ppp_tx_thread(CYG_ADDRWORD arg)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
555 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
556 ppp_tty.tx_thread_running = true;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
557
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
558 // Wait for the PPPD thread to get going and start the PPP
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
559 // initialization phase.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
560 while(phase == PHASE_DEAD )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
561 cyg_thread_delay(100);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
562
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
563 // Now loop until the link goes back down.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
564 while( phase != PHASE_DEAD )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
565 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
566 cyg_semaphore_wait( &ppp_tty.tx_sem );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
567
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
568 if( phase == PHASE_DEAD )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
569 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
570
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
571 // Call into PPP driver to get transmissions going. This is
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
572 // only called if some other thread has failed to transmit all
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
573 // of a packet due to a full buffer, or flow control.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
574
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
575 cyg_ppp_pppstart( &ppp_tty );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
576 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
577
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
578 db_printf("%s exiting\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
579 ppp_tty.tx_thread_running = false;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
580 cyg_thread_exit();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
581 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
582
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
583 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
584
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
585
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
586 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
587 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
588 * wait_input - wait until there is data available on ttyfd,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
589 * for the length of time specified by *timo (indefinite
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
590 * if timo is NULL).
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
591 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
592 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
593 wait_input(timo)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
594 struct timeval *timo;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
595 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
596 if( timo != NULL )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
597 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
598 cyg_tick_count_t trigger = timo->tv_sec*ppp_rtc_resolution.divisor;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
599
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
600 // If the timeval has a microseconds value, just add another
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
601 // second on to the trigger time. These are after all just
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
602 // timeouts, not accurate timings, so a bit of imprecision
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
603 // will not hurt.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
604 if( timo->tv_usec != 0 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
605 trigger += ppp_rtc_resolution.divisor;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
606
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
607 trigger += cyg_current_time();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
608
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
609 // We set the alarm to retrigger after a second. This is in
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
610 // case it catches cyg_io_read() at an uninterruptible
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
611 // point. The alarm is disabled as soon as the read returns,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
612 // so the retrigger will usually not happen.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
613 cyg_alarm_initialize( ppp_tty.alarm,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
614 trigger,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
615 ppp_rtc_resolution.divisor );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
616 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
617
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
618 for(;;)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
619 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
620 int s;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
621 int len = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
622 Cyg_ErrNo err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
623 cyg_serial_buf_info_t info;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
624 cyg_uint32 ilen = sizeof(info);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
625
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
626 #if 1
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
627 // Work out how many bytes are waiting in the serial device
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
628 // buffer and read them all at once. If there are none, we
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
629 // just wait for a single character to arrive.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
630
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
631 if( cyg_io_get_config( ppp_tty.t_handle, CYG_IO_GET_CONFIG_SERIAL_BUFFER_INFO,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
632 &info, &ilen ) == 0 && info.rx_count > 1 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
633 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
634 len = info.rx_count-1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
635 if( len > sizeof(inbuf) )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
636 len = sizeof(inbuf);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
637 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
638 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
639
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
640 if( timo != NULL )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
641 cyg_alarm_enable( ppp_tty.alarm );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
642
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
643 err = cyg_io_read( ppp_handle, &inbuf, &len );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
644
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
645 if( timo != NULL )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
646 cyg_alarm_disable( ppp_tty.alarm );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
647
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
648 // db_printf("read: err %d len %d byte %02x\n",err,len,inbuf[0]);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
649
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
650 if( err == 0 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
651 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
652 int i;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
653
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
654 // Pass all input data to PPP driver for analysis. If this
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
655 // turns out to be for the PPPD, it will call
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
656 // pppasyncctlp() which in turn will set
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
657 // ppp_tty.pppd_wakeup. We detect that on return from
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
658 // pppinput() and return to the caller to do pppd
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
659 // processing.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
660
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
661 s = splsoftnet();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
662
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
663 for( i = 0; i < len; i++ )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
664 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
665 err = cyg_ppp_pppinput( inbuf[i], &ppp_tty );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
666
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
667 if( err != 0 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
668 syslog( LOG_ERR, "pppinput error: %d", err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
669
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
670 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
671
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
672 splx(s);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
673
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
674 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
675 else if( err != -EINTR )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
676 syslog( LOG_ERR, "Read error: %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
677
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
678 if( ppp_tty.pppd_wakeup )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
679 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
680 ppp_tty.pppd_wakeup = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
681 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
682 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
683 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
684 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
685
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
686 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
687 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
688 * wait_time - wait for a given length of time or until a
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
689 * signal is received.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
690 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
691 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
692 wait_time(timo)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
693 struct timeval *timo;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
694 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
695 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
696 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
697
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
698
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
699 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
700 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
701 * read_packet - get a PPP packet from the serial device.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
702 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
703 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
704 read_packet(buf)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
705 u_char *buf;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
706 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
707 int err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
708 struct uio uio;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
709 struct iovec iov;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
710 int len = PPP_MTU + PPP_HDRLEN;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
711 int s;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
712
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
713 //db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
714
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
715 iov.iov_base = buf;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
716 iov.iov_len = len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
717 uio.uio_iov = &iov;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
718 uio.uio_iovcnt = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
719 uio.uio_resid = len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
720 uio.uio_segflg = UIO_USERSPACE;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
721 uio.uio_rw = UIO_READ;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
722
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
723 s = splsoftnet();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
724
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
725 err = cyg_ppp_pppread( &ppp_tty, &uio, 0 );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
726
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
727 splx(s);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
728
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
729 if( err == EWOULDBLOCK )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
730 return -1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
731
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
732 if( err != 0 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
733 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
734 syslog(LOG_ERR, "pppread: %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
735 die(1);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
736 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
737
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
738 len -= uio.uio_resid;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
739
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
740 return len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
741 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
742
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
743 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
744 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
745 * ppp_send_config - configure the transmit characteristics of
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
746 * the ppp interface.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
747 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
748 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
749 ppp_send_config(unit, mtu, asyncmap, pcomp, accomp)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
750 int unit, mtu;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
751 u_int32_t asyncmap;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
752 int pcomp, accomp;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
753 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
754 u_int x;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
755 struct ifreq ifr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
756 int err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
757 int s;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
758
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
759 // db_printf("%s: unit %d mtu %d asyncmap %08x pcomp %08x accomp %08x\n", __PRETTY_FUNCTION__,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
760 // unit,mtu,asyncmap,pcomp,accomp);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
761
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
762 strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
763 ifr.ifr_mtu = mtu;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
764 if (ioctl(sockfd, SIOCSIFMTU, (caddr_t) &ifr) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
765 syslog(LOG_ERR, "ioctl(SIOCSIFMTU): %d",errno);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
766 quit();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
767 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
768
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
769
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
770 s = splsoftnet();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
771
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
772 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSASYNCMAP, (caddr_t) &asyncmap, 0)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
773 syslog(LOG_ERR, "ioctl(PPPIOCSASYNCMAP): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
774 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
775
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
776 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCGFLAGS, (caddr_t) &x, 0)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
777 syslog(LOG_ERR, "ioctl (PPPIOCGFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
778 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
779 x = pcomp? x | SC_COMP_PROT: x &~ SC_COMP_PROT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
780 x = accomp? x | SC_COMP_AC: x &~ SC_COMP_AC;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
781 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSFLAGS, (caddr_t) &x, 0)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
782 syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
783 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
784
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
785 splx(s);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
786 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
787
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
788
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
789 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
790 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
791 * ppp_set_xaccm - set the extended transmit ACCM for the interface.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
792 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
793 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
794 ppp_set_xaccm(unit, accm)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
795 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
796 ext_accm accm;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
797 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
798 int error;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
799 int s;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
800
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
801 //db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
802
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
803 s = splsoftnet();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
804
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
805 error = cyg_ppp_ppptioctl( &ppp_tty, PPPIOCSXASYNCMAP, (caddr_t)accm, 0 );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
806
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
807 splx(s);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
808
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
809 if( error != 0 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
810 syslog(LOG_WARNING, "ioctl(set extended ACCM): %d",error);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
811 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
812
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
813
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
814 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
815 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
816 * ppp_recv_config - configure the receive-side characteristics of
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
817 * the ppp interface.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
818 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
819 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
820 ppp_recv_config(unit, mru, asyncmap, pcomp, accomp)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
821 int unit, mru;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
822 u_int32_t asyncmap;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
823 int pcomp, accomp;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
824 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
825 int x;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
826 int err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
827 int s;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
828
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
829 s = splsoftnet();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
830
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
831 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSMRU, (caddr_t) &mru, 0)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
832 syslog(LOG_ERR, "ioctl(PPPIOCSMRU): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
833 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
834 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSRASYNCMAP, (caddr_t) &asyncmap, 0)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
835 syslog(LOG_ERR, "ioctl(PPPIOCSRASYNCMAP): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
836 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
837 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCGFLAGS, (caddr_t) &x, 0)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
838 syslog(LOG_ERR, "ioctl (PPPIOCGFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
839 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
840 x = !accomp? x | SC_REJ_COMP_AC: x &~ SC_REJ_COMP_AC;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
841 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSFLAGS, (caddr_t) &x, 0)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
842 syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
843 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
844
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
845 splx(s);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
846 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
847
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
848 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
849 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
850 * ccp_test - ask kernel whether a given compression method
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
851 * is acceptable for use. Returns 1 if the method and parameters
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
852 * are OK, 0 if the method is known but the parameters are not OK
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
853 * (e.g. code size should be reduced), or -1 if the method is unknown.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
854 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
855 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
856 ccp_test(unit, opt_ptr, opt_len, for_transmit)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
857 int unit, opt_len, for_transmit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
858 u_char *opt_ptr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
859 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
860 struct ppp_option_data data;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
861 int s;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
862
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
863 data.ptr = opt_ptr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
864 data.length = opt_len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
865 data.transmit = for_transmit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
866 //db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
867
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
868 s = splsoftnet();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
869
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
870 errno = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSCOMPRESS, (caddr_t) &data, 0 );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
871
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
872 splx(s);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
873
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
874 if (errno == 0)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
875 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
876 else return (errno == ENOBUFS)? 0: -1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
877
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
878 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
879
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
880 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
881 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
882 * ccp_flags_set - inform kernel about the current state of CCP.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
883 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
884 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
885 ccp_flags_set(unit, isopen, isup)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
886 int unit, isopen, isup;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
887 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
888 int x;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
889
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
890 int err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
891 //db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
892 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCGFLAGS, (caddr_t) &x, 0)) != 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
893 syslog(LOG_ERR, "ioctl (PPPIOCGFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
894 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
895 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
896 x = isopen? x | SC_CCP_OPEN: x &~ SC_CCP_OPEN;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
897 x = isup? x | SC_CCP_UP: x &~ SC_CCP_UP;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
898 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSFLAGS, (caddr_t) &x,0)) != 0)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
899 syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
900 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
901
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
902 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
903 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
904 * ccp_fatal_error - returns 1 if decompression was disabled as a
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
905 * result of an error detected after decompression of a packet,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
906 * 0 otherwise. This is necessary because of patent nonsense.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
907 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
908 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
909 ccp_fatal_error(unit)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
910 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
911 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
912 int x;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
913 int err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
914
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
915 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
916 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCGFLAGS, (caddr_t) &x, 0)) != 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
917 syslog(LOG_ERR, "ioctl(PPPIOCGFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
918 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
919 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
920 return x & SC_DC_FERROR;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
921 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
922
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
923 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
924 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
925 * get_idle_time - return how long the link has been idle.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
926 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
927 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
928 get_idle_time(u, ip)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
929 int u;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
930 struct ppp_idle *ip;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
931 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
932 return cyg_ppp_ppptioctl(&ppp_tty, PPPIOCGIDLE, (caddr_t)ip, 0) == 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
933 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
934
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
935
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
936 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
937
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
938 #ifdef PPP_FILTER
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
939 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
940 * set_filters - transfer the pass and active filters to the kernel.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
941 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
942 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
943 set_filters(pass, active)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
944 struct bpf_program *pass, *active;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
945 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
946 int ret = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
947
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
948 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
949 if (pass->bf_len > 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
950 if (ioctl(ppp_fd, PPPIOCSPASS, pass) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
951 syslog(LOG_ERR, "Couldn't set pass-filter in kernel: %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
952 ret = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
953 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
954 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
955 if (active->bf_len > 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
956 if (ioctl(ppp_fd, PPPIOCSACTIVE, active) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
957 syslog(LOG_ERR, "Couldn't set active-filter in kernel: %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
958 ret = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
959 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
960 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
961 return ret;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
962 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
963 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
964
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
965 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
966 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
967 * sifvjcomp - config tcp header compression
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
968 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
969 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
970 sifvjcomp(u, vjcomp, cidcomp, maxcid)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
971 int u, vjcomp, cidcomp, maxcid;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
972 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
973 u_int x;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
974 int err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
975
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
976 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCGFLAGS, (caddr_t) &x, 0)) != 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
977 syslog(LOG_ERR, "ioctl (PPPIOCGFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
978 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
979 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
980 x = vjcomp ? x | SC_COMP_TCP: x &~ SC_COMP_TCP;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
981 x = cidcomp? x & ~SC_NO_TCP_CCID: x | SC_NO_TCP_CCID;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
982 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSFLAGS, (caddr_t) &x, 0)) != 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
983 syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
984 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
985 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
986 if (vjcomp && ((err=cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSMAXCID, (caddr_t) &maxcid, 0)) != 0)) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
987 syslog(LOG_ERR, "ioctl(PPPIOCSMAXCID): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
988 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
989 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
990 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
991 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
992
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
993 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
994 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
995 * sifup - Config the interface up and enable IP packets to pass.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
996 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
997 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
998 sifup(u)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
999 int u;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1000 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1001 struct ifreq ifr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1002
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1003 //db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1004 strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1005 if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1006 syslog(LOG_ERR, "ioctl (SIOCGIFFLAGS): %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1007 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1008 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1009 ifr.ifr_flags |= IFF_UP;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1010 if (ioctl(sockfd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1011 syslog(LOG_ERR, "ioctl(SIOCSIFFLAGS): %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1012 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1013 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1014 if_is_up = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1015 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1016 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1017
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1018 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1019 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1020 * sifnpmode - Set the mode for handling packets for a given NP.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1021 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1022 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1023 sifnpmode(u, proto, mode)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1024 int u;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1025 int proto;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1026 enum NPmode mode;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1027 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1028 struct npioctl npi;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1029
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1030 //db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1031 npi.protocol = proto;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1032 npi.mode = mode;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1033 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1034 int err;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1035
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1036 if ((err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSNPMODE, (caddr_t)&npi, 0)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1037 syslog(LOG_ERR, "ioctl(set NP %d mode to %d): %d", proto, mode,err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1038 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1039 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1040 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1041
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1042 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1043 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1044
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1045 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1046 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1047 * sifdown - Config the interface down and disable IP.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1048 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1049 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1050 sifdown(u)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1051 int u;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1052 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1053 struct ifreq ifr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1054 int rv;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1055 struct npioctl npi;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1056
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1057 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1058 rv = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1059 npi.protocol = PPP_IP;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1060 npi.mode = NPMODE_ERROR;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1061 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1062 int err = cyg_ppp_ppptioctl(&ppp_tty, PPPIOCSNPMODE, (caddr_t) &npi, 0);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1063 if( err < 0 )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1064 syslog(LOG_WARNING, "ioctl(PPPIOCSNPMODE): %d",err);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1065 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1066 strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1067 if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1068 syslog(LOG_ERR, "ioctl (SIOCGIFFLAGS): %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1069 rv = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1070 } else {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1071 ifr.ifr_flags &= ~IFF_UP;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1072 if (ioctl(sockfd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1073 syslog(LOG_ERR, "ioctl(SIOCSIFFLAGS): %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1074 rv = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1075 } else
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1076 if_is_up = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1077 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1078 return rv;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1079 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1080 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1081
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1082 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1083 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1084 * SET_SA_FAMILY - set the sa_family field of a struct sockaddr,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1085 * if it exists.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1086 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1087 #define SET_SA_FAMILY(addr, family) \
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1088 BZERO((char *) &(addr), sizeof(addr)); \
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1089 addr.sa_family = (family); \
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1090 addr.sa_len = sizeof(addr);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1091
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1092 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1093 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1094 * sifaddr - Config the interface IP addresses and netmask.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1095 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1096 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1097 sifaddr(u, o, h, m)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1098 int u;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1099 u_int32_t o, h, m;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1100 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1101 struct ifaliasreq ifra;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1102 struct ifreq ifr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1103
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1104 //db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1105 strncpy(ifra.ifra_name, ifname, sizeof(ifra.ifra_name));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1106 SET_SA_FAMILY(ifra.ifra_addr, AF_INET);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1107 ((struct sockaddr_in *) &ifra.ifra_addr)->sin_addr.s_addr = o;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1108 SET_SA_FAMILY(ifra.ifra_broadaddr, AF_INET);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1109 ((struct sockaddr_in *) &ifra.ifra_broadaddr)->sin_addr.s_addr = h;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1110 if (m != 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1111 SET_SA_FAMILY(ifra.ifra_mask, AF_INET);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1112 ((struct sockaddr_in *) &ifra.ifra_mask)->sin_addr.s_addr = m;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1113 } else
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1114 BZERO(&ifra.ifra_mask, sizeof(ifra.ifra_mask));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1115 BZERO(&ifr, sizeof(ifr));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1116 strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1117 if (ioctl(sockfd, SIOCDIFADDR, (caddr_t) &ifr) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1118 if (errno != EADDRNOTAVAIL)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1119 syslog(LOG_WARNING, "Couldn't remove interface address: %d",errno);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1120 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1121 if (ioctl(sockfd, SIOCAIFADDR, (caddr_t) &ifra) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1122 if (errno != EEXIST) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1123 syslog(LOG_ERR, "Couldn't set interface address: %d",errno);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1124 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1125 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1126 syslog(LOG_WARNING,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1127 "Couldn't set interface address: Address %s already exists",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1128 ip_ntoa(o));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1129 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1130 ifaddrs[0] = o;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1131 ifaddrs[1] = h;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1132 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1133 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1134
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1135 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1136 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1137 * cifaddr - Clear the interface IP addresses, and delete routes
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1138 * through the interface if possible.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1139 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1140 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1141 cifaddr(u, o, h)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1142 int u;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1143 u_int32_t o, h;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1144 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1145 struct ifaliasreq ifra;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1146
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1147 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1148 ifaddrs[0] = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1149 strncpy(ifra.ifra_name, ifname, sizeof(ifra.ifra_name));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1150 SET_SA_FAMILY(ifra.ifra_addr, AF_INET);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1151 ((struct sockaddr_in *) &ifra.ifra_addr)->sin_addr.s_addr = o;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1152 SET_SA_FAMILY(ifra.ifra_broadaddr, AF_INET);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1153 ((struct sockaddr_in *) &ifra.ifra_broadaddr)->sin_addr.s_addr = h;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1154 BZERO(&ifra.ifra_mask, sizeof(ifra.ifra_mask));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1155 if (ioctl(sockfd, SIOCDIFADDR, (caddr_t) &ifra) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1156 if (errno != EADDRNOTAVAIL)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1157 syslog(LOG_WARNING, "Couldn't delete interface address: %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1158 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1159 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1160 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1161 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1162
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1163 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1164 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1165 * sifdefaultroute - assign a default route through the address given.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1166 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1167 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1168 sifdefaultroute(u, l, g)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1169 int u;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1170 u_int32_t l, g;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1171 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1172 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1173 return dodefaultroute(g, 's');
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1174 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1175
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1176 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1177 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1178 * cifdefaultroute - delete a default route through the address given.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1179 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1180 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1181 cifdefaultroute(u, l, g)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1182 int u;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1183 u_int32_t l, g;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1184 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1185 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1186 return dodefaultroute(g, 'c');
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1187 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1188
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1189 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1190 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1191 * dodefaultroute - talk to a routing socket to add/delete a default route.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1192 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1193 static int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1194 dodefaultroute(g, cmd)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1195 u_int32_t g;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1196 int cmd;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1197 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1198 int routes;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1199 struct {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1200 struct rt_msghdr hdr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1201 struct sockaddr_in dst;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1202 struct sockaddr_in gway;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1203 struct sockaddr_in mask;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1204 } rtmsg;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1205
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1206 db_printf("%s %08x %c\n", __PRETTY_FUNCTION__,g,cmd);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1207 if ((routes = socket(PF_ROUTE, SOCK_RAW, AF_INET)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1208 syslog(LOG_ERR, "Couldn't %s default route: socket: %d",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1209 cmd=='s'? "add": "delete",errno);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1210 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1211 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1212
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1213 memset(&rtmsg, 0, sizeof(rtmsg));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1214 rtmsg.hdr.rtm_type = cmd == 's'? RTM_ADD: RTM_DELETE;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1215 rtmsg.hdr.rtm_flags = RTF_UP | RTF_GATEWAY | RTF_STATIC;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1216 rtmsg.hdr.rtm_version = RTM_VERSION;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1217 rtmsg.hdr.rtm_seq = ++rtm_seq;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1218 rtmsg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1219 rtmsg.dst.sin_len = sizeof(rtmsg.dst);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1220 rtmsg.dst.sin_family = AF_INET;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1221 rtmsg.gway.sin_len = sizeof(rtmsg.gway);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1222 rtmsg.gway.sin_family = AF_INET;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1223 rtmsg.gway.sin_addr.s_addr = g;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1224 rtmsg.mask.sin_len = sizeof(rtmsg.dst);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1225 rtmsg.mask.sin_family = AF_INET;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1226
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1227 rtmsg.hdr.rtm_msglen = sizeof(rtmsg);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1228 if (write(routes, &rtmsg, sizeof(rtmsg)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1229 syslog(LOG_ERR, "Couldn't %s default route: %d",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1230 cmd=='s'? "add": "delete",errno);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1231 close(routes);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1232 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1233 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1234
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1235 close(routes);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1236 default_route_gateway = (cmd == 's')? g: 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1237 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1238 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1239
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1240 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1241
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1242 #if RTM_VERSION >= 3
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1243
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1244 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1245 * sifproxyarp - Make a proxy ARP entry for the peer.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1246 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1247 static struct {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1248 struct rt_msghdr hdr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1249 struct sockaddr_inarp dst;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1250 struct sockaddr_dl hwa;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1251 char extra[128];
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1252 } arpmsg;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1253
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1254 static int arpmsg_valid;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1255
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1256 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1257 sifproxyarp(unit, hisaddr)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1258 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1259 u_int32_t hisaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1260 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1261 int routes;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1262
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1263 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1264 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1265 * Get the hardware address of an interface on the same subnet
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1266 * as our local address.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1267 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1268 memset(&arpmsg, 0, sizeof(arpmsg));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1269 if (!get_ether_addr(hisaddr, &arpmsg.hwa)) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1270 syslog(LOG_ERR, "Cannot determine ethernet address for proxy ARP");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1271 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1272 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1273
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1274 if ((routes = socket(PF_ROUTE, SOCK_RAW, AF_INET)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1275 syslog(LOG_ERR, "Couldn't add proxy arp entry: socket: %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1276 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1277 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1278
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1279 arpmsg.hdr.rtm_type = RTM_ADD;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1280 arpmsg.hdr.rtm_flags = RTF_ANNOUNCE | RTF_HOST | RTF_STATIC;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1281 arpmsg.hdr.rtm_version = RTM_VERSION;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1282 arpmsg.hdr.rtm_seq = ++rtm_seq;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1283 arpmsg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1284 arpmsg.hdr.rtm_inits = RTV_EXPIRE;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1285 arpmsg.dst.sin_len = sizeof(struct sockaddr_inarp);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1286 arpmsg.dst.sin_family = AF_INET;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1287 arpmsg.dst.sin_addr.s_addr = hisaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1288 arpmsg.dst.sin_other = SIN_PROXY;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1289
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1290 arpmsg.hdr.rtm_msglen = (char *) &arpmsg.hwa - (char *) &arpmsg
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1291 + arpmsg.hwa.sdl_len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1292 if (write(routes, &arpmsg, arpmsg.hdr.rtm_msglen) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1293 syslog(LOG_ERR, "Couldn't add proxy arp entry: %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1294 close(routes);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1295 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1296 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1297
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1298 close(routes);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1299 arpmsg_valid = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1300 proxy_arp_addr = hisaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1301 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1302 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1303
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1304 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1305 * cifproxyarp - Delete the proxy ARP entry for the peer.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1306 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1307 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1308 cifproxyarp(unit, hisaddr)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1309 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1310 u_int32_t hisaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1311 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1312 int routes;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1313
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1314 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1315 if (!arpmsg_valid)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1316 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1317 arpmsg_valid = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1318
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1319 arpmsg.hdr.rtm_type = RTM_DELETE;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1320 arpmsg.hdr.rtm_seq = ++rtm_seq;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1321
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1322 if ((routes = socket(PF_ROUTE, SOCK_RAW, AF_INET)) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1323 syslog(LOG_ERR, "Couldn't delete proxy arp entry: socket: %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1324 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1325 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1326
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1327 if (write(routes, &arpmsg, arpmsg.hdr.rtm_msglen) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1328 syslog(LOG_ERR, "Couldn't delete proxy arp entry: %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1329 close(routes);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1330 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1331 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1332
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1333 close(routes);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1334 proxy_arp_addr = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1335 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1336 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1337
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1338 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1339
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1340 #else /* RTM_VERSION */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1341
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1342 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1343 * sifproxyarp - Make a proxy ARP entry for the peer.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1344 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1345 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1346 sifproxyarp(unit, hisaddr)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1347 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1348 u_int32_t hisaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1349 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1350 struct arpreq arpreq;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1351 struct {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1352 struct sockaddr_dl sdl;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1353 char space[128];
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1354 } dls;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1355
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1356 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1357 BZERO(&arpreq, sizeof(arpreq));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1358
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1359 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1360 * Get the hardware address of an interface on the same subnet
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1361 * as our local address.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1362 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1363 if (!get_ether_addr(hisaddr, &dls.sdl)) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1364 syslog(LOG_ERR, "Cannot determine ethernet address for proxy ARP");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1365 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1366 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1367
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1368 arpreq.arp_ha.sa_len = sizeof(struct sockaddr);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1369 arpreq.arp_ha.sa_family = AF_UNSPEC;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1370 BCOPY(LLADDR(&dls.sdl), arpreq.arp_ha.sa_data, dls.sdl.sdl_alen);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1371 SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1372 ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1373 arpreq.arp_flags = ATF_PERM | ATF_PUBL;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1374 if (ioctl(sockfd, SIOCSARP, (caddr_t)&arpreq) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1375 syslog(LOG_ERR, "Couldn't add proxy arp entry: %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1376 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1377 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1378
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1379 proxy_arp_addr = hisaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1380 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1381 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1382
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1383 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1384 * cifproxyarp - Delete the proxy ARP entry for the peer.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1385 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1386 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1387 cifproxyarp(unit, hisaddr)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1388 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1389 u_int32_t hisaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1390 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1391 struct arpreq arpreq;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1392
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1393 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1394 BZERO(&arpreq, sizeof(arpreq));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1395 SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1396 ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1397 if (ioctl(sockfd, SIOCDARP, (caddr_t)&arpreq) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1398 syslog(LOG_WARNING, "Couldn't delete proxy arp entry: %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1399 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1400 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1401 proxy_arp_addr = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1402 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1403 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1404 #endif /* RTM_VERSION */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1405
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1406
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1407 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1408 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1409 * get_ether_addr - get the hardware address of an interface on the
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1410 * the same subnet as ipaddr.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1411 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1412 #define MAX_IFS 32
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1413
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1414 static int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1415 get_ether_addr(ipaddr, hwaddr)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1416 u_int32_t ipaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1417 struct sockaddr_dl *hwaddr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1418 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1419 struct ifreq *ifr, *ifend, *ifp;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1420 u_int32_t ina, mask;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1421 struct sockaddr_dl *dla;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1422 struct ifreq ifreq;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1423 struct ifconf ifc;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1424 struct ifreq ifs[MAX_IFS];
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1425
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1426 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1427 ifc.ifc_len = sizeof(ifs);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1428 ifc.ifc_req = ifs;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1429 if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1430 syslog(LOG_ERR, "ioctl(SIOCGIFCONF): %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1431 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1432 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1433
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1434 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1435 * Scan through looking for an interface with an Internet
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1436 * address on the same subnet as `ipaddr'.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1437 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1438 ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1439 for (ifr = ifc.ifc_req; ifr < ifend;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1440 ifr = (struct ifreq *) ((char *)&ifr->ifr_addr
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1441 + MAX(ifr->ifr_addr.sa_len, sizeof(ifr->ifr_addr)))) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1442 if (ifr->ifr_addr.sa_family == AF_INET) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1443 ina = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1444 strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1445 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1446 * Check that the interface is up, and not point-to-point
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1447 * or loopback.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1448 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1449 if (ioctl(sockfd, SIOCGIFFLAGS, &ifreq) < 0)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1450 continue;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1451 if ((ifreq.ifr_flags &
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1452 (IFF_UP|IFF_BROADCAST|IFF_POINTOPOINT|IFF_LOOPBACK|IFF_NOARP))
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1453 != (IFF_UP|IFF_BROADCAST))
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1454 continue;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1455 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1456 * Get its netmask and check that it's on the right subnet.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1457 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1458 if (ioctl(sockfd, SIOCGIFNETMASK, &ifreq) < 0)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1459 continue;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1460 mask = ((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr.s_addr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1461 if ((ipaddr & mask) != (ina & mask))
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1462 continue;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1463
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1464 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1465 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1466 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1467
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1468 if (ifr >= ifend)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1469 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1470 syslog(LOG_INFO, "found interface %s for proxy arp", ifr->ifr_name);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1471
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1472 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1473 * Now scan through again looking for a link-level address
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1474 * for this interface.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1475 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1476 ifp = ifr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1477 for (ifr = ifc.ifc_req; ifr < ifend; ) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1478 if (strcmp(ifp->ifr_name, ifr->ifr_name) == 0
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1479 && ifr->ifr_addr.sa_family == AF_LINK) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1480 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1481 * Found the link-level address - copy it out
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1482 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1483 dla = (struct sockaddr_dl *) &ifr->ifr_addr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1484 BCOPY(dla, hwaddr, dla->sdl_len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1485 return 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1486 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1487 ifr = (struct ifreq *) ((char *)&ifr->ifr_addr
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1488 + MAX(ifr->ifr_addr.sa_len, sizeof(ifr->ifr_addr)));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1489 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1490
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1491 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1492 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1493
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1494 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1495 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1496 * Return user specified netmask, modified by any mask we might determine
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1497 * for address `addr' (in network byte order).
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1498 * Here we scan through the system's list of interfaces, looking for
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1499 * any non-point-to-point interfaces which might appear to be on the same
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1500 * network as `addr'. If we find any, we OR in their netmask to the
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1501 * user-specified netmask.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1502 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1503 u_int32_t
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1504 GetMask(addr)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1505 u_int32_t addr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1506 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1507 u_int32_t mask, nmask, ina;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1508 struct ifreq *ifr, *ifend, ifreq;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1509 struct ifconf ifc;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1510 struct ifreq ifs[MAX_IFS];
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1511
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1512 addr = ntohl(addr);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1513 if (IN_CLASSA(addr)) /* determine network mask for address class */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1514 nmask = IN_CLASSA_NET;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1515 else if (IN_CLASSB(addr))
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1516 nmask = IN_CLASSB_NET;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1517 else
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1518 nmask = IN_CLASSC_NET;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1519 /* class D nets are disallowed by bad_ip_adrs */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1520 mask = netmask | htonl(nmask);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1521
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1522 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1523 * Scan through the system's network interfaces.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1524 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1525 ifc.ifc_len = sizeof(ifs);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1526 ifc.ifc_req = ifs;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1527 if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1528 syslog(LOG_WARNING, "ioctl(SIOCGIFCONF): %m");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1529 return mask;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1530 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1531 ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1532 for (ifr = ifc.ifc_req; ifr < ifend;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1533 ifr = (struct ifreq *) ((char *)&ifr->ifr_addr
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1534 + MAX(ifr->ifr_addr.sa_len, sizeof(ifr->ifr_addr)))) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1535 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1536 * Check the interface's internet address.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1537 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1538 if (ifr->ifr_addr.sa_family != AF_INET)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1539 continue;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1540 ina = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1541 if ((ntohl(ina) & nmask) != (addr & nmask))
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1542 continue;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1543 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1544 * Check that the interface is up, and not point-to-point or loopback.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1545 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1546 strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1547 if (ioctl(sockfd, SIOCGIFFLAGS, &ifreq) < 0)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1548 continue;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1549 if ((ifreq.ifr_flags & (IFF_UP|IFF_POINTOPOINT|IFF_LOOPBACK))
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1550 != IFF_UP)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1551 continue;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1552 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1553 * Get its netmask and OR it into our mask.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1554 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1555 if (ioctl(sockfd, SIOCGIFNETMASK, &ifreq) < 0)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1556 continue;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1557 mask |= ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr.s_addr;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1558 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1559
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1560 return mask;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1561 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1562
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1563 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1564 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1565 * Use the hostid as part of the random number seed.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1566 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1567 int
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1568 get_host_seed()
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1569 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1570 //db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1571 #ifndef __ECOS
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1572 return gethostid();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1573 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1574 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1575 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1576
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1577 //=====================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1578 // PAP stubs
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1579 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1580 // When omitting PAP, these fill in the dangling references from auth.c
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1581 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1582
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1583 #ifndef CYGPKG_PPP_PAP
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1584
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1585 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1586 upap_authwithpeer(unit, user, password)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1587 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1588 char *user, *password;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1589 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1590 unit=unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1591 user=user;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1592 password=password;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1593 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1594
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1595 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1596 upap_authpeer(unit)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1597 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1598 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1599 unit=unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1600 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1601
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1602 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1603
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1604 //=====================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1605 // CHAP stubs
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1606 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1607 // When omitting CHAP, these fill in the dangling references from auth.c
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1608 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1609
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1610 #ifndef CYGPKG_PPP_CHAP
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1611
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1612 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1613 ChapAuthWithPeer(unit, our_name, digest)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1614 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1615 char *our_name;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1616 int digest;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1617 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1618 unit=unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1619 our_name=our_name;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1620 digest=digest;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1621 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1622
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1623 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1624 ChapAuthPeer(unit, our_name, digest)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1625 int unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1626 char *our_name;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1627 int digest;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1628 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1629 unit=unit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1630 our_name=our_name;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1631 digest=digest;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1632 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1633
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1634 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1635
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1636 //=====================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1637 // eCos API
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1638
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1639 externC cyg_int32 cyg_ppp_options_init( cyg_ppp_options_t *options )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1640 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1641 if( options == NULL )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1642 return -1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1643
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1644 options->debug = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1645 options->kdebugflag = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1646 options->default_route = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1647 options->modem = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1648 options->flowctl = CYG_PPP_FLOWCTL_HARDWARE;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1649 options->refuse_pap = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1650 options->refuse_chap = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1651
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1652 options->baud = CYGNUM_SERIAL_BAUD_115200;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1653
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1654 options->idle_time_limit = 1*60;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1655 options->maxconnect = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1656
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1657 options->our_address = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1658 options->his_address = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1659
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1660 options->script = NULL;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1661
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1662 strncpy( options->user, CYGPKG_PPP_AUTH_DEFAULT_USER, MAXNAMELEN );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1663 strncpy( options->passwd, CYGPKG_PPP_AUTH_DEFAULT_PASSWD, MAXSECRETLEN );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1664
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1665 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1666 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1667
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1668 // -------------------------------------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1669
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1670
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1671 #define CYGNUM_PPP_PPPD_THREAD_STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL+0x1000)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1672
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1673 static char cyg_pppd_stack[CYGNUM_PPP_PPPD_THREAD_STACK_SIZE];
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1674 static cyg_thread cyg_pppd_thread_obj;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1675
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1676 static char cyg_ppp_tx_thread_stack[CYGNUM_HAL_STACK_SIZE_TYPICAL];
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1677 static cyg_thread cyg_ppp_tx_thread_obj;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1678
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1679
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1680 externC void cyg_pppd_main(CYG_ADDRWORD arg);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1681
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1682
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1683 externC cyg_ppp_handle_t cyg_ppp_up( const char *devnam_arg,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1684 const cyg_ppp_options_t *options )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1685 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1686
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1687 if( options == NULL || phase != PHASE_DEAD )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1688 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1689
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1690 strncpy( devnam, devnam_arg, PATH_MAX );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1691
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1692 ppp_tty.options = options;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1693
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1694 // Start the PPPD thread
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1695 cyg_thread_create(CYGNUM_PPP_PPPD_THREAD_PRIORITY,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1696 cyg_pppd_main,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1697 (CYG_ADDRWORD)&ppp_tty,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1698 "PPPD",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1699 &cyg_pppd_stack[0],
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1700 CYGNUM_PPP_PPPD_THREAD_STACK_SIZE,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1701 &ppp_tty.pppd_thread,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1702 &cyg_pppd_thread_obj
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1703 );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1704 cyg_thread_resume(ppp_tty.pppd_thread);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1705
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1706 // Start the TX thread
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1707 cyg_semaphore_init( &ppp_tty.tx_sem, 0 );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1708
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1709 cyg_thread_create(CYGNUM_PPP_PPPD_THREAD_PRIORITY+1,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1710 cyg_ppp_tx_thread,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1711 (CYG_ADDRWORD)&ppp_tty,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1712 "PPP Tx Thread",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1713 &cyg_ppp_tx_thread_stack[0],
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1714 sizeof(cyg_ppp_tx_thread_stack),
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1715 &ppp_tty.tx_thread,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1716 &cyg_ppp_tx_thread_obj
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1717 );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1718 cyg_thread_resume(ppp_tty.tx_thread);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1719
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1720 // Wait for the PPPD thread to get going and start the PPP
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1721 // initialization phase.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1722 while(phase == PHASE_DEAD )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1723 cyg_thread_delay(100);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1724
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1725 return (cyg_ppp_handle_t)&ppp_tty;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1726 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1727
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1728 // -------------------------------------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1729
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1730 externC char **script;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1731
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1732 externC void cyg_ppp_options_install( const cyg_ppp_options_t *options )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1733 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1734 debug = options->debug;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1735 kdebugflag = options->kdebugflag;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1736
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1737 modem = options->modem;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1738 flowctl = options->flowctl;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1739 refuse_pap = options->refuse_pap;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1740 refuse_chap = options->refuse_chap;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1741
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1742 inspeed = options->baud;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1743
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1744 idle_time_limit = options->idle_time_limit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1745 maxconnect = options->maxconnect;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1746
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1747 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1748 ipcp_options *wo = &ipcp_wantoptions[0];
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1749
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1750 wo->ouraddr = options->our_address;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1751 wo->hisaddr = options->his_address;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1752
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1753 wo->default_route = options->default_route;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1754
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1755 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1756
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1757 script = options->script;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1758
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1759 strncpy( user, &options->user[0], MAXNAMELEN );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1760 strncpy( passwd, &options->passwd[0], MAXSECRETLEN );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1761
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1762 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1763
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1764 // -------------------------------------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1765
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1766 externC cyg_int32 cyg_ppp_down( const cyg_ppp_handle_t handle )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1767 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1768 if( phase != PHASE_DEAD )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1769 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1770 externC int kill_link;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1771 kill_link = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1772 cyg_thread_release( ppp_tty.pppd_thread );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1773 ppp_tty.pppd_wakeup = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1774 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1775 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1776 else
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1777 return -1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1778 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1779
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1780 // -------------------------------------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1781
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1782 externC cyg_int32 cyg_ppp_wait_up( cyg_ppp_handle_t handle )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1783 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1784 while(!( (phase == PHASE_NETWORK && ifaddrs[0] != 0) ||
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1785 phase == PHASE_DEAD ) )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1786 cyg_thread_delay(100);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1787
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1788 return phase == PHASE_NETWORK ? 0 : -1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1789 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1790
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1791 // -------------------------------------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1792
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1793 externC void cyg_ppp_wait_down( cyg_ppp_handle_t handle )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1794 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1795 while( ppp_tty.tx_thread_running || ppp_tty.pppd_thread_running )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1796 cyg_thread_delay(100);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1797
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1798 cyg_thread_delete( ppp_tty.tx_thread );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1799 cyg_thread_delete( ppp_tty.pppd_thread );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1800 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1801
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1802 //=====================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1803 // eCos extras
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1804
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1805 void syslog( int level, char *fmt, ... )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1806 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1807 va_list ap;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1808 int ret;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1809
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1810 #ifdef CYGPKG_PPP_DEBUG_WARN_ONLY
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1811 if(!( level == LOG_ERR ||
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1812 level == LOG_WARNING ))
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1813 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1814 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1815
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1816 va_start(ap, fmt);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1817 diag_printf("SYSLOG %02x: ",level);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1818 ret = diag_vprintf(fmt, ap);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1819 diag_printf("\n");
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1820 va_end(ap);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1821 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1822
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1823 //=====================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1824
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1825 int gettimeofday(struct timeval *tv, struct timezone *tz)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1826 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1827 cyg_tick_count_t time = cyg_current_time();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1828
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1829 tv->tv_sec = time/CYGNUM_HAL_RTC_DENOMINATOR;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1830 tv->tv_usec = (time%CYGNUM_HAL_RTC_DENOMINATOR)*10000;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1831
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1832 // db_printf("%s: %d %d\n", __PRETTY_FUNCTION__, tv->tv_sec, tv->tv_usec);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1833
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1834 return 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1835 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1836
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1837 //=====================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1838
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1839 char *crypt (const char *key, const char *salt)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1840 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1841 static char res[13];
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1842
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1843 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1844
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1845 return res;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1846 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1847
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1848
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1849 //=====================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1850 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1851 * Substitute procedures for those systems which don't have
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1852 * drand48 et al.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1853 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1854
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1855 double
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1856 drand48(void)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1857 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1858 return (double)rand() / (double)0x7fffffffL; /* 2**31-1 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1859 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1860
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1861 long
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1862 mrand48(void)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1863 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1864 return rand();
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1865 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1866
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1867 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1868 srand48(long seedval)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1869 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1870 srand(seedval);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1871 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1872
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1873
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1874 //=====================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1875
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1876 #if 0
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1877
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1878 #undef MD5Init
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1879 #undef MD5Update
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1880 #undef MD5Final
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1881
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1882 #include <sys/types.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1883
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1884 #include <sys/md5.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1885
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1886
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1887 void cyg_MD5Init( MD5_CTX *ctx );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1888 void cyg_MD5Update (MD5_CTX *ctx, const unsigned char *buf, unsigned int size);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1889 void cyg_MD5Final (unsigned char hash[16], MD5_CTX *ctx);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1890
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1891
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1892 void cyg_ppp_MD5Init( MD5_CTX *ctx )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1893 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1894 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1895 cyg_MD5Init( ctx );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1896 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1897 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1898
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1899 void cyg_ppp_MD5Update (MD5_CTX *ctx, const unsigned char *buf, unsigned int size)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1900 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1901 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1902 cyg_MD5Update( ctx, buf, size );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1903 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1904 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1905
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1906 void cyg_ppp_MD5Final (unsigned char hash[16], MD5_CTX *ctx)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1907 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1908 db_printf("%s called\n", __PRETTY_FUNCTION__);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1909 cyg_MD5Final( hash, ctx );
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1910 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1911 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1912
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1913 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1914
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1915 //=====================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1916 // End of sys-ecos.c
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1917
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1918