18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* pppoatm.c - pppd plugin to implement PPPoATM protocol.
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright 2000 Mitchell Blank Jr.
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Based in part on work from Jens Axboe and Paul Mackerras.
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Updated to ppp-2.4.1 by Bernhard Kaindl
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Updated to ppp-2.4.2 by David Woodhouse 2004.
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *  - disconnect method added
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *  - remove_options() abuse removed.
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *  This program is free software; you can redistribute it and/or
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *  modify it under the terms of the GNU General Public License
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *  as published by the Free Software Foundation; either version
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *  2 of the License, or (at your option) any later version.
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <unistd.h>
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <string.h>
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdlib.h>
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd.h"
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pathnames.h"
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "fsm.h" /* Needed for lcp.h to include cleanly */
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "lcp.h"
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <atm.h>
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <linux/atmdev.h>
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <linux/atmppp.h>
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/stat.h>
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <net/if.h>
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/ioctl.h>
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectconst char pppd_version[] = VERSION;
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic struct sockaddr_atmpvc pvcaddr;
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char *qosstr = NULL;
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic bool llc_encaps = 0;
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic bool vc_encaps = 0;
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int device_got_set = 0;
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int pppoatm_max_mtu, pppoatm_max_mru;
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int setdevname_pppoatm(const char *cp, const char **argv, int doit);
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct channel pppoa_channel;
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int pppoa_fd = -1;
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic option_t pppoa_options[] = {
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{ "device name", o_wild, (void *) &setdevname_pppoatm,
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	  "ATM service provider IDs: VPI.VCI",
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	  OPT_DEVNAM | OPT_PRIVFIX | OPT_NOARG  | OPT_A2STRVAL | OPT_STATIC,
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	  devnam},
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{ "llc-encaps", o_bool, &llc_encaps,
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	  "use LLC encapsulation for PPPoATM", 1},
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{ "vc-encaps", o_bool, &vc_encaps,
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	  "use VC multiplexing for PPPoATM (default)", 1},
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{ "qos", o_string, &qosstr,
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	  "set QoS for PPPoATM connection", 1},
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{ NULL }
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project};
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* returns:
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *  -1 if there's a problem with setting the device
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *   0 if we can't parse "cp" as a valid name of a device
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *   1 if "cp" is a reasonable thing to name a device
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Note that we don't actually open the device at this point
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * We do need to fill in:
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *   devnam: a string representation of the device
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *   devstat: a stat structure of the device.  In this case
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *     we're not opening a device, so we just make sure
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *     to set up S_ISCHR(devstat.st_mode) != 1, so we
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *     don't get confused that we're on stdin.
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint (*old_setdevname_hook)(const char* cp) = NULL;
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int setdevname_pppoatm(const char *cp, const char **argv, int doit)
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	struct sockaddr_atmpvc addr;
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	extern struct stat devstat;
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (device_got_set)
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return 0;
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	//info("PPPoATM setdevname_pppoatm: '%s'", cp);
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	memset(&addr, 0, sizeof addr);
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (text2atm(cp, (struct sockaddr *) &addr, sizeof(addr),
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    T2A_PVC | T2A_NAME) < 0) {
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project               if(doit)
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project                   info("atm does not recognize: %s", cp);
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return 0;
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project           }
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (!doit) return 1;
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	//if (!dev_set_ok()) return -1;
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	memcpy(&pvcaddr, &addr, sizeof pvcaddr);
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	strlcpy(devnam, cp, sizeof devnam);
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	devstat.st_mode = S_IFSOCK;
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (the_channel != &pppoa_channel) {
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		the_channel = &pppoa_channel;
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		lcp_wantoptions[0].neg_accompression = 0;
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		lcp_allowoptions[0].neg_accompression = 0;
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		lcp_wantoptions[0].neg_asyncmap = 0;
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		lcp_allowoptions[0].neg_asyncmap = 0;
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		lcp_wantoptions[0].neg_pcompression = 0;
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	info("PPPoATM setdevname_pppoatm - SUCCESS:%s", cp);
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	device_got_set = 1;
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return 1;
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define pppoatm_overhead() (llc_encaps ? 6 : 2)
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void no_device_given_pppoatm(void)
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fatal("No vpi.vci specified");
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void set_line_discipline_pppoatm(int fd)
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	struct atm_backend_ppp be;
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	be.backend_num = ATM_BACKEND_PPP;
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (!llc_encaps)
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		be.encaps = PPPOATM_ENCAPS_VC;
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	else if (!vc_encaps)
1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		be.encaps = PPPOATM_ENCAPS_LLC;
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	else
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		be.encaps = PPPOATM_ENCAPS_AUTODETECT;
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (ioctl(fd, ATM_SETBACKEND, &be) < 0)
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		fatal("ioctl(ATM_SETBACKEND): %m");
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if 0
1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void reset_line_discipline_pppoatm(int fd)
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	atm_backend_t be = ATM_BACKEND_RAW;
1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* 2.4 doesn't support this yet */
1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	(void) ioctl(fd, ATM_SETBACKEND, &be);
1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int connect_pppoatm(void)
1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int fd;
1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	struct atm_qos qos;
1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* XXX: This won't work on Android */
1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	system ("/sbin/modprobe pppoatm");
1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (!device_got_set)
1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		no_device_given_pppoatm();
1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fd = socket(AF_ATMPVC, SOCK_DGRAM, 0);
1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (fd < 0)
1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		fatal("failed to create socket: %m");
1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	memset(&qos, 0, sizeof qos);
1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	qos.txtp.traffic_class = qos.rxtp.traffic_class = ATM_UBR;
1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* TODO: support simplified QoS setting */
1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (qosstr != NULL)
1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (text2qos(qosstr, &qos, 0))
1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			fatal("Can't parse QoS: \"%s\"");
1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	qos.txtp.max_sdu = lcp_allowoptions[0].mru + pppoatm_overhead();
1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	qos.rxtp.max_sdu = lcp_wantoptions[0].mru + pppoatm_overhead();
1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	qos.aal = ATM_AAL5;
1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (setsockopt(fd, SOL_ATM, SO_ATMQOS, &qos, sizeof(qos)) < 0)
1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		fatal("setsockopt(SO_ATMQOS): %m");
1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* TODO: accept on SVCs... */
1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (connect(fd, (struct sockaddr *) &pvcaddr,
1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    sizeof(struct sockaddr_atmpvc)))
1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		fatal("connect(%s): %m", devnam);
1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	pppoatm_max_mtu = lcp_allowoptions[0].mru;
1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	pppoatm_max_mru = lcp_wantoptions[0].mru;
1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	set_line_discipline_pppoatm(fd);
1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	strlcpy(ppp_devnam, devnam, sizeof(ppp_devnam));
1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	pppoa_fd = fd;
1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return fd;
1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void disconnect_pppoatm(void)
1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	close(pppoa_fd);
1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void send_config_pppoa(int mtu,
1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			      u_int32_t asyncmap,
1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			      int pcomp,
1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			      int accomp)
1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int sock;
1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	struct ifreq ifr;
1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (mtu > pppoatm_max_mtu)
1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		error("Couldn't increase MTU to %d", mtu);
1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	sock = socket(AF_INET, SOCK_DGRAM, 0);
1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (sock < 0)
1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		fatal("Couldn't create IP socket: %m");
1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	ifr.ifr_mtu = mtu;
1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (ioctl(sock, SIOCSIFMTU, (caddr_t) &ifr) < 0)
1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		fatal("ioctl(SIOCSIFMTU): %m");
1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	(void) close (sock);
1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void recv_config_pppoa(int mru,
1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			      u_int32_t asyncmap,
1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			      int pcomp,
1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			      int accomp)
1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (mru > pppoatm_max_mru)
1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		error("Couldn't increase MRU to %d", mru);
1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid plugin_init(void)
2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__linux__)
2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	extern int new_style_driver;	/* From sys-linux.c */
2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (!ppp_available() && !new_style_driver)
2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		fatal("Kernel doesn't support ppp_generic - "
2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    "needed for PPPoATM");
2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else
2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fatal("No PPPoATM support on this OS");
2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	info("PPPoATM plugin_init");
2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	add_options(pppoa_options);
2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct channel pppoa_channel = {
2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    options: pppoa_options,
2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    process_extra_options: NULL,
2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    check_options: NULL,
2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    connect: &connect_pppoatm,
2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    disconnect: &disconnect_pppoatm,
2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    establish_ppp: &generic_establish_ppp,
2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    disestablish_ppp: &generic_disestablish_ppp,
2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    send_config: &send_config_pppoa,
2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    recv_config: &recv_config_pppoa,
2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    close: NULL,
2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    cleanup: NULL
2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project};
226