📄 relay.h
字号:
/**********************************************************************
*
* relay.h
*
* Definitions for PPPoE relay
*
* Copyright (C) 2001 Roaring Penguin Software Inc.
*
* This program may be distributed according to the terms of the GNU
* General Public License, version 2 or (at your option) any later version.
*
* LIC: GPL
*
* $Id: relay.h,v 1.11 2002/04/09 17:28:39 dfs Exp $
*
***********************************************************************/
#include "pppoe.h"
/* Description for each active Ethernet interface */
typedef struct InterfaceStruct {
char name[IFNAMSIZ+1]; /* Interface name */
int discoverySock; /* Socket for discovery frames */
int sessionSock; /* Socket for session frames */
int clientOK; /* Client requests allowed (PADI, PADR) */
int acOK; /* AC replies allowed (PADO, PADS) */
unsigned char mac[ETH_ALEN]; /* MAC address */
} PPPoEInterface;
/* Session state for relay */
struct SessionHashStruct;
typedef struct SessionStruct {
struct SessionStruct *next; /* Free list link */
struct SessionStruct *prev; /* Free list link */
struct SessionHashStruct *acHash; /* Hash bucket for AC MAC/Session */
struct SessionHashStruct *clientHash; /* Hash bucket for client MAC/Session */
unsigned int epoch; /* Epoch when last activity was seen */
UINT16_t sesNum; /* Session number assigned by relay */
} PPPoESession;
/* Hash table entry to find sessions */
typedef struct SessionHashStruct {
struct SessionHashStruct *next; /* Link in hash chain */
struct SessionHashStruct *prev; /* Link in hash chain */
struct SessionHashStruct *peer; /* Peer for this session */
PPPoEInterface const *interface; /* Interface */
unsigned char peerMac[ETH_ALEN]; /* Peer's MAC address */
UINT16_t sesNum; /* Session number */
PPPoESession *ses; /* Session data */
} SessionHash;
/* Function prototypes */
void relayGotSessionPacket(PPPoEInterface const *i);
void relayGotDiscoveryPacket(PPPoEInterface const *i);
PPPoEInterface *findInterface(int sock);
unsigned int hash(unsigned char const *mac, UINT16_t sesNum);
SessionHash *findSession(unsigned char const *mac, UINT16_t sesNum);
void deleteHash(SessionHash *hash);
PPPoESession *createSession(PPPoEInterface const *ac,
PPPoEInterface const *cli,
unsigned char const *acMac,
unsigned char const *cliMac,
UINT16_t acSes);
void freeSession(PPPoESession *ses, char const *msg);
void addInterface(char const *ifname, int clientOK, int acOK);
void usage(char const *progname);
void initRelay(int nsess);
void relayLoop(void);
void addHash(SessionHash *sh);
void unhash(SessionHash *sh);
void relayHandlePADT(PPPoEInterface const *iface, PPPoEPacket *packet, int size);
void relayHandlePADI(PPPoEInterface const *iface, PPPoEPacket *packet, int size);
void relayHandlePADO(PPPoEInterface const *iface, PPPoEPacket *packet, int size);
void relayHandlePADR(PPPoEInterface const *iface, PPPoEPacket *packet, int size);
void relayHandlePADS(PPPoEInterface const *iface, PPPoEPacket *packet, int size);
int addTag(PPPoEPacket *packet, PPPoETag const *tag);
int insertBytes(PPPoEPacket *packet, unsigned char *loc,
void const *bytes, int length);
int removeBytes(PPPoEPacket *packet, unsigned char *loc,
int length);
void relaySendError(unsigned char code,
UINT16_t session,
PPPoEInterface const *iface,
unsigned char const *mac,
PPPoETag const *hostUniq,
char const *errMsg);
void alarmHandler(int sig);
void cleanSessions(void);
#define MAX_INTERFACES 8
#define DEFAULT_SESSIONS 5000
/* Hash table size -- a prime number; gives load factor of around 6
for 65534 sessions */
#define HASHTAB_SIZE 18917
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -