1*10465441SEvalZero /** 2*10465441SEvalZero * @file 3*10465441SEvalZero * Network Point to Point Protocol over Layer 2 Tunneling Protocol header file. 4*10465441SEvalZero * 5*10465441SEvalZero */ 6*10465441SEvalZero 7*10465441SEvalZero /* 8*10465441SEvalZero * Redistribution and use in source and binary forms, with or without modification, 9*10465441SEvalZero * are permitted provided that the following conditions are met: 10*10465441SEvalZero * 11*10465441SEvalZero * 1. Redistributions of source code must retain the above copyright notice, 12*10465441SEvalZero * this list of conditions and the following disclaimer. 13*10465441SEvalZero * 2. Redistributions in binary form must reproduce the above copyright notice, 14*10465441SEvalZero * this list of conditions and the following disclaimer in the documentation 15*10465441SEvalZero * and/or other materials provided with the distribution. 16*10465441SEvalZero * 3. The name of the author may not be used to endorse or promote products 17*10465441SEvalZero * derived from this software without specific prior written permission. 18*10465441SEvalZero * 19*10465441SEvalZero * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 20*10465441SEvalZero * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 21*10465441SEvalZero * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 22*10465441SEvalZero * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 23*10465441SEvalZero * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 24*10465441SEvalZero * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*10465441SEvalZero * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*10465441SEvalZero * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27*10465441SEvalZero * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 28*10465441SEvalZero * OF SUCH DAMAGE. 29*10465441SEvalZero * 30*10465441SEvalZero * This file is part of the lwIP TCP/IP stack. 31*10465441SEvalZero * 32*10465441SEvalZero */ 33*10465441SEvalZero 34*10465441SEvalZero #include "netif/ppp/ppp_opts.h" 35*10465441SEvalZero #if PPP_SUPPORT && PPPOL2TP_SUPPORT /* don't build if not configured for use in lwipopts.h */ 36*10465441SEvalZero 37*10465441SEvalZero #ifndef PPPOL2TP_H 38*10465441SEvalZero #define PPPOL2TP_H 39*10465441SEvalZero 40*10465441SEvalZero #include "ppp.h" 41*10465441SEvalZero 42*10465441SEvalZero /* Timeout */ 43*10465441SEvalZero #define PPPOL2TP_CONTROL_TIMEOUT (5*1000) /* base for quick timeout calculation */ 44*10465441SEvalZero #define PPPOL2TP_SLOW_RETRY (60*1000) /* persistent retry interval */ 45*10465441SEvalZero 46*10465441SEvalZero #define PPPOL2TP_MAXSCCRQ 4 /* retry SCCRQ four times (quickly) */ 47*10465441SEvalZero #define PPPOL2TP_MAXICRQ 4 /* retry IRCQ four times */ 48*10465441SEvalZero #define PPPOL2TP_MAXICCN 4 /* retry ICCN four times */ 49*10465441SEvalZero 50*10465441SEvalZero /* L2TP header flags */ 51*10465441SEvalZero #define PPPOL2TP_HEADERFLAG_CONTROL 0x8000 52*10465441SEvalZero #define PPPOL2TP_HEADERFLAG_LENGTH 0x4000 53*10465441SEvalZero #define PPPOL2TP_HEADERFLAG_SEQUENCE 0x0800 54*10465441SEvalZero #define PPPOL2TP_HEADERFLAG_OFFSET 0x0200 55*10465441SEvalZero #define PPPOL2TP_HEADERFLAG_PRIORITY 0x0100 56*10465441SEvalZero #define PPPOL2TP_HEADERFLAG_VERSION 0x0002 57*10465441SEvalZero 58*10465441SEvalZero /* Mandatory bits for control: Control, Length, Sequence, Version 2 */ 59*10465441SEvalZero #define PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY (PPPOL2TP_HEADERFLAG_CONTROL|PPPOL2TP_HEADERFLAG_LENGTH|PPPOL2TP_HEADERFLAG_SEQUENCE|PPPOL2TP_HEADERFLAG_VERSION) 60*10465441SEvalZero /* Forbidden bits for control: Offset, Priority */ 61*10465441SEvalZero #define PPPOL2TP_HEADERFLAG_CONTROL_FORBIDDEN (PPPOL2TP_HEADERFLAG_OFFSET|PPPOL2TP_HEADERFLAG_PRIORITY) 62*10465441SEvalZero 63*10465441SEvalZero /* Mandatory bits for data: Version 2 */ 64*10465441SEvalZero #define PPPOL2TP_HEADERFLAG_DATA_MANDATORY (PPPOL2TP_HEADERFLAG_VERSION) 65*10465441SEvalZero 66*10465441SEvalZero /* AVP (Attribute Value Pair) header */ 67*10465441SEvalZero #define PPPOL2TP_AVPHEADERFLAG_MANDATORY 0x8000 68*10465441SEvalZero #define PPPOL2TP_AVPHEADERFLAG_HIDDEN 0x4000 69*10465441SEvalZero #define PPPOL2TP_AVPHEADERFLAG_LENGTHMASK 0x03ff 70*10465441SEvalZero 71*10465441SEvalZero /* -- AVP - Message type */ 72*10465441SEvalZero #define PPPOL2TP_AVPTYPE_MESSAGE 0 /* Message type */ 73*10465441SEvalZero 74*10465441SEvalZero /* Control Connection Management */ 75*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_SCCRQ 1 /* Start Control Connection Request */ 76*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_SCCRP 2 /* Start Control Connection Reply */ 77*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_SCCCN 3 /* Start Control Connection Connected */ 78*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_STOPCCN 4 /* Stop Control Connection Notification */ 79*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_HELLO 6 /* Hello */ 80*10465441SEvalZero /* Call Management */ 81*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_OCRQ 7 /* Outgoing Call Request */ 82*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_OCRP 8 /* Outgoing Call Reply */ 83*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_OCCN 9 /* Outgoing Call Connected */ 84*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_ICRQ 10 /* Incoming Call Request */ 85*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_ICRP 11 /* Incoming Call Reply */ 86*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_ICCN 12 /* Incoming Call Connected */ 87*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_CDN 14 /* Call Disconnect Notify */ 88*10465441SEvalZero /* Error reporting */ 89*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_WEN 15 /* WAN Error Notify */ 90*10465441SEvalZero /* PPP Session Control */ 91*10465441SEvalZero #define PPPOL2TP_MESSAGETYPE_SLI 16 /* Set Link Info */ 92*10465441SEvalZero 93*10465441SEvalZero /* -- AVP - Result code */ 94*10465441SEvalZero #define PPPOL2TP_AVPTYPE_RESULTCODE 1 /* Result code */ 95*10465441SEvalZero #define PPPOL2TP_RESULTCODE 1 /* General request to clear control connection */ 96*10465441SEvalZero 97*10465441SEvalZero /* -- AVP - Protocol version (!= L2TP Header version) */ 98*10465441SEvalZero #define PPPOL2TP_AVPTYPE_VERSION 2 99*10465441SEvalZero #define PPPOL2TP_VERSION 0x0100 /* L2TP Protocol version 1, revision 0 */ 100*10465441SEvalZero 101*10465441SEvalZero /* -- AVP - Framing capabilities */ 102*10465441SEvalZero #define PPPOL2TP_AVPTYPE_FRAMINGCAPABILITIES 3 /* Bearer capabilities */ 103*10465441SEvalZero #define PPPOL2TP_FRAMINGCAPABILITIES 0x00000003 /* Async + Sync framing */ 104*10465441SEvalZero 105*10465441SEvalZero /* -- AVP - Bearer capabilities */ 106*10465441SEvalZero #define PPPOL2TP_AVPTYPE_BEARERCAPABILITIES 4 /* Bearer capabilities */ 107*10465441SEvalZero #define PPPOL2TP_BEARERCAPABILITIES 0x00000003 /* Analog + Digital Access */ 108*10465441SEvalZero 109*10465441SEvalZero /* -- AVP - Tie breaker */ 110*10465441SEvalZero #define PPPOL2TP_AVPTYPE_TIEBREAKER 5 111*10465441SEvalZero 112*10465441SEvalZero /* -- AVP - Host name */ 113*10465441SEvalZero #define PPPOL2TP_AVPTYPE_HOSTNAME 7 /* Host name */ 114*10465441SEvalZero #define PPPOL2TP_HOSTNAME "lwIP" /* FIXME: make it configurable */ 115*10465441SEvalZero 116*10465441SEvalZero /* -- AVP - Vendor name */ 117*10465441SEvalZero #define PPPOL2TP_AVPTYPE_VENDORNAME 8 /* Vendor name */ 118*10465441SEvalZero #define PPPOL2TP_VENDORNAME "lwIP" /* FIXME: make it configurable */ 119*10465441SEvalZero 120*10465441SEvalZero /* -- AVP - Assign tunnel ID */ 121*10465441SEvalZero #define PPPOL2TP_AVPTYPE_TUNNELID 9 /* Assign Tunnel ID */ 122*10465441SEvalZero 123*10465441SEvalZero /* -- AVP - Receive window size */ 124*10465441SEvalZero #define PPPOL2TP_AVPTYPE_RECEIVEWINDOWSIZE 10 /* Receive window size */ 125*10465441SEvalZero #define PPPOL2TP_RECEIVEWINDOWSIZE 8 /* FIXME: make it configurable */ 126*10465441SEvalZero 127*10465441SEvalZero /* -- AVP - Challenge */ 128*10465441SEvalZero #define PPPOL2TP_AVPTYPE_CHALLENGE 11 /* Challenge */ 129*10465441SEvalZero 130*10465441SEvalZero /* -- AVP - Cause code */ 131*10465441SEvalZero #define PPPOL2TP_AVPTYPE_CAUSECODE 12 /* Cause code*/ 132*10465441SEvalZero 133*10465441SEvalZero /* -- AVP - Challenge response */ 134*10465441SEvalZero #define PPPOL2TP_AVPTYPE_CHALLENGERESPONSE 13 /* Challenge response */ 135*10465441SEvalZero #define PPPOL2TP_AVPTYPE_CHALLENGERESPONSE_SIZE 16 136*10465441SEvalZero 137*10465441SEvalZero /* -- AVP - Assign session ID */ 138*10465441SEvalZero #define PPPOL2TP_AVPTYPE_SESSIONID 14 /* Assign Session ID */ 139*10465441SEvalZero 140*10465441SEvalZero /* -- AVP - Call serial number */ 141*10465441SEvalZero #define PPPOL2TP_AVPTYPE_CALLSERIALNUMBER 15 /* Call Serial Number */ 142*10465441SEvalZero 143*10465441SEvalZero /* -- AVP - Framing type */ 144*10465441SEvalZero #define PPPOL2TP_AVPTYPE_FRAMINGTYPE 19 /* Framing Type */ 145*10465441SEvalZero #define PPPOL2TP_FRAMINGTYPE 0x00000001 /* Sync framing */ 146*10465441SEvalZero 147*10465441SEvalZero /* -- AVP - TX Connect Speed */ 148*10465441SEvalZero #define PPPOL2TP_AVPTYPE_TXCONNECTSPEED 24 /* TX Connect Speed */ 149*10465441SEvalZero #define PPPOL2TP_TXCONNECTSPEED 100000000 /* Connect speed: 100 Mbits/s */ 150*10465441SEvalZero 151*10465441SEvalZero /* L2TP Session state */ 152*10465441SEvalZero #define PPPOL2TP_STATE_INITIAL 0 153*10465441SEvalZero #define PPPOL2TP_STATE_SCCRQ_SENT 1 154*10465441SEvalZero #define PPPOL2TP_STATE_ICRQ_SENT 2 155*10465441SEvalZero #define PPPOL2TP_STATE_ICCN_SENT 3 156*10465441SEvalZero #define PPPOL2TP_STATE_DATA 4 157*10465441SEvalZero 158*10465441SEvalZero #define PPPOL2TP_OUTPUT_DATA_HEADER_LEN 6 /* Our data header len */ 159*10465441SEvalZero 160*10465441SEvalZero /* 161*10465441SEvalZero * PPPoL2TP interface control block. 162*10465441SEvalZero */ 163*10465441SEvalZero typedef struct pppol2tp_pcb_s pppol2tp_pcb; 164*10465441SEvalZero struct pppol2tp_pcb_s { 165*10465441SEvalZero ppp_pcb *ppp; /* PPP PCB */ 166*10465441SEvalZero u8_t phase; /* L2TP phase */ 167*10465441SEvalZero struct udp_pcb *udp; /* UDP L2TP Socket */ 168*10465441SEvalZero struct netif *netif; /* Output interface, used as a default route */ 169*10465441SEvalZero ip_addr_t remote_ip; /* LNS IP Address */ 170*10465441SEvalZero u16_t remote_port; /* LNS port */ 171*10465441SEvalZero #if PPPOL2TP_AUTH_SUPPORT 172*10465441SEvalZero const u8_t *secret; /* Secret string */ 173*10465441SEvalZero u8_t secret_len; /* Secret string length */ 174*10465441SEvalZero u8_t secret_rv[16]; /* Random vector */ 175*10465441SEvalZero u8_t challenge_hash[16]; /* Challenge response */ 176*10465441SEvalZero u8_t send_challenge; /* Boolean whether the next sent packet should contains a challenge response */ 177*10465441SEvalZero #endif /* PPPOL2TP_AUTH_SUPPORT */ 178*10465441SEvalZero 179*10465441SEvalZero u16_t tunnel_port; /* Tunnel port */ 180*10465441SEvalZero u16_t our_ns; /* NS to peer */ 181*10465441SEvalZero u16_t peer_nr; /* NR from peer */ 182*10465441SEvalZero u16_t peer_ns; /* NS from peer */ 183*10465441SEvalZero u16_t source_tunnel_id; /* Tunnel ID assigned by peer */ 184*10465441SEvalZero u16_t remote_tunnel_id; /* Tunnel ID assigned to peer */ 185*10465441SEvalZero u16_t source_session_id; /* Session ID assigned by peer */ 186*10465441SEvalZero u16_t remote_session_id; /* Session ID assigned to peer */ 187*10465441SEvalZero 188*10465441SEvalZero u8_t sccrq_retried; /* number of SCCRQ retries already done */ 189*10465441SEvalZero u8_t icrq_retried; /* number of ICRQ retries already done */ 190*10465441SEvalZero u8_t iccn_retried; /* number of ICCN retries already done */ 191*10465441SEvalZero }; 192*10465441SEvalZero 193*10465441SEvalZero 194*10465441SEvalZero /* Create a new L2TP session. */ 195*10465441SEvalZero ppp_pcb *pppol2tp_create(struct netif *pppif, 196*10465441SEvalZero struct netif *netif, const ip_addr_t *ipaddr, u16_t port, 197*10465441SEvalZero const u8_t *secret, u8_t secret_len, 198*10465441SEvalZero ppp_link_status_cb_fn link_status_cb, void *ctx_cb); 199*10465441SEvalZero 200*10465441SEvalZero #endif /* PPPOL2TP_H */ 201*10465441SEvalZero #endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */ 202