]>
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" |
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. | |
33 | * The PORTING file at the top of the source tree 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 | * | |
52 | * NETDEV_FOR_EACH_QUEUE | |
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 | |
91088554 | 62 | struct dpif_packet; |
796223f5 BP |
63 | struct netdev; |
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; |
064af421 | 72 | |
8b61709d BP |
73 | /* Network device statistics. |
74 | * | |
75 | * Values of unsupported statistics are set to all-1-bits (UINT64_MAX). */ | |
064af421 BP |
76 | struct netdev_stats { |
77 | uint64_t rx_packets; /* Total packets received. */ | |
78 | uint64_t tx_packets; /* Total packets transmitted. */ | |
79 | uint64_t rx_bytes; /* Total bytes received. */ | |
80 | uint64_t tx_bytes; /* Total bytes transmitted. */ | |
81 | uint64_t rx_errors; /* Bad packets received. */ | |
82 | uint64_t tx_errors; /* Packet transmit problems. */ | |
83 | uint64_t rx_dropped; /* No buffer space. */ | |
84 | uint64_t tx_dropped; /* No buffer space. */ | |
85 | uint64_t multicast; /* Multicast packets received. */ | |
86 | uint64_t collisions; | |
87 | ||
88 | /* Detailed receive errors. */ | |
89 | uint64_t rx_length_errors; | |
90 | uint64_t rx_over_errors; /* Receiver ring buff overflow. */ | |
91 | uint64_t rx_crc_errors; /* Recved pkt with crc error. */ | |
92 | uint64_t rx_frame_errors; /* Recv'd frame alignment error. */ | |
93 | uint64_t rx_fifo_errors; /* Recv'r fifo overrun . */ | |
94 | uint64_t rx_missed_errors; /* Receiver missed packet. */ | |
95 | ||
96 | /* Detailed transmit errors. */ | |
97 | uint64_t tx_aborted_errors; | |
98 | uint64_t tx_carrier_errors; | |
99 | uint64_t tx_fifo_errors; | |
100 | uint64_t tx_heartbeat_errors; | |
101 | uint64_t tx_window_errors; | |
102 | }; | |
103 | ||
f431bf7d EJ |
104 | /* Configuration specific to tunnels. */ |
105 | struct netdev_tunnel_config { | |
106 | bool in_key_present; | |
107 | bool in_key_flow; | |
108 | ovs_be64 in_key; | |
109 | ||
110 | bool out_key_present; | |
111 | bool out_key_flow; | |
112 | ovs_be64 out_key; | |
113 | ||
114 | ovs_be16 dst_port; | |
115 | ||
0ad90c84 JR |
116 | bool ip_src_flow; |
117 | bool ip_dst_flow; | |
f431bf7d EJ |
118 | ovs_be32 ip_src; |
119 | ovs_be32 ip_dst; | |
120 | ||
121 | uint8_t ttl; | |
122 | bool ttl_inherit; | |
123 | ||
124 | uint8_t tos; | |
125 | bool tos_inherit; | |
126 | ||
127 | bool csum; | |
128 | bool ipsec; | |
129 | bool dont_fragment; | |
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 PS |
140 | bool netdev_is_pmd(const struct netdev *netdev); |
141 | ||
c1c9c9c4 | 142 | /* Open and close. */ |
e4cfed38 PS |
143 | int netdev_open(const char *name, const char *type, struct netdev **netdevp); |
144 | ||
0bb0393a | 145 | struct netdev *netdev_ref(const struct netdev *); |
fe83f81d | 146 | void netdev_remove(struct netdev *); |
064af421 BP |
147 | void netdev_close(struct netdev *); |
148 | ||
a75531e5 BP |
149 | void netdev_parse_name(const char *netdev_name, char **name, char **type); |
150 | ||
6d9e6eb4 | 151 | /* Options. */ |
bbe6109d | 152 | int netdev_set_config(struct netdev *, const struct smap *args, char **errp); |
79f1cbe9 | 153 | int netdev_get_config(const struct netdev *, struct smap *); |
f431bf7d EJ |
154 | const struct netdev_tunnel_config * |
155 | netdev_get_tunnel_config(const struct netdev *); | |
7dec44fe | 156 | int netdev_get_numa_id(const struct netdev *); |
6d9e6eb4 | 157 | |
c1c9c9c4 | 158 | /* Basic properties. */ |
8b61709d | 159 | const char *netdev_get_name(const struct netdev *); |
149f577a | 160 | const char *netdev_get_type(const struct netdev *); |
0a740f48 | 161 | const char *netdev_get_type_from_name(const char *); |
8b61709d | 162 | int netdev_get_mtu(const struct netdev *, int *mtup); |
9b020780 | 163 | int netdev_set_mtu(const struct netdev *, int mtu); |
9ab3d9a3 | 164 | int netdev_get_ifindex(const struct netdev *); |
5bfc0cd3 | 165 | |
796223f5 | 166 | /* Packet reception. */ |
55c955bd | 167 | int netdev_rxq_open(struct netdev *, struct netdev_rxq **, int id); |
f7791740 | 168 | void netdev_rxq_close(struct netdev_rxq *); |
796223f5 | 169 | |
f7791740 | 170 | const char *netdev_rxq_get_name(const struct netdev_rxq *); |
796223f5 | 171 | |
91088554 DDP |
172 | int netdev_rxq_recv(struct netdev_rxq *rx, struct dpif_packet **buffers, |
173 | int *cnt); | |
f7791740 PS |
174 | void netdev_rxq_wait(struct netdev_rxq *); |
175 | int netdev_rxq_drain(struct netdev_rxq *); | |
8b61709d | 176 | |
796223f5 | 177 | /* Packet transmission. */ |
f00fa8cb | 178 | int netdev_send(struct netdev *, int qid, struct dpif_packet **, int cnt, |
f4fd623c | 179 | bool may_steal); |
f00fa8cb | 180 | void netdev_send_wait(struct netdev *, int qid); |
8b61709d | 181 | |
c1c9c9c4 | 182 | /* Hardware address. */ |
064af421 | 183 | int netdev_set_etheraddr(struct netdev *, const uint8_t mac[6]); |
80992a35 | 184 | int netdev_get_etheraddr(const struct netdev *, uint8_t mac[6]); |
8b61709d | 185 | |
c1c9c9c4 | 186 | /* PHY interface. */ |
85da620e | 187 | bool netdev_get_carrier(const struct netdev *); |
65c3058c | 188 | long long int netdev_get_carrier_resets(const struct netdev *); |
1670c579 | 189 | int netdev_set_miimon_interval(struct netdev *, long long int interval); |
6c038611 BP |
190 | |
191 | /* Features. */ | |
192 | enum netdev_features { | |
193 | NETDEV_F_10MB_HD = 1 << 0, /* 10 Mb half-duplex rate support. */ | |
194 | NETDEV_F_10MB_FD = 1 << 1, /* 10 Mb full-duplex rate support. */ | |
195 | NETDEV_F_100MB_HD = 1 << 2, /* 100 Mb half-duplex rate support. */ | |
196 | NETDEV_F_100MB_FD = 1 << 3, /* 100 Mb full-duplex rate support. */ | |
197 | NETDEV_F_1GB_HD = 1 << 4, /* 1 Gb half-duplex rate support. */ | |
198 | NETDEV_F_1GB_FD = 1 << 5, /* 1 Gb full-duplex rate support. */ | |
199 | NETDEV_F_10GB_FD = 1 << 6, /* 10 Gb full-duplex rate support. */ | |
200 | NETDEV_F_40GB_FD = 1 << 7, /* 40 Gb full-duplex rate support. */ | |
201 | NETDEV_F_100GB_FD = 1 << 8, /* 100 Gb full-duplex rate support. */ | |
202 | NETDEV_F_1TB_FD = 1 << 9, /* 1 Tb full-duplex rate support. */ | |
203 | NETDEV_F_OTHER = 1 << 10, /* Other rate, not in the list. */ | |
204 | NETDEV_F_COPPER = 1 << 11, /* Copper medium. */ | |
205 | NETDEV_F_FIBER = 1 << 12, /* Fiber medium. */ | |
206 | NETDEV_F_AUTONEG = 1 << 13, /* Auto-negotiation. */ | |
207 | NETDEV_F_PAUSE = 1 << 14, /* Pause. */ | |
208 | NETDEV_F_PAUSE_ASYM = 1 << 15, /* Asymmetric pause. */ | |
209 | }; | |
210 | ||
6f2f5cce | 211 | int netdev_get_features(const struct netdev *, |
6c038611 BP |
212 | enum netdev_features *current, |
213 | enum netdev_features *advertised, | |
214 | enum netdev_features *supported, | |
215 | enum netdev_features *peer); | |
d02a5f8e BP |
216 | uint64_t netdev_features_to_bps(enum netdev_features features, |
217 | uint64_t default_bps); | |
6c038611 BP |
218 | bool netdev_features_is_full_duplex(enum netdev_features features); |
219 | int netdev_set_advertisements(struct netdev *, enum netdev_features advertise); | |
8b61709d | 220 | |
4b609110 BP |
221 | /* Flags. */ |
222 | enum netdev_flags { | |
223 | NETDEV_UP = 0x0001, /* Device enabled? */ | |
224 | NETDEV_PROMISC = 0x0002, /* Promiscuous mode? */ | |
225 | NETDEV_LOOPBACK = 0x0004 /* This is a loopback device. */ | |
226 | }; | |
227 | ||
228 | int netdev_get_flags(const struct netdev *, enum netdev_flags *); | |
229 | int netdev_set_flags(struct netdev *, enum netdev_flags, | |
230 | struct netdev_saved_flags **); | |
231 | int netdev_turn_flags_on(struct netdev *, enum netdev_flags, | |
232 | struct netdev_saved_flags **); | |
233 | int netdev_turn_flags_off(struct netdev *, enum netdev_flags, | |
234 | struct netdev_saved_flags **); | |
235 | ||
236 | void netdev_restore_flags(struct netdev_saved_flags *); | |
237 | ||
c1c9c9c4 | 238 | /* TCP/IP stack interface. */ |
f1acd62b BP |
239 | int netdev_get_in4(const struct netdev *, struct in_addr *address, |
240 | struct in_addr *netmask); | |
064af421 | 241 | int netdev_set_in4(struct netdev *, struct in_addr addr, struct in_addr mask); |
733adf2a | 242 | int netdev_get_in4_by_name(const char *device_name, struct in_addr *in4); |
8b61709d | 243 | int netdev_get_in6(const struct netdev *, struct in6_addr *); |
0efaf4b5 | 244 | int netdev_add_router(struct netdev *, struct in_addr router); |
f1acd62b BP |
245 | int netdev_get_next_hop(const struct netdev *, const struct in_addr *host, |
246 | struct in_addr *next_hop, char **); | |
275707c3 | 247 | int netdev_get_status(const struct netdev *, struct smap *); |
dbba996b | 248 | int netdev_arp_lookup(const struct netdev *, ovs_be32 ip, uint8_t mac[6]); |
8b61709d | 249 | |
c1c9c9c4 | 250 | struct netdev *netdev_find_dev_by_in4(const struct in_addr *); |
8b61709d | 251 | |
c1c9c9c4 | 252 | /* Statistics. */ |
064af421 | 253 | int netdev_get_stats(const struct netdev *, struct netdev_stats *); |
8722022c | 254 | int netdev_set_stats(struct netdev *, const struct netdev_stats *); |
c1c9c9c4 BP |
255 | |
256 | /* Quality of service. */ | |
257 | struct netdev_qos_capabilities { | |
258 | unsigned int n_queues; | |
259 | }; | |
260 | ||
261 | struct netdev_queue_stats { | |
262 | /* Values of unsupported statistics are set to all-1-bits (UINT64_MAX). */ | |
263 | uint64_t tx_bytes; | |
264 | uint64_t tx_packets; | |
265 | uint64_t tx_errors; | |
6dc34a0d BP |
266 | |
267 | /* Time at which the queue was created, in msecs, LLONG_MIN if unknown. */ | |
268 | long long int created; | |
c1c9c9c4 BP |
269 | }; |
270 | ||
271 | int netdev_set_policing(struct netdev *, uint32_t kbits_rate, | |
064af421 BP |
272 | uint32_t kbits_burst); |
273 | ||
19993ef3 | 274 | int netdev_get_qos_types(const struct netdev *, struct sset *types); |
c1c9c9c4 BP |
275 | int netdev_get_qos_capabilities(const struct netdev *, |
276 | const char *type, | |
277 | struct netdev_qos_capabilities *); | |
278 | int netdev_get_n_queues(const struct netdev *, | |
279 | const char *type, unsigned int *n_queuesp); | |
280 | ||
281 | int netdev_get_qos(const struct netdev *, | |
79f1cbe9 | 282 | const char **typep, struct smap *details); |
c1c9c9c4 | 283 | int netdev_set_qos(struct netdev *, |
79f1cbe9 | 284 | const char *type, const struct smap *details); |
c1c9c9c4 BP |
285 | |
286 | int netdev_get_queue(const struct netdev *, | |
79f1cbe9 | 287 | unsigned int queue_id, struct smap *details); |
c1c9c9c4 | 288 | int netdev_set_queue(struct netdev *, |
79f1cbe9 | 289 | unsigned int queue_id, const struct smap *details); |
c1c9c9c4 BP |
290 | int netdev_delete_queue(struct netdev *, unsigned int queue_id); |
291 | int netdev_get_queue_stats(const struct netdev *, unsigned int queue_id, | |
292 | struct netdev_queue_stats *); | |
3e912ffc | 293 | uint64_t netdev_get_change_seq(const struct netdev *); |
c1c9c9c4 | 294 | |
89454bf4 BP |
295 | struct netdev_queue_dump { |
296 | struct netdev *netdev; | |
297 | int error; | |
298 | void *state; | |
299 | }; | |
300 | void netdev_queue_dump_start(struct netdev_queue_dump *, | |
301 | const struct netdev *); | |
302 | bool netdev_queue_dump_next(struct netdev_queue_dump *, | |
303 | unsigned int *queue_id, struct smap *details); | |
304 | int netdev_queue_dump_done(struct netdev_queue_dump *); | |
305 | ||
306 | /* Iterates through each queue in NETDEV, using DUMP as state. Fills QUEUE_ID | |
307 | * and DETAILS with information about queues. The client must initialize and | |
308 | * destroy DETAILS. | |
309 | * | |
310 | * Arguments all have pointer type. | |
311 | * | |
312 | * If you break out of the loop, then you need to free the dump structure by | |
313 | * hand using netdev_queue_dump_done(). */ | |
314 | #define NETDEV_QUEUE_FOR_EACH(QUEUE_ID, DETAILS, DUMP, NETDEV) \ | |
315 | for (netdev_queue_dump_start(DUMP, NETDEV); \ | |
316 | (netdev_queue_dump_next(DUMP, QUEUE_ID, DETAILS) \ | |
317 | ? true \ | |
318 | : (netdev_queue_dump_done(DUMP), false)); \ | |
319 | ) | |
c1c9c9c4 BP |
320 | |
321 | typedef void netdev_dump_queue_stats_cb(unsigned int queue_id, | |
322 | struct netdev_queue_stats *, | |
323 | void *aux); | |
324 | int netdev_dump_queue_stats(const struct netdev *, | |
325 | netdev_dump_queue_stats_cb *, void *aux); | |
326 | ||
df1e5a3b PS |
327 | enum { NETDEV_MAX_RX_BATCH = 256 }; /* Maximum number packets in rx_recv() batch. */ |
328 | ||
fbfffdbb BP |
329 | #ifdef __cplusplus |
330 | } | |
331 | #endif | |
332 | ||
064af421 | 333 | #endif /* netdev.h */ |