]>
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 | ||
20 | #include <stdbool.h> | |
21 | #include <stddef.h> | |
22 | #include <stdint.h> | |
dbba996b | 23 | #include "openvswitch/types.h" |
3bd0fd39 | 24 | #include "packets.h" |
c876a4bb | 25 | #include "flow.h" |
064af421 | 26 | |
fbfffdbb BP |
27 | #ifdef __cplusplus |
28 | extern "C" { | |
29 | #endif | |
30 | ||
ef5b15ac | 31 | /* Generic interface to network devices ("netdev"s). |
064af421 | 32 | * |
ef5b15ac BP |
33 | * Every port on a switch must have a corresponding netdev that must minimally |
34 | * support a few operations, such as the ability to read the netdev's MTU. | |
35 | * The PORTING file at the top of the source tree has more information in the | |
86383816 BP |
36 | * "Writing a netdev Provider" section. |
37 | * | |
38 | * Thread-safety | |
39 | * ============= | |
40 | * | |
41 | * Most of the netdev functions are fully thread-safe: they may be called from | |
42 | * any number of threads on the same or different netdev objects. The | |
43 | * exceptions are: | |
44 | * | |
f7791740 PS |
45 | * netdev_rxq_recv() |
46 | * netdev_rxq_wait() | |
47 | * netdev_rxq_drain() | |
86383816 BP |
48 | * |
49 | * These functions are conditionally thread-safe: they may be called from | |
f7791740 PS |
50 | * different threads only on different netdev_rxq objects. (The client may |
51 | * create multiple netdev_rxq objects for a single netdev and access each | |
89454bf4 BP |
52 | * of those from a different thread.) |
53 | * | |
54 | * NETDEV_FOR_EACH_QUEUE | |
55 | * netdev_queue_dump_next() | |
56 | * netdev_queue_dump_done() | |
57 | * | |
58 | * These functions are conditionally thread-safe: they may be called from | |
59 | * different threads only on different netdev_queue_dump objects. (The | |
60 | * client may create multiple netdev_queue_dump objects for a single | |
61 | * netdev and access each of those from a different thread.) | |
62 | */ | |
064af421 | 63 | |
e14deea0 | 64 | struct dp_packet; |
796223f5 BP |
65 | struct netdev; |
66 | struct netdev_class; | |
f7791740 | 67 | struct netdev_rxq; |
4b609110 | 68 | struct netdev_saved_flags; |
064af421 BP |
69 | struct ofpbuf; |
70 | struct in_addr; | |
71 | struct in6_addr; | |
79f1cbe9 | 72 | struct smap; |
19993ef3 | 73 | struct sset; |
a36de779 | 74 | struct ovs_action_push_tnl; |
064af421 | 75 | |
8b61709d BP |
76 | /* Network device statistics. |
77 | * | |
78 | * Values of unsupported statistics are set to all-1-bits (UINT64_MAX). */ | |
064af421 BP |
79 | struct netdev_stats { |
80 | uint64_t rx_packets; /* Total packets received. */ | |
81 | uint64_t tx_packets; /* Total packets transmitted. */ | |
82 | uint64_t rx_bytes; /* Total bytes received. */ | |
83 | uint64_t tx_bytes; /* Total bytes transmitted. */ | |
84 | uint64_t rx_errors; /* Bad packets received. */ | |
85 | uint64_t tx_errors; /* Packet transmit problems. */ | |
86 | uint64_t rx_dropped; /* No buffer space. */ | |
87 | uint64_t tx_dropped; /* No buffer space. */ | |
88 | uint64_t multicast; /* Multicast packets received. */ | |
89 | uint64_t collisions; | |
90 | ||
91 | /* Detailed receive errors. */ | |
92 | uint64_t rx_length_errors; | |
93 | uint64_t rx_over_errors; /* Receiver ring buff overflow. */ | |
94 | uint64_t rx_crc_errors; /* Recved pkt with crc error. */ | |
95 | uint64_t rx_frame_errors; /* Recv'd frame alignment error. */ | |
96 | uint64_t rx_fifo_errors; /* Recv'r fifo overrun . */ | |
97 | uint64_t rx_missed_errors; /* Receiver missed packet. */ | |
98 | ||
99 | /* Detailed transmit errors. */ | |
100 | uint64_t tx_aborted_errors; | |
101 | uint64_t tx_carrier_errors; | |
102 | uint64_t tx_fifo_errors; | |
103 | uint64_t tx_heartbeat_errors; | |
104 | uint64_t tx_window_errors; | |
105 | }; | |
106 | ||
f431bf7d EJ |
107 | /* Configuration specific to tunnels. */ |
108 | struct netdev_tunnel_config { | |
109 | bool in_key_present; | |
110 | bool in_key_flow; | |
111 | ovs_be64 in_key; | |
112 | ||
113 | bool out_key_present; | |
114 | bool out_key_flow; | |
115 | ovs_be64 out_key; | |
116 | ||
117 | ovs_be16 dst_port; | |
118 | ||
0ad90c84 JR |
119 | bool ip_src_flow; |
120 | bool ip_dst_flow; | |
3ae91c01 JB |
121 | struct in6_addr ipv6_src; |
122 | struct in6_addr ipv6_dst; | |
f431bf7d | 123 | |
526df7d8 TG |
124 | uint32_t exts; |
125 | ||
f431bf7d EJ |
126 | uint8_t ttl; |
127 | bool ttl_inherit; | |
128 | ||
129 | uint8_t tos; | |
130 | bool tos_inherit; | |
131 | ||
132 | bool csum; | |
133 | bool ipsec; | |
134 | bool dont_fragment; | |
135 | }; | |
136 | ||
8b61709d BP |
137 | void netdev_run(void); |
138 | void netdev_wait(void); | |
139 | ||
19993ef3 | 140 | void netdev_enumerate_types(struct sset *types); |
94a53842 | 141 | bool netdev_is_reserved_name(const char *name); |
77909859 | 142 | |
f00fa8cb | 143 | int netdev_n_txq(const struct netdev *netdev); |
55c955bd | 144 | int netdev_n_rxq(const struct netdev *netdev); |
a14b8947 | 145 | int netdev_requested_n_rxq(const struct netdev *netdev); |
e4cfed38 PS |
146 | bool netdev_is_pmd(const struct netdev *netdev); |
147 | ||
c1c9c9c4 | 148 | /* Open and close. */ |
e4cfed38 PS |
149 | int netdev_open(const char *name, const char *type, struct netdev **netdevp); |
150 | ||
0bb0393a | 151 | struct netdev *netdev_ref(const struct netdev *); |
fe83f81d | 152 | void netdev_remove(struct netdev *); |
064af421 BP |
153 | void netdev_close(struct netdev *); |
154 | ||
a75531e5 BP |
155 | void netdev_parse_name(const char *netdev_name, char **name, char **type); |
156 | ||
6d9e6eb4 | 157 | /* Options. */ |
bbe6109d | 158 | int netdev_set_config(struct netdev *, const struct smap *args, char **errp); |
79f1cbe9 | 159 | int netdev_get_config(const struct netdev *, struct smap *); |
f431bf7d EJ |
160 | const struct netdev_tunnel_config * |
161 | netdev_get_tunnel_config(const struct netdev *); | |
7dec44fe | 162 | int netdev_get_numa_id(const struct netdev *); |
6d9e6eb4 | 163 | |
c1c9c9c4 | 164 | /* Basic properties. */ |
8b61709d | 165 | const char *netdev_get_name(const struct netdev *); |
149f577a | 166 | const char *netdev_get_type(const struct netdev *); |
0a740f48 | 167 | const char *netdev_get_type_from_name(const char *); |
8b61709d | 168 | int netdev_get_mtu(const struct netdev *, int *mtup); |
9b020780 | 169 | int netdev_set_mtu(const struct netdev *, int mtu); |
9ab3d9a3 | 170 | int netdev_get_ifindex(const struct netdev *); |
5496878c | 171 | int netdev_set_multiq(struct netdev *, unsigned int n_txq, unsigned int n_rxq); |
5bfc0cd3 | 172 | |
796223f5 | 173 | /* Packet reception. */ |
55c955bd | 174 | int netdev_rxq_open(struct netdev *, struct netdev_rxq **, int id); |
f7791740 | 175 | void netdev_rxq_close(struct netdev_rxq *); |
796223f5 | 176 | |
f7791740 | 177 | const char *netdev_rxq_get_name(const struct netdev_rxq *); |
796223f5 | 178 | |
e14deea0 | 179 | int netdev_rxq_recv(struct netdev_rxq *rx, struct dp_packet **buffers, |
91088554 | 180 | int *cnt); |
f7791740 PS |
181 | void netdev_rxq_wait(struct netdev_rxq *); |
182 | int netdev_rxq_drain(struct netdev_rxq *); | |
8b61709d | 183 | |
796223f5 | 184 | /* Packet transmission. */ |
e14deea0 | 185 | int netdev_send(struct netdev *, int qid, struct dp_packet **, int cnt, |
f4fd623c | 186 | bool may_steal); |
f00fa8cb | 187 | void netdev_send_wait(struct netdev *, int qid); |
8b61709d | 188 | |
c876a4bb RL |
189 | int netdev_build_header(const struct netdev *, struct ovs_action_push_tnl *data, |
190 | const struct flow *tnl_flow); | |
a36de779 | 191 | int netdev_push_header(const struct netdev *netdev, |
e14deea0 | 192 | struct dp_packet **buffers, int cnt, |
a36de779 | 193 | const struct ovs_action_push_tnl *data); |
e14deea0 | 194 | int netdev_pop_header(struct netdev *netdev, struct dp_packet **buffers, |
a36de779 PS |
195 | int cnt); |
196 | ||
c1c9c9c4 | 197 | /* Hardware address. */ |
74ff3298 JR |
198 | int netdev_set_etheraddr(struct netdev *, const struct eth_addr mac); |
199 | int netdev_get_etheraddr(const struct netdev *, struct eth_addr *mac); | |
8b61709d | 200 | |
c1c9c9c4 | 201 | /* PHY interface. */ |
85da620e | 202 | bool netdev_get_carrier(const struct netdev *); |
65c3058c | 203 | long long int netdev_get_carrier_resets(const struct netdev *); |
1670c579 | 204 | int netdev_set_miimon_interval(struct netdev *, long long int interval); |
6c038611 BP |
205 | |
206 | /* Features. */ | |
207 | enum netdev_features { | |
208 | NETDEV_F_10MB_HD = 1 << 0, /* 10 Mb half-duplex rate support. */ | |
209 | NETDEV_F_10MB_FD = 1 << 1, /* 10 Mb full-duplex rate support. */ | |
210 | NETDEV_F_100MB_HD = 1 << 2, /* 100 Mb half-duplex rate support. */ | |
211 | NETDEV_F_100MB_FD = 1 << 3, /* 100 Mb full-duplex rate support. */ | |
212 | NETDEV_F_1GB_HD = 1 << 4, /* 1 Gb half-duplex rate support. */ | |
213 | NETDEV_F_1GB_FD = 1 << 5, /* 1 Gb full-duplex rate support. */ | |
214 | NETDEV_F_10GB_FD = 1 << 6, /* 10 Gb full-duplex rate support. */ | |
215 | NETDEV_F_40GB_FD = 1 << 7, /* 40 Gb full-duplex rate support. */ | |
216 | NETDEV_F_100GB_FD = 1 << 8, /* 100 Gb full-duplex rate support. */ | |
217 | NETDEV_F_1TB_FD = 1 << 9, /* 1 Tb full-duplex rate support. */ | |
218 | NETDEV_F_OTHER = 1 << 10, /* Other rate, not in the list. */ | |
219 | NETDEV_F_COPPER = 1 << 11, /* Copper medium. */ | |
220 | NETDEV_F_FIBER = 1 << 12, /* Fiber medium. */ | |
221 | NETDEV_F_AUTONEG = 1 << 13, /* Auto-negotiation. */ | |
222 | NETDEV_F_PAUSE = 1 << 14, /* Pause. */ | |
223 | NETDEV_F_PAUSE_ASYM = 1 << 15, /* Asymmetric pause. */ | |
224 | }; | |
225 | ||
6f2f5cce | 226 | int netdev_get_features(const struct netdev *, |
6c038611 BP |
227 | enum netdev_features *current, |
228 | enum netdev_features *advertised, | |
229 | enum netdev_features *supported, | |
230 | enum netdev_features *peer); | |
d02a5f8e BP |
231 | uint64_t netdev_features_to_bps(enum netdev_features features, |
232 | uint64_t default_bps); | |
6c038611 BP |
233 | bool netdev_features_is_full_duplex(enum netdev_features features); |
234 | int netdev_set_advertisements(struct netdev *, enum netdev_features advertise); | |
8b61709d | 235 | |
4b609110 BP |
236 | /* Flags. */ |
237 | enum netdev_flags { | |
238 | NETDEV_UP = 0x0001, /* Device enabled? */ | |
239 | NETDEV_PROMISC = 0x0002, /* Promiscuous mode? */ | |
240 | NETDEV_LOOPBACK = 0x0004 /* This is a loopback device. */ | |
241 | }; | |
242 | ||
243 | int netdev_get_flags(const struct netdev *, enum netdev_flags *); | |
244 | int netdev_set_flags(struct netdev *, enum netdev_flags, | |
245 | struct netdev_saved_flags **); | |
246 | int netdev_turn_flags_on(struct netdev *, enum netdev_flags, | |
247 | struct netdev_saved_flags **); | |
248 | int netdev_turn_flags_off(struct netdev *, enum netdev_flags, | |
249 | struct netdev_saved_flags **); | |
250 | ||
251 | void netdev_restore_flags(struct netdev_saved_flags *); | |
252 | ||
c1c9c9c4 | 253 | /* TCP/IP stack interface. */ |
f1acd62b BP |
254 | int netdev_get_in4(const struct netdev *, struct in_addr *address, |
255 | struct in_addr *netmask); | |
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); |
8b61709d | 258 | int netdev_get_in6(const struct netdev *, struct in6_addr *); |
0efaf4b5 | 259 | int netdev_add_router(struct netdev *, struct in_addr router); |
f1acd62b BP |
260 | int netdev_get_next_hop(const struct netdev *, const struct in_addr *host, |
261 | struct in_addr *next_hop, char **); | |
275707c3 | 262 | int netdev_get_status(const struct netdev *, struct smap *); |
3bd0fd39 | 263 | int netdev_arp_lookup(const struct netdev *, ovs_be32 ip, |
74ff3298 | 264 | struct eth_addr *mac); |
8b61709d | 265 | |
c1c9c9c4 | 266 | struct netdev *netdev_find_dev_by_in4(const struct in_addr *); |
8b61709d | 267 | |
c1c9c9c4 | 268 | /* Statistics. */ |
064af421 | 269 | int netdev_get_stats(const struct netdev *, struct netdev_stats *); |
c1c9c9c4 BP |
270 | |
271 | /* Quality of service. */ | |
272 | struct netdev_qos_capabilities { | |
273 | unsigned int n_queues; | |
274 | }; | |
275 | ||
276 | struct netdev_queue_stats { | |
277 | /* Values of unsupported statistics are set to all-1-bits (UINT64_MAX). */ | |
278 | uint64_t tx_bytes; | |
279 | uint64_t tx_packets; | |
280 | uint64_t tx_errors; | |
6dc34a0d BP |
281 | |
282 | /* Time at which the queue was created, in msecs, LLONG_MIN if unknown. */ | |
283 | long long int created; | |
c1c9c9c4 BP |
284 | }; |
285 | ||
286 | int netdev_set_policing(struct netdev *, uint32_t kbits_rate, | |
064af421 BP |
287 | uint32_t kbits_burst); |
288 | ||
19993ef3 | 289 | int netdev_get_qos_types(const struct netdev *, struct sset *types); |
c1c9c9c4 BP |
290 | int netdev_get_qos_capabilities(const struct netdev *, |
291 | const char *type, | |
292 | struct netdev_qos_capabilities *); | |
293 | int netdev_get_n_queues(const struct netdev *, | |
294 | const char *type, unsigned int *n_queuesp); | |
295 | ||
296 | int netdev_get_qos(const struct netdev *, | |
79f1cbe9 | 297 | const char **typep, struct smap *details); |
c1c9c9c4 | 298 | int netdev_set_qos(struct netdev *, |
79f1cbe9 | 299 | const char *type, const struct smap *details); |
c1c9c9c4 BP |
300 | |
301 | int netdev_get_queue(const struct netdev *, | |
79f1cbe9 | 302 | unsigned int queue_id, struct smap *details); |
c1c9c9c4 | 303 | int netdev_set_queue(struct netdev *, |
79f1cbe9 | 304 | unsigned int queue_id, const struct smap *details); |
c1c9c9c4 BP |
305 | int netdev_delete_queue(struct netdev *, unsigned int queue_id); |
306 | int netdev_get_queue_stats(const struct netdev *, unsigned int queue_id, | |
307 | struct netdev_queue_stats *); | |
3e912ffc | 308 | uint64_t netdev_get_change_seq(const struct netdev *); |
c1c9c9c4 | 309 | |
89454bf4 BP |
310 | struct netdev_queue_dump { |
311 | struct netdev *netdev; | |
312 | int error; | |
313 | void *state; | |
314 | }; | |
315 | void netdev_queue_dump_start(struct netdev_queue_dump *, | |
316 | const struct netdev *); | |
317 | bool netdev_queue_dump_next(struct netdev_queue_dump *, | |
318 | unsigned int *queue_id, struct smap *details); | |
319 | int netdev_queue_dump_done(struct netdev_queue_dump *); | |
320 | ||
321 | /* Iterates through each queue in NETDEV, using DUMP as state. Fills QUEUE_ID | |
322 | * and DETAILS with information about queues. The client must initialize and | |
323 | * destroy DETAILS. | |
324 | * | |
325 | * Arguments all have pointer type. | |
326 | * | |
327 | * If you break out of the loop, then you need to free the dump structure by | |
328 | * hand using netdev_queue_dump_done(). */ | |
329 | #define NETDEV_QUEUE_FOR_EACH(QUEUE_ID, DETAILS, DUMP, NETDEV) \ | |
330 | for (netdev_queue_dump_start(DUMP, NETDEV); \ | |
331 | (netdev_queue_dump_next(DUMP, QUEUE_ID, DETAILS) \ | |
332 | ? true \ | |
333 | : (netdev_queue_dump_done(DUMP), false)); \ | |
334 | ) | |
c1c9c9c4 BP |
335 | |
336 | typedef void netdev_dump_queue_stats_cb(unsigned int queue_id, | |
337 | struct netdev_queue_stats *, | |
338 | void *aux); | |
339 | int netdev_dump_queue_stats(const struct netdev *, | |
340 | netdev_dump_queue_stats_cb *, void *aux); | |
341 | ||
cd159f1a | 342 | enum { NETDEV_MAX_BURST = 32 }; /* Maximum number packets in a batch. */ |
a36de779 | 343 | extern struct seq *tnl_conf_seq; |
df1e5a3b | 344 | |
fbfffdbb BP |
345 | #ifdef __cplusplus |
346 | } | |
347 | #endif | |
348 | ||
064af421 | 349 | #endif /* netdev.h */ |