]>
Commit | Line | Data |
---|---|---|
064af421 | 1 | /* |
275707c3 | 2 | * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. |
064af421 | 3 | * |
a14bc59f BP |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at: | |
064af421 | 7 | * |
a14bc59f BP |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
064af421 BP |
15 | */ |
16 | ||
17 | #ifndef NETDEV_H | |
18 | #define NETDEV_H 1 | |
19 | ||
b129cc98 | 20 | #include "openvswitch/netdev.h" |
dbba996b | 21 | #include "openvswitch/types.h" |
3bd0fd39 | 22 | #include "packets.h" |
c876a4bb | 23 | #include "flow.h" |
064af421 | 24 | |
fbfffdbb BP |
25 | #ifdef __cplusplus |
26 | extern "C" { | |
27 | #endif | |
28 | ||
ef5b15ac | 29 | /* Generic interface to network devices ("netdev"s). |
064af421 | 30 | * |
ef5b15ac BP |
31 | * Every port on a switch must have a corresponding netdev that must minimally |
32 | * support a few operations, such as the ability to read the netdev's MTU. | |
7c9afefd | 33 | * The Porting section of the documentation has more information in the |
86383816 BP |
34 | * "Writing a netdev Provider" section. |
35 | * | |
36 | * Thread-safety | |
37 | * ============= | |
38 | * | |
39 | * Most of the netdev functions are fully thread-safe: they may be called from | |
40 | * any number of threads on the same or different netdev objects. The | |
41 | * exceptions are: | |
42 | * | |
f7791740 PS |
43 | * netdev_rxq_recv() |
44 | * netdev_rxq_wait() | |
45 | * netdev_rxq_drain() | |
86383816 BP |
46 | * |
47 | * These functions are conditionally thread-safe: they may be called from | |
f7791740 PS |
48 | * different threads only on different netdev_rxq objects. (The client may |
49 | * create multiple netdev_rxq objects for a single netdev and access each | |
89454bf4 BP |
50 | * of those from a different thread.) |
51 | * | |
258e42fa | 52 | * NETDEV_QUEUE_FOR_EACH |
89454bf4 BP |
53 | * netdev_queue_dump_next() |
54 | * netdev_queue_dump_done() | |
55 | * | |
56 | * These functions are conditionally thread-safe: they may be called from | |
57 | * different threads only on different netdev_queue_dump objects. (The | |
58 | * client may create multiple netdev_queue_dump objects for a single | |
59 | * netdev and access each of those from a different thread.) | |
60 | */ | |
064af421 | 61 | |
1895cc8d | 62 | struct dp_packet_batch; |
e14deea0 | 63 | struct dp_packet; |
796223f5 | 64 | struct netdev_class; |
f7791740 | 65 | struct netdev_rxq; |
4b609110 | 66 | struct netdev_saved_flags; |
064af421 BP |
67 | struct ofpbuf; |
68 | struct in_addr; | |
69 | struct in6_addr; | |
79f1cbe9 | 70 | struct smap; |
19993ef3 | 71 | struct sset; |
a36de779 | 72 | struct ovs_action_push_tnl; |
064af421 | 73 | |
875ab130 BP |
74 | enum netdev_pt_mode { |
75 | /* The netdev is packet type aware. It can potentially carry any kind of | |
76 | * packet. This "modern" mode is appropriate for both netdevs that handle | |
77 | * only a single kind of packet (such as a virtual or physical Ethernet | |
78 | * interface) and for those that can handle multiple (such as VXLAN-GPE or | |
79 | * Geneve). */ | |
80 | NETDEV_PT_AWARE, | |
81 | ||
82 | /* The netdev sends and receives only Ethernet frames. The netdev cannot | |
83 | * carry packets other than Ethernet frames. This is a legacy mode for | |
84 | * backward compability with controllers that are not prepared to handle | |
85 | * OpenFlow 1.5+ "packet_type". */ | |
86 | NETDEV_PT_LEGACY_L2, | |
87 | ||
88 | /* The netdev sends and receives only IPv4 and IPv6 packets. The netdev | |
89 | * cannot carry Ethernet frames or other kinds of packets. | |
90 | * | |
91 | * IPv4 and IPv6 packets carried over the netdev are treated as Ethernet: | |
92 | * when they are received, they are converted to Ethernet by adding a dummy | |
93 | * header with the proper Ethertype; on tranmission, the Ethernet header is | |
94 | * stripped. This is a legacy mode for backward compability with | |
95 | * controllers that are not prepared to handle OpenFlow 1.5+ | |
96 | * "packet_type". */ | |
97 | NETDEV_PT_LEGACY_L3, | |
98 | }; | |
99 | ||
f431bf7d EJ |
100 | /* Configuration specific to tunnels. */ |
101 | struct netdev_tunnel_config { | |
102 | bool in_key_present; | |
103 | bool in_key_flow; | |
104 | ovs_be64 in_key; | |
105 | ||
106 | bool out_key_present; | |
107 | bool out_key_flow; | |
108 | ovs_be64 out_key; | |
109 | ||
110 | ovs_be16 dst_port; | |
111 | ||
0ad90c84 JR |
112 | bool ip_src_flow; |
113 | bool ip_dst_flow; | |
3ae91c01 JB |
114 | struct in6_addr ipv6_src; |
115 | struct in6_addr ipv6_dst; | |
f431bf7d | 116 | |
526df7d8 | 117 | uint32_t exts; |
bf4bbd0d PS |
118 | bool set_egress_pkt_mark; |
119 | uint32_t egress_pkt_mark; | |
526df7d8 | 120 | |
f431bf7d EJ |
121 | uint8_t ttl; |
122 | bool ttl_inherit; | |
123 | ||
124 | uint8_t tos; | |
125 | bool tos_inherit; | |
126 | ||
127 | bool csum; | |
f431bf7d | 128 | bool dont_fragment; |
875ab130 | 129 | enum netdev_pt_mode pt_mode; |
f431bf7d EJ |
130 | }; |
131 | ||
8b61709d BP |
132 | void netdev_run(void); |
133 | void netdev_wait(void); | |
134 | ||
19993ef3 | 135 | void netdev_enumerate_types(struct sset *types); |
94a53842 | 136 | bool netdev_is_reserved_name(const char *name); |
77909859 | 137 | |
f00fa8cb | 138 | int netdev_n_txq(const struct netdev *netdev); |
55c955bd | 139 | int netdev_n_rxq(const struct netdev *netdev); |
e4cfed38 | 140 | bool netdev_is_pmd(const struct netdev *netdev); |
57eebbb4 | 141 | bool netdev_has_tunnel_push_pop(const struct netdev *netdev); |
e4cfed38 | 142 | |
c1c9c9c4 | 143 | /* Open and close. */ |
e4cfed38 PS |
144 | int netdev_open(const char *name, const char *type, struct netdev **netdevp); |
145 | ||
0bb0393a | 146 | struct netdev *netdev_ref(const struct netdev *); |
fe83f81d | 147 | void netdev_remove(struct netdev *); |
064af421 BP |
148 | void netdev_close(struct netdev *); |
149 | ||
a75531e5 BP |
150 | void netdev_parse_name(const char *netdev_name, char **name, char **type); |
151 | ||
6d9e6eb4 | 152 | /* Options. */ |
bbe6109d | 153 | int netdev_set_config(struct netdev *, const struct smap *args, char **errp); |
79f1cbe9 | 154 | int netdev_get_config(const struct netdev *, struct smap *); |
f431bf7d EJ |
155 | const struct netdev_tunnel_config * |
156 | netdev_get_tunnel_config(const struct netdev *); | |
7dec44fe | 157 | int netdev_get_numa_id(const struct netdev *); |
6d9e6eb4 | 158 | |
c1c9c9c4 | 159 | /* Basic properties. */ |
8b61709d | 160 | const char *netdev_get_name(const struct netdev *); |
149f577a | 161 | const char *netdev_get_type(const struct netdev *); |
0a740f48 | 162 | const char *netdev_get_type_from_name(const char *); |
8b61709d | 163 | int netdev_get_mtu(const struct netdev *, int *mtup); |
4124cb12 | 164 | int netdev_set_mtu(struct netdev *, int mtu); |
3a414a0a DDP |
165 | void netdev_mtu_user_config(struct netdev *, bool); |
166 | bool netdev_mtu_is_user_config(struct netdev *); | |
9ab3d9a3 | 167 | int netdev_get_ifindex(const struct netdev *); |
050c60bf | 168 | int netdev_set_tx_multiq(struct netdev *, unsigned int n_txq); |
875ab130 | 169 | enum netdev_pt_mode netdev_get_pt_mode(const struct netdev *); |
5bfc0cd3 | 170 | |
796223f5 | 171 | /* Packet reception. */ |
55c955bd | 172 | int netdev_rxq_open(struct netdev *, struct netdev_rxq **, int id); |
f7791740 | 173 | void netdev_rxq_close(struct netdev_rxq *); |
796223f5 | 174 | |
f7791740 | 175 | const char *netdev_rxq_get_name(const struct netdev_rxq *); |
ce179f11 | 176 | int netdev_rxq_get_queue_id(const struct netdev_rxq *); |
796223f5 | 177 | |
1895cc8d | 178 | int netdev_rxq_recv(struct netdev_rxq *rx, struct dp_packet_batch *); |
f7791740 PS |
179 | void netdev_rxq_wait(struct netdev_rxq *); |
180 | int netdev_rxq_drain(struct netdev_rxq *); | |
8b61709d | 181 | |
796223f5 | 182 | /* Packet transmission. */ |
1895cc8d | 183 | int netdev_send(struct netdev *, int qid, struct dp_packet_batch *, |
324c8374 | 184 | bool may_steal, bool concurrent_txq); |
f00fa8cb | 185 | void netdev_send_wait(struct netdev *, int qid); |
8b61709d | 186 | |
18ebd48c PB |
187 | /* Flow offloading. */ |
188 | struct offload_info { | |
189 | const void *port_hmap_obj; /* To query ports info from netdev port map */ | |
190 | ovs_be16 tp_dst_port; /* Destination port for tunnel in SET action */ | |
191 | }; | |
192 | struct netdev_flow_dump; | |
193 | int netdev_flow_flush(struct netdev *); | |
194 | int netdev_flow_dump_create(struct netdev *, struct netdev_flow_dump **dump); | |
195 | int netdev_flow_dump_destroy(struct netdev_flow_dump *); | |
196 | bool netdev_flow_dump_next(struct netdev_flow_dump *, struct match *, | |
197 | struct nlattr **actions, struct dpif_flow_stats *, | |
198 | ovs_u128 *ufid, struct ofpbuf *rbuffer, | |
199 | struct ofpbuf *wbuffer); | |
200 | int netdev_flow_put(struct netdev *, struct match *, struct nlattr *actions, | |
201 | size_t actions_len, const ovs_u128 *, | |
202 | struct offload_info *, struct dpif_flow_stats *); | |
203 | int netdev_flow_get(struct netdev *, struct match *, struct nlattr **actions, | |
204 | const ovs_u128 *, struct dpif_flow_stats *, | |
205 | struct ofpbuf *wbuffer); | |
206 | int netdev_flow_del(struct netdev *, const ovs_u128 *, | |
207 | struct dpif_flow_stats *); | |
208 | int netdev_init_flow_api(struct netdev *); | |
53611f7b PB |
209 | bool netdev_is_flow_api_enabled(void); |
210 | void netdev_set_flow_api_enabled(const struct smap *ovs_other_config); | |
18ebd48c | 211 | |
32b77c31 PB |
212 | struct dpif_port; |
213 | int netdev_ports_insert(struct netdev *, const void *obj, struct dpif_port *); | |
214 | struct netdev *netdev_ports_get(odp_port_t port, const void *obj); | |
215 | int netdev_ports_remove(odp_port_t port, const void *obj); | |
216 | odp_port_t netdev_ifindex_to_odp_port(int ifindex); | |
f2280b41 PB |
217 | struct netdev_flow_dump **netdev_ports_flow_dump_create(const void *obj, |
218 | int *ports); | |
f7dde6df | 219 | void netdev_ports_flow_flush(const void *obj); |
0335a89c PB |
220 | int netdev_ports_flow_del(const void *obj, const ovs_u128 *ufid, |
221 | struct dpif_flow_stats *stats); | |
6c343984 PB |
222 | int netdev_ports_flow_get(const void *obj, struct match *match, |
223 | struct nlattr **actions, | |
224 | const ovs_u128 *ufid, | |
225 | struct dpif_flow_stats *stats, | |
226 | struct ofpbuf *buf); | |
32b77c31 | 227 | |
4975aa3e PS |
228 | /* native tunnel APIs */ |
229 | /* Structure to pass parameters required to build a tunnel header. */ | |
230 | struct netdev_tnl_build_header_params { | |
231 | const struct flow *flow; | |
232 | const struct in6_addr *s_ip; | |
233 | struct eth_addr dmac; | |
234 | struct eth_addr smac; | |
235 | bool is_ipv6; | |
236 | }; | |
237 | ||
238 | void | |
239 | netdev_init_tnl_build_header_params(struct netdev_tnl_build_header_params *params, | |
240 | const struct flow *tnl_flow, | |
241 | const struct in6_addr *src, | |
242 | struct eth_addr dmac, | |
243 | struct eth_addr smac); | |
244 | ||
c876a4bb | 245 | int netdev_build_header(const struct netdev *, struct ovs_action_push_tnl *data, |
4975aa3e PS |
246 | const struct netdev_tnl_build_header_params *params); |
247 | ||
a36de779 | 248 | int netdev_push_header(const struct netdev *netdev, |
1895cc8d | 249 | struct dp_packet_batch *, |
a36de779 | 250 | const struct ovs_action_push_tnl *data); |
9235b479 | 251 | void netdev_pop_header(struct netdev *netdev, struct dp_packet_batch *); |
a36de779 | 252 | |
c1c9c9c4 | 253 | /* Hardware address. */ |
74ff3298 JR |
254 | int netdev_set_etheraddr(struct netdev *, const struct eth_addr mac); |
255 | int netdev_get_etheraddr(const struct netdev *, struct eth_addr *mac); | |
8b61709d | 256 | |
c1c9c9c4 | 257 | /* PHY interface. */ |
85da620e | 258 | bool netdev_get_carrier(const struct netdev *); |
65c3058c | 259 | long long int netdev_get_carrier_resets(const struct netdev *); |
1670c579 | 260 | int netdev_set_miimon_interval(struct netdev *, long long int interval); |
6c038611 | 261 | |
4b609110 BP |
262 | /* Flags. */ |
263 | enum netdev_flags { | |
264 | NETDEV_UP = 0x0001, /* Device enabled? */ | |
265 | NETDEV_PROMISC = 0x0002, /* Promiscuous mode? */ | |
266 | NETDEV_LOOPBACK = 0x0004 /* This is a loopback device. */ | |
267 | }; | |
268 | ||
269 | int netdev_get_flags(const struct netdev *, enum netdev_flags *); | |
270 | int netdev_set_flags(struct netdev *, enum netdev_flags, | |
271 | struct netdev_saved_flags **); | |
272 | int netdev_turn_flags_on(struct netdev *, enum netdev_flags, | |
273 | struct netdev_saved_flags **); | |
274 | int netdev_turn_flags_off(struct netdev *, enum netdev_flags, | |
275 | struct netdev_saved_flags **); | |
276 | ||
277 | void netdev_restore_flags(struct netdev_saved_flags *); | |
278 | ||
c1c9c9c4 | 279 | /* TCP/IP stack interface. */ |
064af421 | 280 | int netdev_set_in4(struct netdev *, struct in_addr addr, struct in_addr mask); |
733adf2a | 281 | int netdev_get_in4_by_name(const char *device_name, struct in_addr *in4); |
a8704b50 PS |
282 | int netdev_get_addr_list(const struct netdev *netdev, struct in6_addr **addr, |
283 | struct in6_addr **mask, int *n_in6); | |
284 | ||
0efaf4b5 | 285 | int netdev_add_router(struct netdev *, struct in_addr router); |
f1acd62b BP |
286 | int netdev_get_next_hop(const struct netdev *, const struct in_addr *host, |
287 | struct in_addr *next_hop, char **); | |
275707c3 | 288 | int netdev_get_status(const struct netdev *, struct smap *); |
3bd0fd39 | 289 | int netdev_arp_lookup(const struct netdev *, ovs_be32 ip, |
74ff3298 | 290 | struct eth_addr *mac); |
8b61709d | 291 | |
c1c9c9c4 | 292 | struct netdev *netdev_find_dev_by_in4(const struct in_addr *); |
8b61709d | 293 | |
c1c9c9c4 | 294 | /* Statistics. */ |
064af421 | 295 | int netdev_get_stats(const struct netdev *, struct netdev_stats *); |
c1c9c9c4 BP |
296 | |
297 | /* Quality of service. */ | |
298 | struct netdev_qos_capabilities { | |
299 | unsigned int n_queues; | |
300 | }; | |
301 | ||
302 | struct netdev_queue_stats { | |
303 | /* Values of unsupported statistics are set to all-1-bits (UINT64_MAX). */ | |
304 | uint64_t tx_bytes; | |
305 | uint64_t tx_packets; | |
306 | uint64_t tx_errors; | |
6dc34a0d BP |
307 | |
308 | /* Time at which the queue was created, in msecs, LLONG_MIN if unknown. */ | |
309 | long long int created; | |
c1c9c9c4 BP |
310 | }; |
311 | ||
312 | int netdev_set_policing(struct netdev *, uint32_t kbits_rate, | |
064af421 BP |
313 | uint32_t kbits_burst); |
314 | ||
19993ef3 | 315 | int netdev_get_qos_types(const struct netdev *, struct sset *types); |
c1c9c9c4 BP |
316 | int netdev_get_qos_capabilities(const struct netdev *, |
317 | const char *type, | |
318 | struct netdev_qos_capabilities *); | |
319 | int netdev_get_n_queues(const struct netdev *, | |
320 | const char *type, unsigned int *n_queuesp); | |
321 | ||
322 | int netdev_get_qos(const struct netdev *, | |
79f1cbe9 | 323 | const char **typep, struct smap *details); |
c1c9c9c4 | 324 | int netdev_set_qos(struct netdev *, |
79f1cbe9 | 325 | const char *type, const struct smap *details); |
c1c9c9c4 BP |
326 | |
327 | int netdev_get_queue(const struct netdev *, | |
79f1cbe9 | 328 | unsigned int queue_id, struct smap *details); |
c1c9c9c4 | 329 | int netdev_set_queue(struct netdev *, |
79f1cbe9 | 330 | unsigned int queue_id, const struct smap *details); |
c1c9c9c4 BP |
331 | int netdev_delete_queue(struct netdev *, unsigned int queue_id); |
332 | int netdev_get_queue_stats(const struct netdev *, unsigned int queue_id, | |
333 | struct netdev_queue_stats *); | |
3e912ffc | 334 | uint64_t netdev_get_change_seq(const struct netdev *); |
c1c9c9c4 | 335 | |
790fb3b7 DDP |
336 | int netdev_reconfigure(struct netdev *netdev); |
337 | void netdev_wait_reconf_required(struct netdev *netdev); | |
338 | bool netdev_is_reconf_required(struct netdev *netdev); | |
339 | ||
89454bf4 BP |
340 | struct netdev_queue_dump { |
341 | struct netdev *netdev; | |
342 | int error; | |
343 | void *state; | |
344 | }; | |
345 | void netdev_queue_dump_start(struct netdev_queue_dump *, | |
346 | const struct netdev *); | |
347 | bool netdev_queue_dump_next(struct netdev_queue_dump *, | |
348 | unsigned int *queue_id, struct smap *details); | |
349 | int netdev_queue_dump_done(struct netdev_queue_dump *); | |
350 | ||
351 | /* Iterates through each queue in NETDEV, using DUMP as state. Fills QUEUE_ID | |
352 | * and DETAILS with information about queues. The client must initialize and | |
353 | * destroy DETAILS. | |
354 | * | |
355 | * Arguments all have pointer type. | |
356 | * | |
357 | * If you break out of the loop, then you need to free the dump structure by | |
358 | * hand using netdev_queue_dump_done(). */ | |
359 | #define NETDEV_QUEUE_FOR_EACH(QUEUE_ID, DETAILS, DUMP, NETDEV) \ | |
360 | for (netdev_queue_dump_start(DUMP, NETDEV); \ | |
361 | (netdev_queue_dump_next(DUMP, QUEUE_ID, DETAILS) \ | |
362 | ? true \ | |
363 | : (netdev_queue_dump_done(DUMP), false)); \ | |
364 | ) | |
c1c9c9c4 BP |
365 | |
366 | typedef void netdev_dump_queue_stats_cb(unsigned int queue_id, | |
367 | struct netdev_queue_stats *, | |
368 | void *aux); | |
369 | int netdev_dump_queue_stats(const struct netdev *, | |
370 | netdev_dump_queue_stats_cb *, void *aux); | |
371 | ||
a36de779 | 372 | extern struct seq *tnl_conf_seq; |
df1e5a3b | 373 | |
a8704b50 PS |
374 | #ifndef _WIN32 |
375 | void netdev_get_addrs_list_flush(void); | |
376 | int netdev_get_addrs(const char dev[], struct in6_addr **paddr, | |
377 | struct in6_addr **pmask, int *n_in6); | |
378 | #endif | |
379 | ||
fbfffdbb BP |
380 | #ifdef __cplusplus |
381 | } | |
382 | #endif | |
383 | ||
064af421 | 384 | #endif /* netdev.h */ |