2 * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Nicira, Inc.
3 * Copyright (c) 2016 Mellanox Technologies, Ltd.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
21 #include <sys/types.h>
22 #include <netinet/in.h> /* Must happen before linux/pkt_cls.h - Glibc #20215 */
23 #include <linux/pkt_cls.h>
24 #include <linux/pkt_sched.h>
26 #include "netlink-socket.h"
27 #include "odp-netlink.h"
28 #include "openvswitch/ofpbuf.h"
29 #include "openvswitch/flow.h"
30 #include "openvswitch/tun-metadata.h"
32 /* For backwards compatability with older kernels */
34 #define TC_H_CLSACT TC_H_INGRESS
36 #ifndef TC_H_MIN_INGRESS
37 #define TC_H_MIN_INGRESS 0xFFF2U
40 #define TC_INGRESS_PARENT TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS)
42 #define TC_POLICY_DEFAULT "none"
44 enum tc_flower_reserved_prio
{
45 TC_RESERVED_PRIORITY_NONE
,
46 TC_RESERVED_PRIORITY_POLICE
,
47 __TC_RESERVED_PRIORITY_MAX
49 #define TC_RESERVED_PRIORITY_MAX (__TC_RESERVED_PRIORITY_MAX -1)
51 /* Returns tc handle 'major':'minor'. */
52 static inline unsigned int
53 tc_make_handle(unsigned int major
, unsigned int minor
)
55 return TC_H_MAKE(major
<< 16, minor
);
58 /* Returns the major number from 'handle'. */
59 static inline unsigned int
60 tc_get_major(unsigned int handle
)
62 return TC_H_MAJ(handle
) >> 16;
65 /* Returns the minor number from 'handle'. */
66 static inline unsigned int
67 tc_get_minor(unsigned int handle
)
69 return TC_H_MIN(handle
);
72 struct tcmsg
*tc_make_request(int ifindex
, int type
,
73 unsigned int flags
, struct ofpbuf
*);
74 int tc_transact(struct ofpbuf
*request
, struct ofpbuf
**replyp
);
75 int tc_add_del_ingress_qdisc(int ifindex
, bool add
, uint32_t block_id
);
82 struct tc_flower_key
{
86 struct eth_addr dst_mac
;
87 struct eth_addr src_mac
;
100 uint16_t vlan_id
[FLOW_MAX_VLAN_HEADERS
];
101 uint8_t vlan_prio
[FLOW_MAX_VLAN_HEADERS
];
103 ovs_be16 encap_eth_type
[FLOW_MAX_VLAN_HEADERS
];
116 struct in6_addr ipv6_src
;
117 struct in6_addr ipv6_dst
;
118 uint8_t rewrite_hlimit
;
119 uint8_t rewrite_tclass
;
128 struct in6_addr ipv6_src
;
129 struct in6_addr ipv6_dst
;
136 struct tun_metadata metadata
;
140 enum tc_action_type
{
156 ovs_be16 vlan_push_tpid
;
157 uint16_t vlan_push_id
;
158 uint8_t vlan_push_prio
;
174 struct in6_addr ipv6_src
;
175 struct in6_addr ipv6_dst
;
177 struct tun_metadata data
;
181 enum tc_action_type type
;
184 enum tc_offloaded_state
{
185 TC_OFFLOADED_STATE_UNDEFINED
,
186 TC_OFFLOADED_STATE_IN_HW
,
187 TC_OFFLOADED_STATE_NOT_IN_HW
,
194 struct tc_flower_key key
;
195 struct tc_flower_key mask
;
198 struct tc_action actions
[TCA_ACT_MAX_PRIO
];
200 struct ovs_flow_stats stats
;
205 struct tc_flower_key key
;
206 struct tc_flower_key mask
;
209 uint32_t csum_update_flags
;
213 struct tc_cookie act_cookie
;
215 bool needs_full_ip_proto_mask
;
217 enum tc_offloaded_state offloaded_state
;
220 /* assert that if we overflow with a masked write of uint32_t to the last byte
221 * of flower.rewrite we overflow inside struct flower.
222 * shouldn't happen unless someone moves rewrite to the end of flower */
223 BUILD_ASSERT_DECL(offsetof(struct tc_flower
, rewrite
)
224 + MEMBER_SIZEOF(struct tc_flower
, rewrite
)
225 + sizeof(uint32_t) - 2 < sizeof(struct tc_flower
));
227 int tc_replace_flower(int ifindex
, uint16_t prio
, uint32_t handle
,
228 struct tc_flower
*flower
, uint32_t block_id
);
229 int tc_del_filter(int ifindex
, int prio
, int handle
, uint32_t block_id
);
230 int tc_get_flower(int ifindex
, int prio
, int handle
,
231 struct tc_flower
*flower
, uint32_t block_id
);
232 int tc_flush(int ifindex
, uint32_t block_id
);
233 int tc_dump_flower_start(int ifindex
, struct nl_dump
*dump
, uint32_t block_id
);
234 int parse_netlink_to_tc_flower(struct ofpbuf
*reply
,
235 struct tc_flower
*flower
);
236 void tc_set_policy(const char *policy
);