Initial import
[sliver-openvswitch.git] / datapath / dp_dev.c
1 #include <linux/kernel.h>
2 #include <linux/netdevice.h>
3 #include <linux/etherdevice.h>
4 #include <linux/rcupdate.h>
5
6 #include "datapath.h"
7 #include "forward.h"
8
9 static int dp_dev_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
10 {
11         printk("xxx_do_ioctl called\n");
12         return 0;
13 }
14
15 static struct net_device_stats *dp_dev_get_stats(struct net_device *dev)
16 {
17         struct datapath *dp = netdev_priv(dev);
18         return &dp->stats;
19 }
20
21 int dp_dev_xmit(struct sk_buff *skb, struct net_device *dev)
22 {
23         struct datapath *dp = netdev_priv(dev);
24
25         printk("xxx dp_dev_xmit not implemented yet!\n");
26         return 0;
27
28         printk("xxx_xmit called send to dp_frame_hook\n");
29
30         rcu_read_lock();    /* xxx Only for 2.4 kernels? */
31         fwd_port_input(dp->chain, skb, OFPP_LOCAL);
32         rcu_read_unlock();  /* xxx Only for 2.4 kernels? */
33         
34         return 0;
35 }
36
37 static int dp_dev_open(struct net_device *dev)
38 {
39         netif_start_queue(dev);
40         return 0;
41 }
42
43 static void dp_dev_set_multicast_list(struct net_device *dev)
44 {
45         printk("xxx_set_multi called\n");
46 }
47
48 static int dp_dev_stop(struct net_device *dev)
49 {
50         netif_stop_queue(dev);
51         return 0;
52 }
53
54 int dp_dev_setup(struct net_device *dev)
55 {
56         int err;
57
58         strncpy(dev->name, "of%d", IFNAMSIZ);
59         err = dev_alloc_name(dev, dev->name);
60         if (err < 0) 
61                 return err;
62
63         dev->do_ioctl = dp_dev_do_ioctl;
64         dev->get_stats = dp_dev_get_stats;
65         dev->hard_start_xmit = dp_dev_xmit;
66         dev->open = dp_dev_open;
67         dev->set_multicast_list = dp_dev_set_multicast_list;
68         dev->stop = dp_dev_stop;
69         dev->tx_queue_len = 0;
70         dev->set_mac_address = NULL;
71
72         dev->flags = IFF_BROADCAST | IFF_NOARP | IFF_MULTICAST;
73
74         random_ether_addr(dev->dev_addr);
75
76         ether_setup(dev);
77         return register_netdevice(dev);
78 }