ethdev: tunnel filter
[dpdk.git] / lib / librte_ether / rte_eth_ctrl.h
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  *
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #ifndef _RTE_ETH_CTRL_H_
35 #define _RTE_ETH_CTRL_H_
36
37 /**
38  * @file
39  *
40  * Ethernet device features and related data structures used
41  * by control APIs should be defined in this file.
42  *
43  */
44
45 #ifdef __cplusplus
46 extern "C" {
47 #endif
48
49 /**
50  * Feature filter types
51  */
52 enum rte_filter_type {
53         RTE_ETH_FILTER_NONE = 0,
54         RTE_ETH_FILTER_TUNNEL,
55         RTE_ETH_FILTER_MAX
56 };
57
58 /**
59  * Generic operations on filters
60  */
61 enum rte_filter_op {
62         RTE_ETH_FILTER_NOP = 0,
63         /**< used to check whether the type filter is supported */
64         RTE_ETH_FILTER_ADD,      /**< add filter entry */
65         RTE_ETH_FILTER_UPDATE,   /**< update filter entry */
66         RTE_ETH_FILTER_DELETE,   /**< delete filter entry */
67         RTE_ETH_FILTER_FLUSH,    /**< flush all entries */
68         RTE_ETH_FILTER_GET,      /**< get filter entry */
69         RTE_ETH_FILTER_SET,      /**< configurations */
70         RTE_ETH_FILTER_INFO,
71         /**< get information of filter, such as status or statistics */
72         RTE_ETH_FILTER_OP_MAX
73 };
74
75 /**
76  * Tunneled type.
77  */
78 enum rte_eth_tunnel_type {
79         RTE_TUNNEL_TYPE_NONE = 0,
80         RTE_TUNNEL_TYPE_VXLAN,
81         RTE_TUNNEL_TYPE_GENEVE,
82         RTE_TUNNEL_TYPE_TEREDO,
83         RTE_TUNNEL_TYPE_NVGRE,
84         RTE_TUNNEL_TYPE_MAX,
85 };
86
87 /**
88  * filter type of tunneling packet
89  */
90 #define ETH_TUNNEL_FILTER_OMAC  0x01 /**< filter by outer MAC addr */
91 #define ETH_TUNNEL_FILTER_OIP   0x02 /**< filter by outer IP Addr */
92 #define ETH_TUNNEL_FILTER_TENID 0x04 /**< filter by tenant ID */
93 #define ETH_TUNNEL_FILTER_IMAC  0x08 /**< filter by inner MAC addr */
94 #define ETH_TUNNEL_FILTER_IVLAN 0x10 /**< filter by inner VLAN ID */
95 #define ETH_TUNNEL_FILTER_IIP   0x20 /**< filter by inner IP addr */
96
97 #define RTE_TUNNEL_FILTER_IMAC_IVLAN (ETH_TUNNEL_FILTER_IMAC | \
98                                         ETH_TUNNEL_FILTER_IVLAN)
99 #define RTE_TUNNEL_FILTER_IMAC_IVLAN_TENID (ETH_TUNNEL_FILTER_IMAC | \
100                                         ETH_TUNNEL_FILTER_IVLAN | \
101                                         ETH_TUNNEL_FILTER_TENID)
102 #define RTE_TUNNEL_FILTER_IMAC_TENID (ETH_TUNNEL_FILTER_IMAC | \
103                                         ETH_TUNNEL_FILTER_TENID)
104 #define RTE_TUNNEL_FILTER_OMAC_TENID_IMAC (ETH_TUNNEL_FILTER_OMAC | \
105                                         ETH_TUNNEL_FILTER_TENID | \
106                                         ETH_TUNNEL_FILTER_IMAC)
107
108 /**
109  *  Select IPv4 or IPv6 for tunnel filters.
110  */
111 enum rte_tunnel_iptype {
112         RTE_TUNNEL_IPTYPE_IPV4 = 0, /**< IPv4. */
113         RTE_TUNNEL_IPTYPE_IPV6,     /**< IPv6. */
114 };
115
116 /**
117  * Tunneling Packet filter configuration.
118  */
119 struct rte_eth_tunnel_filter_conf {
120         struct ether_addr *outer_mac;  /**< Outer MAC address filter. */
121         struct ether_addr *inner_mac;  /**< Inner MAC address filter. */
122         uint16_t inner_vlan;           /**< Inner VLAN filter. */
123         enum rte_tunnel_iptype ip_type; /**< IP address type. */
124         union {
125                 uint32_t ipv4_addr;    /**< IPv4 source address to match. */
126                 uint32_t ipv6_addr[4]; /**< IPv6 source address to match. */
127         } ip_addr; /**< IPv4/IPv6 source address to match (union of above). */
128
129         uint16_t filter_type;   /**< Filter type. */
130         enum rte_eth_tunnel_type tunnel_type; /**< Tunnel Type. */
131         uint32_t tenant_id;     /** < Tenant number. */
132         uint16_t queue_id;      /** < queue number. */
133 };
134
135 #ifdef __cplusplus
136 }
137 #endif
138
139 #endif /* _RTE_ETH_CTRL_H_ */