blob: 317346b2588b7c2c2bcfa71b4d4061c6c7f269d5 [file] [log] [blame]
/*
* Copyright (c) 2009 Mindspeed Technologies, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*
*/
#ifndef _MODULE_PPPOE_H_
#define _MODULE_PPPOE_H_
#define PPP_IP 0x21 /* Internet Protocol */
#define PPP_IPV6 0x57 /* Internet Protocol Version 6 */
#define PPP_LCP 0xc021 /* Link Control Protocol */
#define PPP_IPCP 0x8021 /* IP Control Protocol */
#define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */
#define PPP_PAP 0xc023
#define PPP_CHAP 0xc223
#include "types.h"
#include "modules.h"
#include "channels.h"
#include "module_ethernet.h"
#define IF_NAME_SIZE 16
#define NUM_PPPOE_ENTRIES (1 << 3)
#define PPPOE_AUTO_MODE 0x1
typedef struct tPPPoEFrame {
U16 PPPoE_VerTypeCode;
U16 PPPoE_SessionID;
U16 PPPoE_Length;
U16 PPPoE_Protocol;
U8 PPPoE_Payload[];
} PPPoEFrame, *pPPPoEFrame;
typedef struct _tPPPoE_Info {
struct itf itf;
struct slist_entry list;
struct _tPPPoE_Info *relay;
/* store following two items in network order */
U8 DstMAC[ETHER_ADDR_LEN];
U16 sessionID;
U32 ppp_flags;
U32 last_pkt_rcvd;
U32 last_pkt_xmit;
#ifdef CFG_STATS
U32 total_packets_received;
U32 total_packets_transmitted;
#endif
} PPPoE_Info, *pPPPoE_Info;
typedef struct _tPPPoECommand {
U16 action;
U16 sessionID;
U8 macAddr[6];
U8 phy_intf[12];
U8 log_intf[12];
U16 mode;
} PPPoECommand, *pPPPoECommand;
typedef struct _tPPPoERelayCommand {
U16 action; /*Action to perform */
U8 peermac1[6];
U8 peermac2[6];
U8 ipif_mac[6];
U8 opif_mac[6];
U8 ipifname[IF_NAME_SIZE];
U8 opifname[IF_NAME_SIZE];
U16 sesID;
U16 relaysesID;
U16 pad;
}PPPoERelayCommand, *pPPPoERelayCommand;
typedef struct _tPPPoEIdleTimeCmd {
U8 ppp_intf[12];
U32 xmit_idle;
U32 recv_idle;
} PPPoEIdleTimeCmd, *pPPPoEIdleTimeCmd;
#if defined(COMCERTO_2000)
#define PPPOE_MAX_ITF 6
extern PPPoE_Info pppoe_itf[PPPOE_MAX_ITF];
#endif
extern struct slist_head pppoe_cache[];
int pppoe_init(void);
void pppoe_exit(void);
void M_PPPOE_process_packet(PMetadata mtd) __attribute__((section ("fast_path")));
#if !defined(COMCERTO_2000)
void M_pppoe_ingress(void) __attribute__((section ("fast_path")));
#endif
void M_pppoe_update_length(PMetadata mtd);
void M_pppoe_encapsulate(PMetadata mtd, pPPPoE_Info ppp_info, U16 ethertype, U8 update) __attribute__((section ("fast_path"), noinline));
static __inline U32 HASH_PPPOE(U16 session_id, U8 *srcmac)
{
return ((session_id & 0xff) ^ (session_id >> 8) ^ srcmac[5]) & (NUM_PPPOE_ENTRIES - 1);
}
#endif /* _MODULE_PPPOE_H_ */