[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [UNIKRAFT PATCH v4 1/2] lib/uknetdev: Add ipaddr, netmask & gwaddr as arg
Hi Sharan, thanks a lot for this patch. As discuss off-list, we will do a minor change during upstreaming: the namespace for ipv4_* arguments should be netdev and not net. Otherwise fine to me. regards, Hugo Reviewed-by: Hugo Lefeuvre <hugo.lefeuvre@xxxxxxxxx> On Wed, 2020-07-22 at 15:27 +0200, Sharan Santhanam wrote: > The patch adds ip address, netmask and the gateway address as library > argument. The parameters are list of argument delimited by a space. > The library user can forward the argument using the following command > line: > net.ipv4_addr, net.ipv4_subnet_mask, net.ipv4_gw_addr > > Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx> > --- > lib/uknetdev/Config.uk | 1 + > lib/uknetdev/Makefile.uk | 1 + > lib/uknetdev/include/uk/netdev_core.h | 9 ++++ > lib/uknetdev/netdev.c | 75 > +++++++++++++++++++++++++++ > 4 files changed, 86 insertions(+) > > diff --git a/lib/uknetdev/Config.uk b/lib/uknetdev/Config.uk > index 618e8e67..186dd462 100644 > --- a/lib/uknetdev/Config.uk > +++ b/lib/uknetdev/Config.uk > @@ -4,6 +4,7 @@ menuconfig LIBUKNETDEV > select LIBNOLIBC if !HAVE_LIBC > select LIBUKDEBUG > select LIBUKALLOC > + imply LIBUKLIBPARAM > > if LIBUKNETDEV > config LIBUKNETDEV_MAXNBQUEUES > diff --git a/lib/uknetdev/Makefile.uk b/lib/uknetdev/Makefile.uk > index ca08b254..abdcd4bc 100644 > --- a/lib/uknetdev/Makefile.uk > +++ b/lib/uknetdev/Makefile.uk > @@ -1,4 +1,5 @@ > $(eval $(call addlib_s,libuknetdev,$(CONFIG_LIBUKNETDEV))) > +$(eval $(call addlib_paramprefix,libuknetdev,net)) net -> netdev > > CINCLUDES-$(CONFIG_LIBUKNETDEV) += > -I$(LIBUKNETDEV_BASE)/include > CXXINCLUDES-$(CONFIG_LIBUKNETDEV) += > -I$(LIBUKNETDEV_BASE)/include > diff --git a/lib/uknetdev/include/uk/netdev_core.h > b/lib/uknetdev/include/uk/netdev_core.h > index dba719fc..1fe5f2a5 100644 > --- a/lib/uknetdev/include/uk/netdev_core.h > +++ b/lib/uknetdev/include/uk/netdev_core.h > @@ -373,6 +373,12 @@ struct uk_netdev_data { > const char *drv_name; > }; > > +struct uk_netdev_einfo { > + const char *ipv4_addr; > + const char *ipv4_net_mask; > + const char *ipv4_gw_addr; > +}; > + > /** > * NETDEV > * A structure used to interact with a network device. > @@ -400,6 +406,9 @@ struct uk_netdev { > struct > uk_netdev_tx_queue *_tx_queue[CONFIG_LIBUKNETDEV_MAXNBQUEUES]; > > UK_TAILQ_ENTRY(struct uk_netdev) _list; > + > + /** Netdevice address configuration */ > + struct uk_netdev_einfo *_einfo; > }; > > #ifdef __cplusplus > diff --git a/lib/uknetdev/netdev.c b/lib/uknetdev/netdev.c > index 151e0897..096973a3 100644 > --- a/lib/uknetdev/netdev.c > +++ b/lib/uknetdev/netdev.c > @@ -38,10 +38,62 @@ > #include <string.h> > #include <uk/netdev.h> > #include <uk/print.h> > +#include <uk/libparam.h> > > struct uk_netdev_list uk_netdev_list = > UK_TAILQ_HEAD_INITIALIZER(uk_netdev_list); > static uint16_t netdev_count; > +/** > + * TODO: Define Network argument format when multiple driver device > need to > + * coexist. For example like: > + * Driver Name:IP Address:Net Mask > + */ > +static char *ipv4_addr; > +static char *ipv4_subnet_mask; > +static char *ipv4_gw_addr; > + > +UK_LIB_PARAM_STR(ipv4_addr); > +UK_LIB_PARAM_STR(ipv4_subnet_mask); > +UK_LIB_PARAM_STR(ipv4_gw_addr); > + > +static const char *_parse_ipv4_addr(void) > +{ > + /** Remember the reference to the ip address for successive > calls*/ > + static char *ip_addr; > + > + if (ip_addr) > + return strtok_r(NULL, " ", &ip_addr); > + else if (ipv4_addr) > + return strtok_r(ipv4_addr, " ", &ip_addr); > + > + return NULL; > +} > + > +static const char *_parse_ipv4_net_mask(void) > +{ > + /** Remember the reference to the netmask for successive > calls*/ > + static char *net_mask; > + > + if (net_mask) > + return strtok_r(NULL, " ", &net_mask); > + else if (ipv4_subnet_mask) > + return strtok_r(ipv4_subnet_mask, " ", &net_mask); > + > + return NULL; > +} > + > +static const char *_parse_ipv4_gw_addr(void) > +{ > + /** Remember the reference to the gateway address for > successive calls*/ > + static char *gw; > + > + if (gw) > + return strtok_r(NULL, " ", &gw); > + else if (ipv4_gw_addr) > + return strtok_r(ipv4_gw_addr, " ", &gw); > + > + return NULL; > +} > > static struct uk_netdev_data *_alloc_data(struct uk_alloc *a, > uint16_t netdev_id, > @@ -64,6 +116,25 @@ static struct uk_netdev_data *_alloc_data(struct > uk_alloc *a, > return data; > } > > +static struct uk_netdev_einfo *_alloc_einfo(struct uk_alloc *a) > +{ > + struct uk_netdev_einfo *_einfo = NULL; > + > + if (ipv4_addr || ipv4_subnet_mask || ipv4_gw_addr) { > + _einfo = uk_zalloc(a, sizeof(*_einfo)); > + if (!_einfo) { > + uk_pr_warn("Failed to allocate memory for > netdev config\n"); > + return NULL; > + } > + > + _einfo->ipv4_addr = _parse_ipv4_addr(); > + _einfo->ipv4_net_mask = _parse_ipv4_net_mask(); > + _einfo->ipv4_gw_addr = _parse_ipv4_gw_addr(); > + } > + > + return _einfo; > +} > + > int uk_netdev_drv_register(struct uk_netdev *dev, struct uk_alloc > *a, > const char *drv_name) > { > @@ -91,6 +162,10 @@ int uk_netdev_drv_register(struct uk_netdev *dev, > struct uk_alloc *a, > if (!dev->_data) > return -ENOMEM; > > + dev->_einfo = _alloc_einfo(a); > + if (!dev->_einfo) > + return -ENOMEM; > + > UK_TAILQ_INSERT_TAIL(&uk_netdev_list, dev, _list); > uk_pr_info("Registered netdev%"PRIu16": %p (%s)\n", > netdev_count, dev, drv_name);
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |