diff options
author | Zheng Da <zhengda1936@gmail.com> | 2010-01-29 20:31:20 +0100 |
---|---|---|
committer | Zheng Da <zhengda1936@gmail.com> | 2010-01-29 20:31:20 +0100 |
commit | 2bbc0548875321fa8660566254699cbab9aa00e9 (patch) | |
tree | 31f095379497ce39ea4e0132f85086825d4bfb78 /libdde_linux26/lib/src/arch | |
parent | 3f46d3b565db7c4a88e6484fc8022d4fff1c65e3 (diff) |
libdde_linux26 is adapted to be used by libmachdev.
Diffstat (limited to 'libdde_linux26/lib/src/arch')
-rw-r--r-- | libdde_linux26/lib/src/arch/l4/mach_glue.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/libdde_linux26/lib/src/arch/l4/mach_glue.c b/libdde_linux26/lib/src/arch/l4/mach_glue.c new file mode 100644 index 00000000..9130c550 --- /dev/null +++ b/libdde_linux26/lib/src/arch/l4/mach_glue.c @@ -0,0 +1,85 @@ +#include <linux/netdevice.h> +#include <linux/if.h> + +#define D_INVALID_SIZE 2507 +#define D_NO_MEMORY 2508 + +/* 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 *net; + + read_lock(&dev_base_lock); + for_each_net(net) { + for_each_netdev(net, dev) { + if (!strcmp (name, dev->name) + && dev->base_addr && dev->base_addr != 0xffe0) + goto end; + } + } +end: + read_unlock(&dev_base_lock); + return dev; +} + +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 D_INVALID_SIZE; + + /* Allocate a sk_buff. */ + skb = dev_alloc_skb (len); + if (!skb) + return D_NO_MEMORY; + + 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; + skb->end = skb->tail; + + memcpy (skb->data, pkg_data, len); + + skb->dev = dev; + + return dev->netdev_ops->ndo_start_xmit(skb, dev); +} + +char *netdev_addr(struct net_device *dev) +{ + return dev->dev_addr; +} + +int netdev_flags(struct net_device *dev) +{ + return dev->flags; +} + +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); +} |