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