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