fixed the exception of close socket and added dhcp and dns demo

This commit is contained in:
wlyu 2022-01-06 20:37:34 +08:00
parent a0337a42e3
commit acd53026b0
11 changed files with 185 additions and 81 deletions

View File

@ -119,10 +119,9 @@ void lwip_getip_thread(int argc, char *argv[])
lw_pr_info(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_gwaddr)[0], ((u8_t *)&lwip_gwaddr)[1], lw_pr_info(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_gwaddr)[0], ((u8_t *)&lwip_gwaddr)[1],
((u8_t *)&lwip_gwaddr)[2], ((u8_t *)&lwip_gwaddr)[3]); ((u8_t *)&lwip_gwaddr)[2], ((u8_t *)&lwip_gwaddr)[3]);
lw_pr_info("************************************************\r\n"); lw_pr_info("************************************************\r\n");
} }
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0),
getip, lwip_getip_thread, GetIp [IP] [Netmask] [Gateway]); showip, lwip_getip_thread, GetIp [IP] [Netmask] [Gateway]);
#endif #endif

View File

@ -34,36 +34,6 @@
/******************************************************************************* /*******************************************************************************
* Definitions * Definitions
******************************************************************************/ ******************************************************************************/
/* IP address configuration. */
#define configIP_ADDR0 192
#define configIP_ADDR1 168
#define configIP_ADDR2 0
#define configIP_ADDR3 102
/* Netmask configuration. */
#define configNET_MASK0 255
#define configNET_MASK1 255
#define configNET_MASK2 255
#define configNET_MASK3 0
/* Gateway address configuration. */
#define configGW_ADDR0 192
#define configGW_ADDR1 168
#define configGW_ADDR2 0
#define configGW_ADDR3 100
/* MAC address configuration. */
#define configMAC_ADDR \
{ \
0x02, 0x12, 0x13, 0x10, 0x15, 0x11 \
}
/* Address of PHY interface. */
#define EXAMPLE_PHY_ADDRESS BOARD_ENET0_PHY_ADDRESS
/* System clock name. */
#define EXAMPLE_CLOCK_NAME kCLOCK_CoreSysClk
/******************************************************************************* /*******************************************************************************
* Prototypes * Prototypes
@ -155,31 +125,10 @@ int print_dhcp_state(struct netif *netif)
void lwip_dhcp_test(void) void lwip_dhcp_test(void)
{ {
static int flag = 0; static int flag = 0;
struct netif fsl_netif0;
ip4_addr_t fsl_netif0_ipaddr, fsl_netif0_netmask, fsl_netif0_gw;
ethernetif_config_t fsl_enet_config0 = {
.phyAddress = EXAMPLE_PHY_ADDRESS,
.clockName = EXAMPLE_CLOCK_NAME,
.macAddress = configMAC_ADDR,
};
char ip_addr[4] = {0, 0, 0, 0}; char ip_addr[4] = {0, 0, 0, 0};
ETH_BSP_Config(); ETH_BSP_Config();
// IP4_ADDR(&fsl_netif0_ipaddr, 0U, 0U, 0U, 0U);
// IP4_ADDR(&fsl_netif0_netmask, 0U, 0U, 0U, 0U);
// IP4_ADDR(&fsl_netif0_gw, 0U, 0U, 0U, 0U);
// if(flag == 0)
// {
// lwip_init();
// netif_add(&fsl_netif0, &fsl_netif0_ipaddr, &fsl_netif0_netmask, &fsl_netif0_gw, &fsl_enet_config0,
// ethernetif0_init, ethernet_input);
// netif_set_default(&fsl_netif0);
// flag = 1;
// }
// netif_set_up(&fsl_netif0);
lwip_config_net(ip_addr, ip_addr, ip_addr); lwip_config_net(ip_addr, ip_addr, ip_addr);
is_lwip_test = 1; is_lwip_test = 1;
@ -200,6 +149,15 @@ void lwip_dhcp_test(void)
/* Print DHCP progress */ /* Print DHCP progress */
if(print_dhcp_state(&gnetif)) if(print_dhcp_state(&gnetif))
{ {
sscanf(ipaddr_ntoa(&gnetif.ip_addr), "%d.%d.%d.%d", &lwip_ipaddr[0], &lwip_ipaddr[1],
&lwip_ipaddr[2], &lwip_ipaddr[3]);
sscanf(ipaddr_ntoa(&gnetif.netmask), "%d.%d.%d.%d", &lwip_netmask[0], &lwip_netmask[1],
&lwip_netmask[2], &lwip_netmask[3]);
sscanf(ipaddr_ntoa(&gnetif.gw), "%d.%d.%d.%d", &lwip_gwaddr[0], &lwip_gwaddr[1],
&lwip_gwaddr[2], &lwip_gwaddr[3]);
break; break;
} }
} }
@ -209,6 +167,6 @@ void lwip_dhcp_test(void)
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0),
DHCPTest, lwip_dhcp_test, DHCP_Test); getip, lwip_dhcp_test, DHCP_Test);
#endif #endif

View File

@ -107,4 +107,18 @@ void lwip_ping_thread(int argc, char *argv[])
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3),
ping, lwip_ping_thread, ping [IP] 3 times); ping, lwip_ping_thread, ping [IP] 3 times);
int lwip_dns_test(int argc, char **argv)
{
if (argc <= 1)
{
lw_pr_info("Please input: ping <host address>\n");
return 0;
}
get_url_ip(argv[1]);
return 0;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(2),
dns, lwip_dns_test, dns [url]);
#endif #endif

View File

@ -86,10 +86,9 @@ static void lwip_tcp_send_thread(void *arg)
MdelayKTask(1000); MdelayKTask(1000);
} }
return;
__exit: __exit:
if (sock_tcp_send_once >= 0) closesocket(sock_tcp_send_once); if (sock_tcp_send_once >= 0)
closesocket(sock_tcp_send_once);
return; return;
} }

View File

@ -38,6 +38,7 @@
* *
*/ */
#include <xs_ktask.h>
#include "lwip/opt.h" #include "lwip/opt.h"
#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ #if LWIP_RAW /* don't build if not configured for use in lwipopts.h */
@ -52,6 +53,8 @@
#include "lwip/timeouts.h" #include "lwip/timeouts.h"
#include "lwip/inet_chksum.h" #include "lwip/inet_chksum.h"
#include "lwip/prot/ip4.h" #include "lwip/prot/ip4.h"
#include "lwip/netdb.h"
#include "lwip/prot/ip.h"
#if PING_USE_SOCKETS #if PING_USE_SOCKETS
#include "lwip/sockets.h" #include "lwip/sockets.h"
@ -245,7 +248,7 @@ ping_thread(void *arg)
{ {
int s; int s;
int ret; int ret;
int cnt = 5; int cnt = TEST_LWIP_TIMES;
#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD #if LWIP_SO_SNDRCVTIMEO_NONSTANDARD
int timeout = PING_RCV_TIMEO; int timeout = PING_RCV_TIMEO;
@ -295,6 +298,7 @@ ping_thread(void *arg)
} }
sys_msleep(PING_DELAY); sys_msleep(PING_DELAY);
} }
lwip_close(s);
} }
#else /* PING_USE_SOCKETS */ #else /* PING_USE_SOCKETS */
@ -415,4 +419,126 @@ ping_init(const ip_addr_t* ping_addr)
#endif /* PING_USE_SOCKETS */ #endif /* PING_USE_SOCKETS */
} }
int lwip_ping_send(int s, ip_addr_t *addr, int size)
{
int err;
struct icmp_echo_hdr *iecho;
struct sockaddr_in to;
int ping_size = sizeof(struct icmp_echo_hdr) + size;
LWIP_ASSERT("ping_size is too big", ping_size <= 0xffff);
iecho = malloc(ping_size);
if (iecho == NULL)
{
return ERR_MEM;
}
ping_prepare_echo(iecho, (u16_t) ping_size);
to.sin_len = sizeof(to);
to.sin_family = AF_INET;
#if LWIP_IPV4 && LWIP_IPV6
to.sin_addr.s_addr = addr->u_addr.ip4.addr;
#elif LWIP_IPV4
to.sin_addr.s_addr = addr->addr;
#elif LWIP_IPV6
#error Not supported IPv6.
#endif
err = lwip_sendto(s, iecho, ping_size, 0, (struct sockaddr*) &to, sizeof(to));
free(iecho);
return (err == ping_size ? ERR_OK : ERR_VAL);
}
int lwip_ping_recv(int s, int *ttl)
{
char buf[64];
int fromlen = sizeof(struct sockaddr_in), len;
struct sockaddr_in from;
struct ip_hdr *iphdr;
struct icmp_echo_hdr *iecho;
while ((len = lwip_recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr*) &from, (socklen_t*) &fromlen)) > 0)
{
if (len >= (int)(sizeof(struct ip_hdr) + sizeof(struct icmp_echo_hdr)))
{
iphdr = (struct ip_hdr *) buf;
iecho = (struct icmp_echo_hdr *) (buf + (IPH_HL(iphdr) * 4));
if ((iecho->id == PING_ID) && (iecho->seqno == htons(ping_seq_num)))
{
*ttl = iphdr->_ttl;
return len;
}
}
}
return len;
}
int get_url_ip(char* url)
{
#if LWIP_VERSION_MAJOR >= 2U
struct timeval timeout = { PING_RCV_TIMEO / TICK_PER_SECOND, PING_RCV_TIMEO % TICK_PER_SECOND };
#else
int timeout = PING_RCV_TIMEO * 1000UL / TICK_PER_SECOND;
#endif
int cnt = TEST_LWIP_TIMES;
int s, ttl, recv_len;
ip_addr_t target_addr;
struct addrinfo hint, *res = NULL;
struct sockaddr_in *h = NULL;
struct in_addr ina;
memset(&hint, 0, sizeof(hint));
/* convert URL to IP */
if (lwip_getaddrinfo(url, NULL, &hint, &res) != 0)
{
lw_pr_info("ping: unknown host %s\n", url);
return -1;
}
memcpy(&h, &res->ai_addr, sizeof(struct sockaddr_in *));
memcpy(&ina, &h->sin_addr, sizeof(ina));
lwip_freeaddrinfo(res);
if (inet_aton(inet_ntoa(ina), &target_addr) == 0)
{
lw_pr_info("ping: unknown host %s\n", url);
return -2;
}
/* new a socket */
if ((s = lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP)) < 0)
{
lw_pr_info("ping: create socket failed\n");
return -3;
}
lwip_setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
while (cnt --)
{
if (ping_send(s, &target_addr) == ERR_OK)
{
#ifdef LWIP_DEBUG
ping_time = sys_now();
#endif /* LWIP_DEBUG */
if ((recv_len = lwip_ping_recv(s, &ttl)) >= 0)
{
lw_pr_info("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", recv_len, inet_ntoa(ina), cnt,
ttl, sys_now() - ping_time);
}
else
{
lw_pr_info("From %s icmp_seq=%d timeout\n", inet_ntoa(ina), cnt);
}
}
sys_msleep(PING_DELAY);
}
lwip_close(s);
return 0;
}
#endif /* LWIP_RAW */ #endif /* LWIP_RAW */

View File

@ -7,7 +7,7 @@
* PING_USE_SOCKETS: Set to 1 to use sockets, otherwise the raw api is used * PING_USE_SOCKETS: Set to 1 to use sockets, otherwise the raw api is used
*/ */
#ifndef PING_USE_SOCKETS #ifndef PING_USE_SOCKETS
#define PING_USE_SOCKETS 0 //LWIP_SOCKET #define PING_USE_SOCKETS LWIP_SOCKET
#endif #endif
void ping_init(const ip_addr_t* ping_addr); void ping_init(const ip_addr_t* ping_addr);
@ -16,4 +16,6 @@ void ping_init(const ip_addr_t* ping_addr);
void ping_send_now(void); void ping_send_now(void);
#endif /* !PING_USE_SOCKETS */ #endif /* !PING_USE_SOCKETS */
int get_url_ip(char* url);
#endif /* LWIP_PING_H */ #endif /* LWIP_PING_H */

View File

@ -176,10 +176,12 @@ static void UdpEchoThreadClient(void *arg)
MdelayKTask(1000); MdelayKTask(1000);
} }
return;
__exit: __exit:
if (sock_udp_send_once >= 0) closesocket(sock_udp_send_once); if (sock_udp_send_once >= 0)
{
closesocket(sock_udp_send_once);
}
return; return;
} }

View File

@ -246,7 +246,7 @@ netconn_delete(struct netconn *conn)
} else } else
#endif /* LWIP_NETCONN_FULLDUPLEX */ #endif /* LWIP_NETCONN_FULLDUPLEX */
{ {
err = netconn_prepare_delete(conn); // err = netconn_prepare_delete(conn);
} }
if (err == ERR_OK) { if (err == ERR_OK) {
netconn_free(conn); netconn_free(conn);

View File

@ -601,8 +601,14 @@ tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg)
void void
tcpip_init(tcpip_init_done_fn initfunc, void *arg) tcpip_init(tcpip_init_done_fn initfunc, void *arg)
{ {
static int tcpip_flag = 0;
lwip_init(); lwip_init();
if(tcpip_flag)
return;
tcpip_flag = 1;
tcpip_init_done = initfunc; tcpip_init_done = initfunc;
tcpip_init_done_arg = arg; tcpip_init_done_arg = arg;
if (sys_mbox_new(&tcpip_mbox, TCPIP_MBOX_SIZE) != ERR_OK) { if (sys_mbox_new(&tcpip_mbox, TCPIP_MBOX_SIZE) != ERR_OK) {

View File

@ -93,6 +93,8 @@ int is_lwip_test = 0; //for lwip input thread
x_ticks_t lwip_sys_now; x_ticks_t lwip_sys_now;
static int lwip_init_flag = 0;
struct sys_timeouts { struct sys_timeouts {
struct sys_timeo *next; struct sys_timeo *next;
}; };
@ -318,7 +320,7 @@ void sys_mbox_free(sys_mbox_t *mbox)
int sys_mbox_valid(sys_mbox_t *mbox) int sys_mbox_valid(sys_mbox_t *mbox)
{ {
if (*mbox < SYS_MBOX_NULL) if (*mbox <= SYS_MBOX_NULL)
return 0; return 0;
else else
return 1; return 1;
@ -471,10 +473,6 @@ void lwip_config_input(struct netif *net)
{ {
pthread_t th_id = 0; pthread_t th_id = 0;
//neglect create input thread for test
if(is_lwip_test)
return;
th_id = sys_thread_new("eth_input", lwip_input_thread, net, 4096, 15); th_id = sys_thread_new("eth_input", lwip_input_thread, net, 4096, 15);
if (th_id >= 0) { if (th_id >= 0) {
@ -484,8 +482,6 @@ void lwip_config_input(struct netif *net)
} }
} }
static int lwip_init_flag = 0;
void lwip_config_net(char *ip, char *mask, char *gw) void lwip_config_net(char *ip, char *mask, char *gw)
{ {
#if defined(FSL_FEATURE_SOC_LPC_ENET_COUNT) && (FSL_FEATURE_SOC_LPC_ENET_COUNT > 0) #if defined(FSL_FEATURE_SOC_LPC_ENET_COUNT) && (FSL_FEATURE_SOC_LPC_ENET_COUNT > 0)
@ -521,17 +517,19 @@ void lwip_config_net(char *ip, char *mask, char *gw)
netif_set_default(&gnetif); netif_set_default(&gnetif);
netif_set_up(&gnetif); netif_set_up(&gnetif);
lw_pr_info("\r\n************************************************\r\n"); if(is_lwip_test)
lw_pr_info(" Network Configuration\r\n"); {
lw_pr_info("************************************************\r\n"); lw_pr_info("\r\n************************************************\r\n");
lw_pr_info(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1], lw_pr_info(" Network Configuration\r\n");
((u8_t *)&net_ipaddr)[2], ((u8_t *)&net_ipaddr)[3]); lw_pr_info("************************************************\r\n");
lw_pr_info(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1], lw_pr_info(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1],
((u8_t *)&net_netmask)[2], ((u8_t *)&net_netmask)[3]); ((u8_t *)&net_ipaddr)[2], ((u8_t *)&net_ipaddr)[3]);
lw_pr_info(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1], lw_pr_info(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1],
((u8_t *)&net_gw)[2], ((u8_t *)&net_gw)[3]); ((u8_t *)&net_netmask)[2], ((u8_t *)&net_netmask)[3]);
lw_pr_info("************************************************\r\n"); lw_pr_info(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1],
((u8_t *)&net_gw)[2], ((u8_t *)&net_gw)[3]);
lw_pr_info("************************************************\r\n");
}
lwip_config_input(&gnetif); lwip_config_input(&gnetif);
} }

View File

@ -92,7 +92,7 @@
#define GW_ADDR3 5 #define GW_ADDR3 5
/* USER CODE END 0 */ /* USER CODE END 0 */
#define SYS_MBOX_NULL 0 #define SYS_MBOX_NULL -1
#define SYS_SEM_NULL 0 #define SYS_SEM_NULL 0
#define SYS_MRTEX_NULL SYS_SEM_NULL #define SYS_MRTEX_NULL SYS_SEM_NULL