X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fplugins%2Frp-pppoe%2Fpppoe.h;h=3dba439082d3d2a38011cff34b6961fd5290c867;hp=35c98c8232dac6fb9f61f39f7852d48dda255e34;hb=76307d910b81acb709143b2fd82e1ca724feb24c;hpb=dbfeebc9adcf76a50c1d4e9035d5d481914edb43 diff --git a/pppd/plugins/rp-pppoe/pppoe.h b/pppd/plugins/rp-pppoe/pppoe.h index 35c98c8..3dba439 100644 --- a/pppd/plugins/rp-pppoe/pppoe.h +++ b/pppd/plugins/rp-pppoe/pppoe.h @@ -9,14 +9,10 @@ * This program may be distributed according to the terms of the GNU * General Public License, version 2 or (at your option) any later version. * -* $Id: pppoe.h,v 1.1 2001/12/14 02:55:20 mostrows Exp $ +* $Id: pppoe.h,v 1.4 2008/06/15 04:35:50 paulus Exp $ * ***********************************************************************/ -#ifdef __sun__ -#define __EXTENSIONS__ -#endif - #include "config.h" #if defined(HAVE_NETPACKET_PACKET_H) || defined(HAVE_LINUX_IF_PACKET_H) @@ -62,51 +58,8 @@ #include #endif -#ifdef HAVE_NET_IF_DL_H -#include -#endif - -/* I'm not sure why this is needed... I do not have OpenBSD */ -#if defined(__OpenBSD__) -#include -#include -#endif - -#ifdef USE_BPF -extern int bpfSize; -struct PPPoEPacketStruct; -void sessionDiscoveryPacket(struct PPPoEPacketStruct *packet); -#define BPF_BUFFER_IS_EMPTY (bpfSize <= 0) -#define BPF_BUFFER_HAS_DATA (bpfSize > 0) -#define ethhdr ether_header -#define h_dest ether_dhost -#define h_source ether_shost -#define h_proto ether_type -#define ETH_DATA_LEN ETHERMTU -#define ETH_ALEN ETHER_ADDR_LEN -#else -#undef USE_BPF #define BPF_BUFFER_IS_EMPTY 1 #define BPF_BUFFER_HAS_DATA 0 -#endif - -#ifdef USE_DLPI -#include -#define ethhdr ether_header -#define ETH_DATA_LEN ETHERMTU -#define ETH_ALEN ETHERADDRL -#define h_dest ether_dhost.ether_addr_octet -#define h_source ether_shost.ether_addr_octet -#define h_proto ether_type - -/* cloned from dltest.h */ -#define MAXDLBUF 8192 -#define MAXDLADDR 1024 -#define MAXWAIT 15 -#define OFFADDR(s, n) (u_char*)((char*)(s) + (int)(n)) -#define CASERET(s) case s: return ("s") - -#endif /* Define various integer types -- assumes a char is 8 bits */ #if SIZEOF_UNSIGNED_SHORT == 2 @@ -124,7 +77,7 @@ typedef unsigned int UINT32_t; #elif SIZEOF_UNSIGNED_LONG == 4 typedef unsigned long UINT32_t; #else -#error Could not find a 16-bit integer type +#error Could not find a 32-bit integer type #endif #ifdef HAVE_LINUX_IF_ETHER_H @@ -160,6 +113,12 @@ extern UINT16_t Eth_PPPOE_Session; #define CODE_PADR 0x19 #define CODE_PADS 0x65 #define CODE_PADT 0xA7 + +/* Extensions from draft-carrel-info-pppoe-ext-00 */ +/* I do NOT like PADM or PADN, but they are here for completeness */ +#define CODE_PADM 0xD3 +#define CODE_PADN 0xD4 + #define CODE_SESS 0x00 /* PPPoE Tags */ @@ -174,6 +133,12 @@ extern UINT16_t Eth_PPPOE_Session; #define TAG_AC_SYSTEM_ERROR 0x0202 #define TAG_GENERIC_ERROR 0x0203 +/* Extensions from draft-carrel-info-pppoe-ext-00 */ +/* I do NOT like these tags one little bit */ +#define TAG_HURL 0x111 +#define TAG_MOTM 0x112 +#define TAG_IP_ROUTE_ADD 0x121 + /* Discovery phase states */ #define STATE_SENT_PADI 0 #define STATE_RECEIVED_PADO 1 @@ -205,19 +170,17 @@ extern UINT16_t Eth_PPPOE_Session; /* A PPPoE Packet, including Ethernet headers */ typedef struct PPPoEPacketStruct { struct ethhdr ethHdr; /* Ethernet header */ -#ifdef PACK_BITFIELDS_REVERSED - unsigned int type:4; /* PPPoE Type (must be 1) */ - unsigned int ver:4; /* PPPoE Version (must be 1) */ -#else - unsigned int ver:4; /* PPPoE Version (must be 1) */ - unsigned int type:4; /* PPPoE Type (must be 1) */ -#endif + unsigned int vertype:8; /* PPPoE Version and Type (must both be 1) */ unsigned int code:8; /* PPPoE code */ unsigned int session:16; /* PPPoE session */ unsigned int length:16; /* Payload length */ unsigned char payload[ETH_DATA_LEN]; /* A bit of room to spare */ } PPPoEPacket; +#define PPPOE_VER(vt) ((vt) >> 4) +#define PPPOE_TYPE(vt) ((vt) & 0xf) +#define PPPOE_VER_TYPE(v, t) (((v) << 4) | (t)) + /* Header size of a PPPoE packet */ #define PPPOE_OVERHEAD 6 /* type, code, session, length */ #define HDR_SIZE (sizeof(struct ethhdr) + PPPOE_OVERHEAD) @@ -254,6 +217,8 @@ typedef struct PPPoEConnectionStruct { int sessionSocket; /* Raw socket for session frames */ unsigned char myEth[ETH_ALEN]; /* My MAC address */ unsigned char peerEth[ETH_ALEN]; /* Peer's MAC address */ + unsigned char req_peer_mac[ETH_ALEN]; /* required peer MAC address */ + unsigned char req_peer; /* require mac addr to match req_peer_mac */ UINT16_t session; /* Session ID */ char *ifName; /* Interface name */ char *serviceName; /* Desired service name, if any */ @@ -261,13 +226,13 @@ typedef struct PPPoEConnectionStruct { int synchronous; /* Use synchronous PPP */ int useHostUniq; /* Use Host-Uniq tag */ int printACNames; /* Just print AC names */ - int skipDiscovery; /* Skip discovery */ - int noDiscoverySocket; /* Don't even open discovery socket */ - int killSession; /* Kill session and exit */ FILE *debugFile; /* Debug file for dumping packets */ int numPADOs; /* Number of PADO packets received */ PPPoETag cookie; /* We have to send this if we get it */ PPPoETag relayId; /* Ditto */ + int error; /* Error packet received */ + int debug; /* Set to log packets sent and received */ + int discoveryTimeout; /* Timeout for discovery packets */ } PPPoEConnection; /* Structure used to determine acceptable PADO or PADS packet */ @@ -308,12 +273,16 @@ void discovery(PPPoEConnection *conn); unsigned char *findTag(PPPoEPacket *packet, UINT16_t tagType, PPPoETag *tag); +void pppoe_printpkt(PPPoEPacket *packet, + void (*printer)(void *, char *, ...), void *arg); +void pppoe_log_packet(const char *prefix, PPPoEPacket *packet); + #define SET_STRING(var, val) do { if (var) free(var); var = strDup(val); } while(0); #define CHECK_ROOM(cursor, start, len) \ do {\ if (((cursor)-(start))+(len) > MAX_PPPOE_PAYLOAD) { \ - syslog(LOG_ERR, "Would create too-long packet"); \ + error("Would create too-long packet"); \ return; \ } \ } while(0)