takashi kadono / Mbed OS Nucleo446_SSD1331

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 PPP interface for lwIP
kadonotakashi 0:8fdf9a60065b 2
kadonotakashi 0:8fdf9a60065b 3 Author: Sylvain Rochet
kadonotakashi 0:8fdf9a60065b 4
kadonotakashi 0:8fdf9a60065b 5 Table of Contents:
kadonotakashi 0:8fdf9a60065b 6
kadonotakashi 0:8fdf9a60065b 7 1 - Supported PPP protocols and features
kadonotakashi 0:8fdf9a60065b 8 2 - Raw API PPP example for all protocols
kadonotakashi 0:8fdf9a60065b 9 3 - PPPoS input path (raw API, IRQ safe API, TCPIP API)
kadonotakashi 0:8fdf9a60065b 10 4 - Thread safe PPP API (PPPAPI)
kadonotakashi 0:8fdf9a60065b 11 5 - Notify phase callback (PPP_NOTIFY_PHASE)
kadonotakashi 0:8fdf9a60065b 12 6 - Upgrading from lwIP <= 1.4.x to lwIP >= 2.0.x
kadonotakashi 0:8fdf9a60065b 13
kadonotakashi 0:8fdf9a60065b 14
kadonotakashi 0:8fdf9a60065b 15
kadonotakashi 0:8fdf9a60065b 16 1 Supported PPP protocols and features
kadonotakashi 0:8fdf9a60065b 17 ======================================
kadonotakashi 0:8fdf9a60065b 18
kadonotakashi 0:8fdf9a60065b 19 Supported Low level protocols:
kadonotakashi 0:8fdf9a60065b 20 * PPP over serial using HDLC-like framing, such as wired dialup modems
kadonotakashi 0:8fdf9a60065b 21 or mobile telecommunications GPRS/EDGE/UMTS/HSPA+/LTE modems
kadonotakashi 0:8fdf9a60065b 22 * PPP over Ethernet, such as xDSL modems
kadonotakashi 0:8fdf9a60065b 23 * PPP over L2TP (Layer 2 Tunneling Protocol) LAC (L2TP Access Concentrator),
kadonotakashi 0:8fdf9a60065b 24 IP tunnel over UDP, such as VPN access
kadonotakashi 0:8fdf9a60065b 25
kadonotakashi 0:8fdf9a60065b 26 Supported auth protocols:
kadonotakashi 0:8fdf9a60065b 27 * PAP, Password Authentication Protocol
kadonotakashi 0:8fdf9a60065b 28 * CHAP, Challenge-Handshake Authentication Protocol, also known as CHAP-MD5
kadonotakashi 0:8fdf9a60065b 29 * MSCHAPv1, Microsoft version of CHAP, version 1
kadonotakashi 0:8fdf9a60065b 30 * MSCHAPv2, Microsoft version of CHAP, version 2
kadonotakashi 0:8fdf9a60065b 31 * EAP, Extensible Authentication Protocol
kadonotakashi 0:8fdf9a60065b 32
kadonotakashi 0:8fdf9a60065b 33 Supported address protocols:
kadonotakashi 0:8fdf9a60065b 34 * IPCP, IP Control Protocol, IPv4 addresses negotiation
kadonotakashi 0:8fdf9a60065b 35 * IP6CP, IPv6 Control Protocol, IPv6 link-local addresses negotiation
kadonotakashi 0:8fdf9a60065b 36
kadonotakashi 0:8fdf9a60065b 37 Supported encryption protocols:
kadonotakashi 0:8fdf9a60065b 38 * MPPE, Microsoft Point-to-Point Encryption
kadonotakashi 0:8fdf9a60065b 39
kadonotakashi 0:8fdf9a60065b 40 Supported compression or miscellaneous protocols, for serial links only:
kadonotakashi 0:8fdf9a60065b 41 * PFC, Protocol Field Compression
kadonotakashi 0:8fdf9a60065b 42 * ACFC, Address-and-Control-Field-Compression
kadonotakashi 0:8fdf9a60065b 43 * ACCM, Asynchronous-Control-Character-Map
kadonotakashi 0:8fdf9a60065b 44 * VJ, Van Jacobson TCP/IP Header Compression
kadonotakashi 0:8fdf9a60065b 45
kadonotakashi 0:8fdf9a60065b 46
kadonotakashi 0:8fdf9a60065b 47
kadonotakashi 0:8fdf9a60065b 48 2 Raw API PPP example for all protocols
kadonotakashi 0:8fdf9a60065b 49 =======================================
kadonotakashi 0:8fdf9a60065b 50
kadonotakashi 0:8fdf9a60065b 51 As usual, raw API for lwIP means the lightweight API which *MUST* only be used
kadonotakashi 0:8fdf9a60065b 52 for NO_SYS=1 systems or called inside lwIP core thread for NO_SYS=0 systems.
kadonotakashi 0:8fdf9a60065b 53
kadonotakashi 0:8fdf9a60065b 54 /*
kadonotakashi 0:8fdf9a60065b 55 * Globals
kadonotakashi 0:8fdf9a60065b 56 * =======
kadonotakashi 0:8fdf9a60065b 57 */
kadonotakashi 0:8fdf9a60065b 58
kadonotakashi 0:8fdf9a60065b 59 /* The PPP control block */
kadonotakashi 0:8fdf9a60065b 60 ppp_pcb *ppp;
kadonotakashi 0:8fdf9a60065b 61
kadonotakashi 0:8fdf9a60065b 62 /* The PPP IP interface */
kadonotakashi 0:8fdf9a60065b 63 struct netif ppp_netif;
kadonotakashi 0:8fdf9a60065b 64
kadonotakashi 0:8fdf9a60065b 65
kadonotakashi 0:8fdf9a60065b 66 /*
kadonotakashi 0:8fdf9a60065b 67 * PPP status callback
kadonotakashi 0:8fdf9a60065b 68 * ===================
kadonotakashi 0:8fdf9a60065b 69 *
kadonotakashi 0:8fdf9a60065b 70 * PPP status callback is called on PPP status change (up, down, …) from lwIP
kadonotakashi 0:8fdf9a60065b 71 * core thread
kadonotakashi 0:8fdf9a60065b 72 */
kadonotakashi 0:8fdf9a60065b 73
kadonotakashi 0:8fdf9a60065b 74 /* PPP status callback example */
kadonotakashi 0:8fdf9a60065b 75 static void status_cb(ppp_pcb *pcb, int err_code, void *ctx) {
kadonotakashi 0:8fdf9a60065b 76 struct netif *pppif = ppp_netif(pcb);
kadonotakashi 0:8fdf9a60065b 77 LWIP_UNUSED_ARG(ctx);
kadonotakashi 0:8fdf9a60065b 78
kadonotakashi 0:8fdf9a60065b 79 switch(err_code) {
kadonotakashi 0:8fdf9a60065b 80 case PPPERR_NONE: {
kadonotakashi 0:8fdf9a60065b 81 #if LWIP_DNS
kadonotakashi 0:8fdf9a60065b 82 const ip_addr_t *ns;
kadonotakashi 0:8fdf9a60065b 83 #endif /* LWIP_DNS */
kadonotakashi 0:8fdf9a60065b 84 printf("status_cb: Connected\n");
kadonotakashi 0:8fdf9a60065b 85 #if PPP_IPV4_SUPPORT
kadonotakashi 0:8fdf9a60065b 86 printf(" our_ipaddr = %s\n", ipaddr_ntoa(&pppif->ip_addr));
kadonotakashi 0:8fdf9a60065b 87 printf(" his_ipaddr = %s\n", ipaddr_ntoa(&pppif->gw));
kadonotakashi 0:8fdf9a60065b 88 printf(" netmask = %s\n", ipaddr_ntoa(&pppif->netmask));
kadonotakashi 0:8fdf9a60065b 89 #if LWIP_DNS
kadonotakashi 0:8fdf9a60065b 90 ns = dns_getserver(0);
kadonotakashi 0:8fdf9a60065b 91 printf(" dns1 = %s\n", ipaddr_ntoa(ns));
kadonotakashi 0:8fdf9a60065b 92 ns = dns_getserver(1);
kadonotakashi 0:8fdf9a60065b 93 printf(" dns2 = %s\n", ipaddr_ntoa(ns));
kadonotakashi 0:8fdf9a60065b 94 #endif /* LWIP_DNS */
kadonotakashi 0:8fdf9a60065b 95 #endif /* PPP_IPV4_SUPPORT */
kadonotakashi 0:8fdf9a60065b 96 #if PPP_IPV6_SUPPORT
kadonotakashi 0:8fdf9a60065b 97 printf(" our6_ipaddr = %s\n", ip6addr_ntoa(netif_ip6_addr(pppif, 0)));
kadonotakashi 0:8fdf9a60065b 98 #endif /* PPP_IPV6_SUPPORT */
kadonotakashi 0:8fdf9a60065b 99 break;
kadonotakashi 0:8fdf9a60065b 100 }
kadonotakashi 0:8fdf9a60065b 101 case PPPERR_PARAM: {
kadonotakashi 0:8fdf9a60065b 102 printf("status_cb: Invalid parameter\n");
kadonotakashi 0:8fdf9a60065b 103 break;
kadonotakashi 0:8fdf9a60065b 104 }
kadonotakashi 0:8fdf9a60065b 105 case PPPERR_OPEN: {
kadonotakashi 0:8fdf9a60065b 106 printf("status_cb: Unable to open PPP session\n");
kadonotakashi 0:8fdf9a60065b 107 break;
kadonotakashi 0:8fdf9a60065b 108 }
kadonotakashi 0:8fdf9a60065b 109 case PPPERR_DEVICE: {
kadonotakashi 0:8fdf9a60065b 110 printf("status_cb: Invalid I/O device for PPP\n");
kadonotakashi 0:8fdf9a60065b 111 break;
kadonotakashi 0:8fdf9a60065b 112 }
kadonotakashi 0:8fdf9a60065b 113 case PPPERR_ALLOC: {
kadonotakashi 0:8fdf9a60065b 114 printf("status_cb: Unable to allocate resources\n");
kadonotakashi 0:8fdf9a60065b 115 break;
kadonotakashi 0:8fdf9a60065b 116 }
kadonotakashi 0:8fdf9a60065b 117 case PPPERR_USER: {
kadonotakashi 0:8fdf9a60065b 118 printf("status_cb: User interrupt\n");
kadonotakashi 0:8fdf9a60065b 119 break;
kadonotakashi 0:8fdf9a60065b 120 }
kadonotakashi 0:8fdf9a60065b 121 case PPPERR_CONNECT: {
kadonotakashi 0:8fdf9a60065b 122 printf("status_cb: Connection lost\n");
kadonotakashi 0:8fdf9a60065b 123 break;
kadonotakashi 0:8fdf9a60065b 124 }
kadonotakashi 0:8fdf9a60065b 125 case PPPERR_AUTHFAIL: {
kadonotakashi 0:8fdf9a60065b 126 printf("status_cb: Failed authentication challenge\n");
kadonotakashi 0:8fdf9a60065b 127 break;
kadonotakashi 0:8fdf9a60065b 128 }
kadonotakashi 0:8fdf9a60065b 129 case PPPERR_PROTOCOL: {
kadonotakashi 0:8fdf9a60065b 130 printf("status_cb: Failed to meet protocol\n");
kadonotakashi 0:8fdf9a60065b 131 break;
kadonotakashi 0:8fdf9a60065b 132 }
kadonotakashi 0:8fdf9a60065b 133 case PPPERR_PEERDEAD: {
kadonotakashi 0:8fdf9a60065b 134 printf("status_cb: Connection timeout\n");
kadonotakashi 0:8fdf9a60065b 135 break;
kadonotakashi 0:8fdf9a60065b 136 }
kadonotakashi 0:8fdf9a60065b 137 case PPPERR_IDLETIMEOUT: {
kadonotakashi 0:8fdf9a60065b 138 printf("status_cb: Idle Timeout\n");
kadonotakashi 0:8fdf9a60065b 139 break;
kadonotakashi 0:8fdf9a60065b 140 }
kadonotakashi 0:8fdf9a60065b 141 case PPPERR_CONNECTTIME: {
kadonotakashi 0:8fdf9a60065b 142 printf("status_cb: Max connect time reached\n");
kadonotakashi 0:8fdf9a60065b 143 break;
kadonotakashi 0:8fdf9a60065b 144 }
kadonotakashi 0:8fdf9a60065b 145 case PPPERR_LOOPBACK: {
kadonotakashi 0:8fdf9a60065b 146 printf("status_cb: Loopback detected\n");
kadonotakashi 0:8fdf9a60065b 147 break;
kadonotakashi 0:8fdf9a60065b 148 }
kadonotakashi 0:8fdf9a60065b 149 default: {
kadonotakashi 0:8fdf9a60065b 150 printf("status_cb: Unknown error code %d\n", err_code);
kadonotakashi 0:8fdf9a60065b 151 break;
kadonotakashi 0:8fdf9a60065b 152 }
kadonotakashi 0:8fdf9a60065b 153 }
kadonotakashi 0:8fdf9a60065b 154
kadonotakashi 0:8fdf9a60065b 155 /*
kadonotakashi 0:8fdf9a60065b 156 * This should be in the switch case, this is put outside of the switch
kadonotakashi 0:8fdf9a60065b 157 * case for example readability.
kadonotakashi 0:8fdf9a60065b 158 */
kadonotakashi 0:8fdf9a60065b 159
kadonotakashi 0:8fdf9a60065b 160 if (err_code == PPPERR_NONE) {
kadonotakashi 0:8fdf9a60065b 161 return;
kadonotakashi 0:8fdf9a60065b 162 }
kadonotakashi 0:8fdf9a60065b 163
kadonotakashi 0:8fdf9a60065b 164 /* ppp_close() was previously called, don't reconnect */
kadonotakashi 0:8fdf9a60065b 165 if (err_code == PPPERR_USER) {
kadonotakashi 0:8fdf9a60065b 166 /* ppp_free(); -- can be called here */
kadonotakashi 0:8fdf9a60065b 167 return;
kadonotakashi 0:8fdf9a60065b 168 }
kadonotakashi 0:8fdf9a60065b 169
kadonotakashi 0:8fdf9a60065b 170 /*
kadonotakashi 0:8fdf9a60065b 171 * Try to reconnect in 30 seconds, if you need a modem chatscript you have
kadonotakashi 0:8fdf9a60065b 172 * to do a much better signaling here ;-)
kadonotakashi 0:8fdf9a60065b 173 */
kadonotakashi 0:8fdf9a60065b 174 ppp_connect(pcb, 30);
kadonotakashi 0:8fdf9a60065b 175 /* OR ppp_listen(pcb); */
kadonotakashi 0:8fdf9a60065b 176 }
kadonotakashi 0:8fdf9a60065b 177
kadonotakashi 0:8fdf9a60065b 178
kadonotakashi 0:8fdf9a60065b 179 /*
kadonotakashi 0:8fdf9a60065b 180 * Creating a new PPPoS session
kadonotakashi 0:8fdf9a60065b 181 * ============================
kadonotakashi 0:8fdf9a60065b 182 *
kadonotakashi 0:8fdf9a60065b 183 * In lwIP, PPPoS is not PPPoSONET, in lwIP PPPoS is PPPoSerial.
kadonotakashi 0:8fdf9a60065b 184 */
kadonotakashi 0:8fdf9a60065b 185
kadonotakashi 0:8fdf9a60065b 186 #include "netif/ppp/pppos.h"
kadonotakashi 0:8fdf9a60065b 187
kadonotakashi 0:8fdf9a60065b 188 /*
kadonotakashi 0:8fdf9a60065b 189 * PPPoS serial output callback
kadonotakashi 0:8fdf9a60065b 190 *
kadonotakashi 0:8fdf9a60065b 191 * ppp_pcb, PPP control block
kadonotakashi 0:8fdf9a60065b 192 * data, buffer to write to serial port
kadonotakashi 0:8fdf9a60065b 193 * len, length of the data buffer
kadonotakashi 0:8fdf9a60065b 194 * ctx, optional user-provided callback context pointer
kadonotakashi 0:8fdf9a60065b 195 *
kadonotakashi 0:8fdf9a60065b 196 * Return value: len if write succeed
kadonotakashi 0:8fdf9a60065b 197 */
kadonotakashi 0:8fdf9a60065b 198 static u32_t output_cb(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx) {
kadonotakashi 0:8fdf9a60065b 199 return uart_write(UART, data, len);
kadonotakashi 0:8fdf9a60065b 200 }
kadonotakashi 0:8fdf9a60065b 201
kadonotakashi 0:8fdf9a60065b 202 /*
kadonotakashi 0:8fdf9a60065b 203 * Create a new PPPoS interface
kadonotakashi 0:8fdf9a60065b 204 *
kadonotakashi 0:8fdf9a60065b 205 * ppp_netif, netif to use for this PPP link, i.e. PPP IP interface
kadonotakashi 0:8fdf9a60065b 206 * output_cb, PPPoS serial output callback
kadonotakashi 0:8fdf9a60065b 207 * status_cb, PPP status callback, called on PPP status change (up, down, …)
kadonotakashi 0:8fdf9a60065b 208 * ctx_cb, optional user-provided callback context pointer
kadonotakashi 0:8fdf9a60065b 209 */
kadonotakashi 0:8fdf9a60065b 210 ppp = pppos_create(&ppp_netif,
kadonotakashi 0:8fdf9a60065b 211 output_cb, status_cb, ctx_cb);
kadonotakashi 0:8fdf9a60065b 212
kadonotakashi 0:8fdf9a60065b 213
kadonotakashi 0:8fdf9a60065b 214 /*
kadonotakashi 0:8fdf9a60065b 215 * Creating a new PPPoE session
kadonotakashi 0:8fdf9a60065b 216 * ============================
kadonotakashi 0:8fdf9a60065b 217 */
kadonotakashi 0:8fdf9a60065b 218
kadonotakashi 0:8fdf9a60065b 219 #include "netif/ppp/pppoe.h"
kadonotakashi 0:8fdf9a60065b 220
kadonotakashi 0:8fdf9a60065b 221 /*
kadonotakashi 0:8fdf9a60065b 222 * Create a new PPPoE interface
kadonotakashi 0:8fdf9a60065b 223 *
kadonotakashi 0:8fdf9a60065b 224 * ppp_netif, netif to use for this PPP link, i.e. PPP IP interface
kadonotakashi 0:8fdf9a60065b 225 * ethif, already existing and setup Ethernet interface to use
kadonotakashi 0:8fdf9a60065b 226 * service_name, PPPoE service name discriminator (not supported yet)
kadonotakashi 0:8fdf9a60065b 227 * concentrator_name, PPPoE concentrator name discriminator (not supported yet)
kadonotakashi 0:8fdf9a60065b 228 * status_cb, PPP status callback, called on PPP status change (up, down, …)
kadonotakashi 0:8fdf9a60065b 229 * ctx_cb, optional user-provided callback context pointer
kadonotakashi 0:8fdf9a60065b 230 */
kadonotakashi 0:8fdf9a60065b 231 ppp = pppoe_create(&ppp_netif,
kadonotakashi 0:8fdf9a60065b 232 &ethif,
kadonotakashi 0:8fdf9a60065b 233 service_name, concentrator_name,
kadonotakashi 0:8fdf9a60065b 234 status_cb, ctx_cb);
kadonotakashi 0:8fdf9a60065b 235
kadonotakashi 0:8fdf9a60065b 236
kadonotakashi 0:8fdf9a60065b 237 /*
kadonotakashi 0:8fdf9a60065b 238 * Creating a new PPPoL2TP session
kadonotakashi 0:8fdf9a60065b 239 * ===============================
kadonotakashi 0:8fdf9a60065b 240 */
kadonotakashi 0:8fdf9a60065b 241
kadonotakashi 0:8fdf9a60065b 242 #include "netif/ppp/pppol2tp.h"
kadonotakashi 0:8fdf9a60065b 243
kadonotakashi 0:8fdf9a60065b 244 /*
kadonotakashi 0:8fdf9a60065b 245 * Create a new PPPoL2TP interface
kadonotakashi 0:8fdf9a60065b 246 *
kadonotakashi 0:8fdf9a60065b 247 * ppp_netif, netif to use for this PPP link, i.e. PPP IP interface
kadonotakashi 0:8fdf9a60065b 248 * netif, optional already existing and setup output netif, necessary if you
kadonotakashi 0:8fdf9a60065b 249 * want to set this interface as default route to settle the chicken
kadonotakashi 0:8fdf9a60065b 250 * and egg problem with VPN links
kadonotakashi 0:8fdf9a60065b 251 * ipaddr, IP to connect to
kadonotakashi 0:8fdf9a60065b 252 * port, UDP port to connect to (usually 1701)
kadonotakashi 0:8fdf9a60065b 253 * secret, L2TP secret to use
kadonotakashi 0:8fdf9a60065b 254 * secret_len, size in bytes of the L2TP secret
kadonotakashi 0:8fdf9a60065b 255 * status_cb, PPP status callback, called on PPP status change (up, down, …)
kadonotakashi 0:8fdf9a60065b 256 * ctx_cb, optional user-provided callback context pointer
kadonotakashi 0:8fdf9a60065b 257 */
kadonotakashi 0:8fdf9a60065b 258 ppp = pppol2tp_create(&ppp_netif,
kadonotakashi 0:8fdf9a60065b 259 struct netif *netif, ip_addr_t *ipaddr, u16_t port,
kadonotakashi 0:8fdf9a60065b 260 u8_t *secret, u8_t secret_len,
kadonotakashi 0:8fdf9a60065b 261 ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
kadonotakashi 0:8fdf9a60065b 262
kadonotakashi 0:8fdf9a60065b 263
kadonotakashi 0:8fdf9a60065b 264 /*
kadonotakashi 0:8fdf9a60065b 265 * Initiate PPP client connection
kadonotakashi 0:8fdf9a60065b 266 * ==============================
kadonotakashi 0:8fdf9a60065b 267 */
kadonotakashi 0:8fdf9a60065b 268
kadonotakashi 0:8fdf9a60065b 269 /* Set this interface as default route */
kadonotakashi 0:8fdf9a60065b 270 ppp_set_default(ppp);
kadonotakashi 0:8fdf9a60065b 271
kadonotakashi 0:8fdf9a60065b 272 /*
kadonotakashi 0:8fdf9a60065b 273 * Basic PPP client configuration. Can only be set if PPP session is in the
kadonotakashi 0:8fdf9a60065b 274 * dead state (i.e. disconnected). We don't need to provide thread-safe
kadonotakashi 0:8fdf9a60065b 275 * equivalents through PPPAPI because those helpers are only changing
kadonotakashi 0:8fdf9a60065b 276 * structure members while session is inactive for lwIP core. Configuration
kadonotakashi 0:8fdf9a60065b 277 * only need to be done once.
kadonotakashi 0:8fdf9a60065b 278 */
kadonotakashi 0:8fdf9a60065b 279
kadonotakashi 0:8fdf9a60065b 280 /* Ask the peer for up to 2 DNS server addresses. */
kadonotakashi 0:8fdf9a60065b 281 ppp_set_usepeerdns(ppp, 1);
kadonotakashi 0:8fdf9a60065b 282
kadonotakashi 0:8fdf9a60065b 283 /* Auth configuration, this is pretty self-explanatory */
kadonotakashi 0:8fdf9a60065b 284 ppp_set_auth(ppp, PPPAUTHTYPE_ANY, "login", "password");
kadonotakashi 0:8fdf9a60065b 285
kadonotakashi 0:8fdf9a60065b 286 /*
kadonotakashi 0:8fdf9a60065b 287 * Initiate PPP negotiation, without waiting (holdoff=0), can only be called
kadonotakashi 0:8fdf9a60065b 288 * if PPP session is in the dead state (i.e. disconnected).
kadonotakashi 0:8fdf9a60065b 289 */
kadonotakashi 0:8fdf9a60065b 290 u16_t holdoff = 0;
kadonotakashi 0:8fdf9a60065b 291 ppp_connect(ppp, holdoff);
kadonotakashi 0:8fdf9a60065b 292
kadonotakashi 0:8fdf9a60065b 293
kadonotakashi 0:8fdf9a60065b 294 /*
kadonotakashi 0:8fdf9a60065b 295 * Initiate PPP server listener
kadonotakashi 0:8fdf9a60065b 296 * ============================
kadonotakashi 0:8fdf9a60065b 297 */
kadonotakashi 0:8fdf9a60065b 298
kadonotakashi 0:8fdf9a60065b 299 /*
kadonotakashi 0:8fdf9a60065b 300 * Basic PPP server configuration. Can only be set if PPP session is in the
kadonotakashi 0:8fdf9a60065b 301 * dead state (i.e. disconnected). We don't need to provide thread-safe
kadonotakashi 0:8fdf9a60065b 302 * equivalents through PPPAPI because those helpers are only changing
kadonotakashi 0:8fdf9a60065b 303 * structure members while session is inactive for lwIP core. Configuration
kadonotakashi 0:8fdf9a60065b 304 * only need to be done once.
kadonotakashi 0:8fdf9a60065b 305 */
kadonotakashi 0:8fdf9a60065b 306 ip4_addr_t addr;
kadonotakashi 0:8fdf9a60065b 307
kadonotakashi 0:8fdf9a60065b 308 /* Set our address */
kadonotakashi 0:8fdf9a60065b 309 IP4_ADDR(&addr, 192,168,0,1);
kadonotakashi 0:8fdf9a60065b 310 ppp_set_ipcp_ouraddr(ppp, &addr);
kadonotakashi 0:8fdf9a60065b 311
kadonotakashi 0:8fdf9a60065b 312 /* Set peer(his) address */
kadonotakashi 0:8fdf9a60065b 313 IP4_ADDR(&addr, 192,168,0,2);
kadonotakashi 0:8fdf9a60065b 314 ppp_set_ipcp_hisaddr(ppp, &addr);
kadonotakashi 0:8fdf9a60065b 315
kadonotakashi 0:8fdf9a60065b 316 /* Set primary DNS server */
kadonotakashi 0:8fdf9a60065b 317 IP4_ADDR(&addr, 192,168,10,20);
kadonotakashi 0:8fdf9a60065b 318 ppp_set_ipcp_dnsaddr(ppp, 0, &addr);
kadonotakashi 0:8fdf9a60065b 319
kadonotakashi 0:8fdf9a60065b 320 /* Set secondary DNS server */
kadonotakashi 0:8fdf9a60065b 321 IP4_ADDR(&addr, 192,168,10,21);
kadonotakashi 0:8fdf9a60065b 322 ppp_set_ipcp_dnsaddr(ppp, 1, &addr);
kadonotakashi 0:8fdf9a60065b 323
kadonotakashi 0:8fdf9a60065b 324 /* Auth configuration, this is pretty self-explanatory */
kadonotakashi 0:8fdf9a60065b 325 ppp_set_auth(ppp, PPPAUTHTYPE_ANY, "login", "password");
kadonotakashi 0:8fdf9a60065b 326
kadonotakashi 0:8fdf9a60065b 327 /* Require peer to authenticate */
kadonotakashi 0:8fdf9a60065b 328 ppp_set_auth_required(ppp, 1);
kadonotakashi 0:8fdf9a60065b 329
kadonotakashi 0:8fdf9a60065b 330 /*
kadonotakashi 0:8fdf9a60065b 331 * Only for PPPoS, the PPP session should be up and waiting for input.
kadonotakashi 0:8fdf9a60065b 332 *
kadonotakashi 0:8fdf9a60065b 333 * Note: for PPPoS, ppp_connect() and ppp_listen() are actually the same thing.
kadonotakashi 0:8fdf9a60065b 334 * The listen call is meant for future support of PPPoE and PPPoL2TP server
kadonotakashi 0:8fdf9a60065b 335 * mode, where we will need to negotiate the incoming PPPoE session or L2TP
kadonotakashi 0:8fdf9a60065b 336 * session before initiating PPP itself. We need this call because there is
kadonotakashi 0:8fdf9a60065b 337 * two passive modes for PPPoS, ppp_set_passive and ppp_set_silent.
kadonotakashi 0:8fdf9a60065b 338 */
kadonotakashi 0:8fdf9a60065b 339 ppp_set_silent(pppos, 1);
kadonotakashi 0:8fdf9a60065b 340
kadonotakashi 0:8fdf9a60065b 341 /*
kadonotakashi 0:8fdf9a60065b 342 * Initiate PPP listener (i.e. wait for an incoming connection), can only
kadonotakashi 0:8fdf9a60065b 343 * be called if PPP session is in the dead state (i.e. disconnected).
kadonotakashi 0:8fdf9a60065b 344 */
kadonotakashi 0:8fdf9a60065b 345 ppp_listen(ppp);
kadonotakashi 0:8fdf9a60065b 346
kadonotakashi 0:8fdf9a60065b 347
kadonotakashi 0:8fdf9a60065b 348 /*
kadonotakashi 0:8fdf9a60065b 349 * Closing PPP connection
kadonotakashi 0:8fdf9a60065b 350 * ======================
kadonotakashi 0:8fdf9a60065b 351 */
kadonotakashi 0:8fdf9a60065b 352
kadonotakashi 0:8fdf9a60065b 353 /*
kadonotakashi 0:8fdf9a60065b 354 * Initiate the end of the PPP session, without carrier lost signal
kadonotakashi 0:8fdf9a60065b 355 * (nocarrier=0), meaning a clean shutdown of PPP protocols.
kadonotakashi 0:8fdf9a60065b 356 * You can call this function at anytime.
kadonotakashi 0:8fdf9a60065b 357 */
kadonotakashi 0:8fdf9a60065b 358 u8_t nocarrier = 0;
kadonotakashi 0:8fdf9a60065b 359 ppp_close(ppp, nocarrier);
kadonotakashi 0:8fdf9a60065b 360 /*
kadonotakashi 0:8fdf9a60065b 361 * Then you must wait your status_cb() to be called, it may takes from a few
kadonotakashi 0:8fdf9a60065b 362 * seconds to several tens of seconds depending on the current PPP state.
kadonotakashi 0:8fdf9a60065b 363 */
kadonotakashi 0:8fdf9a60065b 364
kadonotakashi 0:8fdf9a60065b 365 /*
kadonotakashi 0:8fdf9a60065b 366 * Freeing a PPP connection
kadonotakashi 0:8fdf9a60065b 367 * ========================
kadonotakashi 0:8fdf9a60065b 368 */
kadonotakashi 0:8fdf9a60065b 369
kadonotakashi 0:8fdf9a60065b 370 /*
kadonotakashi 0:8fdf9a60065b 371 * Free the PPP control block, can only be called if PPP session is in the
kadonotakashi 0:8fdf9a60065b 372 * dead state (i.e. disconnected). You need to call ppp_close() before.
kadonotakashi 0:8fdf9a60065b 373 */
kadonotakashi 0:8fdf9a60065b 374 ppp_free(ppp);
kadonotakashi 0:8fdf9a60065b 375
kadonotakashi 0:8fdf9a60065b 376
kadonotakashi 0:8fdf9a60065b 377
kadonotakashi 0:8fdf9a60065b 378 3 PPPoS input path (raw API, IRQ safe API, TCPIP API)
kadonotakashi 0:8fdf9a60065b 379 =====================================================
kadonotakashi 0:8fdf9a60065b 380
kadonotakashi 0:8fdf9a60065b 381 Received data on serial port should be sent to lwIP using the pppos_input()
kadonotakashi 0:8fdf9a60065b 382 function or the pppos_input_tcpip() function.
kadonotakashi 0:8fdf9a60065b 383
kadonotakashi 0:8fdf9a60065b 384 If NO_SYS is 1 and if PPP_INPROC_IRQ_SAFE is 0 (the default), pppos_input()
kadonotakashi 0:8fdf9a60065b 385 is not IRQ safe and then *MUST* only be called inside your main loop.
kadonotakashi 0:8fdf9a60065b 386
kadonotakashi 0:8fdf9a60065b 387 Whatever the NO_SYS value, if PPP_INPROC_IRQ_SAFE is 1, pppos_input() is IRQ
kadonotakashi 0:8fdf9a60065b 388 safe and can be safely called from an interrupt context, using that is going
kadonotakashi 0:8fdf9a60065b 389 to reduce your need of buffer if pppos_input() is called byte after byte in
kadonotakashi 0:8fdf9a60065b 390 your rx serial interrupt.
kadonotakashi 0:8fdf9a60065b 391
kadonotakashi 0:8fdf9a60065b 392 if NO_SYS is 0, the thread safe way outside an interrupt context is to use
kadonotakashi 0:8fdf9a60065b 393 the pppos_input_tcpip() function to pass input data to the lwIP core thread
kadonotakashi 0:8fdf9a60065b 394 using the TCPIP API. This is thread safe in all cases but you should avoid
kadonotakashi 0:8fdf9a60065b 395 passing data byte after byte because it uses heavy locking (mailbox) and it
kadonotakashi 0:8fdf9a60065b 396 allocates pbuf, better fill them !
kadonotakashi 0:8fdf9a60065b 397
kadonotakashi 0:8fdf9a60065b 398 if NO_SYS is 0 and if PPP_INPROC_IRQ_SAFE is 1, you may also use pppos_input()
kadonotakashi 0:8fdf9a60065b 399 from an RX thread, however pppos_input() is not thread safe by itself. You can
kadonotakashi 0:8fdf9a60065b 400 do that *BUT* you should NEVER call pppos_connect(), pppos_listen() and
kadonotakashi 0:8fdf9a60065b 401 ppp_free() if pppos_input() can still be running, doing this is NOT thread safe
kadonotakashi 0:8fdf9a60065b 402 at all. Using PPP_INPROC_IRQ_SAFE from an RX thread is discouraged unless you
kadonotakashi 0:8fdf9a60065b 403 really know what you are doing, your move ;-)
kadonotakashi 0:8fdf9a60065b 404
kadonotakashi 0:8fdf9a60065b 405
kadonotakashi 0:8fdf9a60065b 406 /*
kadonotakashi 0:8fdf9a60065b 407 * Fonction to call for received data
kadonotakashi 0:8fdf9a60065b 408 *
kadonotakashi 0:8fdf9a60065b 409 * ppp, PPP control block
kadonotakashi 0:8fdf9a60065b 410 * buffer, input buffer
kadonotakashi 0:8fdf9a60065b 411 * buffer_len, buffer length in bytes
kadonotakashi 0:8fdf9a60065b 412 */
kadonotakashi 0:8fdf9a60065b 413 void pppos_input(ppp, buffer, buffer_len);
kadonotakashi 0:8fdf9a60065b 414
kadonotakashi 0:8fdf9a60065b 415 or
kadonotakashi 0:8fdf9a60065b 416
kadonotakashi 0:8fdf9a60065b 417 void pppos_input_tcpip(ppp, buffer, buffer_len);
kadonotakashi 0:8fdf9a60065b 418
kadonotakashi 0:8fdf9a60065b 419
kadonotakashi 0:8fdf9a60065b 420
kadonotakashi 0:8fdf9a60065b 421 4 Thread safe PPP API (PPPAPI)
kadonotakashi 0:8fdf9a60065b 422 ==============================
kadonotakashi 0:8fdf9a60065b 423
kadonotakashi 0:8fdf9a60065b 424 There is a thread safe API for all corresponding ppp_* functions, you have to
kadonotakashi 0:8fdf9a60065b 425 enable LWIP_PPP_API in your lwipopts.h file, then see
kadonotakashi 0:8fdf9a60065b 426 include/netif/ppp/pppapi.h, this is actually pretty obvious.
kadonotakashi 0:8fdf9a60065b 427
kadonotakashi 0:8fdf9a60065b 428
kadonotakashi 0:8fdf9a60065b 429
kadonotakashi 0:8fdf9a60065b 430 5 Notify phase callback (PPP_NOTIFY_PHASE)
kadonotakashi 0:8fdf9a60065b 431 ==========================================
kadonotakashi 0:8fdf9a60065b 432
kadonotakashi 0:8fdf9a60065b 433 Notify phase callback, enabled using the PPP_NOTIFY_PHASE config option, let
kadonotakashi 0:8fdf9a60065b 434 you configure a callback that is called on each PPP internal state change.
kadonotakashi 0:8fdf9a60065b 435 This is different from the status callback which only warns you about
kadonotakashi 0:8fdf9a60065b 436 up(running) and down(dead) events.
kadonotakashi 0:8fdf9a60065b 437
kadonotakashi 0:8fdf9a60065b 438 Notify phase callback can be used, for example, to set a LED pattern depending
kadonotakashi 0:8fdf9a60065b 439 on the current phase of the PPP session. Here is a callback example which
kadonotakashi 0:8fdf9a60065b 440 tries to mimic what we usually see on xDSL modems while they are negotiating
kadonotakashi 0:8fdf9a60065b 441 the link, which should be self-explanatory:
kadonotakashi 0:8fdf9a60065b 442
kadonotakashi 0:8fdf9a60065b 443 static void ppp_notify_phase_cb(ppp_pcb *pcb, u8_t phase, void *ctx) {
kadonotakashi 0:8fdf9a60065b 444 switch (phase) {
kadonotakashi 0:8fdf9a60065b 445
kadonotakashi 0:8fdf9a60065b 446 /* Session is down (either permanently or briefly) */
kadonotakashi 0:8fdf9a60065b 447 case PPP_PHASE_DEAD:
kadonotakashi 0:8fdf9a60065b 448 led_set(PPP_LED, LED_OFF);
kadonotakashi 0:8fdf9a60065b 449 break;
kadonotakashi 0:8fdf9a60065b 450
kadonotakashi 0:8fdf9a60065b 451 /* We are between two sessions */
kadonotakashi 0:8fdf9a60065b 452 case PPP_PHASE_HOLDOFF:
kadonotakashi 0:8fdf9a60065b 453 led_set(PPP_LED, LED_SLOW_BLINK);
kadonotakashi 0:8fdf9a60065b 454 break;
kadonotakashi 0:8fdf9a60065b 455
kadonotakashi 0:8fdf9a60065b 456 /* Session just started */
kadonotakashi 0:8fdf9a60065b 457 case PPP_PHASE_INITIALIZE:
kadonotakashi 0:8fdf9a60065b 458 led_set(PPP_LED, LED_FAST_BLINK);
kadonotakashi 0:8fdf9a60065b 459 break;
kadonotakashi 0:8fdf9a60065b 460
kadonotakashi 0:8fdf9a60065b 461 /* Session is running */
kadonotakashi 0:8fdf9a60065b 462 case PPP_PHASE_RUNNING:
kadonotakashi 0:8fdf9a60065b 463 led_set(PPP_LED, LED_ON);
kadonotakashi 0:8fdf9a60065b 464 break;
kadonotakashi 0:8fdf9a60065b 465
kadonotakashi 0:8fdf9a60065b 466 default:
kadonotakashi 0:8fdf9a60065b 467 break;
kadonotakashi 0:8fdf9a60065b 468 }
kadonotakashi 0:8fdf9a60065b 469 }
kadonotakashi 0:8fdf9a60065b 470
kadonotakashi 0:8fdf9a60065b 471
kadonotakashi 0:8fdf9a60065b 472
kadonotakashi 0:8fdf9a60065b 473 6 Upgrading from lwIP <= 1.4.x to lwIP >= 2.0.x
kadonotakashi 0:8fdf9a60065b 474 ===============================================
kadonotakashi 0:8fdf9a60065b 475
kadonotakashi 0:8fdf9a60065b 476 PPP API was fully reworked between 1.4.x and 2.0.x releases. However porting
kadonotakashi 0:8fdf9a60065b 477 from previous lwIP version is pretty easy:
kadonotakashi 0:8fdf9a60065b 478
kadonotakashi 0:8fdf9a60065b 479 * Previous PPP API used an integer to identify PPP sessions, we are now
kadonotakashi 0:8fdf9a60065b 480 using ppp_pcb* control block, therefore all functions changed from "int ppp"
kadonotakashi 0:8fdf9a60065b 481 to "ppp_pcb *ppp"
kadonotakashi 0:8fdf9a60065b 482
kadonotakashi 0:8fdf9a60065b 483 * struct netif was moved outside the PPP structure, you have to provide a netif
kadonotakashi 0:8fdf9a60065b 484 for PPP interface in pppoX_create() functions
kadonotakashi 0:8fdf9a60065b 485
kadonotakashi 0:8fdf9a60065b 486 * PPP session are not started automatically after you created them anymore,
kadonotakashi 0:8fdf9a60065b 487 you have to call ppp_connect(), this way you can configure the session before
kadonotakashi 0:8fdf9a60065b 488 starting it.
kadonotakashi 0:8fdf9a60065b 489
kadonotakashi 0:8fdf9a60065b 490 * Previous PPP API used CamelCase, we are now using snake_case.
kadonotakashi 0:8fdf9a60065b 491
kadonotakashi 0:8fdf9a60065b 492 * Previous PPP API mixed PPPoS and PPPoE calls, this isn't the case anymore,
kadonotakashi 0:8fdf9a60065b 493 PPPoS functions are now prefixed pppos_ and PPPoE functions are now prefixed
kadonotakashi 0:8fdf9a60065b 494 pppoe_, common functions are now prefixed ppp_.
kadonotakashi 0:8fdf9a60065b 495
kadonotakashi 0:8fdf9a60065b 496 * New PPPERR_ error codes added, check you have all of them in your status
kadonotakashi 0:8fdf9a60065b 497 callback function
kadonotakashi 0:8fdf9a60065b 498
kadonotakashi 0:8fdf9a60065b 499 * Only the following include files should now be used in user application:
kadonotakashi 0:8fdf9a60065b 500 #include "netif/ppp/pppapi.h"
kadonotakashi 0:8fdf9a60065b 501 #include "netif/ppp/pppos.h"
kadonotakashi 0:8fdf9a60065b 502 #include "netif/ppp/pppoe.h"
kadonotakashi 0:8fdf9a60065b 503 #include "netif/ppp/pppol2tp.h"
kadonotakashi 0:8fdf9a60065b 504
kadonotakashi 0:8fdf9a60065b 505 Functions from ppp.h can be used, but you don't need to include this header
kadonotakashi 0:8fdf9a60065b 506 file as it is already included by above header files.
kadonotakashi 0:8fdf9a60065b 507
kadonotakashi 0:8fdf9a60065b 508 * PPP_INPROC_OWNTHREAD was broken by design and was removed, you have to create
kadonotakashi 0:8fdf9a60065b 509 your own serial rx thread
kadonotakashi 0:8fdf9a60065b 510
kadonotakashi 0:8fdf9a60065b 511 * PPP_INPROC_MULTITHREADED option was misnamed and confusing and was renamed
kadonotakashi 0:8fdf9a60065b 512 PPP_INPROC_IRQ_SAFE, please read the "PPPoS input path" documentation above
kadonotakashi 0:8fdf9a60065b 513 because you might have been fooled by that
kadonotakashi 0:8fdf9a60065b 514
kadonotakashi 0:8fdf9a60065b 515 * If you used tcpip_callback_with_block() on ppp_ functions you may wish to use
kadonotakashi 0:8fdf9a60065b 516 the PPPAPI API instead.
kadonotakashi 0:8fdf9a60065b 517
kadonotakashi 0:8fdf9a60065b 518 * ppp_sighup and ppp_close functions were merged using an optional argument
kadonotakashi 0:8fdf9a60065b 519 "nocarrier" on ppp_close.
kadonotakashi 0:8fdf9a60065b 520
kadonotakashi 0:8fdf9a60065b 521 * DNS servers are now only remotely asked if LWIP_DNS is set and if
kadonotakashi 0:8fdf9a60065b 522 ppp_set_usepeerdns() is set to true, they are now automatically registered
kadonotakashi 0:8fdf9a60065b 523 using the dns_setserver() function so you don't need to do that in the PPP
kadonotakashi 0:8fdf9a60065b 524 callback anymore.
kadonotakashi 0:8fdf9a60065b 525
kadonotakashi 0:8fdf9a60065b 526 * PPPoS does not use the SIO API anymore, as such it now requires a serial
kadonotakashi 0:8fdf9a60065b 527 output callback in place of sio_write
kadonotakashi 0:8fdf9a60065b 528
kadonotakashi 0:8fdf9a60065b 529 * PPP_MAXIDLEFLAG is now in ms instead of jiffies