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. 228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project***********************************************************************/ 238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char const RCSID[] = 258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project"$Id: plugin.c,v 1.12 2004/11/04 10:07:37 paulus Exp $"; 268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define _GNU_SOURCE 1 288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppoe.h" 298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/pppd.h" 318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/fsm.h" 328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/lcp.h" 338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/ipcp.h" 348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/ccp.h" 358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd/pathnames.h" 368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <linux/types.h> 388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <syslog.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> 518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "ppp_defs.h" 528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "if_ppp.h" 538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "if_pppox.h" 548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define _PATH_ETHOPT _ROOT_PATH "/etc/ppp/options." 568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar pppd_version[] = VERSION; 588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* From sys-linux.c in pppd -- MUST FIX THIS! */ 608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern int new_style_driver; 618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *pppd_pppoe_service = NULL; 638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char *acName = NULL; 648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char *existingSession = NULL; 658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int printACNames = 0; 668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int PPPoEDevnameHook(char *cmd, char **argv, int doit); 688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic option_t Options[] = { 698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "device name", o_wild, (void *) &PPPoEDevnameHook, 708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "PPPoE device name", 718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_DEVNAM | OPT_PRIVFIX | OPT_NOARG | OPT_A2STRVAL | OPT_STATIC, 728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project devnam}, 738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "rp_pppoe_service", o_string, &pppd_pppoe_service, 748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Desired PPPoE service name" }, 758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "rp_pppoe_ac", o_string, &acName, 768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Desired PPPoE access concentrator name" }, 778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "rp_pppoe_sess", o_string, &existingSession, 788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Attach to existing session (sessid:macaddr)" }, 798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "rp_pppoe_verbose", o_int, &printACNames, 808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Be verbose about discovered access concentrators"}, 818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { NULL } 828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}; 838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic PPPoEConnection *conn = NULL; 858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/********************************************************************** 878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %FUNCTION: PPPOEInitDevice 888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %ARGUMENTS: 898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * None 908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %RETURNS: 918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %DESCRIPTION: 938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Initializes PPPoE device. 948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************/ 958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOEInitDevice(void) 978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project conn = malloc(sizeof(PPPoEConnection)); 998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!conn) { 1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fatal("Could not allocate memory for PPPoE session"); 1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project memset(conn, 0, sizeof(PPPoEConnection)); 1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (acName) { 1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project SET_STRING(conn->acName, acName); 1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (pppd_pppoe_service) { 1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project SET_STRING(conn->serviceName, pppd_pppoe_service); 1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project SET_STRING(conn->ifName, devnam); 1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project conn->discoverySocket = -1; 1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project conn->sessionSocket = -1; 1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project conn->useHostUniq = 1; 1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project conn->printACNames = printACNames; 1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/********************************************************************** 1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %FUNCTION: PPPOEConnectDevice 1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %ARGUMENTS: 1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * None 1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %RETURNS: 1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Non-negative if all goes well; -1 otherwise 1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %DESCRIPTION: 1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Connects PPPoE device. 1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************/ 1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOEConnectDevice(void) 1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct sockaddr_pppox sp; 1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strlcpy(ppp_devnam, devnam, sizeof(ppp_devnam)); 1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (existingSession) { 1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int mac[ETH_ALEN]; 1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i, ses; 1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (sscanf(existingSession, "%d:%x:%x:%x:%x:%x:%x", 1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project &ses, &mac[0], &mac[1], &mac[2], 1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project &mac[3], &mac[4], &mac[5]) != 7) { 1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fatal("Illegal value for rp_pppoe_sess option"); 1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project conn->session = htons(ses); 1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (i=0; i<ETH_ALEN; i++) { 1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project conn->peerEth[i] = (unsigned char) mac[i]; 1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project discovery(conn); 1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (conn->discoveryState != STATE_SESSION) { 1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("Unable to complete PPPoE Discovery"); 1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return -1; 1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Set PPPoE session-number for further consumption */ 1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ppp_session_number = ntohs(conn->session); 1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Make the session socket */ 1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project conn->sessionSocket = socket(AF_PPPOX, SOCK_STREAM, PX_PROTO_OE); 1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (conn->sessionSocket < 0) { 1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fatal("Failed to create PPPoE socket: %m"); 1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sp.sa_family = AF_PPPOX; 1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sp.sa_protocol = PX_PROTO_OE; 1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sp.sa_addr.pppoe.sid = conn->session; 1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project memcpy(sp.sa_addr.pppoe.dev, conn->ifName, IFNAMSIZ); 1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project memcpy(sp.sa_addr.pppoe.remote, conn->peerEth, ETH_ALEN); 1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Set remote_number for ServPoET */ 1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sprintf(remote_number, "%02X:%02X:%02X:%02X:%02X:%02X", 1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (unsigned) conn->peerEth[0], 1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (unsigned) conn->peerEth[1], 1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (unsigned) conn->peerEth[2], 1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (unsigned) conn->peerEth[3], 1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (unsigned) conn->peerEth[4], 1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (unsigned) conn->peerEth[5]); 1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (connect(conn->sessionSocket, (struct sockaddr *) &sp, 1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sizeof(struct sockaddr_pppox)) < 0) { 1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fatal("Failed to connect PPPoE socket: %d %m", errno); 1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return -1; 1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return conn->sessionSocket; 1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void 1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOESendConfig(int mtu, 1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_int32_t asyncmap, 1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int pcomp, 1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int accomp) 1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int sock; 1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct ifreq ifr; 1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (mtu > MAX_PPPOE_MTU) { 1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project warn("Couldn't increase MTU to %d", mtu); 1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project mtu = MAX_PPPOE_MTU; 1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sock = socket(AF_INET, SOCK_DGRAM, 0); 1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (sock < 0) { 1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("Couldn't create IP socket: %m"); 2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return; 2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); 2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ifr.ifr_mtu = mtu; 2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (ioctl(sock, SIOCSIFMTU, &ifr) < 0) { 2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("Couldn't set interface MTU to %d: %m", mtu); 2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return; 2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (void) close (sock); 2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void 2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOERecvConfig(int mru, 2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_int32_t asyncmap, 2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int pcomp, 2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int accomp) 2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (mru > MAX_PPPOE_MTU) 2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project warn("Couldn't increase MRU to %d", mru); 2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/********************************************************************** 2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %FUNCTION: PPPOEDisconnectDevice 2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %ARGUMENTS: 2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * None 2268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %RETURNS: 2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Nothing 2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %DESCRIPTION: 2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Disconnects PPPoE device 2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************/ 2318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void 2328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOEDisconnectDevice(void) 2338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 2348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct sockaddr_pppox sp; 2358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sp.sa_family = AF_PPPOX; 2378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sp.sa_protocol = PX_PROTO_OE; 2388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sp.sa_addr.pppoe.sid = 0; 2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project memcpy(sp.sa_addr.pppoe.dev, conn->ifName, IFNAMSIZ); 2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project memcpy(sp.sa_addr.pppoe.remote, conn->peerEth, ETH_ALEN); 2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (connect(conn->sessionSocket, (struct sockaddr *) &sp, 2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sizeof(struct sockaddr_pppox)) < 0) { 2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fatal("Failed to disconnect PPPoE socket: %d %m", errno); 2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return; 2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project close(conn->sessionSocket); 2478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* don't send PADT?? */ 2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project close(conn->discoverySocket); 2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 2508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void 2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPOEDeviceOptions(void) 2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char buf[256]; 2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project snprintf(buf, 256, _PATH_ETHOPT "%s",devnam); 2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if(!options_from_file(buf, 0, 0, 1)) 2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project exit(EXIT_OPTION_ERROR); 2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct channel pppoe_channel; 2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/********************************************************************** 2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %FUNCTION: PPPoEDevnameHook 2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %ARGUMENTS: 2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * cmd -- the command (actually, the device name 2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * argv -- argument vector 2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * doit -- if non-zero, set device name. Otherwise, just check if possible 2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %RETURNS: 2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 1 if we will handle this device; 0 otherwise. 2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %DESCRIPTION: 2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Checks if name is a valid interface name; if so, returns 1. Also 2738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * sets up devnam (string representation of device). 2748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************/ 2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectPPPoEDevnameHook(char *cmd, char **argv, int doit) 2778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 2788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int r = 1; 2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int fd; 2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct ifreq ifr; 2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Only do it if name is "ethXXX", "nasXXX", "tapXXX" or "nic-XXXX. 2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project In latter case strip off the "nic-" */ 2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Thanks to Russ Couturier for this fix */ 2858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strlen(cmd) > 4 && !strncmp(cmd, "nic-", 4)) { 2868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Strip off "nic-" */ 2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project cmd += 4; 2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else if (strlen(cmd) < 4 2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project || (strncmp(cmd, "eth", 3) && strncmp(cmd, "nas", 3) 2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project && strncmp(cmd, "tap", 3) && strncmp(cmd, "br", 2))) { 2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Open a socket */ 2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((fd = socket(PF_PACKET, SOCK_RAW, 0)) < 0) { 2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project r = 0; 2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Try getting interface index */ 3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (r) { 3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strncpy(ifr.ifr_name, cmd, sizeof(ifr.ifr_name)); 3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) { 3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project r = 0; 3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { 3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project r = 0; 3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 3088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) { 3098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("Interface %s not Ethernet", cmd); 3108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project r=0; 3118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Close socket */ 3178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project close(fd); 3188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (r) { 3198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strncpy(devnam, cmd, sizeof(devnam)); 3208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (the_channel != &pppoe_channel) { 3218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project the_channel = &pppoe_channel; 3238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project modem = 0; 3248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project lcp_allowoptions[0].neg_accompression = 0; 3268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project lcp_wantoptions[0].neg_accompression = 0; 3278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project lcp_allowoptions[0].neg_asyncmap = 0; 3298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project lcp_wantoptions[0].neg_asyncmap = 0; 3308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project lcp_allowoptions[0].neg_pcompression = 0; 3328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project lcp_wantoptions[0].neg_pcompression = 0; 3338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ccp_allowoptions[0].deflate = 0 ; 3358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ccp_wantoptions[0].deflate = 0 ; 3368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ipcp_allowoptions[0].neg_vj=0; 3388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ipcp_wantoptions[0].neg_vj=0; 3398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ccp_allowoptions[0].bsd_compress = 0; 3418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ccp_wantoptions[0].bsd_compress = 0; 3428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project PPPOEInitDevice(); 3448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 3468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return r; 3498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 3508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/********************************************************************** 3528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %FUNCTION: plugin_init 3538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %ARGUMENTS: 3548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * None 3558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %RETURNS: 3568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Nothing 3578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * %DESCRIPTION: 3588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Initializes hooks for pppd plugin 3598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ***********************************************************************/ 3608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 3618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectplugin_init(void) 3628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 3638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!ppp_available() && !new_style_driver) { 3648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fatal("Linux kernel does not support PPPoE -- are you running 2.4.x?"); 3658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project add_options(Options); 3688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project info("RP-PPPoE plugin version %s compiled against pppd %s", 3708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project RP_VERSION, VERSION); 3718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 3728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/********************************************************************** 3748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%FUNCTION: fatalSys 3758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%ARGUMENTS: 3768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* str -- error message 3778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%RETURNS: 3788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Nothing 3798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%DESCRIPTION: 3808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Prints a message plus the errno value to stderr and syslog and exits. 3818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project***********************************************************************/ 3828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 3838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectfatalSys(char const *str) 3848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 3858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char buf[1024]; 3868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i = errno; 3878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sprintf(buf, "%.256s: %.256s", str, strerror(i)); 3888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printErr(buf); 3898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sprintf(buf, "RP-PPPoE: %.256s: %.256s", str, strerror(i)); 3908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sendPADT(conn, buf); 3918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project exit(1); 3928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 3938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/********************************************************************** 3958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%FUNCTION: rp_fatal 3968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%ARGUMENTS: 3978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* str -- error message 3988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%RETURNS: 3998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Nothing 4008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%DESCRIPTION: 4018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Prints a message to stderr and syslog and exits. 4028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project***********************************************************************/ 4038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 4048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectrp_fatal(char const *str) 4058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 4068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char buf[1024]; 4078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printErr(str); 4088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sprintf(buf, "RP-PPPoE: %.256s", str); 4098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sendPADT(conn, buf); 4108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project exit(1); 4118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 4128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/********************************************************************** 4138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%FUNCTION: sysErr 4148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%ARGUMENTS: 4158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* str -- error message 4168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%RETURNS: 4178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Nothing 4188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*%DESCRIPTION: 4198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Prints a message plus the errno value to syslog. 4208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project***********************************************************************/ 4218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 4228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectsysErr(char const *str) 4238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 4248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project rp_fatal(str); 4258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 4268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct channel pppoe_channel = { 4298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project options: Options, 4308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project process_extra_options: &PPPOEDeviceOptions, 4318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project check_options: NULL, 4328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project connect: &PPPOEConnectDevice, 4338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project disconnect: &PPPOEDisconnectDevice, 4348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project establish_ppp: &generic_establish_ppp, 4358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project disestablish_ppp: &generic_disestablish_ppp, 4368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project send_config: &PPPOESendConfig, 4378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project recv_config: &PPPOERecvConfig, 4388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project close: NULL, 4398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project cleanup: NULL 4408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}; 441