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