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);

Reply via email to