datapath: Constify ops structures.
[openvswitch] / datapath / vport.c
index cdf615a47b8b135c631988ba6d52e9666391bab3..fdbf522e8d73d4e92ca6b1b22cfe63c0edd1335c 100644 (file)
@@ -6,6 +6,8 @@
  * kernel, by Linus Torvalds and others.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/dcache.h>
 #include <linux/etherdevice.h>
 #include <linux/if.h>
 #include <linux/percpu.h>
 #include <linux/rtnetlink.h>
 #include <linux/compat.h>
+#include <linux/version.h>
 
 #include "vport.h"
 #include "vport-internal_dev.h"
 
 /* List of statically compiled vport implementations.  Don't forget to also
  * add yours to the list at the bottom of vport.h. */
-static struct vport_ops *base_vport_ops_list[] = {
+static const struct vport_ops *base_vport_ops_list[] = {
        &netdev_vport_ops,
        &internal_vport_ops,
        &patch_vport_ops,
        &gre_vport_ops,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
+       &capwap_vport_ops,
+#endif
 };
 
 static const struct vport_ops **vport_ops_list;
@@ -72,13 +78,14 @@ void vport_unlock(void)
        mutex_unlock(&vport_mutex);
 }
 
-#define ASSERT_VPORT() do { \
-       if (unlikely(!mutex_is_locked(&vport_mutex))) { \
-               printk(KERN_ERR "openvswitch: vport lock not held at %s (%d)\n", \
-                       __FILE__, __LINE__); \
-               dump_stack(); \
-       } \
-} while(0)
+#define ASSERT_VPORT()                                         \
+do {                                                           \
+       if (unlikely(!mutex_is_locked(&vport_mutex))) {         \
+               pr_err("vport lock not held at %s (%d)\n",      \
+                      __FILE__, __LINE__);                     \
+               dump_stack();                                   \
+       }                                                       \
+} while (0)
 
 /**
  *     vport_init - initialize vport subsystem
@@ -106,7 +113,7 @@ int vport_init(void)
        }
 
        for (i = 0; i < ARRAY_SIZE(base_vport_ops_list); i++) {
-               struct vport_ops *new_ops = base_vport_ops_list[i];
+               const struct vport_ops *new_ops = base_vport_ops_list[i];
 
                if (new_ops->init)
                        err = new_ops->init();
@@ -612,7 +619,7 @@ struct vport *vport_locate(const char *name)
        struct hlist_node *node;
 
        if (unlikely(!mutex_is_locked(&vport_mutex) && !rtnl_is_locked())) {
-               printk(KERN_ERR "openvswitch: neither RTNL nor vport lock held in vport_locate\n");
+               pr_err("neither RTNL nor vport lock held in vport_locate\n");
                dump_stack();
        }
 
@@ -897,13 +904,13 @@ int vport_set_addr(struct vport *vport, const unsigned char *addr)
  * support setting the stats, in which case the result will always be
  * -EOPNOTSUPP.  RTNL lock must be held.
  */
-int vport_set_stats(struct vport *vport, struct odp_vport_stats *stats)
+int vport_set_stats(struct vport *vport, struct rtnl_link_stats64 *stats)
 {
        ASSERT_RTNL();
 
        if (vport->ops->flags & VPORT_F_GEN_STATS) {
                spin_lock_bh(&vport->stats_lock);
-               memcpy(&vport->offset_stats, stats, sizeof(struct odp_vport_stats));
+               vport->offset_stats = *stats;
                spin_unlock_bh(&vport->stats_lock);
 
                return 0;
@@ -991,10 +998,10 @@ struct kobject *vport_get_kobj(const struct vport *vport)
  *
  * Retrieves transmit, receive, and error stats for the given device.
  */
-int vport_get_stats(struct vport *vport, struct odp_vport_stats *stats)
+int vport_get_stats(struct vport *vport, struct rtnl_link_stats64 *stats)
 {
-       struct odp_vport_stats dev_stats;
-       struct odp_vport_stats *dev_statsp = NULL;
+       struct rtnl_link_stats64 dev_stats;
+       struct rtnl_link_stats64 *dev_statsp = NULL;
        int err;
 
        if (vport->ops->get_stats) {
@@ -1023,31 +1030,39 @@ int vport_get_stats(struct vport *vport, struct odp_vport_stats *stats)
 
                spin_lock_bh(&vport->stats_lock);
 
-               memcpy(stats, &vport->offset_stats, sizeof(struct odp_vport_stats));
+               *stats = vport->offset_stats;
 
-               stats->rx_errors        += vport->err_stats.rx_errors
-                                               + vport->err_stats.rx_frame_err
-                                               + vport->err_stats.rx_over_err
-                                               + vport->err_stats.rx_crc_err;
+               stats->rx_errors        += vport->err_stats.rx_errors;
                stats->tx_errors        += vport->err_stats.tx_errors;
                stats->tx_dropped       += vport->err_stats.tx_dropped;
                stats->rx_dropped       += vport->err_stats.rx_dropped;
-               stats->rx_over_err      += vport->err_stats.rx_over_err;
-               stats->rx_crc_err       += vport->err_stats.rx_crc_err;
-               stats->rx_frame_err     += vport->err_stats.rx_frame_err;
-               stats->collisions       += vport->err_stats.collisions;
 
                spin_unlock_bh(&vport->stats_lock);
 
                if (dev_statsp) {
-                       stats->rx_errors        += dev_statsp->rx_errors;
-                       stats->tx_errors        += dev_statsp->tx_errors;
-                       stats->rx_dropped       += dev_statsp->rx_dropped;
-                       stats->tx_dropped       += dev_statsp->tx_dropped;
-                       stats->rx_over_err      += dev_statsp->rx_over_err;
-                       stats->rx_crc_err       += dev_statsp->rx_crc_err;
-                       stats->rx_frame_err     += dev_statsp->rx_frame_err;
-                       stats->collisions       += dev_statsp->collisions;
+                       stats->rx_packets          += dev_statsp->rx_packets;
+                       stats->tx_packets          += dev_statsp->tx_packets;
+                       stats->rx_bytes            += dev_statsp->rx_bytes;
+                       stats->tx_bytes            += dev_statsp->tx_bytes;
+                       stats->rx_errors           += dev_statsp->rx_errors;
+                       stats->tx_errors           += dev_statsp->tx_errors;
+                       stats->rx_dropped          += dev_statsp->rx_dropped;
+                       stats->tx_dropped          += dev_statsp->tx_dropped;
+                       stats->multicast           += dev_statsp->multicast;
+                       stats->collisions          += dev_statsp->collisions;
+                       stats->rx_length_errors    += dev_statsp->rx_length_errors;
+                       stats->rx_over_errors      += dev_statsp->rx_over_errors;
+                       stats->rx_crc_errors       += dev_statsp->rx_crc_errors;
+                       stats->rx_frame_errors     += dev_statsp->rx_frame_errors;
+                       stats->rx_fifo_errors      += dev_statsp->rx_fifo_errors;
+                       stats->rx_missed_errors    += dev_statsp->rx_missed_errors;
+                       stats->tx_aborted_errors   += dev_statsp->tx_aborted_errors;
+                       stats->tx_carrier_errors   += dev_statsp->tx_carrier_errors;
+                       stats->tx_fifo_errors      += dev_statsp->tx_fifo_errors;
+                       stats->tx_heartbeat_errors += dev_statsp->tx_heartbeat_errors;
+                       stats->tx_window_errors    += dev_statsp->tx_window_errors;
+                       stats->rx_compressed       += dev_statsp->rx_compressed;
+                       stats->tx_compressed       += dev_statsp->tx_compressed;
                }
 
                for_each_possible_cpu(i) {
@@ -1210,6 +1225,9 @@ void vport_receive(struct vport *vport, struct sk_buff *skb)
                local_bh_enable();
        }
 
+       if (!(vport->ops->flags & VPORT_F_FLOW))
+               OVS_CB(skb)->flow = NULL;
+
        if (!(vport->ops->flags & VPORT_F_TUN_ID))
                OVS_CB(skb)->tun_id = 0;
 
@@ -1243,8 +1261,9 @@ int vport_send(struct vport *vport, struct sk_buff *skb)
        mtu = vport_get_mtu(vport);
        if (unlikely(packet_length(skb) > mtu && !skb_is_gso(skb))) {
                if (net_ratelimit())
-                       printk(KERN_WARNING "%s: dropped over-mtu packet: %d > %d\n",
-                              dp_name(vport_get_dp_port(vport)->dp), packet_length(skb), mtu);
+                       pr_warn("%s: dropped over-mtu packet: %d > %d\n",
+                               dp_name(vport_get_dp_port(vport)->dp),
+                               packet_length(skb), mtu);
                goto error;
        }
 
@@ -1296,18 +1315,6 @@ void vport_record_error(struct vport *vport, enum vport_err_type err_type)
                        vport->err_stats.rx_errors++;
                        break;
 
-               case VPORT_E_RX_FRAME:
-                       vport->err_stats.rx_frame_err++;
-                       break;
-
-               case VPORT_E_RX_OVER:
-                       vport->err_stats.rx_over_err++;
-                       break;
-
-               case VPORT_E_RX_CRC:
-                       vport->err_stats.rx_crc_err++;
-                       break;
-
                case VPORT_E_TX_DROPPED:
                        vport->err_stats.tx_dropped++;
                        break;
@@ -1315,10 +1322,6 @@ void vport_record_error(struct vport *vport, enum vport_err_type err_type)
                case VPORT_E_TX_ERROR:
                        vport->err_stats.tx_errors++;
                        break;
-
-               case VPORT_E_COLLISION:
-                       vport->err_stats.collisions++;
-                       break;
                };
 
                spin_unlock_bh(&vport->stats_lock);