linux/net/openvswitch/flow.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2007-2014 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 <net/inet_ecn.h>
  35
  36struct sk_buff;
  37
  38/* Used to memset ovs_key_ipv4_tunnel padding. */
  39#define OVS_TUNNEL_KEY_SIZE                                     \
  40        (offsetof(struct ovs_key_ipv4_tunnel, ipv4_ttl) +       \
  41        FIELD_SIZEOF(struct ovs_key_ipv4_tunnel, ipv4_ttl))
  42
  43struct ovs_key_ipv4_tunnel {
  44        __be64 tun_id;
  45        __be32 ipv4_src;
  46        __be32 ipv4_dst;
  47        __be16 tun_flags;
  48        u8   ipv4_tos;
  49        u8   ipv4_ttl;
  50} __packed __aligned(4); /* Minimize padding. */
  51
  52static inline void ovs_flow_tun_key_init(struct ovs_key_ipv4_tunnel *tun_key,
  53                                         const struct iphdr *iph, __be64 tun_id,
  54                                         __be16 tun_flags)
  55{
  56        tun_key->tun_id = tun_id;
  57        tun_key->ipv4_src = iph->saddr;
  58        tun_key->ipv4_dst = iph->daddr;
  59        tun_key->ipv4_tos = iph->tos;
  60        tun_key->ipv4_ttl = iph->ttl;
  61        tun_key->tun_flags = tun_flags;
  62
  63        /* clear struct padding. */
  64        memset((unsigned char *) tun_key + OVS_TUNNEL_KEY_SIZE, 0,
  65               sizeof(*tun_key) - OVS_TUNNEL_KEY_SIZE);
  66}
  67
  68struct sw_flow_key {
  69        struct ovs_key_ipv4_tunnel tun_key;  /* Encapsulating tunnel key. */
  70        struct {
  71                u32     priority;       /* Packet QoS priority. */
  72                u32     skb_mark;       /* SKB mark. */
  73                u16     in_port;        /* Input switch port (or DP_MAX_PORTS). */
  74        } __packed phy; /* Safe when right after 'tun_key'. */
  75        struct {
  76                u8     src[ETH_ALEN];   /* Ethernet source address. */
  77                u8     dst[ETH_ALEN];   /* Ethernet destination address. */
  78                __be16 tci;             /* 0 if no VLAN, VLAN_TAG_PRESENT set otherwise. */
  79                __be16 type;            /* Ethernet frame type. */
  80        } eth;
  81        struct {
  82                u8     proto;           /* IP protocol or lower 8 bits of ARP opcode. */
  83                u8     tos;             /* IP ToS. */
  84                u8     ttl;             /* IP TTL/hop limit. */
  85                u8     frag;            /* One of OVS_FRAG_TYPE_*. */
  86        } ip;
  87        struct {
  88                __be16 src;             /* TCP/UDP/SCTP source port. */
  89                __be16 dst;             /* TCP/UDP/SCTP destination port. */
  90                __be16 flags;           /* TCP flags. */
  91        } tp;
  92        union {
  93                struct {
  94                        struct {
  95                                __be32 src;     /* IP source address. */
  96                                __be32 dst;     /* IP destination address. */
  97                        } addr;
  98                        struct {
  99                                u8 sha[ETH_ALEN];       /* ARP source hardware address. */
 100                                u8 tha[ETH_ALEN];       /* ARP target hardware address. */
 101                        } arp;
 102                } ipv4;
 103                struct {
 104                        struct {
 105                                struct in6_addr src;    /* IPv6 source address. */
 106                                struct in6_addr dst;    /* IPv6 destination address. */
 107                        } addr;
 108                        __be32 label;                   /* IPv6 flow label. */
 109                        struct {
 110                                struct in6_addr target; /* ND target address. */
 111                                u8 sll[ETH_ALEN];       /* ND source link layer address. */
 112                                u8 tll[ETH_ALEN];       /* ND target link layer address. */
 113                        } nd;
 114                } ipv6;
 115        };
 116} __aligned(BITS_PER_LONG/8); /* Ensure that we can do comparisons as longs. */
 117
 118struct sw_flow_key_range {
 119        unsigned short int start;
 120        unsigned short int end;
 121};
 122
 123struct sw_flow_mask {
 124        int ref_count;
 125        struct rcu_head rcu;
 126        struct list_head list;
 127        struct sw_flow_key_range range;
 128        struct sw_flow_key key;
 129};
 130
 131struct sw_flow_match {
 132        struct sw_flow_key *key;
 133        struct sw_flow_key_range range;
 134        struct sw_flow_mask *mask;
 135};
 136
 137struct sw_flow_actions {
 138        struct rcu_head rcu;
 139        u32 actions_len;
 140        struct nlattr actions[];
 141};
 142
 143struct flow_stats {
 144        u64 packet_count;               /* Number of packets matched. */
 145        u64 byte_count;                 /* Number of bytes matched. */
 146        unsigned long used;             /* Last used time (in jiffies). */
 147        spinlock_t lock;                /* Lock for atomic stats update. */
 148        __be16 tcp_flags;               /* Union of seen TCP flags. */
 149};
 150
 151struct sw_flow {
 152        struct rcu_head rcu;
 153        struct hlist_node hash_node[2];
 154        u32 hash;
 155        int stats_last_writer;          /* NUMA-node id of the last writer on
 156                                         * 'stats[0]'.
 157                                         */
 158        struct sw_flow_key key;
 159        struct sw_flow_key unmasked_key;
 160        struct sw_flow_mask *mask;
 161        struct sw_flow_actions __rcu *sf_acts;
 162        struct flow_stats __rcu *stats[]; /* One for each NUMA node.  First one
 163                                           * is allocated at flow creation time,
 164                                           * the rest are allocated on demand
 165                                           * while holding the 'stats[0].lock'.
 166                                           */
 167};
 168
 169struct arp_eth_header {
 170        __be16      ar_hrd;     /* format of hardware address   */
 171        __be16      ar_pro;     /* format of protocol address   */
 172        unsigned char   ar_hln; /* length of hardware address   */
 173        unsigned char   ar_pln; /* length of protocol address   */
 174        __be16      ar_op;      /* ARP opcode (command)     */
 175
 176        /* Ethernet+IPv4 specific members. */
 177        unsigned char       ar_sha[ETH_ALEN];   /* sender hardware address  */
 178        unsigned char       ar_sip[4];          /* sender IP address        */
 179        unsigned char       ar_tha[ETH_ALEN];   /* target hardware address  */
 180        unsigned char       ar_tip[4];          /* target IP address        */
 181} __packed;
 182
 183void ovs_flow_stats_update(struct sw_flow *, __be16 tcp_flags,
 184                           struct sk_buff *);
 185void ovs_flow_stats_get(const struct sw_flow *, struct ovs_flow_stats *,
 186                        unsigned long *used, __be16 *tcp_flags);
 187void ovs_flow_stats_clear(struct sw_flow *);
 188u64 ovs_flow_used_time(unsigned long flow_jiffies);
 189
 190int ovs_flow_extract(struct sk_buff *, u16 in_port, struct sw_flow_key *);
 191
 192#endif /* flow.h */
 193