1*10465441SEvalZero /***************************************************************************** 2*10465441SEvalZero * ppp_oe.h - PPP Over Ethernet implementation for lwIP. 3*10465441SEvalZero * 4*10465441SEvalZero * Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc. 5*10465441SEvalZero * 6*10465441SEvalZero * The authors hereby grant permission to use, copy, modify, distribute, 7*10465441SEvalZero * and license this software and its documentation for any purpose, provided 8*10465441SEvalZero * that existing copyright notices are retained in all copies and that this 9*10465441SEvalZero * notice and the following disclaimer are included verbatim in any 10*10465441SEvalZero * distributions. No written agreement, license, or royalty fee is required 11*10465441SEvalZero * for any of the authorized uses. 12*10465441SEvalZero * 13*10465441SEvalZero * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR 14*10465441SEvalZero * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 15*10465441SEvalZero * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 16*10465441SEvalZero * IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 17*10465441SEvalZero * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 18*10465441SEvalZero * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 19*10465441SEvalZero * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 20*10465441SEvalZero * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21*10465441SEvalZero * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 22*10465441SEvalZero * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23*10465441SEvalZero * 24*10465441SEvalZero ****************************************************************************** 25*10465441SEvalZero * REVISION HISTORY 26*10465441SEvalZero * 27*10465441SEvalZero * 06-01-01 Marc Boucher <[email protected]> 28*10465441SEvalZero * Ported to lwIP. 29*10465441SEvalZero *****************************************************************************/ 30*10465441SEvalZero 31*10465441SEvalZero 32*10465441SEvalZero 33*10465441SEvalZero /* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */ 34*10465441SEvalZero 35*10465441SEvalZero /*- 36*10465441SEvalZero * Copyright (c) 2002 The NetBSD Foundation, Inc. 37*10465441SEvalZero * All rights reserved. 38*10465441SEvalZero * 39*10465441SEvalZero * This code is derived from software contributed to The NetBSD Foundation 40*10465441SEvalZero * by Martin Husemann <[email protected]>. 41*10465441SEvalZero * 42*10465441SEvalZero * Redistribution and use in source and binary forms, with or without 43*10465441SEvalZero * modification, are permitted provided that the following conditions 44*10465441SEvalZero * are met: 45*10465441SEvalZero * 1. Redistributions of source code must retain the above copyright 46*10465441SEvalZero * notice, this list of conditions and the following disclaimer. 47*10465441SEvalZero * 2. Redistributions in binary form must reproduce the above copyright 48*10465441SEvalZero * notice, this list of conditions and the following disclaimer in the 49*10465441SEvalZero * documentation and/or other materials provided with the distribution. 50*10465441SEvalZero * 3. All advertising materials mentioning features or use of this software 51*10465441SEvalZero * must display the following acknowledgement: 52*10465441SEvalZero * This product includes software developed by the NetBSD 53*10465441SEvalZero * Foundation, Inc. and its contributors. 54*10465441SEvalZero * 4. Neither the name of The NetBSD Foundation nor the names of its 55*10465441SEvalZero * contributors may be used to endorse or promote products derived 56*10465441SEvalZero * from this software without specific prior written permission. 57*10465441SEvalZero * 58*10465441SEvalZero * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 59*10465441SEvalZero * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 60*10465441SEvalZero * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 61*10465441SEvalZero * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 62*10465441SEvalZero * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 63*10465441SEvalZero * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 64*10465441SEvalZero * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 65*10465441SEvalZero * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 66*10465441SEvalZero * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 67*10465441SEvalZero * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 68*10465441SEvalZero * POSSIBILITY OF SUCH DAMAGE. 69*10465441SEvalZero */ 70*10465441SEvalZero #ifndef PPP_OE_H 71*10465441SEvalZero #define PPP_OE_H 72*10465441SEvalZero 73*10465441SEvalZero #include "lwip/opt.h" 74*10465441SEvalZero 75*10465441SEvalZero #if PPPOE_SUPPORT > 0 76*10465441SEvalZero 77*10465441SEvalZero #include "netif/etharp.h" 78*10465441SEvalZero 79*10465441SEvalZero #ifdef PACK_STRUCT_USE_INCLUDES 80*10465441SEvalZero # include "arch/bpstruct.h" 81*10465441SEvalZero #endif 82*10465441SEvalZero PACK_STRUCT_BEGIN 83*10465441SEvalZero struct pppoehdr { 84*10465441SEvalZero PACK_STRUCT_FIELD(u8_t vertype); 85*10465441SEvalZero PACK_STRUCT_FIELD(u8_t code); 86*10465441SEvalZero PACK_STRUCT_FIELD(u16_t session); 87*10465441SEvalZero PACK_STRUCT_FIELD(u16_t plen); 88*10465441SEvalZero } PACK_STRUCT_STRUCT; 89*10465441SEvalZero PACK_STRUCT_END 90*10465441SEvalZero #ifdef PACK_STRUCT_USE_INCLUDES 91*10465441SEvalZero # include "arch/epstruct.h" 92*10465441SEvalZero #endif 93*10465441SEvalZero 94*10465441SEvalZero #ifdef PACK_STRUCT_USE_INCLUDES 95*10465441SEvalZero # include "arch/bpstruct.h" 96*10465441SEvalZero #endif 97*10465441SEvalZero PACK_STRUCT_BEGIN 98*10465441SEvalZero struct pppoetag { 99*10465441SEvalZero PACK_STRUCT_FIELD(u16_t tag); 100*10465441SEvalZero PACK_STRUCT_FIELD(u16_t len); 101*10465441SEvalZero } PACK_STRUCT_STRUCT; 102*10465441SEvalZero PACK_STRUCT_END 103*10465441SEvalZero #ifdef PACK_STRUCT_USE_INCLUDES 104*10465441SEvalZero # include "arch/epstruct.h" 105*10465441SEvalZero #endif 106*10465441SEvalZero 107*10465441SEvalZero 108*10465441SEvalZero #define PPPOE_STATE_INITIAL 0 109*10465441SEvalZero #define PPPOE_STATE_PADI_SENT 1 110*10465441SEvalZero #define PPPOE_STATE_PADR_SENT 2 111*10465441SEvalZero #define PPPOE_STATE_SESSION 3 112*10465441SEvalZero #define PPPOE_STATE_CLOSING 4 113*10465441SEvalZero /* passive */ 114*10465441SEvalZero #define PPPOE_STATE_PADO_SENT 1 115*10465441SEvalZero 116*10465441SEvalZero #define PPPOE_HEADERLEN sizeof(struct pppoehdr) 117*10465441SEvalZero #define PPPOE_VERTYPE 0x11 /* VER=1, TYPE = 1 */ 118*10465441SEvalZero 119*10465441SEvalZero #define PPPOE_TAG_EOL 0x0000 /* end of list */ 120*10465441SEvalZero #define PPPOE_TAG_SNAME 0x0101 /* service name */ 121*10465441SEvalZero #define PPPOE_TAG_ACNAME 0x0102 /* access concentrator name */ 122*10465441SEvalZero #define PPPOE_TAG_HUNIQUE 0x0103 /* host unique */ 123*10465441SEvalZero #define PPPOE_TAG_ACCOOKIE 0x0104 /* AC cookie */ 124*10465441SEvalZero #define PPPOE_TAG_VENDOR 0x0105 /* vendor specific */ 125*10465441SEvalZero #define PPPOE_TAG_RELAYSID 0x0110 /* relay session id */ 126*10465441SEvalZero #define PPPOE_TAG_SNAME_ERR 0x0201 /* service name error */ 127*10465441SEvalZero #define PPPOE_TAG_ACSYS_ERR 0x0202 /* AC system error */ 128*10465441SEvalZero #define PPPOE_TAG_GENERIC_ERR 0x0203 /* gerneric error */ 129*10465441SEvalZero 130*10465441SEvalZero #define PPPOE_CODE_PADI 0x09 /* Active Discovery Initiation */ 131*10465441SEvalZero #define PPPOE_CODE_PADO 0x07 /* Active Discovery Offer */ 132*10465441SEvalZero #define PPPOE_CODE_PADR 0x19 /* Active Discovery Request */ 133*10465441SEvalZero #define PPPOE_CODE_PADS 0x65 /* Active Discovery Session confirmation */ 134*10465441SEvalZero #define PPPOE_CODE_PADT 0xA7 /* Active Discovery Terminate */ 135*10465441SEvalZero 136*10465441SEvalZero #ifndef ETHERMTU 137*10465441SEvalZero #define ETHERMTU 1500 138*10465441SEvalZero #endif 139*10465441SEvalZero 140*10465441SEvalZero /* two byte PPP protocol discriminator, then IP data */ 141*10465441SEvalZero #define PPPOE_MAXMTU (ETHERMTU-PPPOE_HEADERLEN-2) 142*10465441SEvalZero 143*10465441SEvalZero #ifndef PPPOE_MAX_AC_COOKIE_LEN 144*10465441SEvalZero #define PPPOE_MAX_AC_COOKIE_LEN 64 145*10465441SEvalZero #endif 146*10465441SEvalZero 147*10465441SEvalZero struct pppoe_softc { 148*10465441SEvalZero struct pppoe_softc *next; 149*10465441SEvalZero struct netif *sc_ethif; /* ethernet interface we are using */ 150*10465441SEvalZero int sc_pd; /* ppp unit number */ 151*10465441SEvalZero void (*sc_linkStatusCB)(int pd, int up); 152*10465441SEvalZero 153*10465441SEvalZero int sc_state; /* discovery phase or session connected */ 154*10465441SEvalZero struct eth_addr sc_dest; /* hardware address of concentrator */ 155*10465441SEvalZero u16_t sc_session; /* PPPoE session id */ 156*10465441SEvalZero 157*10465441SEvalZero #ifdef PPPOE_TODO 158*10465441SEvalZero char *sc_service_name; /* if != NULL: requested name of service */ 159*10465441SEvalZero char *sc_concentrator_name; /* if != NULL: requested concentrator id */ 160*10465441SEvalZero #endif /* PPPOE_TODO */ 161*10465441SEvalZero u8_t sc_ac_cookie[PPPOE_MAX_AC_COOKIE_LEN]; /* content of AC cookie we must echo back */ 162*10465441SEvalZero size_t sc_ac_cookie_len; /* length of cookie data */ 163*10465441SEvalZero #ifdef PPPOE_SERVER 164*10465441SEvalZero u8_t *sc_hunique; /* content of host unique we must echo back */ 165*10465441SEvalZero size_t sc_hunique_len; /* length of host unique */ 166*10465441SEvalZero #endif 167*10465441SEvalZero int sc_padi_retried; /* number of PADI retries already done */ 168*10465441SEvalZero int sc_padr_retried; /* number of PADR retries already done */ 169*10465441SEvalZero }; 170*10465441SEvalZero 171*10465441SEvalZero 172*10465441SEvalZero #define pppoe_init() /* compatibility define, no initialization needed */ 173*10465441SEvalZero 174*10465441SEvalZero err_t pppoe_create(struct netif *ethif, int pd, void (*linkStatusCB)(int pd, int up), struct pppoe_softc **scptr); 175*10465441SEvalZero err_t pppoe_destroy(struct netif *ifp); 176*10465441SEvalZero 177*10465441SEvalZero int pppoe_connect(struct pppoe_softc *sc); 178*10465441SEvalZero void pppoe_disconnect(struct pppoe_softc *sc); 179*10465441SEvalZero 180*10465441SEvalZero void pppoe_disc_input(struct netif *netif, struct pbuf *p); 181*10465441SEvalZero void pppoe_data_input(struct netif *netif, struct pbuf *p); 182*10465441SEvalZero 183*10465441SEvalZero err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb); 184*10465441SEvalZero 185*10465441SEvalZero /** used in ppp.c */ 186*10465441SEvalZero #define PPPOE_HDRLEN (sizeof(struct eth_hdr) + PPPOE_HEADERLEN) 187*10465441SEvalZero 188*10465441SEvalZero #endif /* PPPOE_SUPPORT */ 189*10465441SEvalZero 190*10465441SEvalZero #endif /* PPP_OE_H */ 191