]> git.proxmox.com Git - mirror_ovs.git/blobdiff - datapath/datapath.h
datapath: compat: Fix RHEL 7.5 build warning from ip_tunnel_get_stats64()
[mirror_ovs.git] / datapath / datapath.h
index a70123c1a87bbcd10e5105aaba3df608dc65012e..93c9ed5054481cf38a1c6beac34589e8803ce73c 100644 (file)
 #include "compat.h"
 #include "flow.h"
 #include "flow_table.h"
+#include "vport-internal_dev.h"
 
 #define DP_MAX_PORTS           USHRT_MAX
 #define DP_VPORT_HASH_BUCKETS  1024
 
-#define SAMPLE_ACTION_DEPTH 3
-
 /**
  * struct dp_stats_percpu - per-cpu packet processing statistics for a given
  * datapath.
@@ -69,6 +68,8 @@ struct dp_stats_percpu {
  * ovs_mutex and RCU.
  * @stats_percpu: Per-CPU datapath statistics.
  * @net: Reference to net namespace.
+ * @max_headroom: the maximum headroom of all vports in this datapath; it will
+ * be used by all the internal vports in this dp.
  *
  * Context: See the comment on locking at the top of datapath.c for additional
  * locking information.
@@ -90,6 +91,11 @@ struct datapath {
        possible_net_t net;
 
        u32 user_features;
+
+       u32 max_headroom;
+
+       /* Switch meters. */
+       struct hlist_head *meters;
 };
 
 /**
@@ -97,12 +103,14 @@ struct datapath {
  * @input_vport: The original vport packet came in on. This value is cached
  * when a packet is received by OVS.
  * @mru: The maximum received fragement size; 0 if the packet is not
- * @cutlen: The number of bytes from the packet end to be removed.
  * fragmented.
+ * @acts_origlen: The netlink size of the flow actions applied to this skb.
+ * @cutlen: The number of bytes from the packet end to be removed.
  */
 struct ovs_skb_cb {
        struct vport            *input_vport;
        u16                     mru;
+       u16                     acts_origlen;
        u32                     cutlen;
 };
 #define OVS_CB(skb) ((struct ovs_skb_cb *)(skb)->cb)
@@ -120,7 +128,6 @@ struct ovs_skb_cb {
  */
 struct dp_upcall_info {
        struct ip_tunnel_info *egress_tun_info;
-       const void *egress_tun_opts;
        const struct nlattr *userdata;
        const struct nlattr *actions;
        int actions_len;
@@ -140,9 +147,15 @@ struct ovs_net {
 
        /* Module reference for configuring conntrack. */
        bool xt_label;
+
+#ifdef HAVE_INET_FRAG_LRU_MOVE
+       struct net *net;
+       struct netns_frags ipv4_frags;
+       struct netns_frags nf_frags;
+#endif
 };
 
-extern int ovs_net_id;
+extern unsigned int ovs_net_id;
 void ovs_lock(void);
 void ovs_unlock(void);
 
@@ -188,6 +201,36 @@ static inline struct vport *ovs_vport_ovsl(const struct datapath *dp, int port_n
        return ovs_lookup_vport(dp, port_no);
 }
 
+/* Must be called with rcu_read_lock. */
+static inline struct datapath *get_dp_rcu(struct net *net, int dp_ifindex)
+{
+       struct net_device *dev = dev_get_by_index_rcu(net, dp_ifindex);
+
+       if (dev) {
+               struct vport *vport = ovs_internal_dev_get_vport(dev);
+
+               if (vport)
+                       return vport->dp;
+       }
+
+       return NULL;
+}
+
+/* The caller must hold either ovs_mutex or rcu_read_lock to keep the
+ * returned dp pointer valid.
+ */
+static inline struct datapath *get_dp(struct net *net, int dp_ifindex)
+{
+       struct datapath *dp;
+
+       WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_ovsl_is_held());
+       rcu_read_lock();
+       dp = get_dp_rcu(net, dp_ifindex);
+       rcu_read_unlock();
+
+       return dp;
+}
+
 extern struct notifier_block ovs_dp_device_notifier;
 extern struct genl_family dp_vport_genl_family;
 extern struct genl_multicast_group ovs_dp_vport_multicast_group;
@@ -199,8 +242,8 @@ int ovs_dp_upcall(struct datapath *, struct sk_buff *,
                  uint32_t cutlen);
 
 const char *ovs_dp_name(const struct datapath *dp);
-struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 pid, u32 seq,
-                                        u8 cmd);
+struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, struct net *net,
+                                        u32 portid, u32 seq, u8 cmd);
 
 int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb,
                        const struct sw_flow_actions *, struct sw_flow_key *);