1 #include <linux/netdevice.h>
2 #include <linux/init.h>
3 #include <linux/skbuff.h>
4 #include "linux_glue.h"
6 #include <l4/dde/linux26/dde26_net.h>
10 #define DEBUG(DBG, msg, ...) \
12 printk(msg, ##__VA_ARGS__); \
15 #define ANKH_DEBUG_INIT 1
16 #define ANKH_DEBUG_PACKET 0
18 int ankh_debug_linuxglue = 0;
19 void ankh_set_debug() { ++ankh_debug_linuxglue; }
20 void ankh_unset_debug() { --ankh_debug_linuxglue; }
22 /*****************************************************************************
23 * Open the "real" network devices. Return the number of opened interfaces.
24 *****************************************************************************/
25 int open_network_devices(int promisc)
27 struct net_device *dev;
31 DEBUG(ANKH_DEBUG_INIT, "%s() \n", __func__);
34 for_each_netdev(net, dev)
36 DEBUG(ANKH_DEBUG_INIT, "opening %s\n", dev->name);
38 // beam us to promiscuous mode, so that we can receive packets that
39 // are not meant for the NIC's MAC address --> we need that, because
40 // ORe clients have different MAC addresses
41 if (promisc && netdev_set_promisc(dev) == 0)
42 DEBUG(ANKH_DEBUG_INIT, "set interface to promiscuous mode.\n");
47 DEBUG(ANKH_DEBUG_INIT, "error opening %s : %d\n", dev->name, err);
54 //xmit_lock_add(dev->name);
62 static int net_recv_irq(struct sk_buff *skb)
67 * Special case: The loopback device is handled
68 * by local packet delivery beforehand. The loopback
69 * driver however, tries to directly call the recv() routine
72 if (!strcmp(skb->dev->name, "lo"))
73 return NET_RX_SUCCESS;
76 * Push eth header back, so that skb->data is the raw packet.
78 skb_push(skb, skb->dev->hard_header_len);
81 * Hand to upper layers.
85 printk("%s\n", print_mac(mac, skb->data));
87 packet_deliver(skb->data, skb->len, skb->dev->name, 0);
90 * Need to release skb here.
94 return NET_RX_SUCCESS;
98 static void _init_linux_glue(void)
100 l4dde26_softirq_init();
103 l4dde26_register_rx_callback(net_recv_irq);
105 subsys_initcall(_init_linux_glue);
107 /*****************************************************************************
108 * wrapper functions for accessing net_device members
109 *****************************************************************************/
111 #define ND(p) ((struct net_device *)p)
113 int netdev_irq(void *netdev)
114 { return ND(netdev)->irq; }
117 char const *netdev_name(void *netdev)
118 { return dev_name(&ND(netdev)->dev); }
121 int netdev_set_promisc(void *netdev)
124 struct net_device *dev = ND(netdev);
125 if ((err = dev_change_flags(dev, dev->flags | IFF_PROMISC)) != 0)
126 DEBUG(ANKH_DEBUG_INIT, "%s could not be set to promiscuous mode.\n",
133 int netdev_unset_promisc(void *netdev)
136 struct net_device *dev = ND(netdev);
137 if ((err = dev_change_flags(dev, dev->flags & ~IFF_PROMISC)) != 0)
138 DEBUG(ANKH_DEBUG_INIT, "%s could not be set to promiscuous mode.\n",
145 void *alloc_dmaable_buffer(unsigned size)
147 return kmalloc(size, GFP_KERNEL);
151 int netdev_get_promisc(void *netdev)
152 { return ND(netdev)->flags & IFF_PROMISC; }
155 char *netdev_dev_addr(void *netdev)
156 { return ND(netdev)->dev_addr; }
159 int netdev_mtu(void *netdev)
160 { return ND(netdev)->mtu; }
163 int netdev_xmit(void *netdev, char *addr, unsigned len)
165 // XXX could we pass 0 as length here? data netdev is set
167 struct sk_buff *skb = alloc_skb(len, GFP_KERNEL);
170 skb->data = addr; // XXX
172 skb->dev = ND(netdev);
174 while (netif_queue_stopped(ND(netdev)))
178 if (ND(netdev)->netdev_ops)
179 err = ND(netdev)->netdev_ops->ndo_start_xmit(skb, ND(netdev));
181 err = ND(netdev)->hard_start_xmit(skb, ND(netdev));