These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / net / openvswitch / flow.h
index a076e44..1d055c5 100644 (file)
 #include <linux/time.h>
 #include <linux/flex_array.h>
 #include <net/inet_ecn.h>
+#include <net/ip_tunnels.h>
+#include <net/dst_metadata.h>
 
 struct sk_buff;
 
-/* Used to memset ovs_key_ipv4_tunnel padding. */
-#define OVS_TUNNEL_KEY_SIZE                                    \
-       (offsetof(struct ovs_key_ipv4_tunnel, tp_dst) +         \
-        FIELD_SIZEOF(struct ovs_key_ipv4_tunnel, tp_dst))
-
-struct ovs_key_ipv4_tunnel {
-       __be64 tun_id;
-       __be32 ipv4_src;
-       __be32 ipv4_dst;
-       __be16 tun_flags;
-       u8   ipv4_tos;
-       u8   ipv4_ttl;
-       __be16 tp_src;
-       __be16 tp_dst;
-} __packed __aligned(4); /* Minimize padding. */
-
-struct ovs_tunnel_info {
-       struct ovs_key_ipv4_tunnel tunnel;
-       const void *options;
-       u8 options_len;
-};
-
 /* Store options at the end of the array if they are less than the
  * maximum size. This allows us to get the benefits of variable length
  * matching for small options.
@@ -66,54 +46,9 @@ struct ovs_tunnel_info {
 #define TUN_METADATA_OPTS(flow_key, opt_len) \
        ((void *)((flow_key)->tun_opts + TUN_METADATA_OFFSET(opt_len)))
 
-static inline void __ovs_flow_tun_info_init(struct ovs_tunnel_info *tun_info,
-                                           __be32 saddr, __be32 daddr,
-                                           u8 tos, u8 ttl,
-                                           __be16 tp_src,
-                                           __be16 tp_dst,
-                                           __be64 tun_id,
-                                           __be16 tun_flags,
-                                           const void *opts,
-                                           u8 opts_len)
-{
-       tun_info->tunnel.tun_id = tun_id;
-       tun_info->tunnel.ipv4_src = saddr;
-       tun_info->tunnel.ipv4_dst = daddr;
-       tun_info->tunnel.ipv4_tos = tos;
-       tun_info->tunnel.ipv4_ttl = ttl;
-       tun_info->tunnel.tun_flags = tun_flags;
-
-       /* For the tunnel types on the top of IPsec, the tp_src and tp_dst of
-        * the upper tunnel are used.
-        * E.g: GRE over IPSEC, the tp_src and tp_port are zero.
-        */
-       tun_info->tunnel.tp_src = tp_src;
-       tun_info->tunnel.tp_dst = tp_dst;
-
-       /* Clear struct padding. */
-       if (sizeof(tun_info->tunnel) != OVS_TUNNEL_KEY_SIZE)
-               memset((unsigned char *)&tun_info->tunnel + OVS_TUNNEL_KEY_SIZE,
-                      0, sizeof(tun_info->tunnel) - OVS_TUNNEL_KEY_SIZE);
-
-       tun_info->options = opts;
-       tun_info->options_len = opts_len;
-}
-
-static inline void ovs_flow_tun_info_init(struct ovs_tunnel_info *tun_info,
-                                         const struct iphdr *iph,
-                                         __be16 tp_src,
-                                         __be16 tp_dst,
-                                         __be64 tun_id,
-                                         __be16 tun_flags,
-                                         const void *opts,
-                                         u8 opts_len)
-{
-       __ovs_flow_tun_info_init(tun_info, iph->saddr, iph->daddr,
-                                iph->tos, iph->ttl,
-                                tp_src, tp_dst,
-                                tun_id, tun_flags,
-                                opts, opts_len);
-}
+struct ovs_tunnel_info {
+       struct metadata_dst     *tun_dst;
+};
 
 #define OVS_SW_FLOW_KEY_METADATA_SIZE                  \
        (offsetof(struct sw_flow_key, recirc_id) +      \
@@ -122,12 +57,13 @@ static inline void ovs_flow_tun_info_init(struct ovs_tunnel_info *tun_info,
 struct sw_flow_key {
        u8 tun_opts[255];
        u8 tun_opts_len;
-       struct ovs_key_ipv4_tunnel tun_key;  /* Encapsulating tunnel key. */
+       struct ip_tunnel_key tun_key;   /* Encapsulating tunnel key. */
        struct {
                u32     priority;       /* Packet QoS priority. */
                u32     skb_mark;       /* SKB mark. */
                u16     in_port;        /* Input switch port (or DP_MAX_PORTS). */
        } __packed phy; /* Safe when right after 'tun_key'. */
+       u8 tun_proto;                   /* Protocol of encapsulating tunnel. */
        u32 ovs_flow_hash;              /* Datapath computed hash value.  */
        u32 recirc_id;                  /* Recirculation ID.  */
        struct {
@@ -176,6 +112,14 @@ struct sw_flow_key {
                        } nd;
                } ipv6;
        };
+       struct {
+               /* Connection tracking fields. */
+               u16 zone;
+               u32 mark;
+               u8 state;
+               struct ovs_key_ct_labels labels;
+       } ct;
+
 } __aligned(BITS_PER_LONG/8); /* Ensure that we can do comparisons as longs. */
 
 struct sw_flow_key_range {
@@ -209,6 +153,7 @@ struct sw_flow_id {
 
 struct sw_flow_actions {
        struct rcu_head rcu;
+       size_t orig_len;        /* From flow_cmd_new netlink actions size */
        u32 actions_len;
        struct nlattr actions[];
 };
@@ -273,11 +218,11 @@ void ovs_flow_stats_clear(struct sw_flow *);
 u64 ovs_flow_used_time(unsigned long flow_jiffies);
 
 int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key);
-int ovs_flow_key_extract(const struct ovs_tunnel_info *tun_info,
+int ovs_flow_key_extract(const struct ip_tunnel_info *tun_info,
                         struct sk_buff *skb,
                         struct sw_flow_key *key);
 /* Extract key from packet coming from userspace. */
-int ovs_flow_key_extract_userspace(const struct nlattr *attr,
+int ovs_flow_key_extract_userspace(struct net *net, const struct nlattr *attr,
                                   struct sk_buff *skb,
                                   struct sw_flow_key *key, bool log);