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

[PATCH] mini-os: netfront: Read netmask and gateway from Xenstore



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.

The patch also makes the 'gw' variable global in order to be used by other
source files when communication with the gateway is needed.

Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
---
 include/netfront.h |  5 ++++-
 lwip-net.c         | 35 ++++++++++++++++++++++++-----------
 netfront.c         | 34 +++++++++++++++++++++++++++++-----
 3 files changed, 57 insertions(+), 17 deletions(-)

diff --git a/include/netfront.h b/include/netfront.h
index 1164d50..df1a9a7 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);
@@ -27,4 +27,7 @@ void start_networking(void);
 void stop_networking(void);
 
 void networking_set_addr(struct ip_addr *ipaddr, struct ip_addr *netmask, 
struct ip_addr *gw);
+
+/* Gateway address */
+extern struct ip_addr gw;
 #endif
diff --git a/lwip-net.c b/lwip-net.c
index 449b70f..0c49d96 100644
--- a/lwip-net.c
+++ b/lwip-net.c
@@ -331,6 +331,8 @@ static void tcpip_bringup_finished(void *p)
   up(&tcpip_is_up);
 }
 
+struct ip_addr gw;
+
 /* 
  * Utility function to bring the whole lot up.  Call this from app_main() 
  * or similar -- it starts netfront and have lwIP start its thread,
@@ -342,23 +344,34 @@ void start_networking(void)
   struct netif *netif;
   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




 


Rackspace

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