]> git.pld-linux.org Git - packages/ppp.git/blame - ppp-pppoatm.patch
- Fixed srcs md5dum; bad urls removed
[packages/ppp.git] / ppp-pppoatm.patch
CommitLineData
a8d61108
JR
1diff -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
32diff -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+
This page took 0.05668 seconds and 4 git commands to generate.