1/********************************************************************** 2* 3* relay.h 4* 5* Definitions for PPPoE relay 6* 7* Copyright (C) 2001-2006 Roaring Penguin Software Inc. 8* 9* This program may be distributed according to the terms of the GNU 10* General Public License, version 2 or (at your option) any later version. 11* 12* LIC: GPL 13* 14* $Id$ 15* 16***********************************************************************/ 17 18#include "pppoe.h" 19 20/* Description for each active Ethernet interface */ 21typedef struct InterfaceStruct { 22 char name[IFNAMSIZ+1]; /* Interface name */ 23 int discoverySock; /* Socket for discovery frames */ 24 int sessionSock; /* Socket for session frames */ 25 int clientOK; /* Client requests allowed (PADI, PADR) */ 26 int acOK; /* AC replies allowed (PADO, PADS) */ 27 unsigned char mac[ETH_ALEN]; /* MAC address */ 28} PPPoEInterface; 29 30/* Session state for relay */ 31struct SessionHashStruct; 32typedef struct SessionStruct { 33 struct SessionStruct *next; /* Free list link */ 34 struct SessionStruct *prev; /* Free list link */ 35 struct SessionHashStruct *acHash; /* Hash bucket for AC MAC/Session */ 36 struct SessionHashStruct *clientHash; /* Hash bucket for client MAC/Session */ 37 unsigned int epoch; /* Epoch when last activity was seen */ 38 UINT16_t sesNum; /* Session number assigned by relay */ 39} PPPoESession; 40 41/* Hash table entry to find sessions */ 42typedef struct SessionHashStruct { 43 struct SessionHashStruct *next; /* Link in hash chain */ 44 struct SessionHashStruct *prev; /* Link in hash chain */ 45 struct SessionHashStruct *peer; /* Peer for this session */ 46 PPPoEInterface const *interface; /* Interface */ 47 unsigned char peerMac[ETH_ALEN]; /* Peer's MAC address */ 48 UINT16_t sesNum; /* Session number */ 49 PPPoESession *ses; /* Session data */ 50} SessionHash; 51 52/* Function prototypes */ 53 54void relayGotSessionPacket(PPPoEInterface const *i); 55void relayGotDiscoveryPacket(PPPoEInterface const *i); 56PPPoEInterface *findInterface(int sock); 57unsigned int hash(unsigned char const *mac, UINT16_t sesNum); 58SessionHash *findSession(unsigned char const *mac, UINT16_t sesNum); 59void deleteHash(SessionHash *hash); 60PPPoESession *createSession(PPPoEInterface const *ac, 61 PPPoEInterface const *cli, 62 unsigned char const *acMac, 63 unsigned char const *cliMac, 64 UINT16_t acSes); 65void freeSession(PPPoESession *ses, char const *msg); 66void addInterface(char const *ifname, int clientOK, int acOK); 67void usage(char const *progname); 68void initRelay(int nsess); 69void relayLoop(void); 70void addHash(SessionHash *sh); 71void unhash(SessionHash *sh); 72 73void relayHandlePADT(PPPoEInterface const *iface, PPPoEPacket *packet, int size); 74void relayHandlePADI(PPPoEInterface const *iface, PPPoEPacket *packet, int size); 75void relayHandlePADO(PPPoEInterface const *iface, PPPoEPacket *packet, int size); 76void relayHandlePADR(PPPoEInterface const *iface, PPPoEPacket *packet, int size); 77void relayHandlePADS(PPPoEInterface const *iface, PPPoEPacket *packet, int size); 78 79int addTag(PPPoEPacket *packet, PPPoETag const *tag); 80int insertBytes(PPPoEPacket *packet, unsigned char *loc, 81 void const *bytes, int length); 82int removeBytes(PPPoEPacket *packet, unsigned char *loc, 83 int length); 84void relaySendError(unsigned char code, 85 UINT16_t session, 86 PPPoEInterface const *iface, 87 unsigned char const *mac, 88 PPPoETag const *hostUniq, 89 char const *errMsg); 90 91void alarmHandler(int sig); 92void cleanSessions(void); 93 94#define MAX_INTERFACES 8 95#define DEFAULT_SESSIONS 5000 96 97/* Hash table size -- a prime number; gives load factor of around 6 98 for 65534 sessions */ 99#define HASHTAB_SIZE 18917 100