DeviceQueue: Loopback device functions implemented
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 22 Aug 2016 09:19:42 +0000 (11:19 +0200)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 22 Aug 2016 09:19:42 +0000 (11:19 +0200)
Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

include/devif/loopback_device.h [new file with mode: 0644]
lib/devif/Hakefile
lib/devif/loopback_device.c [new file with mode: 0644]
usr/tests/devif/Hakefile
usr/tests/devif/devif_dummy_device.c [deleted file]
usr/tests/devif/loopback_device.c [new file with mode: 0644]

diff --git a/include/devif/loopback_device.h b/include/devif/loopback_device.h
new file mode 100644 (file)
index 0000000..5a48ba2
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2016 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, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+#ifndef LOOPBACK_DEVICE_H_
+#define LOOPBACK_DEVICE_H_ 1
+
+
+#include <barrelfish/barrelfish.h>
+#include "queue_interface.h"
+
+// Loopback device functions
+errval_t devq_loopback_setup(uint64_t *features, uint32_t* default_qsize, 
+                             uint32_t* default_bufsize, bool* reconnect, 
+                             char* name);
+errval_t devq_loopback_destroy(struct devq *q);
+
+errval_t devq_loopback_create(struct devq *q, uint64_t flags);   
+errval_t devq_loopback_notify(struct devq *q, uint8_t num_slots);
+
+errval_t devq_loopback_register(struct devq *q, struct capref cap,
+                                regionid_t region_id);
+errval_t devq_loopback_deregister(struct devq *q, regionid_t region_id);
+
+errval_t devq_loopback_control(struct devq *q, uint64_t request,
+                               uint64_t value);
+
+#endif /* LOOPBACK_DEVICE_H_ */
index 9c9643c..b7de52f 100644 (file)
@@ -16,7 +16,7 @@
     build library { 
         target = "devif",
         cFiles = ["queue_interface.c", "region_pool.c", 
-                  "region.c", "desc_queue.c"],
+                  "region.c", "desc_queue.c", "loopback_device.c"],
         addCFlags = [ "-DLIBRARY" ],
         flounderBindings = [ "devif" ],
         flounderExtraBindings = [ ("devif", ["rpcclient"]) ],
diff --git a/lib/devif/loopback_device.c b/lib/devif/loopback_device.c
new file mode 100644 (file)
index 0000000..feb3f1c
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2016 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, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#include <barrelfish/barrelfish.h>
+#include <devif/queue_interface.h>
+#include <devif/loopback_device.h>
+
+// Loopback device functions
+errval_t devq_loopback_setup(uint64_t *features, uint32_t* default_qsize, 
+                             uint32_t* default_bufsize, bool* reconnect, 
+                             char* name)
+{
+    *features = 0;
+    *default_qsize = 0;
+    *default_bufsize = 0;
+    *reconnect = false;
+    name = "loopback";
+    return SYS_ERR_OK;
+}
+
+errval_t devq_loopback_destroy(struct devq *q)
+{
+    return SYS_ERR_OK;
+}
+
+errval_t devq_loopback_create(struct devq *q, uint64_t flags)
+{
+    return SYS_ERR_OK;
+}
+
+errval_t devq_loopback_notify(struct devq *q, uint8_t num_slots)
+{
+    errval_t err;
+    struct devq_buf buf;
+    for (int i = 0; i < num_slots; i++) {
+        err = devq_dequeue(q, &(buf.rid), &(buf.addr), 
+                           &(buf.len), &(buf.bid), &(buf.flags));
+        if (err_is_fail(err))  {
+            return err;
+        }   
+
+        err = devq_enqueue(q, buf.rid, buf.addr, buf.len,
+                           buf.flags, &buf.bid);
+        if (err_is_fail(err))  {
+            return err;
+        }   
+    }
+    
+    err = devq_notify(q);
+
+    return err;
+}
+
+errval_t devq_loopback_register(struct devq *q, struct capref cap,
+                                regionid_t region_id)
+{
+    return SYS_ERR_OK;
+}
+
+errval_t devq_loopback_deregister(struct devq *q, regionid_t region_id)
+{
+    return SYS_ERR_OK;
+}
+
+errval_t devq_loopback_control(struct devq *q, uint64_t request,
+                               uint64_t value)
+{
+    // TODO Might have some options for loopback device?
+    return SYS_ERR_OK;
+}
index c2ccd96..0935a92 100644 (file)
@@ -14,7 +14,7 @@
                       cFiles = [ "queue_interface.c" ],
                       addLibraries = [ "devif" ] },
 
-  build application { target = "devif_dummy_device", 
-                      cFiles = [ "devif_dummy_device.c" ],
+  build application { target = "devif_loopback_device", 
+                      cFiles = [ "loopback_device.c" ],
                       addLibraries = [ "devif" ] }
 ]
diff --git a/usr/tests/devif/devif_dummy_device.c b/usr/tests/devif/devif_dummy_device.c
deleted file mode 100644 (file)
index 3448490..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, 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, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <time.h>
-#include <barrelfish/barrelfish.h>
-#include <barrelfish/waitset.h>
-#include <barrelfish/deferred.h>
-#include <devif/queue_interface.h>
-
-static struct endpoint_state* state;
-static struct capref last_region;
-static regionid_t last_rid;
-
-
-// Prototypes
-
-errval_t notify_loopback(struct devq *q, uint8_t num_slots);
-errval_t setup (uint64_t* features, uint32_t* default_qsize,
-                uint32_t* default_bufsize, bool* reconnect, char* name) ;
-errval_t create(struct devq *q, uint64_t flags);
-errval_t reg(struct devq *q, struct capref cap, regionid_t rid) ;
-errval_t dereg(struct devq *q, regionid_t rid); 
-errval_t notify(struct devq* q, uint8_t num_slots);
-errval_t control(struct devq* q, uint64_t request, uint64_t value);
-
-errval_t setup (uint64_t* features, uint32_t* default_qsize,
-                uint32_t* default_bufsize, bool* reconnect, char* name) 
-{
-    *features = 0;
-    *reconnect = false;
-    *default_qsize = 0;
-    *default_bufsize = 0;
-    name = "loopback";
-    return SYS_ERR_OK;
-}
-
-errval_t create (struct devq *q, uint64_t flags) 
-{
-    void* device = devq_get_state(q);
-    device = malloc(sizeof(uint64_t));
-    return SYS_ERR_OK;  
-}
-
-errval_t reg(struct devq *q, struct capref cap, regionid_t rid) 
-{
-    last_region = cap;
-    last_rid = rid;
-    return SYS_ERR_OK;
-}
-
-
-errval_t dereg(struct devq *q, regionid_t rid) 
-{
-    return SYS_ERR_OK;
-}
-
-errval_t notify_loopback(struct devq *q, uint8_t num_slots) 
-{
-    errval_t err;
-    struct devq_buf* bufs = malloc(sizeof(struct devq_buf)*num_slots);
-    for (int i = 0; i < num_slots; i++) {
-        err = devq_dequeue(q, &(bufs[i].rid), &(bufs[i].addr),
-                           &(bufs[i].len), &(bufs[i].bid), &(bufs[i].flags));
-
-        if (err_is_fail(err)) {
-            return err;
-        }
-    }
-
-    for (int i = 0; i < num_slots; i++) {
-        err = devq_enqueue(q, bufs[i].rid, bufs[i].addr,
-                           bufs[i].len, bufs[i].flags, &bufs[i].bid);
-
-        if (err_is_fail(err)) {
-            return err;
-        }
-    }
-    
-    
-    err = devq_notify(q);
-    if (err_is_fail(err)) {
-        return err;
-    }
-
-    return SYS_ERR_OK;
-}
-
-errval_t control(struct devq* q, uint64_t request, uint64_t value)
-{
-    return SYS_ERR_OK;
-}
-
-int main(int argc, char *argv[])
-{
-    errval_t err;
-    struct devq_func_pointer f = {
-        .setup = setup,
-        .create = create,
-        .reg = reg,
-        .notify = notify_loopback,
-        .dereg = dereg,
-        .ctrl = control,
-    };
-
-    struct endpoint_state my_state = {
-        .endpoint_type = ENDPOINT_TYPE_NET,
-        .device_name = "loopback",
-        .q = NULL,
-        .features = 0,
-        .f = f,
-    };
-    
-    state = &my_state;
-    
-    err = devq_driver_export(&my_state);
-    if (err_is_fail(err)){  
-        abort();
-    }
-
-    while (true) {
-        event_dispatch(get_default_waitset());
-    }
-}
-
diff --git a/usr/tests/devif/loopback_device.c b/usr/tests/devif/loopback_device.c
new file mode 100644 (file)
index 0000000..9999f01
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, 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, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <barrelfish/barrelfish.h>
+#include <barrelfish/waitset.h>
+#include <barrelfish/deferred.h>
+#include <devif/queue_interface.h>
+#include <devif/loopback_device.h>
+
+static struct endpoint_state* state;
+
+// Prototypes
+int main(int argc, char *argv[])
+{
+    errval_t err;
+    struct devq_func_pointer f = {
+        .setup = devq_loopback_setup,
+        .create = devq_loopback_create,
+        .reg = devq_loopback_register,
+        .notify = devq_loopback_notify,
+        .dereg = devq_loopback_deregister,
+        .ctrl = devq_loopback_control,
+    };
+
+    struct endpoint_state my_state = {
+        .endpoint_type = ENDPOINT_TYPE_NET,
+        .device_name = "loopback",
+        .q = NULL,
+        .features = 0,
+        .f = f,
+    };
+    
+    state = &my_state;
+    
+    err = devq_driver_export(&my_state);
+    if (err_is_fail(err)){  
+        abort();
+    }
+
+    while (true) {
+        event_dispatch(get_default_waitset());
+    }
+}
+