linux/include/net/flow_dissector.h
<<
>>
Prefs
   1#ifndef _NET_FLOW_DISSECTOR_H
   2#define _NET_FLOW_DISSECTOR_H
   3
   4#include <linux/types.h>
   5#include <linux/in6.h>
   6#include <uapi/linux/if_ether.h>
   7
   8/**
   9 * struct flow_dissector_key_control:
  10 * @thoff: Transport header offset
  11 */
  12struct flow_dissector_key_control {
  13        u16     thoff;
  14        u16     addr_type;
  15        u32     flags;
  16};
  17
  18#define FLOW_DIS_IS_FRAGMENT    BIT(0)
  19#define FLOW_DIS_FIRST_FRAG     BIT(1)
  20#define FLOW_DIS_ENCAPSULATION  BIT(2)
  21
  22/**
  23 * struct flow_dissector_key_basic:
  24 * @thoff: Transport header offset
  25 * @n_proto: Network header protocol (eg. IPv4/IPv6)
  26 * @ip_proto: Transport header protocol (eg. TCP/UDP)
  27 */
  28struct flow_dissector_key_basic {
  29        __be16  n_proto;
  30        u8      ip_proto;
  31        u8      padding;
  32};
  33
  34struct flow_dissector_key_tags {
  35        u32     flow_label;
  36};
  37
  38struct flow_dissector_key_vlan {
  39        u16     vlan_id:12,
  40                vlan_priority:3;
  41        u16     padding;
  42};
  43
  44struct flow_dissector_key_mpls {
  45        u32     mpls_ttl:8,
  46                mpls_bos:1,
  47                mpls_tc:3,
  48                mpls_label:20;
  49};
  50
  51struct flow_dissector_key_keyid {
  52        __be32  keyid;
  53};
  54
  55/**
  56 * struct flow_dissector_key_ipv4_addrs:
  57 * @src: source ip address
  58 * @dst: destination ip address
  59 */
  60struct flow_dissector_key_ipv4_addrs {
  61        /* (src,dst) must be grouped, in the same way than in IP header */
  62        __be32 src;
  63        __be32 dst;
  64};
  65
  66/**
  67 * struct flow_dissector_key_ipv6_addrs:
  68 * @src: source ip address
  69 * @dst: destination ip address
  70 */
  71struct flow_dissector_key_ipv6_addrs {
  72        /* (src,dst) must be grouped, in the same way than in IP header */
  73        struct in6_addr src;
  74        struct in6_addr dst;
  75};
  76
  77/**
  78 * struct flow_dissector_key_tipc_addrs:
  79 * @srcnode: source node address
  80 */
  81struct flow_dissector_key_tipc_addrs {
  82        __be32 srcnode;
  83};
  84
  85/**
  86 * struct flow_dissector_key_addrs:
  87 * @v4addrs: IPv4 addresses
  88 * @v6addrs: IPv6 addresses
  89 */
  90struct flow_dissector_key_addrs {
  91        union {
  92                struct flow_dissector_key_ipv4_addrs v4addrs;
  93                struct flow_dissector_key_ipv6_addrs v6addrs;
  94                struct flow_dissector_key_tipc_addrs tipcaddrs;
  95        };
  96};
  97
  98/**
  99 * flow_dissector_key_arp:
 100 *      @ports: Operation, source and target addresses for an ARP header
 101 *              for Ethernet hardware addresses and IPv4 protocol addresses
 102 *              sip: Sender IP address
 103 *              tip: Target IP address
 104 *              op:  Operation
 105 *              sha: Sender hardware address
 106 *              tpa: Target hardware address
 107 */
 108struct flow_dissector_key_arp {
 109        __u32 sip;
 110        __u32 tip;
 111        __u8 op;
 112        unsigned char sha[ETH_ALEN];
 113        unsigned char tha[ETH_ALEN];
 114};
 115
 116/**
 117 * flow_dissector_key_tp_ports:
 118 *      @ports: port numbers of Transport header
 119 *              src: source port number
 120 *              dst: destination port number
 121 */
 122struct flow_dissector_key_ports {
 123        union {
 124                __be32 ports;
 125                struct {
 126                        __be16 src;
 127                        __be16 dst;
 128                };
 129        };
 130};
 131
 132/**
 133 * flow_dissector_key_icmp:
 134 *      @ports: type and code of ICMP header
 135 *              icmp: ICMP type (high) and code (low)
 136 *              type: ICMP type
 137 *              code: ICMP code
 138 */
 139struct flow_dissector_key_icmp {
 140        union {
 141                __be16 icmp;
 142                struct {
 143                        u8 type;
 144                        u8 code;
 145                };
 146        };
 147};
 148
 149/**
 150 * struct flow_dissector_key_eth_addrs:
 151 * @src: source Ethernet address
 152 * @dst: destination Ethernet address
 153 */
 154struct flow_dissector_key_eth_addrs {
 155        /* (dst,src) must be grouped, in the same way than in ETH header */
 156        unsigned char dst[ETH_ALEN];
 157        unsigned char src[ETH_ALEN];
 158};
 159
 160enum flow_dissector_key_id {
 161        FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */
 162        FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
 163        FLOW_DISSECTOR_KEY_IPV4_ADDRS, /* struct flow_dissector_key_ipv4_addrs */
 164        FLOW_DISSECTOR_KEY_IPV6_ADDRS, /* struct flow_dissector_key_ipv6_addrs */
 165        FLOW_DISSECTOR_KEY_PORTS, /* struct flow_dissector_key_ports */
 166        FLOW_DISSECTOR_KEY_ICMP, /* struct flow_dissector_key_icmp */
 167        FLOW_DISSECTOR_KEY_ETH_ADDRS, /* struct flow_dissector_key_eth_addrs */
 168        FLOW_DISSECTOR_KEY_TIPC_ADDRS, /* struct flow_dissector_key_tipc_addrs */
 169        FLOW_DISSECTOR_KEY_ARP, /* struct flow_dissector_key_arp */
 170        FLOW_DISSECTOR_KEY_VLAN, /* struct flow_dissector_key_flow_vlan */
 171        FLOW_DISSECTOR_KEY_FLOW_LABEL, /* struct flow_dissector_key_flow_tags */
 172        FLOW_DISSECTOR_KEY_GRE_KEYID, /* struct flow_dissector_key_keyid */
 173        FLOW_DISSECTOR_KEY_MPLS_ENTROPY, /* struct flow_dissector_key_keyid */
 174        FLOW_DISSECTOR_KEY_ENC_KEYID, /* struct flow_dissector_key_keyid */
 175        FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS, /* struct flow_dissector_key_ipv4_addrs */
 176        FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS, /* struct flow_dissector_key_ipv6_addrs */
 177        FLOW_DISSECTOR_KEY_ENC_CONTROL, /* struct flow_dissector_key_control */
 178        FLOW_DISSECTOR_KEY_ENC_PORTS, /* struct flow_dissector_key_ports */
 179        FLOW_DISSECTOR_KEY_MPLS, /* struct flow_dissector_key_mpls */
 180
 181        FLOW_DISSECTOR_KEY_MAX,
 182};
 183
 184#define FLOW_DISSECTOR_F_PARSE_1ST_FRAG         BIT(0)
 185#define FLOW_DISSECTOR_F_STOP_AT_L3             BIT(1)
 186#define FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL     BIT(2)
 187#define FLOW_DISSECTOR_F_STOP_AT_ENCAP          BIT(3)
 188
 189struct flow_dissector_key {
 190        enum flow_dissector_key_id key_id;
 191        size_t offset; /* offset of struct flow_dissector_key_*
 192                          in target the struct */
 193};
 194
 195struct flow_dissector {
 196        unsigned int used_keys; /* each bit repesents presence of one key id */
 197        unsigned short int offset[FLOW_DISSECTOR_KEY_MAX];
 198};
 199
 200struct flow_keys {
 201        struct flow_dissector_key_control control;
 202#define FLOW_KEYS_HASH_START_FIELD basic
 203        struct flow_dissector_key_basic basic;
 204        struct flow_dissector_key_tags tags;
 205        struct flow_dissector_key_vlan vlan;
 206        struct flow_dissector_key_keyid keyid;
 207        struct flow_dissector_key_ports ports;
 208        struct flow_dissector_key_addrs addrs;
 209};
 210
 211#define FLOW_KEYS_HASH_OFFSET           \
 212        offsetof(struct flow_keys, FLOW_KEYS_HASH_START_FIELD)
 213
 214__be32 flow_get_u32_src(const struct flow_keys *flow);
 215__be32 flow_get_u32_dst(const struct flow_keys *flow);
 216
 217extern struct flow_dissector flow_keys_dissector;
 218extern struct flow_dissector flow_keys_buf_dissector;
 219
 220/* struct flow_keys_digest:
 221 *
 222 * This structure is used to hold a digest of the full flow keys. This is a
 223 * larger "hash" of a flow to allow definitively matching specific flows where
 224 * the 32 bit skb->hash is not large enough. The size is limited to 16 bytes so
 225 * that it can by used in CB of skb (see sch_choke for an example).
 226 */
 227#define FLOW_KEYS_DIGEST_LEN    16
 228struct flow_keys_digest {
 229        u8      data[FLOW_KEYS_DIGEST_LEN];
 230};
 231
 232void make_flow_keys_digest(struct flow_keys_digest *digest,
 233                           const struct flow_keys *flow);
 234
 235static inline bool flow_keys_have_l4(const struct flow_keys *keys)
 236{
 237        return (keys->ports.ports || keys->tags.flow_label);
 238}
 239
 240u32 flow_hash_from_keys(struct flow_keys *keys);
 241
 242static inline bool dissector_uses_key(const struct flow_dissector *flow_dissector,
 243                                      enum flow_dissector_key_id key_id)
 244{
 245        return flow_dissector->used_keys & (1 << key_id);
 246}
 247
 248static inline void *skb_flow_dissector_target(struct flow_dissector *flow_dissector,
 249                                              enum flow_dissector_key_id key_id,
 250                                              void *target_container)
 251{
 252        return ((char *)target_container) + flow_dissector->offset[key_id];
 253}
 254
 255#endif
 256