18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/***********************************************************************
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* plugin.c
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* pppd plugin for kernel-mode PPPoE on Linux
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Copyright (C) 2001 by Roaring Penguin Software Inc., Michal Ostrowski
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* and Jamal Hadi Salim.
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Much code and many ideas derived from pppoe plugin by Michal
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Ostrowski and Jamal Hadi Salim, which carries this copyright:
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Copyright 2000 Michal Ostrowski <mostrows@styx.uwaterloo.ca>,
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*                Jamal Hadi Salim <hadi@cyberus.ca>
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Borrows heavily from the PPPoATM plugin by Mitchell Blank Jr.,
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* which is based in part on work from Jens Axboe and Paul Mackerras.
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* This program is free software; you can redistribute it and/or
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* modify it under the terms of the GNU General Public License
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* as published by the Free Software Foundation; either version
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* 2 of the License, or (at your option) any later version.
221286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley*
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project***********************************************************************/
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char const RCSID[] =
261286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley"$Id: plugin.c,v 1.17 2008/06/15 04:35:50 paulus Exp $";
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define _GNU_SOURCE 1
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppoe.h"
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/pppd.h"
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/fsm.h"
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/lcp.h"
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/ipcp.h"
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/ccp.h"
361286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley/* #include "pppd/pathnames.h" */
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <linux/types.h>
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/ioctl.h>
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/types.h>
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/socket.h>
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/stat.h>
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <string.h>
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdlib.h>
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <errno.h>
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <unistd.h>
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <fcntl.h>
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <signal.h>
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <net/ethernet.h>
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <net/if_arp.h>
511286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley#include <linux/ppp_defs.h>
521286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley#include <linux/if_pppox.h>
531286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
541286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley#ifndef _ROOT_PATH
551286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley#define _ROOT_PATH ""
561286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley#endif
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define _PATH_ETHOPT         _ROOT_PATH "/etc/ppp/options."
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar pppd_version[] = VERSION;
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* From sys-linux.c in pppd -- MUST FIX THIS! */
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern int new_style_driver;
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *pppd_pppoe_service = NULL;
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char *acName = NULL;
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char *existingSession = NULL;
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int printACNames = 0;
691286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langleystatic char *pppoe_reqd_mac = NULL;
701286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langleyunsigned char pppoe_reqd_mac_addr[6];
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int PPPoEDevnameHook(char *cmd, char **argv, int doit);
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic option_t Options[] = {
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    { "device name", o_wild, (void *) &PPPoEDevnameHook,
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      "PPPoE device name",
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      OPT_DEVNAM | OPT_PRIVFIX | OPT_NOARG  | OPT_A2STRVAL | OPT_STATIC,
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      devnam},
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    { "rp_pppoe_service", o_string, &pppd_pppoe_service,
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      "Desired PPPoE service name" },
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    { "rp_pppoe_ac",      o_string, &acName,
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      "Desired PPPoE access concentrator name" },
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    { "rp_pppoe_sess",    o_string, &existingSession,
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      "Attach to existing session (sessid:macaddr)" },
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    { "rp_pppoe_verbose", o_int, &printACNames,
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project      "Be verbose about discovered access concentrators"},
861286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    { "pppoe-mac", o_string, &pppoe_reqd_mac,
871286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley      "Only connect to specified MAC address" },
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    { NULL }
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project};
901286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langleyint (*OldDevnameHook)(char *cmd, char **argv, int doit) = NULL;
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic PPPoEConnection *conn = NULL;
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**********************************************************************
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %FUNCTION: PPPOEInitDevice
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %ARGUMENTS:
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * None
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %RETURNS:
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %DESCRIPTION:
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Initializes PPPoE device.
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************/
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOEInitDevice(void)
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    conn = malloc(sizeof(PPPoEConnection));
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (!conn) {
1071286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	novm("PPPoE session data");
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    memset(conn, 0, sizeof(PPPoEConnection));
1101286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    conn->ifName = devnam;
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    conn->discoverySocket = -1;
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    conn->sessionSocket = -1;
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    conn->useHostUniq = 1;
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    conn->printACNames = printACNames;
1151286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    conn->discoveryTimeout = PADI_TIMEOUT;
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return 1;
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**********************************************************************
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %FUNCTION: PPPOEConnectDevice
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %ARGUMENTS:
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * None
1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %RETURNS:
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Non-negative if all goes well; -1 otherwise
1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %DESCRIPTION:
1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Connects PPPoE device.
1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************/
1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int
1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOEConnectDevice(void)
1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    struct sockaddr_pppox sp;
1321286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    struct ifreq ifr;
1331286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    int s;
1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1351286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    /* Open session socket before discovery phase, to avoid losing session */
1361286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    /* packets sent by peer just after PADS packet (noted on some Cisco    */
1371286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    /* server equipment).                                                  */
1381286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    /* Opening this socket just before waitForPADS in the discovery()      */
1391286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    /* function would be more appropriate, but it would mess-up the code   */
1401286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    conn->sessionSocket = socket(AF_PPPOX, SOCK_STREAM, PX_PROTO_OE);
1411286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (conn->sessionSocket < 0) {
1421286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	error("Failed to create PPPoE socket: %m");
1431286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	return -1;
1441286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    }
1451286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
1461286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    /* Restore configuration */
1471286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    lcp_allowoptions[0].mru = conn->mtu;
1481286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    lcp_wantoptions[0].mru = conn->mru;
1491286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
1501286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    /* Update maximum MRU */
1511286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    s = socket(AF_INET, SOCK_DGRAM, 0);
1521286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (s < 0) {
1531286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	error("Can't get MTU for %s: %m", conn->ifName);
1541286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	goto errout;
1551286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    }
1561286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    strncpy(ifr.ifr_name, conn->ifName, sizeof(ifr.ifr_name));
1571286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (ioctl(s, SIOCGIFMTU, &ifr) < 0) {
1581286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	error("Can't get MTU for %s: %m", conn->ifName);
1591286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	close(s);
1601286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	goto errout;
1611286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    }
1621286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    close(s);
1631286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
1641286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (lcp_allowoptions[0].mru > ifr.ifr_mtu - TOTAL_OVERHEAD)
1651286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	lcp_allowoptions[0].mru = ifr.ifr_mtu - TOTAL_OVERHEAD;
1661286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (lcp_wantoptions[0].mru > ifr.ifr_mtu - TOTAL_OVERHEAD)
1671286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	lcp_wantoptions[0].mru = ifr.ifr_mtu - TOTAL_OVERHEAD;
1681286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
1691286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    conn->acName = acName;
1701286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    conn->serviceName = pppd_pppoe_service;
1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    strlcpy(ppp_devnam, devnam, sizeof(ppp_devnam));
1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (existingSession) {
1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	unsigned int mac[ETH_ALEN];
1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int i, ses;
1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (sscanf(existingSession, "%d:%x:%x:%x:%x:%x:%x",
1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		   &ses, &mac[0], &mac[1], &mac[2],
1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		   &mac[3], &mac[4], &mac[5]) != 7) {
1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    fatal("Illegal value for rp_pppoe_sess option");
1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	conn->session = htons(ses);
1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for (i=0; i<ETH_ALEN; i++) {
1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    conn->peerEth[i] = (unsigned char) mac[i];
1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    } else {
1851286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	conn->discoverySocket =
1861286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley            openInterface(conn->ifName, Eth_PPPOE_Discovery, conn->myEth);
1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	discovery(conn);
1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (conn->discoveryState != STATE_SESSION) {
1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    error("Unable to complete PPPoE Discovery");
1901286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	    goto errout;
1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* Set PPPoE session-number for further consumption */
1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ppp_session_number = ntohs(conn->session);
1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    sp.sa_family = AF_PPPOX;
1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    sp.sa_protocol = PX_PROTO_OE;
1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    sp.sa_addr.pppoe.sid = conn->session;
2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    memcpy(sp.sa_addr.pppoe.dev, conn->ifName, IFNAMSIZ);
2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    memcpy(sp.sa_addr.pppoe.remote, conn->peerEth, ETH_ALEN);
2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* Set remote_number for ServPoET */
2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    sprintf(remote_number, "%02X:%02X:%02X:%02X:%02X:%02X",
2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    (unsigned) conn->peerEth[0],
2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    (unsigned) conn->peerEth[1],
2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    (unsigned) conn->peerEth[2],
2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    (unsigned) conn->peerEth[3],
2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    (unsigned) conn->peerEth[4],
2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    (unsigned) conn->peerEth[5]);
2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2121286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    warn("Connected to %02X:%02X:%02X:%02X:%02X:%02X via interface %s",
2131286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	 (unsigned) conn->peerEth[0],
2141286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	 (unsigned) conn->peerEth[1],
2151286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	 (unsigned) conn->peerEth[2],
2161286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	 (unsigned) conn->peerEth[3],
2171286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	 (unsigned) conn->peerEth[4],
2181286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	 (unsigned) conn->peerEth[5],
2191286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	 conn->ifName);
2201286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
2211286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    script_setenv("MACREMOTE", remote_number, 0);
2221286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (connect(conn->sessionSocket, (struct sockaddr *) &sp,
2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		sizeof(struct sockaddr_pppox)) < 0) {
2251286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	error("Failed to connect PPPoE socket: %d %m", errno);
2261286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	goto errout;
2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return conn->sessionSocket;
2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2311286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley errout:
2321286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (conn->discoverySocket >= 0) {
2331286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	sendPADT(conn, NULL);
2341286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	close(conn->discoverySocket);
2351286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	conn->discoverySocket = -1;
2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
2371286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    close(conn->sessionSocket);
2381286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    return -1;
2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void
2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOERecvConfig(int mru,
2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		u_int32_t asyncmap,
2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		int pcomp,
2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		int accomp)
2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
2471286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley#if 0 /* broken protocol, but no point harrassing the users I guess... */
2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (mru > MAX_PPPOE_MTU)
2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	warn("Couldn't increase MRU to %d", mru);
2501286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley#endif
2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**********************************************************************
2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %FUNCTION: PPPOEDisconnectDevice
2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %ARGUMENTS:
2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * None
2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %RETURNS:
2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Nothing
2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %DESCRIPTION:
2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Disconnects PPPoE device
2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************/
2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void
2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOEDisconnectDevice(void)
2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    struct sockaddr_pppox sp;
2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    sp.sa_family = AF_PPPOX;
2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    sp.sa_protocol = PX_PROTO_OE;
2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    sp.sa_addr.pppoe.sid = 0;
2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    memcpy(sp.sa_addr.pppoe.dev, conn->ifName, IFNAMSIZ);
2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    memcpy(sp.sa_addr.pppoe.remote, conn->peerEth, ETH_ALEN);
2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (connect(conn->sessionSocket, (struct sockaddr *) &sp,
2731286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley		sizeof(struct sockaddr_pppox)) < 0)
2741286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	error("Failed to disconnect PPPoE socket: %d %m", errno);
2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    close(conn->sessionSocket);
2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* don't send PADT?? */
2771286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (conn->discoverySocket >= 0)
2781286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	close(conn->discoverySocket);
2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void
2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOEDeviceOptions(void)
2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char buf[256];
2851286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    snprintf(buf, 256, _PATH_ETHOPT "%s", devnam);
2861286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (!options_from_file(buf, 0, 0, 1))
2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	exit(EXIT_OPTION_ERROR);
2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct channel pppoe_channel;
2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**********************************************************************
2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %FUNCTION: PPPoEDevnameHook
2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %ARGUMENTS:
2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * cmd -- the command (actually, the device name
2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * argv -- argument vector
2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * doit -- if non-zero, set device name.  Otherwise, just check if possible
2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %RETURNS:
3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 1 if we will handle this device; 0 otherwise.
3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %DESCRIPTION:
3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Checks if name is a valid interface name; if so, returns 1.  Also
3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * sets up devnam (string representation of device).
3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************/
3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int
3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPoEDevnameHook(char *cmd, char **argv, int doit)
3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
3088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int r = 1;
3098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int fd;
3108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    struct ifreq ifr;
3118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3121286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    /*
3131286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley     * Take any otherwise-unrecognized option as a possible device name,
3141286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley     * and test if it is the name of a network interface with a
3151286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley     * hardware address whose sa_family is ARPHRD_ETHER.
3161286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley     */
3178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (strlen(cmd) > 4 && !strncmp(cmd, "nic-", 4)) {
3188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* Strip off "nic-" */
3198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	cmd += 4;
3208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
3218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* Open a socket */
3238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if ((fd = socket(PF_PACKET, SOCK_RAW, 0)) < 0) {
3248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	r = 0;
3258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
3268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* Try getting interface index */
3288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (r) {
3298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	strncpy(ifr.ifr_name, cmd, sizeof(ifr.ifr_name));
3308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) {
3318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    r = 0;
3328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	} else {
3338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
3348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		r = 0;
3358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    } else {
3368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
3371286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley		    if (doit)
3381286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley			error("Interface %s not Ethernet", cmd);
3391286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley		    r = 0;
3408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
3418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
3428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
3448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* Close socket */
3468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    close(fd);
3471286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (r && doit) {
3488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	strncpy(devnam, cmd, sizeof(devnam));
3498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (the_channel != &pppoe_channel) {
3508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    the_channel = &pppoe_channel;
3528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    modem = 0;
3538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    PPPOEInitDevice();
3558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return 1;
3578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
3588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return r;
3608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**********************************************************************
3638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %FUNCTION: plugin_init
3648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %ARGUMENTS:
3658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * None
3668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %RETURNS:
3678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Nothing
3688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %DESCRIPTION:
3698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Initializes hooks for pppd plugin
3708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************/
3718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
3728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectplugin_init(void)
3738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
3748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (!ppp_available() && !new_style_driver) {
3758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fatal("Linux kernel does not support PPPoE -- are you running 2.4.x?");
3768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
3778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    add_options(Options);
3798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    info("RP-PPPoE plugin version %s compiled against pppd %s",
3818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 RP_VERSION, VERSION);
3828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3841286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langleyvoid pppoe_check_options(void)
3858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
3861286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    unsigned int mac[6];
3871286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    int i;
3881286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
3891286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (pppoe_reqd_mac != NULL) {
3901286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	if (sscanf(pppoe_reqd_mac, "%x:%x:%x:%x:%x:%x",
3911286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley		   &mac[0], &mac[1], &mac[2], &mac[3],
3921286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley		   &mac[4], &mac[5]) != 6) {
3931286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	    option_error("cannot parse pppoe-mac option value");
3941286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	    exit(EXIT_OPTION_ERROR);
3951286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	}
3961286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	for (i = 0; i < 6; ++i)
3971286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	    conn->req_peer_mac[i] = mac[i];
3981286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	conn->req_peer = 1;
3991286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    }
4008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4011286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    lcp_allowoptions[0].neg_accompression = 0;
4021286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    lcp_wantoptions[0].neg_accompression = 0;
4031286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
4041286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    lcp_allowoptions[0].neg_asyncmap = 0;
4051286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    lcp_wantoptions[0].neg_asyncmap = 0;
4061286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
4071286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    lcp_allowoptions[0].neg_pcompression = 0;
4081286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    lcp_wantoptions[0].neg_pcompression = 0;
4091286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
4101286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (lcp_allowoptions[0].mru > MAX_PPPOE_MTU)
4111286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	lcp_allowoptions[0].mru = MAX_PPPOE_MTU;
4121286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    if (lcp_wantoptions[0].mru > MAX_PPPOE_MTU)
4131286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	lcp_wantoptions[0].mru = MAX_PPPOE_MTU;
4148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4151286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    /* Save configuration */
4161286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    conn->mtu = lcp_allowoptions[0].mru;
4171286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    conn->mru = lcp_wantoptions[0].mru;
4181286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
4191286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    ccp_allowoptions[0].deflate = 0;
4201286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    ccp_wantoptions[0].deflate = 0;
4211286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
4221286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    ipcp_allowoptions[0].neg_vj = 0;
4231286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    ipcp_wantoptions[0].neg_vj = 0;
4241286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley
4251286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    ccp_allowoptions[0].bsd_compress = 0;
4261286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    ccp_wantoptions[0].bsd_compress = 0;
4271286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley}
4288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct channel pppoe_channel = {
4301286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .options = Options,
4311286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .process_extra_options = &PPPOEDeviceOptions,
4321286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .check_options = pppoe_check_options,
4331286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .connect = &PPPOEConnectDevice,
4341286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .disconnect = &PPPOEDisconnectDevice,
4351286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .establish_ppp = &generic_establish_ppp,
4361286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .disestablish_ppp = &generic_disestablish_ppp,
4371286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .send_config = NULL,
4381286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .recv_config = &PPPOERecvConfig,
4391286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .close = NULL,
4401286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley    .cleanup = NULL
4418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project};
442