1 #include <linux/kernel.h>
2 #include <linux/netdevice.h>
3 #include <linux/etherdevice.h>
4 #include <linux/rcupdate.h>
5 #include <linux/skbuff.h>
11 struct net_device_stats stats;
15 static struct dp_dev *dp_dev_priv(struct net_device *netdev)
17 return netdev_priv(netdev);
20 static struct net_device_stats *dp_dev_get_stats(struct net_device *netdev)
22 struct dp_dev *dp_dev = dp_dev_priv(netdev);
23 return &dp_dev->stats;
26 int dp_dev_recv(struct net_device *netdev, struct sk_buff *skb)
29 struct dp_dev *dp_dev = dp_dev_priv(netdev);
31 skb->pkt_type = PACKET_HOST;
32 skb->protocol = eth_type_trans(skb, netdev);
37 netdev->last_rx = jiffies;
38 dp_dev->stats.rx_packets++;
39 dp_dev->stats.rx_bytes += len;
43 static int dp_dev_mac_addr(struct net_device *dev, void *p)
45 struct sockaddr *addr = p;
47 if (netif_running(dev))
49 if (!is_valid_ether_addr(addr->sa_data))
50 return -EADDRNOTAVAIL;
51 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
55 static int dp_dev_xmit(struct sk_buff *skb, struct net_device *netdev)
57 struct dp_dev *dp_dev = dp_dev_priv(netdev);
61 if (likely(dp != NULL)) {
62 dp_dev->stats.tx_packets++;
63 dp_dev->stats.tx_bytes += skb->len;
64 skb_reset_mac_header(skb);
65 fwd_port_input(dp->chain, skb, OFPP_LOCAL);
67 dp_dev->stats.tx_dropped++;
74 static int dp_dev_open(struct net_device *netdev)
76 netif_start_queue(netdev);
80 static int dp_dev_stop(struct net_device *netdev)
82 netif_stop_queue(netdev);
87 do_setup(struct net_device *netdev)
91 netdev->get_stats = dp_dev_get_stats;
92 netdev->hard_start_xmit = dp_dev_xmit;
93 netdev->open = dp_dev_open;
94 netdev->stop = dp_dev_stop;
95 netdev->tx_queue_len = 0;
96 netdev->set_mac_address = dp_dev_mac_addr;
98 netdev->flags = IFF_BROADCAST | IFF_MULTICAST;
100 random_ether_addr(netdev->dev_addr);
104 int dp_dev_setup(struct datapath *dp)
106 struct dp_dev *dp_dev;
107 struct net_device *netdev;
111 snprintf(of_name, sizeof of_name, "of%d", dp->dp_idx);
112 netdev = alloc_netdev(sizeof(struct dp_dev), of_name, do_setup);
116 err = register_netdev(netdev);
122 dp_dev = dp_dev_priv(netdev);
128 void dp_dev_destroy(struct datapath *dp)
130 struct dp_dev *dp_dev = dp_dev_priv(dp->netdev);
133 unregister_netdev(dp->netdev);
134 free_netdev(dp->netdev);
137 int is_dp_dev(struct net_device *netdev)
139 return netdev->open == dp_dev_open;