#include /* Device drivers */ #include "fsl_sysmpu.h" /* FreeRTOS */ #include "FreeRTOS.h" #include "task.h" /* LwIP */ #include "lwip/apps/httpd.h" #include "lwip/apps/lwiperf.h" #include "lwip/apps/sntp.h" #include "lwip/dhcp.h" #include "lwip/dns.h" #include "lwip/init.h" #include "lwip/prot/dhcp.h" #include "lwip/tcpip.h" /* ENET */ #include "ethernetif.h" /* Debug Console */ #include "fsl_debug_console.h" #define NTP_POOL_ADDR "cn.pool.ntp.org" #define NETIF_HOSTNAME "k60_server" static char *s_netif_hostname = NETIF_HOSTNAME; static struct netif fsl_netif0; /* Report state => string */ static const char *report_type_str[] = { "TCP_DONE_SERVER", /* LWIPERF_TCP_DONE_SERVER,*/ "TCP_DONE_CLIENT", /* LWIPERF_TCP_DONE_CLIENT,*/ "TCP_ABORTED_LOCAL", /* LWIPERF_TCP_ABORTED_LOCAL, */ "TCP_ABORTED_LOCAL_DATAERROR", /* LWIPERF_TCP_ABORTED_LOCAL_DATAERROR, */ "TCP_ABORTED_LOCAL_TXERROR", /* LWIPERF_TCP_ABORTED_LOCAL_TXERROR, */ "TCP_ABORTED_REMOTE", /* LWIPERF_TCP_ABORTED_REMOTE, */ "UDP_STARTED", /* LWIPERF_UDP_STARTED, */ "UDP_DONE", /* LWIPERF_UDP_DONE, */ "UDP_ABORTED_LOCAL", /* LWIPERF_UDP_ABORTED_LOCAL, */ "UDP_ABORTED_REMOTE" /* LWIPERF_UDP_ABORTED_REMOTE */ }; /** Prototype of a report function that is called when a session is finished. This report function shows the test results. */ static void ip_stack_lwiperf_report(void *arg, enum lwiperf_report_type report_type, const ip_addr_t *local_addr, u16_t local_port, const ip_addr_t *remote_addr, u16_t remote_port, u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec) { printf("-------------------------------------------------\r\n"); if ((report_type < sizeof(report_type_str)) && local_addr && remote_addr) { printf(" %s \r\n", report_type_str[report_type]); printf(" Local address : %u.%u.%u.%u ", ((u8_t *)local_addr)[0], ((u8_t *)local_addr)[1], ((u8_t *)local_addr)[2], ((u8_t *)local_addr)[3]); printf(" Port %d \r\n", local_port); printf(" Remote address : %u.%u.%u.%u ", ((u8_t *)remote_addr)[0], ((u8_t *)remote_addr)[1], ((u8_t *)remote_addr)[2], ((u8_t *)remote_addr)[3]); printf(" Port %d \r\n", remote_port); printf(" Bytes Transferred %ld \r\n", bytes_transferred); printf(" Duration (ms) %ld \r\n", ms_duration); printf(" Bandwidth (kbitpsec) %ld \r\n", bandwidth_kbitpsec); } else { printf(" IPERF Report error\r\n"); } } static void ip_stack_sntp_address_found(const char *name, const ip_addr_t *ipaddr, void *callback_arg) { printf("Resolved IP: %s\r\n", ipaddr_ntoa(ipaddr)); sntp_setserver(0, ipaddr); sntp_init(); } static void ip_stack_enable_sntp(void) { /* We are not ESP32, we have to do the DNS resolution manually. */ ip_addr_t ntp_addr; sntp_setoperatingmode(SNTP_OPMODE_POLL); if (dns_gethostbyname(NTP_POOL_ADDR, &ntp_addr, ip_stack_sntp_address_found, NULL) == ERR_OK) { /* If ERR_OK is returned, the result is cached in DNS. */ sntp_setserver(0, &ntp_addr); sntp_init(); } else { printf("No cached DNS result found, wait for callback.\r\n"); } } void ip_stack_setup(void) { ip4_addr_t fsl_netif0_ipaddr, fsl_netif0_netmask, fsl_netif0_gw; tcpip_init(NULL, NULL); /* Initialize netif interface */ netif_add(&fsl_netif0, &fsl_netif0_ipaddr, &fsl_netif0_netmask, &fsl_netif0_gw, NULL, ethernetif_init, tcpip_input); netif_set_default(&fsl_netif0); netif_set_up(&fsl_netif0); netif_set_hostname(&fsl_netif0, s_netif_hostname); /* Start DHCP, this configures both DNS and IP addresses. */ dhcp_start(&fsl_netif0); /* Wait for a lease */ while (dhcp_supplied_address(&fsl_netif0) == 0) { vTaskDelay(pdMS_TO_TICKS(500)); } printf("IP Address: %s\r\n", ipaddr_ntoa(&fsl_netif0.ip_addr)); ip_stack_enable_sntp(); /* Start IPerf server */ lwiperf_start_tcp_server_default(ip_stack_lwiperf_report, NULL); httpd_init(); }