]>
Commit | Line | Data |
---|---|---|
a8d61108 JR |
1 | diff -urN ppp-2.4.1/pppd/plugins/Makefile.linux ppp-2.4.1.ppoatm/pppd/plugins/Makefile.linux |
2 | --- ppp-2.4.1/pppd/plugins/Makefile.linux Fri Jun 15 18:55:48 2001 | |
3 | +++ ppp-2.4.1.ppoatm/pppd/plugins/Makefile.linux Fri Jun 15 18:34:27 2001 | |
48c2d7b2 JR |
4 | @@ -3,7 +3,7 @@ |
5 | LDFLAGS += -shared | |
6 | INSTALL = install | |
56257b9d | 7 | |
48c2d7b2 JR |
8 | -all: minconn.so passprompt.so pppoe/pppoe.so |
9 | +all: minconn.so passprompt.so pppoe/pppoe.so pppoatm.so | |
56257b9d | 10 | |
48c2d7b2 JR |
11 | pppoe/pppoe.so: |
12 | $(MAKE) -C pppoe $(MFLAGS) pppoe.so | |
a8d61108 | 13 | @@ -14,12 +14,15 @@ |
48c2d7b2 JR |
14 | passprompt.so: passprompt.c |
15 | $(CC) -o $@ $(LDFLAGS) $(CFLAGS) passprompt.c | |
56257b9d JR |
16 | |
17 | +pppoatm.so: pppoatm.c | |
a8d61108 | 18 | + $(CC) -o $@ $(LDFLAGS) $(CFLAGS) -D_linux_=1 -latm pppoatm.c |
56257b9d | 19 | + |
48c2d7b2 | 20 | LIBDIR = /usr/lib/pppd |
56257b9d | 21 | |
48c2d7b2 JR |
22 | -install: minconn.so passprompt.so pppoe/pppoe.so |
23 | +install: minconn.so passprompt.so pppoe/pppoe.so pppoatm.so | |
24 | version=`awk -F '"' '/VERSION/ { print $$2; }' ../patchlevel.h`; \ | |
25 | $(INSTALL) -d $(DESTDIR)$(LIBDIR)/$$version; \ | |
26 | $(INSTALL) $? $(DESTDIR)$(LIBDIR)/$$version | |
a8d61108 JR |
27 | |
28 | clean: | |
29 | - rm -rf *.o *.so | |
30 | \ No newline at end of file | |
31 | + rm -rf *.o *.so | |
32 | diff -urN ppp-2.4.1/pppd/plugins/pppoatm.c ppp-2.4.1.ppoatm/pppd/plugins/pppoatm.c | |
48c2d7b2 | 33 | --- ppp-2.4.1/pppd/plugins/pppoatm.c Thu Jan 1 01:00:00 1970 |
a8d61108 JR |
34 | +++ ppp-2.4.1.ppoatm/pppd/plugins/pppoatm.c Fri Jun 15 18:50:39 2001 |
35 | @@ -0,0 +1,223 @@ | |
56257b9d JR |
36 | +/* pppoatm.c - pppd plugin to implement PPPoATM protocol. |
37 | + * | |
38 | + * Copyright 2000 Mitchell Blank Jr. | |
39 | + * Based in part on work from Jens Axboe and Paul Mackerras. | |
40 | + * | |
41 | + * This program is free software; you can redistribute it and/or | |
42 | + * modify it under the terms of the GNU General Public License | |
43 | + * as published by the Free Software Foundation; either version | |
44 | + * 2 of the License, or (at your option) any later version. | |
45 | + */ | |
56257b9d JR |
46 | +#include <atm.h> |
47 | +#include <linux/atmdev.h> | |
48 | +#include <linux/atmppp.h> | |
49 | +#include <sys/stat.h> | |
50 | +#include <net/if.h> | |
51 | +#include <sys/ioctl.h> | |
a8d61108 JR |
52 | +#include "pppd.h" |
53 | +#include "pathnames.h" | |
54 | +#include "fsm.h" /* Needed for lcp.h to include cleanly */ | |
55 | +#include "lcp.h" | |
56 | + | |
57 | +#define _PATH_ATMOPT _ROOT_PATH "/etc/ppp/options." | |
56257b9d JR |
58 | + |
59 | +static struct sockaddr_atmpvc pvcaddr; | |
60 | +static char *qosstr = NULL; | |
61 | +static int pppoatm_accept = 0; | |
62 | +static bool llc_encaps = 0; | |
63 | +static bool vc_encaps = 0; | |
64 | +static int device_got_set = 0; | |
65 | +static int pppoatm_max_mtu, pppoatm_max_mru; | |
66 | + | |
a8d61108 JR |
67 | +static int setdevname_pppoatm(const char *cp); |
68 | + | |
56257b9d | 69 | +static option_t my_options[] = { |
a8d61108 JR |
70 | + { "device name", o_wild, (void *) &setdevname_pppoatm, |
71 | + "Serial port device name", | |
72 | + OPT_DEVNAM | OPT_PRIVFIX | OPT_NOARG | OPT_A2STRVAL | OPT_STATIC, | |
73 | + devnam}, | |
56257b9d JR |
74 | +#if 0 |
75 | + { "accept", o_bool, &pppoatm_accept, | |
76 | + "set PPPoATM socket to accept incoming connections", 1 }, | |
77 | +#endif | |
78 | + { "llc-encaps", o_bool, &llc_encaps, | |
79 | + "use LLC encapsulation for PPPoATM", 1}, | |
80 | + { "vc-encaps", o_bool, &vc_encaps, | |
81 | + "use VC multiplexing for PPPoATM (default)", 1}, | |
82 | + { "qos", o_string, &qosstr, | |
83 | + "set QoS for PPPoATM connection", 1}, | |
84 | + { NULL } | |
85 | +}; | |
86 | + | |
87 | +/* returns: | |
88 | + * -1 if there's a problem with setting the device | |
89 | + * 0 if we can't parse "cp" as a valid name of a device | |
90 | + * 1 if "cp" is a reasonable thing to name a device | |
91 | + * Note that we don't actually open the device at this point | |
92 | + * We do need to fill in: | |
93 | + * devnam: a string representation of the device | |
94 | + * devstat: a stat structure of the device. In this case | |
95 | + * we're not opening a device, so we just make sure | |
96 | + * to set up S_ISCHR(devstat.st_mode) != 1, so we | |
97 | + * don't get confused that we're on stdin. | |
98 | + */ | |
99 | +static int setdevname_pppoatm(const char *cp) | |
100 | +{ | |
101 | + struct sockaddr_atmpvc addr; | |
102 | + extern struct stat devstat; | |
103 | + if (device_got_set) | |
104 | + return 0; | |
105 | + info("PPPoATM setdevname_pppoatm"); | |
106 | + memset(&addr, 0, sizeof addr); | |
107 | + if (text2atm(cp, (struct sockaddr *) &addr, sizeof(addr), | |
108 | + T2A_PVC | T2A_NAME) < 0) | |
109 | + return 0; | |
a8d61108 JR |
110 | +/* if (!dev_set_ok()) |
111 | + return -1;*/ | |
56257b9d JR |
112 | + memcpy(&pvcaddr, &addr, sizeof pvcaddr); |
113 | + strlcpy(devnam, cp, sizeof devnam); | |
114 | + devstat.st_mode = S_IFSOCK; | |
115 | + info("PPPoATM setdevname_pppoatm - SUCCESS"); | |
116 | + device_got_set = 1; | |
117 | + return 1; | |
118 | +} | |
119 | + | |
48c2d7b2 | 120 | +static void options_for_pppoatm(void) |
56257b9d | 121 | +{ |
a8d61108 JR |
122 | + char buf[256]; |
123 | + | |
124 | + snprintf(buf, 256, _PATH_ATMOPT "%s",devnam); | |
125 | + if(!options_from_file(buf, 0, 0, 1)) | |
48c2d7b2 | 126 | + exit(EXIT_OPTION_ERROR); |
56257b9d JR |
127 | +} |
128 | + | |
129 | +#define pppoatm_overhead() (llc_encaps ? 6 : 2) | |
130 | + | |
131 | +static void no_device_given_pppoatm(void) | |
132 | +{ | |
133 | + fatal("No vpi.vci specified"); | |
134 | +} | |
135 | + | |
a8d61108 | 136 | +static int connect_device_pppoatm(void) |
56257b9d JR |
137 | +{ |
138 | + int fd; | |
139 | + struct atm_qos qos; | |
48c2d7b2 | 140 | + struct atm_backend_ppp be; |
56257b9d | 141 | + |
56257b9d JR |
142 | + fd = socket(AF_ATMPVC, SOCK_DGRAM, 0); |
143 | + if (fd < 0) | |
144 | + fatal("failed to create socket: %m"); | |
145 | + memset(&qos, 0, sizeof qos); | |
146 | + qos.txtp.traffic_class = qos.rxtp.traffic_class = ATM_UBR; | |
147 | + /* TODO: support simplified QoS setting */ | |
148 | + if (qosstr != NULL) | |
149 | + if (text2qos(qosstr, &qos, 0)) | |
150 | + fatal("Can't parse QoS: \"%s\""); | |
151 | + qos.txtp.max_sdu = lcp_allowoptions[0].mru + pppoatm_overhead(); | |
152 | + qos.rxtp.max_sdu = lcp_wantoptions[0].mru + pppoatm_overhead(); | |
153 | + qos.aal = ATM_AAL5; | |
154 | + if (setsockopt(fd, SOL_ATM, SO_ATMQOS, &qos, sizeof(qos)) < 0) | |
155 | + fatal("setsockopt(SO_ATMQOS): %m"); | |
156 | + /* TODO: accept on SVCs... */ | |
157 | + if (connect(fd, (struct sockaddr *) &pvcaddr, | |
158 | + sizeof(struct sockaddr_atmpvc))) | |
159 | + fatal("connect(%s): %m", devnam); | |
160 | + pppoatm_max_mtu = lcp_allowoptions[0].mru; | |
161 | + pppoatm_max_mru = lcp_wantoptions[0].mru; | |
56257b9d | 162 | + |
56257b9d JR |
163 | + be.backend_num = ATM_BACKEND_PPP; |
164 | + if (!llc_encaps) | |
165 | + be.encaps = PPPOATM_ENCAPS_VC; | |
166 | + else if (!vc_encaps) | |
167 | + be.encaps = PPPOATM_ENCAPS_LLC; | |
168 | + else | |
169 | + be.encaps = PPPOATM_ENCAPS_AUTODETECT; | |
170 | + if (ioctl(fd, ATM_SETBACKEND, &be) < 0) | |
171 | + fatal("ioctl(ATM_SETBACKEND): %m"); | |
48c2d7b2 JR |
172 | + |
173 | + return fd; | |
56257b9d JR |
174 | +} |
175 | + | |
a8d61108 | 176 | +static void disconnect_device_pppoatm(void) |
56257b9d | 177 | +{ |
48c2d7b2 | 178 | +/* |
56257b9d | 179 | + atm_backend_t be = ATM_BACKEND_RAW; |
48c2d7b2 | 180 | + * 2.4 doesn't support this yet * |
56257b9d | 181 | + (void) ioctl(fd, ATM_SETBACKEND, &be); |
48c2d7b2 | 182 | +*/ |
56257b9d JR |
183 | +} |
184 | + | |
a8d61108 | 185 | +static void send_config_pppoatm(int mtu, u_int32_t asyncmap, |
56257b9d JR |
186 | + int pcomp, int accomp) |
187 | +{ | |
188 | + int sock; | |
189 | + struct ifreq ifr; | |
190 | + if (mtu > pppoatm_max_mtu) | |
191 | + error("Couldn't increase MTU to %d", mtu); | |
192 | + sock = socket(AF_INET, SOCK_DGRAM, 0); | |
193 | + if (sock < 0) | |
194 | + fatal("Couldn't create IP socket: %m"); | |
195 | + strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); | |
196 | + ifr.ifr_mtu = mtu; | |
197 | + if (ioctl(sock, SIOCSIFMTU, (caddr_t) &ifr) < 0) | |
198 | + fatal("ioctl(SIOCSIFMTU): %m"); | |
199 | + (void) close (sock); | |
200 | +} | |
201 | + | |
a8d61108 | 202 | +static void recv_config_pppoatm(int mru, u_int32_t asyncmap, |
56257b9d JR |
203 | + int pcomp, int accomp) |
204 | +{ | |
205 | + if (mru > pppoatm_max_mru) | |
206 | + error("Couldn't increase MRU to %d", mru); | |
207 | +} | |
208 | + | |
56257b9d JR |
209 | +void plugin_init(void) |
210 | +{ | |
211 | +#if _linux_ | |
212 | + extern int new_style_driver; /* From sys-linux.c */ | |
213 | +#endif | |
214 | + static char *bad_options[] = { | |
215 | + "noaccomp", "-ac", | |
216 | + "default-asyncmap", "-am", "asyncmap", "-as", "escape", | |
217 | + "receive-all", | |
218 | + "crtscts", "-crtscts", "nocrtscts", | |
219 | + "cdtrcts", "nocdtrcts", | |
220 | + "xonxoff", | |
221 | + "modem", "local", "sync", | |
222 | + NULL }; | |
223 | +#if _linux_ | |
a8d61108 | 224 | + if ((!ppp_available() && !new_style_driver)) |
56257b9d JR |
225 | + fatal("Kernel doesn't support ppp_generic - " |
226 | + "needed for PPPoATM"); | |
227 | +#else | |
228 | + fatal("No PPPoATM support on this OS"); | |
229 | +#endif | |
230 | + info("PPPoATM plugin_init"); | |
231 | + add_options(my_options); | |
56257b9d JR |
232 | + { |
233 | + char **a; | |
234 | + for (a = bad_options; *a != NULL; a++) | |
235 | + remove_option(*a); | |
236 | + } | |
237 | + modem = 0; | |
238 | + lcp_wantoptions[0].neg_accompression = 0; | |
239 | + lcp_allowoptions[0].neg_accompression = 0; | |
240 | + lcp_wantoptions[0].neg_asyncmap = 0; | |
241 | + lcp_allowoptions[0].neg_asyncmap = 0; | |
242 | + lcp_wantoptions[0].neg_pcompression = 0; | |
243 | +} | |
a8d61108 JR |
244 | + |
245 | +struct channel pppoatm_channel = { | |
246 | + options: my_options, | |
247 | + process_extra_options: options_for_pppoatm, | |
248 | + check_options: NULL, | |
249 | + connect: &connect_device_pppoatm, | |
250 | + disconnect: &disconnect_device_pppoatm, | |
251 | + establish_ppp: &generic_establish_ppp, | |
252 | + disestablish_ppp: &generic_disestablish_ppp, | |
253 | + send_config: &send_config_pppoatm, | |
254 | + recv_config: &recv_config_pppoatm, | |
255 | + close: NULL, | |
256 | + cleanup: NULL | |
257 | +}; | |
258 | + |