]>
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 { | |
fea6740f | 102 | ovs_be64 in_key; |
f431bf7d EJ |
103 | bool in_key_present; |
104 | bool in_key_flow; | |
f431bf7d EJ |
105 | |
106 | bool out_key_present; | |
107 | bool out_key_flow; | |
108 | ovs_be64 out_key; | |
109 | ||
ebe0e518 | 110 | ovs_be16 payload_ethertype; |
f431bf7d EJ |
111 | ovs_be16 dst_port; |
112 | ||
0ad90c84 JR |
113 | bool ip_src_flow; |
114 | bool ip_dst_flow; | |
3ae91c01 JB |
115 | struct in6_addr ipv6_src; |
116 | struct in6_addr ipv6_dst; | |
f431bf7d | 117 | |
526df7d8 | 118 | uint32_t exts; |
bf4bbd0d | 119 | uint32_t egress_pkt_mark; |
fea6740f | 120 | bool set_egress_pkt_mark; |
526df7d8 | 121 | |
f431bf7d EJ |
122 | uint8_t ttl; |
123 | bool ttl_inherit; | |
124 | ||
125 | uint8_t tos; | |
126 | bool tos_inherit; | |
127 | ||
128 | bool csum; | |
f431bf7d | 129 | bool dont_fragment; |
875ab130 | 130 | enum netdev_pt_mode pt_mode; |
0ffff497 WT |
131 | |
132 | bool set_seq; | |
133 | uint32_t seqno; | |
7dc18ae9 WT |
134 | uint32_t erspan_idx; |
135 | uint8_t erspan_ver; | |
136 | uint8_t erspan_dir; | |
137 | uint8_t erspan_hwid; | |
068794b4 GR |
138 | |
139 | bool erspan_ver_flow; | |
140 | bool erspan_idx_flow; | |
141 | bool erspan_dir_flow; | |
142 | bool erspan_hwid_flow; | |
f431bf7d EJ |
143 | }; |
144 | ||
8b61709d BP |
145 | void netdev_run(void); |
146 | void netdev_wait(void); | |
147 | ||
19993ef3 | 148 | void netdev_enumerate_types(struct sset *types); |
94a53842 | 149 | bool netdev_is_reserved_name(const char *name); |
77909859 | 150 | |
f00fa8cb | 151 | int netdev_n_txq(const struct netdev *netdev); |
55c955bd | 152 | int netdev_n_rxq(const struct netdev *netdev); |
e4cfed38 | 153 | bool netdev_is_pmd(const struct netdev *netdev); |
57eebbb4 | 154 | bool netdev_has_tunnel_push_pop(const struct netdev *netdev); |
e4cfed38 | 155 | |
c1c9c9c4 | 156 | /* Open and close. */ |
e4cfed38 PS |
157 | int netdev_open(const char *name, const char *type, struct netdev **netdevp); |
158 | ||
0bb0393a | 159 | struct netdev *netdev_ref(const struct netdev *); |
fe83f81d | 160 | void netdev_remove(struct netdev *); |
064af421 BP |
161 | void netdev_close(struct netdev *); |
162 | ||
a75531e5 BP |
163 | void netdev_parse_name(const char *netdev_name, char **name, char **type); |
164 | ||
6d9e6eb4 | 165 | /* Options. */ |
bbe6109d | 166 | int netdev_set_config(struct netdev *, const struct smap *args, char **errp); |
79f1cbe9 | 167 | int netdev_get_config(const struct netdev *, struct smap *); |
f431bf7d EJ |
168 | const struct netdev_tunnel_config * |
169 | netdev_get_tunnel_config(const struct netdev *); | |
7dec44fe | 170 | int netdev_get_numa_id(const struct netdev *); |
6d9e6eb4 | 171 | |
c1c9c9c4 | 172 | /* Basic properties. */ |
8b61709d | 173 | const char *netdev_get_name(const struct netdev *); |
149f577a | 174 | const char *netdev_get_type(const struct netdev *); |
0a740f48 | 175 | const char *netdev_get_type_from_name(const char *); |
8b61709d | 176 | int netdev_get_mtu(const struct netdev *, int *mtup); |
4124cb12 | 177 | int netdev_set_mtu(struct netdev *, int mtu); |
3a414a0a DDP |
178 | void netdev_mtu_user_config(struct netdev *, bool); |
179 | bool netdev_mtu_is_user_config(struct netdev *); | |
9ab3d9a3 | 180 | int netdev_get_ifindex(const struct netdev *); |
050c60bf | 181 | int netdev_set_tx_multiq(struct netdev *, unsigned int n_txq); |
875ab130 | 182 | enum netdev_pt_mode netdev_get_pt_mode(const struct netdev *); |
48c1ab5d IM |
183 | void netdev_set_dpif_type(struct netdev *, const char *); |
184 | const char *netdev_get_dpif_type(const struct netdev *); | |
5bfc0cd3 | 185 | |
796223f5 | 186 | /* Packet reception. */ |
55c955bd | 187 | int netdev_rxq_open(struct netdev *, struct netdev_rxq **, int id); |
f7791740 | 188 | void netdev_rxq_close(struct netdev_rxq *); |
35c91567 | 189 | bool netdev_rxq_enabled(struct netdev_rxq *); |
796223f5 | 190 | |
f7791740 | 191 | const char *netdev_rxq_get_name(const struct netdev_rxq *); |
ce179f11 | 192 | int netdev_rxq_get_queue_id(const struct netdev_rxq *); |
796223f5 | 193 | |
8492adc2 JS |
194 | int netdev_rxq_recv(struct netdev_rxq *rx, struct dp_packet_batch *, |
195 | int *qfill); | |
f7791740 PS |
196 | void netdev_rxq_wait(struct netdev_rxq *); |
197 | int netdev_rxq_drain(struct netdev_rxq *); | |
8b61709d | 198 | |
796223f5 | 199 | /* Packet transmission. */ |
1895cc8d | 200 | int netdev_send(struct netdev *, int qid, struct dp_packet_batch *, |
b30896c9 | 201 | bool concurrent_txq); |
f00fa8cb | 202 | void netdev_send_wait(struct netdev *, int qid); |
8b61709d | 203 | |
4975aa3e PS |
204 | /* native tunnel APIs */ |
205 | /* Structure to pass parameters required to build a tunnel header. */ | |
206 | struct netdev_tnl_build_header_params { | |
207 | const struct flow *flow; | |
208 | const struct in6_addr *s_ip; | |
209 | struct eth_addr dmac; | |
210 | struct eth_addr smac; | |
211 | bool is_ipv6; | |
212 | }; | |
213 | ||
214 | void | |
215 | netdev_init_tnl_build_header_params(struct netdev_tnl_build_header_params *params, | |
216 | const struct flow *tnl_flow, | |
217 | const struct in6_addr *src, | |
218 | struct eth_addr dmac, | |
219 | struct eth_addr smac); | |
220 | ||
c876a4bb | 221 | int netdev_build_header(const struct netdev *, struct ovs_action_push_tnl *data, |
4975aa3e PS |
222 | const struct netdev_tnl_build_header_params *params); |
223 | ||
a36de779 | 224 | int netdev_push_header(const struct netdev *netdev, |
1895cc8d | 225 | struct dp_packet_batch *, |
a36de779 | 226 | const struct ovs_action_push_tnl *data); |
9235b479 | 227 | void netdev_pop_header(struct netdev *netdev, struct dp_packet_batch *); |
a36de779 | 228 | |
c1c9c9c4 | 229 | /* Hardware address. */ |
74ff3298 JR |
230 | int netdev_set_etheraddr(struct netdev *, const struct eth_addr mac); |
231 | int netdev_get_etheraddr(const struct netdev *, struct eth_addr *mac); | |
8b61709d | 232 | |
c1c9c9c4 | 233 | /* PHY interface. */ |
85da620e | 234 | bool netdev_get_carrier(const struct netdev *); |
65c3058c | 235 | long long int netdev_get_carrier_resets(const struct netdev *); |
1670c579 | 236 | int netdev_set_miimon_interval(struct netdev *, long long int interval); |
6c038611 | 237 | |
4b609110 BP |
238 | /* Flags. */ |
239 | enum netdev_flags { | |
240 | NETDEV_UP = 0x0001, /* Device enabled? */ | |
241 | NETDEV_PROMISC = 0x0002, /* Promiscuous mode? */ | |
242 | NETDEV_LOOPBACK = 0x0004 /* This is a loopback device. */ | |
243 | }; | |
244 | ||
245 | int netdev_get_flags(const struct netdev *, enum netdev_flags *); | |
246 | int netdev_set_flags(struct netdev *, enum netdev_flags, | |
247 | struct netdev_saved_flags **); | |
248 | int netdev_turn_flags_on(struct netdev *, enum netdev_flags, | |
249 | struct netdev_saved_flags **); | |
250 | int netdev_turn_flags_off(struct netdev *, enum netdev_flags, | |
251 | struct netdev_saved_flags **); | |
252 | ||
253 | void netdev_restore_flags(struct netdev_saved_flags *); | |
254 | ||
c1c9c9c4 | 255 | /* TCP/IP stack interface. */ |
064af421 | 256 | int netdev_set_in4(struct netdev *, struct in_addr addr, struct in_addr mask); |
733adf2a | 257 | int netdev_get_in4_by_name(const char *device_name, struct in_addr *in4); |
ee4776b8 | 258 | int netdev_get_ip_by_name(const char *device_name, struct in6_addr *); |
a8704b50 PS |
259 | int netdev_get_addr_list(const struct netdev *netdev, struct in6_addr **addr, |
260 | struct in6_addr **mask, int *n_in6); | |
261 | ||
0efaf4b5 | 262 | int netdev_add_router(struct netdev *, struct in_addr router); |
f1acd62b BP |
263 | int netdev_get_next_hop(const struct netdev *, const struct in_addr *host, |
264 | struct in_addr *next_hop, char **); | |
275707c3 | 265 | int netdev_get_status(const struct netdev *, struct smap *); |
3bd0fd39 | 266 | int netdev_arp_lookup(const struct netdev *, ovs_be32 ip, |
74ff3298 | 267 | struct eth_addr *mac); |
8b61709d | 268 | |
c1c9c9c4 | 269 | struct netdev *netdev_find_dev_by_in4(const struct in_addr *); |
8b61709d | 270 | |
c1c9c9c4 | 271 | /* Statistics. */ |
064af421 | 272 | int netdev_get_stats(const struct netdev *, struct netdev_stats *); |
971f4b39 MW |
273 | int netdev_get_custom_stats(const struct netdev *, |
274 | struct netdev_custom_stats *); | |
c1c9c9c4 BP |
275 | |
276 | /* Quality of service. */ | |
277 | struct netdev_qos_capabilities { | |
278 | unsigned int n_queues; | |
279 | }; | |
280 | ||
281 | struct netdev_queue_stats { | |
282 | /* Values of unsupported statistics are set to all-1-bits (UINT64_MAX). */ | |
283 | uint64_t tx_bytes; | |
284 | uint64_t tx_packets; | |
285 | uint64_t tx_errors; | |
6dc34a0d BP |
286 | |
287 | /* Time at which the queue was created, in msecs, LLONG_MIN if unknown. */ | |
288 | long long int created; | |
c1c9c9c4 BP |
289 | }; |
290 | ||
291 | int netdev_set_policing(struct netdev *, uint32_t kbits_rate, | |
064af421 BP |
292 | uint32_t kbits_burst); |
293 | ||
19993ef3 | 294 | int netdev_get_qos_types(const struct netdev *, struct sset *types); |
c1c9c9c4 BP |
295 | int netdev_get_qos_capabilities(const struct netdev *, |
296 | const char *type, | |
297 | struct netdev_qos_capabilities *); | |
298 | int netdev_get_n_queues(const struct netdev *, | |
299 | const char *type, unsigned int *n_queuesp); | |
300 | ||
301 | int netdev_get_qos(const struct netdev *, | |
79f1cbe9 | 302 | const char **typep, struct smap *details); |
c1c9c9c4 | 303 | int netdev_set_qos(struct netdev *, |
79f1cbe9 | 304 | const char *type, const struct smap *details); |
c1c9c9c4 BP |
305 | |
306 | int netdev_get_queue(const struct netdev *, | |
79f1cbe9 | 307 | unsigned int queue_id, struct smap *details); |
c1c9c9c4 | 308 | int netdev_set_queue(struct netdev *, |
79f1cbe9 | 309 | unsigned int queue_id, const struct smap *details); |
c1c9c9c4 BP |
310 | int netdev_delete_queue(struct netdev *, unsigned int queue_id); |
311 | int netdev_get_queue_stats(const struct netdev *, unsigned int queue_id, | |
312 | struct netdev_queue_stats *); | |
3e912ffc | 313 | uint64_t netdev_get_change_seq(const struct netdev *); |
c1c9c9c4 | 314 | |
790fb3b7 DDP |
315 | int netdev_reconfigure(struct netdev *netdev); |
316 | void netdev_wait_reconf_required(struct netdev *netdev); | |
317 | bool netdev_is_reconf_required(struct netdev *netdev); | |
318 | ||
89454bf4 BP |
319 | struct netdev_queue_dump { |
320 | struct netdev *netdev; | |
321 | int error; | |
322 | void *state; | |
323 | }; | |
324 | void netdev_queue_dump_start(struct netdev_queue_dump *, | |
325 | const struct netdev *); | |
326 | bool netdev_queue_dump_next(struct netdev_queue_dump *, | |
327 | unsigned int *queue_id, struct smap *details); | |
328 | int netdev_queue_dump_done(struct netdev_queue_dump *); | |
329 | ||
330 | /* Iterates through each queue in NETDEV, using DUMP as state. Fills QUEUE_ID | |
331 | * and DETAILS with information about queues. The client must initialize and | |
332 | * destroy DETAILS. | |
333 | * | |
334 | * Arguments all have pointer type. | |
335 | * | |
336 | * If you break out of the loop, then you need to free the dump structure by | |
337 | * hand using netdev_queue_dump_done(). */ | |
338 | #define NETDEV_QUEUE_FOR_EACH(QUEUE_ID, DETAILS, DUMP, NETDEV) \ | |
339 | for (netdev_queue_dump_start(DUMP, NETDEV); \ | |
340 | (netdev_queue_dump_next(DUMP, QUEUE_ID, DETAILS) \ | |
341 | ? true \ | |
342 | : (netdev_queue_dump_done(DUMP), false)); \ | |
343 | ) | |
c1c9c9c4 BP |
344 | |
345 | typedef void netdev_dump_queue_stats_cb(unsigned int queue_id, | |
346 | struct netdev_queue_stats *, | |
347 | void *aux); | |
348 | int netdev_dump_queue_stats(const struct netdev *, | |
349 | netdev_dump_queue_stats_cb *, void *aux); | |
350 | ||
a36de779 | 351 | extern struct seq *tnl_conf_seq; |
df1e5a3b | 352 | |
a8704b50 PS |
353 | #ifndef _WIN32 |
354 | void netdev_get_addrs_list_flush(void); | |
355 | int netdev_get_addrs(const char dev[], struct in6_addr **paddr, | |
356 | struct in6_addr **pmask, int *n_in6); | |
357 | #endif | |
358 | ||
fbfffdbb BP |
359 | #ifdef __cplusplus |
360 | } | |
361 | #endif | |
362 | ||
064af421 | 363 | #endif /* netdev.h */ |