18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*********************************************************************** 28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* 38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* pppoe.h 48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* 58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Declaration of various PPPoE constants 68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* 78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Copyright (C) 2000 Roaring Penguin Software Inc. 88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* 98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* This program may be distributed according to the terms of the GNU 108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* General Public License, version 2 or (at your option) any later version. 118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* 128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* $Id: pppoe.h,v 1.2 2004/11/04 10:07:37 paulus Exp $ 138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* 148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project***********************************************************************/ 158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef __sun__ 178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define __EXTENSIONS__ 188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "config.h" 218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(HAVE_NETPACKET_PACKET_H) || defined(HAVE_LINUX_IF_PACKET_H) 238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define _POSIX_SOURCE 1 /* For sigaction defines */ 248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdio.h> /* For FILE */ 278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/types.h> /* For pid_t */ 288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* How do we access raw Ethernet devices? */ 308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#undef USE_LINUX_PACKET 318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#undef USE_BPF 328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(HAVE_NETPACKET_PACKET_H) || defined(HAVE_LINUX_IF_PACKET_H) 348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define USE_LINUX_PACKET 1 358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#elif defined(HAVE_SYS_DLPI_H) 368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define USE_DLPI 378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#elif defined(HAVE_NET_BPF_H) 388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define USE_BPF 1 398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Sanity check */ 428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if !defined(USE_BPF) && !defined(USE_LINUX_PACKET) && !defined(USE_DLPI) 438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#error Unknown method for accessing raw Ethernet frames 448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef HAVE_SYS_CDEFS_H 478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/cdefs.h> 488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef HAVE_SYS_SOCKET_H 518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/socket.h> 528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Ugly header files on some Linux boxes... */ 558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(HAVE_LINUX_IF_H) 568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <linux/if.h> 578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#elif defined(HAVE_NET_IF_H) 588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <net/if.h> 598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef HAVE_NET_IF_TYPES_H 628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <net/if_types.h> 638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef HAVE_NET_IF_DL_H 668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <net/if_dl.h> 678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* I'm not sure why this is needed... I do not have OpenBSD */ 708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__OpenBSD__) 718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <net/ppp_defs.h> 728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <net/if_ppp.h> 738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef USE_BPF 768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern int bpfSize; 778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct PPPoEPacketStruct; 788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid sessionDiscoveryPacket(struct PPPoEPacketStruct *packet); 798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define BPF_BUFFER_IS_EMPTY (bpfSize <= 0) 808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define BPF_BUFFER_HAS_DATA (bpfSize > 0) 818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ethhdr ether_header 828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define h_dest ether_dhost 838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define h_source ether_shost 848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define h_proto ether_type 858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ETH_DATA_LEN ETHERMTU 868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ETH_ALEN ETHER_ADDR_LEN 878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else 888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#undef USE_BPF 898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define BPF_BUFFER_IS_EMPTY 1 908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define BPF_BUFFER_HAS_DATA 0 918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef USE_DLPI 948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/ethernet.h> 958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ethhdr ether_header 968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ETH_DATA_LEN ETHERMTU 978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ETH_ALEN ETHERADDRL 988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define h_dest ether_dhost.ether_addr_octet 998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define h_source ether_shost.ether_addr_octet 1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define h_proto ether_type 1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* cloned from dltest.h */ 1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MAXDLBUF 8192 1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MAXDLADDR 1024 1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MAXWAIT 15 1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define OFFADDR(s, n) (u_char*)((char*)(s) + (int)(n)) 1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CASERET(s) case s: return ("s") 1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Define various integer types -- assumes a char is 8 bits */ 1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if SIZEOF_UNSIGNED_SHORT == 2 1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef unsigned short UINT16_t; 1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#elif SIZEOF_UNSIGNED_INT == 2 1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef unsigned int UINT16_t; 1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else 1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#error Could not find a 16-bit integer type 1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if SIZEOF_UNSIGNED_SHORT == 4 1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef unsigned short UINT32_t; 1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#elif SIZEOF_UNSIGNED_INT == 4 1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef unsigned int UINT32_t; 1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#elif SIZEOF_UNSIGNED_LONG == 4 1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef unsigned long UINT32_t; 1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else 1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#error Could not find a 16-bit integer type 1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef HAVE_LINUX_IF_ETHER_H 1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <linux/if_ether.h> 1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <netinet/in.h> 1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef HAVE_NETINET_IF_ETHER_H 1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/types.h> 1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef HAVE_SYS_SOCKET_H 1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/socket.h> 1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef HAVE_SYS_DLPI_H 1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <netinet/if_ether.h> 1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Ethernet frame types according to RFC 2516 */ 1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ETH_PPPOE_DISCOVERY 0x8863 1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define ETH_PPPOE_SESSION 0x8864 1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* But some brain-dead peers disobey the RFC, so frame types are variables */ 1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern UINT16_t Eth_PPPOE_Discovery; 1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern UINT16_t Eth_PPPOE_Session; 1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* PPPoE codes */ 1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CODE_PADI 0x09 1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CODE_PADO 0x07 1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CODE_PADR 0x19 1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CODE_PADS 0x65 1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CODE_PADT 0xA7 1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CODE_SESS 0x00 1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* PPPoE Tags */ 1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_END_OF_LIST 0x0000 1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_SERVICE_NAME 0x0101 1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_AC_NAME 0x0102 1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_HOST_UNIQ 0x0103 1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_AC_COOKIE 0x0104 1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_VENDOR_SPECIFIC 0x0105 1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_RELAY_SESSION_ID 0x0110 1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_SERVICE_NAME_ERROR 0x0201 1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_AC_SYSTEM_ERROR 0x0202 1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_GENERIC_ERROR 0x0203 1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Discovery phase states */ 1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STATE_SENT_PADI 0 1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STATE_RECEIVED_PADO 1 1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STATE_SENT_PADR 2 1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STATE_SESSION 3 1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STATE_TERMINATED 4 1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* How many PADI/PADS attempts? */ 1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MAX_PADI_ATTEMPTS 3 1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Initial timeout for PADO/PADS */ 1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define PADI_TIMEOUT 5 1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* States for scanning PPP frames */ 1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STATE_WAITFOR_FRAME_ADDR 0 1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STATE_DROP_PROTO 1 1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define STATE_BUILDING_PACKET 2 1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Special PPP frame characters */ 1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define FRAME_ESC 0x7D 1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define FRAME_FLAG 0x7E 1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define FRAME_ADDR 0xFF 1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define FRAME_CTRL 0x03 2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define FRAME_ENC 0x20 2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define IPV4ALEN 4 2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define SMALLBUF 256 2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* A PPPoE Packet, including Ethernet headers */ 2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef struct PPPoEPacketStruct { 2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct ethhdr ethHdr; /* Ethernet header */ 2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef PACK_BITFIELDS_REVERSED 2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int type:4; /* PPPoE Type (must be 1) */ 2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int ver:4; /* PPPoE Version (must be 1) */ 2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else 2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int ver:4; /* PPPoE Version (must be 1) */ 2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int type:4; /* PPPoE Type (must be 1) */ 2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int code:8; /* PPPoE code */ 2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int session:16; /* PPPoE session */ 2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int length:16; /* Payload length */ 2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned char payload[ETH_DATA_LEN]; /* A bit of room to spare */ 2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} PPPoEPacket; 2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Header size of a PPPoE packet */ 2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define PPPOE_OVERHEAD 6 /* type, code, session, length */ 2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define HDR_SIZE (sizeof(struct ethhdr) + PPPOE_OVERHEAD) 2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MAX_PPPOE_PAYLOAD (ETH_DATA_LEN - PPPOE_OVERHEAD) 2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MAX_PPPOE_MTU (MAX_PPPOE_PAYLOAD - 2) 2268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* PPPoE Tag */ 2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef struct PPPoETagStruct { 2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int type:16; /* tag type */ 2318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int length:16; /* Length of payload */ 2328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned char payload[ETH_DATA_LEN]; /* A LOT of room to spare */ 2338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} PPPoETag; 2348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Header size of a PPPoE tag */ 2358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define TAG_HDR_SIZE 4 2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Chunk to read from stdin */ 2388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define READ_CHUNK 4096 2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Function passed to parsePacket */ 2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef void ParseFunc(UINT16_t type, 2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project UINT16_t len, 2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned char *data, 2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void *extra); 2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define PPPINITFCS16 0xffff /* Initial FCS value */ 2478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Keep track of the state of a connection -- collect everything in 2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project one spot */ 2508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecttypedef struct PPPoEConnectionStruct { 2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int discoveryState; /* Where we are in discovery */ 2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int discoverySocket; /* Raw socket for discovery frames */ 2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int sessionSocket; /* Raw socket for session frames */ 2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned char myEth[ETH_ALEN]; /* My MAC address */ 2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned char peerEth[ETH_ALEN]; /* Peer's MAC address */ 2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project UINT16_t session; /* Session ID */ 2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *ifName; /* Interface name */ 2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *serviceName; /* Desired service name, if any */ 2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *acName; /* Desired AC name, if any */ 2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int synchronous; /* Use synchronous PPP */ 2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int useHostUniq; /* Use Host-Uniq tag */ 2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int printACNames; /* Just print AC names */ 2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int skipDiscovery; /* Skip discovery */ 2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int noDiscoverySocket; /* Don't even open discovery socket */ 2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project FILE *debugFile; /* Debug file for dumping packets */ 2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int numPADOs; /* Number of PADO packets received */ 2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project PPPoETag cookie; /* We have to send this if we get it */ 2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project PPPoETag relayId; /* Ditto */ 2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} PPPoEConnection; 2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Structure used to determine acceptable PADO or PADS packet */ 2738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct PacketCriteria { 2748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project PPPoEConnection *conn; 2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int acNameOK; 2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int serviceNameOK; 2778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int seenACName; 2788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int seenServiceName; 2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}; 2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Function Prototypes */ 2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectUINT16_t etherType(PPPoEPacket *packet); 2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint openInterface(char const *ifname, UINT16_t type, unsigned char *hwaddr); 2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint sendPacket(PPPoEConnection *conn, int sock, PPPoEPacket *pkt, int size); 2858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint receivePacket(int sock, PPPoEPacket *pkt, int *size); 2868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid fatalSys(char const *str); 2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid rp_fatal(char const *str); 2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid printErr(char const *str); 2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid sysErr(char const *str); 2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid dumpPacket(FILE *fp, PPPoEPacket *packet, char const *dir); 2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid dumpHex(FILE *fp, unsigned char const *buf, int len); 2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint parsePacket(PPPoEPacket *packet, ParseFunc *func, void *extra); 2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid parseLogErrs(UINT16_t typ, UINT16_t len, unsigned char *data, void *xtra); 2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid syncReadFromPPP(PPPoEConnection *conn, PPPoEPacket *packet); 2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid asyncReadFromPPP(PPPoEConnection *conn, PPPoEPacket *packet); 2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid asyncReadFromEth(PPPoEConnection *conn, int sock, int clampMss); 2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid syncReadFromEth(PPPoEConnection *conn, int sock, int clampMss); 2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *strDup(char const *str); 2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid sendPADT(PPPoEConnection *conn, char const *msg); 3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid sendSessionPacket(PPPoEConnection *conn, 3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project PPPoEPacket *packet, int len); 3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid initPPP(void); 3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid clampMSS(PPPoEPacket *packet, char const *dir, int clampMss); 3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectUINT16_t computeTCPChecksum(unsigned char *ipHdr, unsigned char *tcpHdr); 3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectUINT16_t pppFCS16(UINT16_t fcs, unsigned char *cp, int len); 3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid discovery(PPPoEConnection *conn); 3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectunsigned char *findTag(PPPoEPacket *packet, UINT16_t tagType, 3088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project PPPoETag *tag); 3098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define SET_STRING(var, val) do { if (var) free(var); var = strDup(val); } while(0); 3118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHECK_ROOM(cursor, start, len) \ 3138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdo {\ 3148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (((cursor)-(start))+(len) > MAX_PPPOE_PAYLOAD) { \ 3158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project syslog(LOG_ERR, "Would create too-long packet"); \ 3168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return; \ 3178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } \ 3188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} while(0) 3198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* True if Ethernet address is broadcast or multicast */ 3218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define NOT_UNICAST(e) ((e[0] & 0x01) != 0) 3228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define BROADCAST(e) ((e[0] & e[1] & e[2] & e[3] & e[4] & e[5]) == 0xFF) 3238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define NOT_BROADCAST(e) ((e[0] & e[1] & e[2] & e[3] & e[4] & e[5]) != 0xFF) 324