summaryrefslogtreecommitdiff
path: root/libdde-linux26/lib/src/mach_glue
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2013-07-27 22:15:01 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2013-07-27 22:15:01 +0000
commit7996a3d79d55b7f879dfd62e202bbfe2963718d3 (patch)
tree8d9f6759fec4099b9be503c11c7ed174f7204980 /libdde-linux26/lib/src/mach_glue
parent4fbe7358c7747a9165f776eb19addbb9baf7def2 (diff)
really properly move files
Diffstat (limited to 'libdde-linux26/lib/src/mach_glue')
-rw-r--r--libdde-linux26/lib/src/mach_glue/block.c81
-rw-r--r--libdde-linux26/lib/src/mach_glue/net.c112
2 files changed, 193 insertions, 0 deletions
diff --git a/libdde-linux26/lib/src/mach_glue/block.c b/libdde-linux26/lib/src/mach_glue/block.c
new file mode 100644
index 00000000..3820712c
--- /dev/null
+++ b/libdde-linux26/lib/src/mach_glue/block.c
@@ -0,0 +1,81 @@
+#include <linux/fs.h>
+#include <linux/genhd.h>
+#include <linux/bio.h>
+#include <ddekit/assert.h>
+
+struct gendisk *find_disk_by_name (char *);
+void dde_page_cache_add (struct page *);
+
+struct block_device *open_block_dev (char *name, int part, fmode_t mode)
+{
+ struct gendisk *disk = find_disk_by_name (name);
+ if (disk)
+ {
+ dev_t devid = MKDEV (disk->major, disk->first_minor + part);
+ return open_by_devnum (devid, mode);
+ }
+ return ERR_PTR(-ENXIO);
+}
+
+/* read or write a piece of data to a block device.
+ * DATA must be in one page.
+ * SECTORNR: the writing location in sectors. */
+int block_dev_rw (struct block_device *dev, int sectornr,
+ char *data, int count, int rw, void (*done (int err)))
+{
+ int err = 0;
+ struct bio *bio;
+ struct page *page;
+ int i;
+
+ void end_bio (struct bio *bio, int err)
+ {
+ done (err);
+ }
+
+ assert (count <= PAGE_SIZE);
+ bio = bio_alloc (GFP_NOIO, 1);
+ if (bio == NULL)
+ {
+ err = ENOMEM;
+ goto out;
+ }
+
+ page = kmalloc (sizeof (*page), GFP_KERNEL);
+ if (page == NULL)
+ {
+ err = ENOMEM;
+ goto out;
+ }
+
+ bio->bi_sector = sectornr;
+ bio->bi_bdev = dev;
+ page->virtual = data;
+ dde_page_cache_add (page);
+ bio->bi_io_vec[0].bv_page = page;
+ bio->bi_io_vec[0].bv_len = count;
+ bio->bi_io_vec[0].bv_offset = (int) data & ~PAGE_MASK;
+
+ bio->bi_vcnt = 1;
+ bio->bi_idx = 0;
+ bio->bi_size = count;
+
+ bio->bi_end_io = end_bio;
+ bio->bi_private = NULL;
+ bio_get (bio);
+ submit_bio (rw, bio);
+ if (bio_flagged (bio, BIO_EOPNOTSUPP))
+ {
+ err = -EOPNOTSUPP;
+ goto out;
+ }
+ bio_put (bio);
+out:
+ if (err)
+ {
+ if (bio)
+ bio_put (bio);
+ kfree (page);
+ }
+ return err;
+}
diff --git a/libdde-linux26/lib/src/mach_glue/net.c b/libdde-linux26/lib/src/mach_glue/net.c
new file mode 100644
index 00000000..3ab9e44f
--- /dev/null
+++ b/libdde-linux26/lib/src/mach_glue/net.c
@@ -0,0 +1,112 @@
+#include <linux/netdevice.h>
+#include <linux/if.h>
+
+/* List of sk_buffs waiting to be freed. */
+static struct sk_buff_head skb_done_list;
+
+struct net_device *search_netdev (char *name)
+{
+ struct net_device *dev;
+ struct net_device *found = NULL;
+ struct net *net;
+
+ printk("search device %s\n", name);
+ read_lock(&dev_base_lock);
+ for_each_net(net) {
+ for_each_netdev(net, dev) {
+ printk("there is device %s, base addr: %x\n",
+ dev->name, dev->base_addr);
+ if (!strcmp (name, dev->name))
+ {
+ found = dev;
+ goto end;
+ }
+ }
+ }
+end:
+ read_unlock(&dev_base_lock);
+ return found;
+}
+
+int linux_pkg_xmit (char *pkg_data, int len, void *del_data,
+ int (*del_func) (struct sk_buff *, void *),
+ struct net_device *dev)
+{
+ struct sk_buff *skb;
+
+ if (len == 0 || len > dev->mtu + dev->hard_header_len)
+ return EINVAL;
+
+ /* Allocate a sk_buff. */
+ skb = dev_alloc_skb (len);
+ if (!skb)
+ return ENOMEM;
+
+ skb->del_data = del_data;
+ skb->pre_del_func = del_func;
+
+ /* Copy user data. This is only required if it spans multiple pages. */
+ skb->len = len;
+ skb->tail = skb->data + len;
+
+ memcpy (skb->data, pkg_data, len);
+
+ skb->dev = dev;
+
+ return dev_queue_xmit(skb);
+}
+
+char *netdev_addr(struct net_device *dev)
+{
+ return dev->dev_addr;
+}
+
+int netdev_flags(struct net_device *dev)
+{
+ return dev->flags;
+}
+
+char *netdev_name (struct net_device *dev)
+{
+ return dev->name;
+}
+
+unsigned int netdev_mtu (struct net_device *dev)
+{
+ return dev->mtu;
+}
+
+unsigned short netdev_header_len (struct net_device *dev)
+{
+ return dev->hard_header_len;
+}
+
+unsigned short netdev_type (struct net_device *dev)
+{
+ return dev->type;
+}
+
+unsigned char netdev_addr_len (struct net_device *dev)
+{
+ return dev->addr_len;
+}
+
+void *skb_reply(struct sk_buff *skb)
+{
+ return skb->del_data;
+}
+
+void skb_done_head_init()
+{
+ skb_queue_head_init (&skb_done_list);
+}
+
+struct sk_buff *skb_done_dequeue()
+{
+ return skb_dequeue (&skb_done_list);
+}
+
+void skb_done_queue(struct sk_buff *skb)
+{
+ skb_queue_tail (&skb_done_list, skb);
+}