|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2] mini-os: netfront: Read netmask and gateway from Xenstore
Costin Lupu, le mer. 19 août 2020 15:49:00 +0300, a ecrit:
> When providing the IP address via the config file, one can also add the
> netmask and gateway address, e.g. "ip=192.168.0.2 255.255.255.0
> 192.168.0.1", which will be further published to Xenstore. This patch adds
> support for reading the netmask and gateway values.
>
> Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
> ---
> include/netfront.h | 2 +-
> lwip-net.c | 32 ++++++++++++++++++++++----------
> netfront.c | 34 +++++++++++++++++++++++++++++-----
> 3 files changed, 52 insertions(+), 16 deletions(-)
>
> diff --git a/include/netfront.h b/include/netfront.h
> index 1164d50..bc3080e 100644
> --- a/include/netfront.h
> +++ b/include/netfront.h
> @@ -7,7 +7,7 @@ struct netfront_dev *init_netfront(char *nodename,
> void (*netif_rx)(unsigned char *data,
> int len, void* arg),
> unsigned char rawmac[6],
> - char **ip);
> + char **ip, char **mask, char **gw);
> void netfront_xmit(struct netfront_dev *dev, unsigned char* data,int len);
> void shutdown_netfront(struct netfront_dev *dev);
> void suspend_netfront(void);
> diff --git a/lwip-net.c b/lwip-net.c
> index 449b70f..80d1c8f 100644
> --- a/lwip-net.c
> +++ b/lwip-net.c
> @@ -343,22 +343,34 @@ void start_networking(void)
> struct ip_addr ipaddr = { htonl(IF_IPADDR) };
> struct ip_addr netmask = { htonl(IF_NETMASK) };
> struct ip_addr gw = { 0 };
> - char *ip = NULL;
> + char *ip = NULL, *netmask_str = NULL, *gw_str = NULL;
>
> tprintk("Waiting for network.\n");
>
> - dev = init_netfront(NULL, NULL, rawmac, &ip);
> + dev = init_netfront(NULL, NULL, rawmac, &ip, &netmask_str, &gw_str);
>
> if (ip) {
> ipaddr.addr = inet_addr(ip);
> - if (IN_CLASSA(ntohl(ipaddr.addr)))
> - netmask.addr = htonl(IN_CLASSA_NET);
> - else if (IN_CLASSB(ntohl(ipaddr.addr)))
> - netmask.addr = htonl(IN_CLASSB_NET);
> - else if (IN_CLASSC(ntohl(ipaddr.addr)))
> - netmask.addr = htonl(IN_CLASSC_NET);
> - else
> - tprintk("Strange IP %s, leaving netmask to 0.\n", ip);
> + free(ip);
> +
> + if (netmask_str) {
> + netmask.addr = inet_addr(netmask_str);
> + free(netmask_str);
> + } else {
> + if (IN_CLASSA(ntohl(ipaddr.addr)))
> + netmask.addr = htonl(IN_CLASSA_NET);
> + else if (IN_CLASSB(ntohl(ipaddr.addr)))
> + netmask.addr = htonl(IN_CLASSB_NET);
> + else if (IN_CLASSC(ntohl(ipaddr.addr)))
> + netmask.addr = htonl(IN_CLASSC_NET);
> + else
> + tprintk("Strange IP %s, leaving netmask to 0.\n", ip);
> + }
> +
> + if (gw_str) {
> + gw.addr = inet_addr(gw_str);
> + free(gw_str);
> + }
> }
> tprintk("IP %x netmask %x gateway %x.\n",
> ntohl(ipaddr.addr), ntohl(netmask.addr), ntohl(gw.addr));
> diff --git a/netfront.c b/netfront.c
> index 66f2bbc..58eb55e 100644
> --- a/netfront.c
> +++ b/netfront.c
> @@ -71,6 +71,8 @@ struct netfront_dev_list {
> struct netfront_dev *dev;
> unsigned char rawmac[6];
> char *ip;
> + char *mask;
> + char *gw;
>
> int refcount;
>
> @@ -81,7 +83,7 @@ static struct netfront_dev_list *dev_list = NULL;
>
> void init_rx_buffers(struct netfront_dev *dev);
> static struct netfront_dev *_init_netfront(struct netfront_dev *dev,
> - unsigned char rawmac[6], char
> **ip);
> + unsigned char rawmac[6], char
> **ip, char **mask, char **gw);
> static void _shutdown_netfront(struct netfront_dev *dev);
> void netfront_set_rx_handler(struct netfront_dev *dev,
> void (*thenetif_rx)(unsigned char *data, int
> len,
> @@ -301,7 +303,7 @@ struct netfront_dev *init_netfront(char *_nodename,
> void (*thenetif_rx)(unsigned char* data,
> int len, void* arg),
> unsigned char rawmac[6],
> - char **ip)
> + char **ip, char **mask, char **gw)
> {
> char nodename[256];
> struct netfront_dev *dev;
> @@ -344,7 +346,7 @@ struct netfront_dev *init_netfront(char *_nodename,
> ldev = malloc(sizeof(struct netfront_dev_list));
> memset(ldev, 0, sizeof(struct netfront_dev_list));
>
> - if (_init_netfront(dev, ldev->rawmac, &(ldev->ip))) {
> + if (_init_netfront(dev, ldev->rawmac, &(ldev->ip), &(ldev->mask),
> &(ldev->gw))) {
> ldev->dev = dev;
> ldev->refcount = 1;
> ldev->next = NULL;
> @@ -374,6 +376,10 @@ out:
> }
> if (ip)
> *ip = strdup(ldev->ip);
> + if (mask)
> + *mask = strdup(ldev->mask);
> + if (gw)
> + *gw = strdup(ldev->gw);
>
> err:
> return dev;
> @@ -381,7 +387,7 @@ err:
>
> static struct netfront_dev *_init_netfront(struct netfront_dev *dev,
> unsigned char rawmac[6],
> - char **ip)
> + char **ip, char **mask, char **gw)
> {
> xenbus_transaction_t xbt;
> char* err = NULL;
> @@ -518,8 +524,26 @@ done:
> }
>
> if (ip) {
> + char *p;
> +
> snprintf(path, sizeof(path), "%s/ip", dev->backend);
> xenbus_read(XBT_NIL, path, ip);
> +
> + if (mask) {
> + p = strchr(*ip, ' ');
> + if (p) {
> + *p++ = '\0';
> + *mask = p;
> +
> + if (gw) {
> + p = strchr(p, ' ');
> + if (p) {
> + *p++ = '\0';
> + *gw = p;
> + }
> + }
> + }
> + }
> }
> }
>
> @@ -676,7 +700,7 @@ void resume_netfront(void)
> struct netfront_dev_list *list;
>
> for (list = dev_list; list != NULL; list = list->next)
> - _init_netfront(list->dev, NULL, NULL);
> + _init_netfront(list->dev, NULL, NULL, NULL, NULL);
> }
>
> void init_rx_buffers(struct netfront_dev *dev)
> --
> 2.20.1
>
--
Samuel
"2 + 2 = 5 pour d'assez grandes valeurs de 2"
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |