[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [UNIKRAFT/LIBLWIP PATCH 4/5] Attach uknetdev netifs during boot



Hello Simon,

This patch seems fine.

Reviewed-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>

Thanks & Regards
Sharan

On 2/8/19 12:00 AM, Simon Kuenzer wrote:
Scan for uknetdev devices and attach them automatically to the lwIP
stack during initialization. If DHCP support is enabled, the stack
will query for an address on the interfaces.

Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
---
  Config.uk |  7 +++++
  init.c    | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2 files changed, 95 insertions(+)

diff --git a/Config.uk b/Config.uk
index 23813de..acfe3ef 100644
--- a/Config.uk
+++ b/Config.uk
@@ -24,6 +24,13 @@ config LWIP_UKNETDEV
                interfaces have to be polled manually (uknetdev_poll()).
  endmenu
+config LWIP_AUTOIFACE
+       bool "Automatically attach netifs"
+       default y
+       help
+               Automatically attach found network devices to the stack
+               during initialization.
+
  choice
        prompt "Operation mode"
        default LWIP_THREADS
diff --git a/init.c b/init.c
index ece363d..65d56b6 100644
--- a/init.c
+++ b/init.c
@@ -43,6 +43,7 @@
  #else /* CONFIG_LWIP_NOTHREADS */
  #include <uk/semaphore.h>
  #endif /* CONFIG_LWIP_NOTHREADS */
+#include "netif/uknetdev.h"
void sys_init(void)
  {
@@ -68,6 +69,22 @@ static void _lwip_init_done(void *arg __unused)
   */
  int liblwip_init(void)
  {
+#if CONFIG_LWIP_UKNETDEV && CONFIG_LWIP_AUTOIFACE
+       unsigned int devid;
+       struct uk_netdev *dev;
+       struct netif *nf;
+       const char  __maybe_unused *strcfg;
+       uint16_t  __maybe_unused int16cfg;
+       int is_first_nf;
+#if LWIP_IPV4
+       ip4_addr_t __maybe_unused ip4;
+       ip4_addr_t *ip4_arg;
+       ip4_addr_t __maybe_unused mask4;
+       ip4_addr_t *mask4_arg;
+       ip4_addr_t __maybe_unused gw4;
+       ip4_addr_t *gw4_arg;
+#endif /* LWIP_IPV4 */
+#endif /* CONFIG_LWIP_UKNETDEV && CONFIG_LWIP_AUTOIFACE */
#if !CONFIG_LWIP_NOTHREADS
        uk_semaphore_init(&_lwip_init_sem, 0);
@@ -82,5 +99,76 @@ int liblwip_init(void)
        uk_semaphore_down(&_lwip_init_sem);
  #endif /* CONFIG_LWIP_NOTHREADS */
+#if CONFIG_LWIP_UKNETDEV && CONFIG_LWIP_AUTOIFACE
+       is_first_nf = 1;
+
+       for (devid = 0; devid < uk_netdev_count(); ++devid) {
+               dev = uk_netdev_get(devid);
+               if (!dev)
+                       continue;
+               if (uk_netdev_state_get(dev) != UK_NETDEV_UNCONFIGURED) {
+                       uk_pr_info("Skipping to add network device %u to lwIP: Not 
in unconfigured state\n",
+                                   devid);
+                       continue;
+               }
+
+               uk_pr_info("Attach network device %u to lwIP...\n",
+                          devid);
+
+#if LWIP_IPV4
+               ip4_arg   = NULL;
+               mask4_arg = NULL;
+               gw4_arg   = NULL;
+
+               /*
+                * TODO: Try to get device configuration from
+                * netdev's econf interface:
+                *
+                * UK_NETDEV_IPV4_ADDR_NINT16;
+                * UK_NETDEV_IPV4_ADDR_STR;
+                * UK_NETDEV_IPV4_MASK_NINT16;
+                * UK_NETDEV_IPV4_MASK_STR;
+                * UK_NETDEV_IPV4_GW_NINT16;
+                * UK_NETDEV_IPV4_GW_STR;
+                *
+                * When successfully done, set
+                *  ip_arg = &ip;
+                *  mask_arg = &mask;
+                *  gw_arg = &gw;
+                */
+
+               nf = uknetdev_addif(dev, ip4_arg, mask4_arg, gw4_arg);
+#else /* LWIP_IPV4 */
+               /*
+                * TODO: Add support for IPv6 device configuration from
+                * netdev's econf interface
+                */
+
+               nf = uknetdev_addif(dev);
+#endif /* LWIP_IPV4 */
+               if (!nf) {
+                       uk_pr_err("Failed to attach network device %u to 
lwIP\n",
+                                 devid);
+                       continue;
+               }
+
+               /* Declare the first network device as default interface */
+               if (is_first_nf) {
+                       uk_pr_info("%c%c%u: Set as default interface\n",
+                                  nf->name[0], nf->name[1], nf->num);
+                       netif_set_default(nf);
+                       is_first_nf = 0;
+               }
+               netif_set_up(nf);
+
+#if LWIP_IPV4 && LWIP_DHCP
+               if (!ip4_arg) {
+                       uk_pr_info("%c%c%u: DHCP configuration 
(background)...\n",
+                                  nf->name[0], nf->name[1], nf->num);
+                       dhcp_start(nf);
+               }
+#endif /* LWIP_IPV4 && LWIP_DHCP */
+       }
+#endif /* CONFIG_LWIP_UKNETDEV && CONFIG_LWIP_AUTOIFACE */
        return 0;
  }


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.