diff options
author | Tom Rini <trini@konsulko.com> | 2024-10-16 08:10:14 -0600 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2024-10-16 08:10:14 -0600 |
commit | f3f86fd1fe0fb288356bff78f8a6fa2edf89e3fc (patch) | |
tree | f0a99ea87d92f63895a6d053e3185838ebecf2d0 /contrib/examples/ppp/pppos_example.c |
Squashed 'lib/lwip/lwip/' content from commit 0a0452b2c39b
git-subtree-dir: lib/lwip/lwip
git-subtree-split: 0a0452b2c39bdd91e252aef045c115f88f6ca773
Diffstat (limited to 'contrib/examples/ppp/pppos_example.c')
-rw-r--r-- | contrib/examples/ppp/pppos_example.c | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/contrib/examples/ppp/pppos_example.c b/contrib/examples/ppp/pppos_example.c new file mode 100644 index 00000000000..0d18ce5240d --- /dev/null +++ b/contrib/examples/ppp/pppos_example.c @@ -0,0 +1,221 @@ +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Dirk Ziegelmeier <dziegel@gmx.de> + * + */ + +#include "lwip/dns.h" + +#ifndef PPPOS_SUPPORT +#define PPPOS_SUPPORT 0 +#endif /* PPPOS_SUPPORT */ + +#if PPPOS_SUPPORT +#include "netif/ppp/pppos.h" +#include "lwip/sio.h" +#define PPP_PTY_TEST 1 +#endif /* PPPOS_SUPPORT */ + +#include "pppos_example.h" + +#include <stdio.h> + +#if PPPOS_SUPPORT +static sio_fd_t ppp_sio; +static ppp_pcb *ppp; +static struct netif pppos_netif; + +static void +pppos_rx_thread(void *arg) +{ + u32_t len; + u8_t buffer[128]; + LWIP_UNUSED_ARG(arg); + + /* Please read the "PPPoS input path" chapter in the PPP documentation. */ + while (1) { + len = sio_read(ppp_sio, buffer, sizeof(buffer)); + if (len > 0) { + /* Pass received raw characters from PPPoS to be decoded through lwIP + * TCPIP thread using the TCPIP API. This is thread safe in all cases + * but you should avoid passing data byte after byte. */ + pppos_input_tcpip(ppp, buffer, len); + } + } +} + +static void +ppp_link_status_cb(ppp_pcb *pcb, int err_code, void *ctx) +{ + struct netif *pppif = ppp_netif(pcb); + LWIP_UNUSED_ARG(ctx); + + switch(err_code) { + case PPPERR_NONE: /* No error. */ + { +#if LWIP_DNS + const ip_addr_t *ns; +#endif /* LWIP_DNS */ + fprintf(stderr, "ppp_link_status_cb: PPPERR_NONE\n\r"); +#if LWIP_IPV4 + fprintf(stderr, " our_ip4addr = %s\n\r", ip4addr_ntoa(netif_ip4_addr(pppif))); + fprintf(stderr, " his_ipaddr = %s\n\r", ip4addr_ntoa(netif_ip4_gw(pppif))); + fprintf(stderr, " netmask = %s\n\r", ip4addr_ntoa(netif_ip4_netmask(pppif))); +#endif /* LWIP_IPV4 */ +#if LWIP_IPV6 + fprintf(stderr, " our_ip6addr = %s\n\r", ip6addr_ntoa(netif_ip6_addr(pppif, 0))); +#endif /* LWIP_IPV6 */ + +#if LWIP_DNS + ns = dns_getserver(0); + fprintf(stderr, " dns1 = %s\n\r", ipaddr_ntoa(ns)); + ns = dns_getserver(1); + fprintf(stderr, " dns2 = %s\n\r", ipaddr_ntoa(ns)); +#endif /* LWIP_DNS */ +#if PPP_IPV6_SUPPORT + fprintf(stderr, " our6_ipaddr = %s\n\r", ip6addr_ntoa(netif_ip6_addr(pppif, 0))); +#endif /* PPP_IPV6_SUPPORT */ + } + break; + + case PPPERR_PARAM: /* Invalid parameter. */ + printf("ppp_link_status_cb: PPPERR_PARAM\n"); + break; + + case PPPERR_OPEN: /* Unable to open PPP session. */ + printf("ppp_link_status_cb: PPPERR_OPEN\n"); + break; + + case PPPERR_DEVICE: /* Invalid I/O device for PPP. */ + printf("ppp_link_status_cb: PPPERR_DEVICE\n"); + break; + + case PPPERR_ALLOC: /* Unable to allocate resources. */ + printf("ppp_link_status_cb: PPPERR_ALLOC\n"); + break; + + case PPPERR_USER: /* User interrupt. */ + printf("ppp_link_status_cb: PPPERR_USER\n"); + break; + + case PPPERR_CONNECT: /* Connection lost. */ + printf("ppp_link_status_cb: PPPERR_CONNECT\n"); + break; + + case PPPERR_AUTHFAIL: /* Failed authentication challenge. */ + printf("ppp_link_status_cb: PPPERR_AUTHFAIL\n"); + break; + + case PPPERR_PROTOCOL: /* Failed to meet protocol. */ + printf("ppp_link_status_cb: PPPERR_PROTOCOL\n"); + break; + + case PPPERR_PEERDEAD: /* Connection timeout. */ + printf("ppp_link_status_cb: PPPERR_PEERDEAD\n"); + break; + + case PPPERR_IDLETIMEOUT: /* Idle Timeout. */ + printf("ppp_link_status_cb: PPPERR_IDLETIMEOUT\n"); + break; + + case PPPERR_CONNECTTIME: /* PPPERR_CONNECTTIME. */ + printf("ppp_link_status_cb: PPPERR_CONNECTTIME\n"); + break; + + case PPPERR_LOOPBACK: /* Connection timeout. */ + printf("ppp_link_status_cb: PPPERR_LOOPBACK\n"); + break; + + default: + printf("ppp_link_status_cb: unknown errCode %d\n", err_code); + break; + } +} + +static u32_t +ppp_output_cb(ppp_pcb *pcb, const void *data, u32_t len, void *ctx) +{ + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(ctx); + return sio_write(ppp_sio, (const u8_t*)data, len); +} + +#if LWIP_NETIF_STATUS_CALLBACK +static void +netif_status_callback(struct netif *nif) +{ + printf("PPPNETIF: %c%c%d is %s\n", nif->name[0], nif->name[1], nif->num, + netif_is_up(nif) ? "UP" : "DOWN"); +#if LWIP_IPV4 + printf("IPV4: Host at %s ", ip4addr_ntoa(netif_ip4_addr(nif))); + printf("mask %s ", ip4addr_ntoa(netif_ip4_netmask(nif))); + printf("gateway %s\n", ip4addr_ntoa(netif_ip4_gw(nif))); +#endif /* LWIP_IPV4 */ +#if LWIP_IPV6 + printf("IPV6: Host at %s\n", ip6addr_ntoa(netif_ip6_addr(nif, 0))); +#endif /* LWIP_IPV6 */ +#if LWIP_NETIF_HOSTNAME + printf("FQDN: %s\n", netif_get_hostname(nif)); +#endif /* LWIP_NETIF_HOSTNAME */ +} +#endif /* LWIP_NETIF_STATUS_CALLBACK */ +#endif + +void +pppos_example_init(void) +{ +#if PPPOS_SUPPORT +#if PPP_PTY_TEST + ppp_sio = sio_open(2); +#else + ppp_sio = sio_open(0); +#endif + if(!ppp_sio) + { + perror("PPPOS example: Error opening device"); + return; + } + + ppp = pppos_create(&pppos_netif, ppp_output_cb, ppp_link_status_cb, NULL); + if (!ppp) + { + printf("PPPOS example: Could not create PPP control interface"); + return; + } + +#ifdef LWIP_PPP_CHAP_TEST + ppp_set_auth(ppp, PPPAUTHTYPE_CHAP, "lwip", "mysecret"); +#endif + + ppp_connect(ppp, 0); + +#if LWIP_NETIF_STATUS_CALLBACK + netif_set_status_callback(&pppos_netif, netif_status_callback); +#endif /* LWIP_NETIF_STATUS_CALLBACK */ + + sys_thread_new("pppos_rx_thread", pppos_rx_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); +#endif /* PPPOS_SUPPORT */ +} |