root/net/openvswitch/flow.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. sw_flow_key_is_nd
  2. ovs_key_mac_proto
  3. __ovs_mac_header_len
  4. ovs_mac_header_len
  5. ovs_identifier_is_ufid
  6. ovs_identifier_is_key

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

/* [<][>][^][v][top][bottom][index][help] */