libnet: added small library to get a hardware queue
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Fri, 11 Aug 2017 07:20:37 +0000 (09:20 +0200)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Fri, 11 Aug 2017 07:20:37 +0000 (09:20 +0200)
Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

include/net/net_queue.h [new file with mode: 0644]
lib/net/Hakefile
lib/net/net_queue.c [new file with mode: 0644]

diff --git a/include/net/net_queue.h b/include/net/net_queue.h
new file mode 100644 (file)
index 0000000..49ac9f4
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+ * @brief
+ *  net_queue.h
+ */
+
+/*
+ * Copyright (c) 2017, ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+
+#ifndef LIB_NETQUEUE_INCLUDE_NETWORKING_H_
+#define LIB_NETQUEUE_INCLUDE_NETWORKING_H_
+
+#include <errors/errno.h>
+
+#define NETIF_TXFLAG (1UL << 31)
+#define NETIF_TXFLAG_LAST (1UL << 30)
+#define NETIF_TXFLAG_FIRST (1UL << 29)
+
+
+#define NETIF_RXFLAG (1UL << 28)
+
+struct devq;
+
+typedef void (*inthandler_t)(void*);
+
+/**
+ * @brief creates a queue to the given card
+ *
+ * @param interrupt interrupt handler 
+ * @param cardname  network card to create the queue for
+ * @param queueid   queueid of the network card
+ * @param poll      Is the queue polled or are interrupts used
+ * @param retqueue  returns the pointer to the queue
+ *
+ * @return SYS_ERR_OK on success, errval on failure
+ */
+errval_t net_queue_create(inthandler_t interrupt, const char *cardname,
+                          uint64_t* queueid, bool poll, struct devq **retqueue);
+
+#endif /* LIB_NETQUEUE_INCLUDE_NETWORKING_H_ */
index b5c62a5..0aa276e 100644 (file)
@@ -13,7 +13,7 @@
 [ build library {
     target       = "net",
     cFiles       = [ "net.c", "netbufs.c",  "netif.c", "pbuf.c", "dhcp.c",
-                     "net_filter.c", "arp.c" ],
+                     "net_filter.c", "arp.c", "net_queue.c"],
     flounderBindings = [ "net_filter"],
     flounderDefs = [ "net_filter", "octopus" ],
     flounderExtraDefs = [ ("net_filter",["rpcclient"]) ],
diff --git a/lib/net/net_queue.c b/lib/net/net_queue.c
new file mode 100644 (file)
index 0000000..38e77e4
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2017, ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#include <barrelfish/barrelfish.h>
+#include <net/net_queue.h>
+#include "networking_internal.h"
+
+// cardname - "e1000:vendor:deviceid:bus:device:function"
+static errval_t create_e1000_queue(char* cardname, inthandler_t interrupt, uint64_t *queueid,
+                                   bool poll, struct devq **retqueue)
+{
+    if (cardname[5] != ':') {
+        return SYS_ERR_OK;
+    }
+    uint32_t vendor, deviceid, bus, device, function;
+    unsigned parsed = sscanf(cardname + 6, "%x:%x:%x:%x:%x", &vendor,
+                             &deviceid, &bus, &device, &function);
+    if (parsed != 5) {
+        return SYS_ERR_OK;
+    }
+
+    return e1000_queue_create((struct e1000_queue**)retqueue, vendor, deviceid,
+                              bus, device, function, 1, interrupt);
+}
+
+static errval_t create_e10k_queue(char* cardname, inthandler_t interrupt, uint64_t *queueid,
+                                  bool poll, struct devq **retqueue)
+{
+    errval_t err;
+    err = e10k_queue_create((struct e10k_queue**)retqueue, interrupt,
+                            false /*virtual functions*/,
+                            poll, /* user interrupts*/
+                            false);
+    *queueid = e10k_queue_get_id((struct e10k_queue*)*retqueue);
+    return err;
+}
+
+static errval_t create_sfn5122f_queue(char* cardname, inthandler_t interrupt, uint64_t *queueid,
+                                      bool poll, struct devq **retqueue)
+{
+    errval_t err;
+    err = sfn5122f_queue_create((struct sfn5122f_queue**)retqueue, interrupt,
+                                false /*userlevel network feature*/,
+                                poll /* user interrupts*/,
+                                false);
+    *queueid = sfn5122f_queue_get_id((struct sfn5122f_queue*)*retqueue);
+    return err;
+}
+
+
+typedef errval_t (*queue_create_fn)(char*, inthandler_t, uint64_t*, bool, struct devq **);
+struct networking_card
+{
+    char *cardname;
+    queue_create_fn createfn;
+} networking_cards [] = {
+    { "e1000", create_e1000_queue},
+    { "e10k", create_e10k_queue},
+    { "sfn5122f", create_sfn5122f_queue},
+    { NULL, NULL}
+};
+
+
+/**
+ * @brief creates a queue to the given card and the queueid
+ *
+ * @param interrupt interrupt handler 
+ * @param cardname  network card to create the queue for
+ * @param queueid   queueid of the network card
+ * @param poll      Is the queue polled or are interrupts used
+ * @param retqueue  returns the pointer to the queue
+ *
+ * @return SYS_ERR_OK on success, errval on failure
+ */
+errval_t net_queue_create(inthandler_t interrupt, const char *cardname,
+                          uint64_t* queueid, bool poll, struct devq **retqueue)
+{
+    struct networking_card *nc = networking_cards;
+    while(nc->cardname != NULL) {
+        if (strncmp(cardname, nc->cardname, strlen(nc->cardname)) == 0) {
+            return nc->createfn(nc->cardname, interrupt, queueid, poll, retqueue);
+        }
+        nc++;
+    }
+
+    debug_printf("net: ERROR unknown queue. card='%s', queueid=%" PRIu64 "\n",
+                  cardname, *queueid);
+
+    return -1;
+}