linux/net/openvswitch/flow.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2007-2017 Nicira, Inc.
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of version 2 of the GNU General Public
   6 * License as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful, but
   9 * WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11 * General Public License for more details.
  12 *
  13 * You should have received a copy of the GNU General Public License
  14 * along with this program; if not, write to the Free Software
  15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  16 * 02110-1301, USA
  17 */
  18
  19#ifndef FLOW_H
  20#define FLOW_H 1
  21
  22#include <linux/cache.h>
  23#include <linux/kernel.h>
  24#include <linux/netlink.h>
  25#include <linux/openvswitch.h>
  26#include <linux/spinlock.h>
  27#include <linux/types.h>
  28#include <linux/rcupdate.h>
  29#include <linux/if_ether.h>
  30#include <linux/in6.h>
  31#include <linux/jiffies.h>
  32#include <linux/time.h>
  33#include <linux/flex_array.h>
  34#include <linux/cpumask.h>
  35#include <net/inet_ecn.h>
  36#include <net/ip_tunnels.h>
  37#include <net/dst_metadata.h>
  38
  39struct sk_buff;
  40
  41enum sw_flow_mac_proto {
  42        MAC_PROTO_NONE = 0,
  43        MAC_PROTO_ETHERNET,
  44};
  45#define SW_FLOW_KEY_INVALID     0x80
  46
  47/* Store options at the end of the array if they are less than the
  48 * maximum size. This allows us to get the benefits of variable length
  49 * matching for small options.
  50 */
  51#define TUN_METADATA_OFFSET(opt_len) \
  52        (FIELD_SIZEOF(struct sw_flow_key, tun_opts) - opt_len)
  53#define TUN_METADATA_OPTS(flow_key, opt_len) \
  54        ((void *)((flow_key)->tun_opts + TUN_METADATA_OFFSET(opt_len)))
  55
  56struct ovs_tunnel_info {
  57        struct metadata_dst     *tun_dst;
  58};
  59
  60struct vlan_head {
  61        __be16 tpid; /* Vlan type. Generally 802.1q or 802.1ad.*/
  62        __be16 tci;  /* 0 if no VLAN, VLAN_TAG_PRESENT set otherwise. */
  63};
  64
  65#define OVS_SW_FLOW_KEY_METADATA_SIZE                   \
  66        (offsetof(struct sw_flow_key, recirc_id) +      \
  67        FIELD_SIZEOF(struct sw_flow_key, recirc_id))
  68
  69struct sw_flow_key {
  70        u8 tun_opts[IP_TUNNEL_OPTS_MAX];
  71        u8 tun_opts_len;
  72        struct ip_tunnel_key tun_key;   /* Encapsulating tunnel key. */
  73        struct {
  74                u32     priority;       /* Packet QoS priority. */
  75                u32     skb_mark;       /* SKB mark. */
  76                u16     in_port;        /* Input switch port (or DP_MAX_PORTS). */
  77        } __packed phy; /* Safe when right after 'tun_key'. */
  78        u8 mac_proto;                   /* MAC layer protocol (e.g. Ethernet). */
  79        u8 tun_proto;                   /* Protocol of encapsulating tunnel. */
  80        u32 ovs_flow_hash;              /* Datapath computed hash value.  */
  81        u32 recirc_id;                  /* Recirculation ID.  */
  82        struct {
  83                u8     src[ETH_ALEN];   /* Ethernet source address. */
  84                u8     dst[ETH_ALEN];   /* Ethernet destination address. */
  85                struct vlan_head vlan;
  86                struct vlan_head cvlan;
  87                __be16 type;            /* Ethernet frame type. */
  88        } eth;
  89        /* Filling a hole of two bytes. */
  90        u8 ct_state;
  91        u8 ct_orig_proto;               /* CT original direction tuple IP
  92                                         * protocol.
  93                                         */
  94        union {
  95                struct {
  96                        __be32 top_lse; /* top label stack entry */
  97                } mpls;
  98                struct {
  99                        u8     proto;   /* IP protocol or lower 8 bits of ARP opcode. */
 100                        u8     tos;         /* IP ToS. */
 101                        u8     ttl;         /* IP TTL/hop limit. */
 102                        u8     frag;    /* One of OVS_FRAG_TYPE_*. */
 103                } ip;
 104        };
 105        u16 ct_zone;                    /* Conntrack zone. */
 106        struct {
 107                __be16 src;             /* TCP/UDP/SCTP source port. */
 108                __be16 dst;             /* TCP/UDP/SCTP destination port. */
 109                __be16 flags;           /* TCP flags. */
 110        } tp;
 111        union {
 112                struct {
 113                        struct {
 114                                __be32 src;     /* IP source address. */
 115                                __be32 dst;     /* IP destination address. */
 116                        } addr;
 117                        union {
 118                                struct {
 119                                        __be32 src;
 120                                        __be32 dst;
 121                                } ct_orig;      /* Conntrack original direction fields. */
 122                                struct {
 123                                        u8 sha[ETH_ALEN];       /* ARP source hardware address. */
 124                                        u8 tha[ETH_ALEN];       /* ARP target hardware address. */
 125                                } arp;
 126                        };
 127                } ipv4;
 128                struct {
 129                        struct {
 130                                struct in6_addr src;    /* IPv6 source address. */
 131                                struct in6_addr dst;    /* IPv6 destination address. */
 132                        } addr;
 133                        __be32 label;                   /* IPv6 flow label. */
 134                        union {
 135                                struct {
 136                                        struct in6_addr src;
 137                                        struct in6_addr dst;
 138                                } ct_orig;      /* Conntrack original direction fields. */
 139                                struct {
 140                                        struct in6_addr target; /* ND target address. */
 141                                        u8 sll[ETH_ALEN];       /* ND source link layer address. */
 142                                        u8 tll[ETH_ALEN];       /* ND target link layer address. */
 143                                } nd;
 144                        };
 145                } ipv6;
 146        };
 147        struct {
 148                /* Connection tracking fields not packed above. */
 149                struct {
 150                        __be16 src;     /* CT orig tuple tp src port. */
 151                        __be16 dst;     /* CT orig tuple tp dst port. */
 152                } orig_tp;
 153                u32 mark;
 154                struct ovs_key_ct_labels labels;
 155        } ct;
 156
 157} __aligned(BITS_PER_LONG/8); /* Ensure that we can do comparisons as longs. */
 158
 159static inline bool sw_flow_key_is_nd(const struct sw_flow_key *key)
 160{
 161        return key->eth.type == htons(ETH_P_IPV6) &&
 162                key->ip.proto == NEXTHDR_ICMP &&
 163                key->tp.dst == 0 &&
 164                (key->tp.src == htons(NDISC_NEIGHBOUR_SOLICITATION) ||
 165                 key->tp.src == htons(NDISC_NEIGHBOUR_ADVERTISEMENT));
 166}
 167
 168struct sw_flow_key_range {
 169        unsigned short int start;
 170        unsigned short int end;
 171};
 172
 173struct sw_flow_mask {
 174        int ref_count;
 175        struct rcu_head rcu;
 176        struct list_head list;
 177        struct sw_flow_key_range range;
 178        struct sw_flow_key key;
 179};
 180
 181struct sw_flow_match {
 182        struct sw_flow_key *key;
 183        struct sw_flow_key_range range;
 184        struct sw_flow_mask *mask;
 185};
 186
 187#define MAX_UFID_LENGTH 16 /* 128 bits */
 188
 189struct sw_flow_id {
 190        u32 ufid_len;
 191        union {
 192                u32 ufid[MAX_UFID_LENGTH / 4];
 193                struct sw_flow_key *unmasked_key;
 194        };
 195};
 196
 197struct sw_flow_actions {
 198        struct rcu_head rcu;
 199        size_t orig_len;        /* From flow_cmd_new netlink actions size */
 200        u32 actions_len;
 201        struct nlattr actions[];
 202};
 203
 204struct flow_stats {
 205        u64 packet_count;               /* Number of packets matched. */
 206        u64 byte_count;                 /* Number of bytes matched. */
 207        unsigned long used;             /* Last used time (in jiffies). */
 208        spinlock_t lock;                /* Lock for atomic stats update. */
 209        __be16 tcp_flags;               /* Union of seen TCP flags. */
 210};
 211
 212struct sw_flow {
 213        struct rcu_head rcu;
 214        struct {
 215                struct hlist_node node[2];
 216                u32 hash;
 217        } flow_table, ufid_table;
 218        int stats_last_writer;          /* CPU id of the last writer on
 219                                         * 'stats[0]'.
 220                                         */
 221        struct sw_flow_key key;
 222        struct sw_flow_id id;
 223        struct cpumask cpu_used_mask;
 224        struct sw_flow_mask *mask;
 225        struct sw_flow_actions __rcu *sf_acts;
 226        struct flow_stats __rcu *stats[]; /* One for each CPU.  First one
 227                                           * is allocated at flow creation time,
 228                                           * the rest are allocated on demand
 229                                           * while holding the 'stats[0].lock'.
 230                                           */
 231};
 232
 233struct arp_eth_header {
 234        __be16      ar_hrd;     /* format of hardware address   */
 235        __be16      ar_pro;     /* format of protocol address   */
 236        unsigned char   ar_hln; /* length of hardware address   */
 237        unsigned char   ar_pln; /* length of protocol address   */
 238        __be16      ar_op;      /* ARP opcode (command)     */
 239
 240        /* Ethernet+IPv4 specific members. */
 241        unsigned char       ar_sha[ETH_ALEN];   /* sender hardware address  */
 242        unsigned char       ar_sip[4];          /* sender IP address        */
 243        unsigned char       ar_tha[ETH_ALEN];   /* target hardware address  */
 244        unsigned char       ar_tip[4];          /* target IP address        */
 245} __packed;
 246
 247static inline u8 ovs_key_mac_proto(const struct sw_flow_key *key)
 248{
 249        return key->mac_proto & ~SW_FLOW_KEY_INVALID;
 250}
 251
 252static inline u16 __ovs_mac_header_len(u8 mac_proto)
 253{
 254        return mac_proto == MAC_PROTO_ETHERNET ? ETH_HLEN : 0;
 255}
 256
 257static inline u16 ovs_mac_header_len(const struct sw_flow_key *key)
 258{
 259        return __ovs_mac_header_len(ovs_key_mac_proto(key));
 260}
 261
 262static inline bool ovs_identifier_is_ufid(const struct sw_flow_id *sfid)
 263{
 264        return sfid->ufid_len;
 265}
 266
 267static inline bool ovs_identifier_is_key(const struct sw_flow_id *sfid)
 268{
 269        return !ovs_identifier_is_ufid(sfid);
 270}
 271
 272void ovs_flow_stats_update(struct sw_flow *, __be16 tcp_flags,
 273                           const struct sk_buff *);
 274void ovs_flow_stats_get(const struct sw_flow *, struct ovs_flow_stats *,
 275                        unsigned long *used, __be16 *tcp_flags);
 276void ovs_flow_stats_clear(struct sw_flow *);
 277u64 ovs_flow_used_time(unsigned long flow_jiffies);
 278
 279int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key);
 280int ovs_flow_key_extract(const struct ip_tunnel_info *tun_info,
 281                         struct sk_buff *skb,
 282                         struct sw_flow_key *key);
 283/* Extract key from packet coming from userspace. */
 284int ovs_flow_key_extract_userspace(struct net *net, const struct nlattr *attr,
 285                                   struct sk_buff *skb,
 286                                   struct sw_flow_key *key, bool log);
 287
 288#endif /* flow.h */
 289