This is an automated email from the ASF dual-hosted git repository. gnutt pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 8bce416c25f26c4c284121ceaab8b84dcc1393de Author: chao.an <[email protected]> AuthorDate: Thu May 14 16:24:21 2020 +0800 sim/tapdev: follow the tunnel MTU size Change-Id: Ia32255517650d95ea3a675ee9fe5b69e923fb51a Signed-off-by: chao.an <[email protected]> --- arch/sim/src/sim/up_internal.h | 1 + arch/sim/src/sim/up_netdriver.c | 37 +++++++++++++++++++++++++++++-------- arch/sim/src/sim/up_tapdev.c | 28 +++++++++++++++++++++++----- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/arch/sim/src/sim/up_internal.h b/arch/sim/src/sim/up_internal.h index 9c80960..7208e31 100644 --- a/arch/sim/src/sim/up_internal.h +++ b/arch/sim/src/sim/up_internal.h @@ -373,6 +373,7 @@ void vpnkit_ifdown(void); #ifdef CONFIG_SIM_NETDEV int netdriver_init(void); void netdriver_setmacaddr(unsigned char *macaddr); +void netdriver_setmtu(int mtu); void netdriver_loop(void); #endif diff --git a/arch/sim/src/sim/up_netdriver.c b/arch/sim/src/sim/up_netdriver.c index e5df8f6..ee8f0c3 100644 --- a/arch/sim/src/sim/up_netdriver.c +++ b/arch/sim/src/sim/up_netdriver.c @@ -48,6 +48,7 @@ #include <debug.h> #include <string.h> +#include <nuttx/kmalloc.h> #include <nuttx/wqueue.h> #include <nuttx/net/net.h> #include <nuttx/net/netdev.h> @@ -69,10 +70,6 @@ static struct work_s g_timer_work; static struct work_s g_avail_work; static struct work_s g_recv_work; -/* A single packet buffer is used */ - -static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE]; - /* Ethernet peripheral state */ static struct net_driver_s g_sim_dev; @@ -126,10 +123,12 @@ static void netdriver_recv_work(FAR void *arg) net_lock(); - /* netdev_read will return 0 on a timeout event and >0 on a data received event */ + /* netdev_read will return 0 on a timeout event and > 0 + * on a data received event + */ dev->d_len = netdev_read((FAR unsigned char *)dev->d_buf, - CONFIG_NET_ETH_PKTSIZE); + dev->d_pktsize); if (dev->d_len > 0) { NETDEV_RXPACKETS(dev); @@ -149,7 +148,9 @@ static void netdriver_recv_work(FAR void *arg) pkt_input(dev); #endif /* CONFIG_NET_PKT */ - /* We only accept IP packets of the configured type and ARP packets */ + /* We only accept IP packets of the configured type + * and ARP packets + */ #ifdef CONFIG_NET_IPv4 if (eth->type == HTONS(ETHTYPE_IP)) @@ -325,14 +326,29 @@ static int netdriver_txavail(FAR struct net_driver_s *dev) int netdriver_init(void) { FAR struct net_driver_s *dev = &g_sim_dev; + void *pktbuf; + int pktsize; /* Internal initialization */ netdev_init(); + /* Update the buffer size */ + + pktsize = dev->d_pktsize ? dev->d_pktsize : + (MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE); + + /* Allocate packet buffer */ + + pktbuf = kmm_malloc(pktsize); + if (pktbuf == NULL) + { + return -ENOMEM; + } + /* Set callbacks */ - dev->d_buf = g_pktbuf; /* Single packet buffer */ + dev->d_buf = pktbuf; dev->d_ifup = netdriver_ifup; dev->d_ifdown = netdriver_ifdown; dev->d_txavail = netdriver_txavail; @@ -347,6 +363,11 @@ void netdriver_setmacaddr(unsigned char *macaddr) memcpy(g_sim_dev.d_mac.ether.ether_addr_octet, macaddr, IFHWADDRLEN); } +void netdriver_setmtu(int mtu) +{ + g_sim_dev.d_pktsize = mtu; +} + void netdriver_loop(void) { if (work_available(&g_recv_work) && netdev_avail()) diff --git a/arch/sim/src/sim/up_tapdev.c b/arch/sim/src/sim/up_tapdev.c index 4ef2975..7b9e8e6 100644 --- a/arch/sim/src/sim/up_tapdev.c +++ b/arch/sim/src/sim/up_tapdev.c @@ -92,6 +92,7 @@ struct sel_arg_struct ****************************************************************************/ void netdriver_setmacaddr(unsigned char *macaddr); +void netdriver_setmtu(int mtu); /**************************************************************************** * Private Data @@ -219,15 +220,29 @@ void tapdev_init(void) ifr.ifr_ifindex = if_nametoindex(gdevname); ret = ioctl(sockfd, SIOCBRADDIF, &ifr); - close(sockfd); if (ret < 0) { printf("TAPDEV: ioctl failed (can't add interface %s to " "bridge %s): %d\r\n", gdevname, CONFIG_SIM_NET_BRIDGE_DEVICE, -ret); + close(sockfd); + close(tapdevfd); + return; + } + + ret = ioctl(sockfd, SIOCGIFMTU, &ifr); + close(sockfd); + if (ret < 0) + { + printf("TAPDEV: ioctl failed (can't get MTU " + "from %s): %d\r\n", gdevname, -ret); close(tapdevfd); return; - } + } + else + { + netdriver_setmtu(ifr.ifr_mtu); + } #endif gtapdevfd = tapdevfd; @@ -341,7 +356,8 @@ void tapdev_ifup(in_addr_t ifaddr) ret = ioctl(sockfd, SIOCGIFFLAGS, (unsigned long)&ifr); if (ret < 0) { - printf("TAPDEV: ioctl failed (can't get interface flags): %d\r\n", -ret); + printf("TAPDEV: ioctl failed " + "(can't get interface flags): %d\r\n", -ret); close(sockfd); return; } @@ -350,7 +366,8 @@ void tapdev_ifup(in_addr_t ifaddr) ret = ioctl(sockfd, SIOCSIFFLAGS, (unsigned long)&ifr); if (ret < 0) { - printf("TAPDEV: ioctl failed (can't set interface flags): %d\r\n", -ret); + printf("TAPDEV: ioctl failed " + "(can't set interface flags): %d\r\n", -ret); close(sockfd); return; } @@ -405,7 +422,8 @@ void tapdev_ifdown(void) ret = ioctl(sockfd, SIOCDELRT, (unsigned long)&ghostroute); if (ret < 0) { - printf("TAPDEV: ioctl failed (can't delete host route): %d\r\n", -ret); + printf("TAPDEV: ioctl failed " + "(can't delete host route): %d\r\n", -ret); } close(sockfd);
