[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 |