]> xenbits.xensource.com Git - mini-os.git/commitdiff
mini-os: netfront: Read netmask and gateway from Xenstore
authorCostin Lupu <costin.lupu@cs.pub.ro>
Wed, 19 Aug 2020 12:49:00 +0000 (15:49 +0300)
committerWei Liu <wl@xen.org>
Thu, 27 Aug 2020 13:39:00 +0000 (13:39 +0000)
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@cs.pub.ro>
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
include/netfront.h
lwip-net.c
netfront.c

index 1164d507a979ca674bbb8536630181b9f5597a45..bc3080ef73584323df094b1718f2df2f3a9a7bb0 100644 (file)
@@ -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);
index 449b70fda79c6e02baacc82dca17967e8e04a438..80d1c8f6892bcbe23340dd16d1b589b999e92d03 100644 (file)
@@ -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));
index 66f2bbc44184c32ffdf26038edd6ef7c63307126..58eb55e4cc40262c84f437fae9dc69347d342a7e 100644 (file)
@@ -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)