pppoe.h revision 8ad0dd2a5c5f23cd210aedba72a43e48026e7436
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