T125: network starup workaroud
authorReto Achermann <reto.achermann@inf.ethz.ch>
Fri, 19 Jun 2015 07:33:42 +0000 (09:33 +0200)
committerReto Achermann <reto.achermann@inf.ethz.ch>
Fri, 19 Jun 2015 10:09:30 +0000 (12:09 +0200)
Machines having more than one e1000 network card in it sometimes
use the wrong card to initialize the network infrastructure.

Adding an argument to kaluga eth0={PCIADDRESS} to tell Kaluga
which device to take to initialize the network.
the address has format: PCIADDRESS=bus:dev:fun

closes T125

Signed-off-by: Reto Achermann <reto.achermann@inf.ethz.ch>

usr/kaluga/driver_startup.c
usr/kaluga/kaluga.h
usr/kaluga/main.c

index e3c0eb7..ee884e1 100644 (file)
@@ -8,6 +8,10 @@
 #include <if/monitor_blocking_rpcclient_defs.h>
 #endif
 
+#ifdef __x86__
+#include <pci/pci.h>
+#endif
+
 #include "kaluga.h"
 
 #ifdef __x86__
@@ -80,6 +84,23 @@ errval_t start_networking(coreid_t core,
     assert(driver != NULL);
     errval_t err = SYS_ERR_OK;
 
+    uint64_t vendor_id, device_id, bus, dev, fun;
+
+    /* check if we are using the supplied pci address of eth0 */
+    if (eth0.bus != 0xff || eth0.device != 0xff || eth0.function != 0xff) {
+        err = oct_read(record, "_ { bus: %d, device: %d, function: %d, vendor: %d, device_id: %d }",
+                            &bus, &dev, &fun, &vendor_id, &device_id);
+        assert(err_is_ok(err));
+
+        if ((eth0.bus != (uint8_t)bus)
+             | (eth0.device != (uint8_t)dev)
+             | (eth0.function != (uint8_t)fun)) {
+            KALUGA_DEBUG("start_networking: skipping card %" PRIu64 ":% "PRIu64 ":% "
+                         PRIu64"\n", bus, dev, fun);
+            return KALUGA_ERR_DRIVER_NOT_AUTO;
+        }
+    }
+
     if (is_started(driver)) {
         return KALUGA_ERR_DRIVER_ALREADY_STARTED;
     }
@@ -99,9 +120,8 @@ errval_t start_networking(coreid_t core,
         KALUGA_DEBUG("NGD_mng not found or not declared as auto.");
         return KALUGA_ERR_DRIVER_NOT_AUTO;
     }
+
     err = default_start_function(core, driver, record);
-    //err = spawn_program(core, driver->path, driver->argv + 1, environ, 0,
-    //                    get_did_ptr(driver));
     if (err_is_fail(err)) {
         DEBUG_ERR(err, "Spawning %s failed.", driver->path);
         return err;
index c9403a8..f70ed4d 100644 (file)
@@ -11,6 +11,7 @@
 
 extern coreid_t my_core_id;
 extern uint32_t my_arch_id;
+extern struct pci_address eth0;
 extern char **environ;
 
 #include "boot_modules.h"
index 83fd7fd..860c7ad 100644 (file)
 #include <if/monitor_defs.h>
 
 #include <vfs/vfs.h>
+#include <pci/pci.h> // for pci_addr
 #include <octopus/octopus.h>
 #include <skb/skb.h>
 #include <thc/thc.h>
 
 #include <trace/trace.h>
 
-
 #include "kaluga.h"
 
+
 coreid_t my_core_id = 0;  // Core ID
 uint32_t my_arch_id = 0;  // APIC ID
+struct pci_address eth0 = {0xff, 0xff, 0xff};
 
 static void add_start_function_overrides(void)
 {
@@ -51,8 +53,18 @@ static void add_start_function_overrides(void)
 static void parse_arguments(int argc, char** argv)
 {
     for (int i = 1; i < argc; i++) {
-        if (strncmp(argv[i], "apicid=", sizeof("apicid")) == 0) {
-            my_arch_id = strtol(argv[i] + sizeof("apicid"), NULL, 10);
+        if (strncmp(argv[i], "apicid=", 7) == 0) {
+            my_arch_id = strtol(argv[i] + 7, NULL, 10);
+        } else if (strncmp(argv[i], "eth0=", 5) == 0) {
+            int parsed = sscanf(argv[i], "eth0=%" SCNu8 ":%" SCNu8 ":%" SCNu8,
+                                &eth0.bus, &eth0.device, &eth0.function);
+            printf("Kaluga using eth0=%u:%u:%u as network device\n", eth0.bus,
+                         eth0.device, eth0.function);
+            if (parsed != 3) {
+                eth0.bus = 0xff;
+                eth0.device = 0xff;
+                eth0.function = 0xff;
+            }
         } else if (strcmp(argv[i], "boot") == 0) {
             // ignored
         }