5c7065fe1ab31309be55567ef9d10c5372b683ec
[sliver-openvswitch.git] / lib / netdev-linux.c
1 /*
2  * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
3  *
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:
7  *
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.
15  */
16
17 #include <config.h>
18
19 #include "netdev-linux.h"
20
21 #include <errno.h>
22 #include <fcntl.h>
23 #include <arpa/inet.h>
24 #include <inttypes.h>
25 #include <linux/filter.h>
26 #include <linux/gen_stats.h>
27 #include <linux/if_ether.h>
28 #include <linux/if_tun.h>
29 #include <linux/types.h>
30 #include <linux/ethtool.h>
31 #include <linux/mii.h>
32 #include <linux/pkt_cls.h>
33 #include <linux/pkt_sched.h>
34 #include <linux/rtnetlink.h>
35 #include <linux/sockios.h>
36 #include <sys/types.h>
37 #include <sys/ioctl.h>
38 #include <sys/socket.h>
39 #include <netpacket/packet.h>
40 #include <net/if.h>
41 #include <net/if_arp.h>
42 #include <net/if_packet.h>
43 #include <net/route.h>
44 #include <netinet/in.h>
45 #include <poll.h>
46 #include <stdlib.h>
47 #include <string.h>
48 #include <unistd.h>
49
50 #include "coverage.h"
51 #include "dpif-linux.h"
52 #include "dpif-netdev.h"
53 #include "dynamic-string.h"
54 #include "fatal-signal.h"
55 #include "hash.h"
56 #include "hmap.h"
57 #include "netdev-provider.h"
58 #include "netdev-vport.h"
59 #include "netlink-notifier.h"
60 #include "netlink-socket.h"
61 #include "netlink.h"
62 #include "ofpbuf.h"
63 #include "openflow/openflow.h"
64 #include "ovs-atomic.h"
65 #include "packets.h"
66 #include "poll-loop.h"
67 #include "rtnetlink-link.h"
68 #include "shash.h"
69 #include "socket-util.h"
70 #include "sset.h"
71 #include "timer.h"
72 #include "unaligned.h"
73 #include "vlog.h"
74
75 VLOG_DEFINE_THIS_MODULE(netdev_linux);
76
77 COVERAGE_DEFINE(netdev_set_policing);
78 COVERAGE_DEFINE(netdev_arp_lookup);
79 COVERAGE_DEFINE(netdev_get_ifindex);
80 COVERAGE_DEFINE(netdev_get_hwaddr);
81 COVERAGE_DEFINE(netdev_set_hwaddr);
82 COVERAGE_DEFINE(netdev_get_ethtool);
83 COVERAGE_DEFINE(netdev_set_ethtool);
84
85 \f
86 /* These were introduced in Linux 2.6.14, so they might be missing if we have
87  * old headers. */
88 #ifndef ADVERTISED_Pause
89 #define ADVERTISED_Pause                (1 << 13)
90 #endif
91 #ifndef ADVERTISED_Asym_Pause
92 #define ADVERTISED_Asym_Pause           (1 << 14)
93 #endif
94
95 /* These were introduced in Linux 2.6.24, so they might be missing if we
96  * have old headers. */
97 #ifndef ETHTOOL_GFLAGS
98 #define ETHTOOL_GFLAGS       0x00000025 /* Get flags bitmap(ethtool_value) */
99 #endif
100 #ifndef ETHTOOL_SFLAGS
101 #define ETHTOOL_SFLAGS       0x00000026 /* Set flags bitmap(ethtool_value) */
102 #endif
103
104 /* This was introduced in Linux 2.6.25, so it might be missing if we have old
105  * headers. */
106 #ifndef TC_RTAB_SIZE
107 #define TC_RTAB_SIZE 1024
108 #endif
109
110 /* Linux 2.6.21 introduced struct tpacket_auxdata.
111  * Linux 2.6.27 added the tp_vlan_tci member.
112  * Linux 3.0 defined TP_STATUS_VLAN_VALID.
113  * Linux 3.13 repurposed a padding member for tp_vlan_tpid and defined
114  * TP_STATUS_VLAN_TPID_VALID.
115  *
116  * With all this churn it's easiest to unconditionally define a replacement
117  * structure that has everything we want.
118  */
119 #ifndef PACKET_AUXDATA
120 #define PACKET_AUXDATA                  8
121 #endif
122 #ifndef TP_STATUS_VLAN_VALID
123 #define TP_STATUS_VLAN_VALID            (1 << 4)
124 #endif
125 #ifndef TP_STATUS_VLAN_TPID_VALID
126 #define TP_STATUS_VLAN_TPID_VALID       (1 << 6)
127 #endif
128 #undef tpacket_auxdata
129 #define tpacket_auxdata rpl_tpacket_auxdata
130 struct tpacket_auxdata {
131     uint32_t tp_status;
132     uint32_t tp_len;
133     uint32_t tp_snaplen;
134     uint16_t tp_mac;
135     uint16_t tp_net;
136     uint16_t tp_vlan_tci;
137     uint16_t tp_vlan_tpid;
138 };
139
140 enum {
141     VALID_IFINDEX           = 1 << 0,
142     VALID_ETHERADDR         = 1 << 1,
143     VALID_IN4               = 1 << 2,
144     VALID_IN6               = 1 << 3,
145     VALID_MTU               = 1 << 4,
146     VALID_POLICING          = 1 << 5,
147     VALID_VPORT_STAT_ERROR  = 1 << 6,
148     VALID_DRVINFO           = 1 << 7,
149     VALID_FEATURES          = 1 << 8,
150 };
151 \f
152 /* Traffic control. */
153
154 /* An instance of a traffic control class.  Always associated with a particular
155  * network device.
156  *
157  * Each TC implementation subclasses this with whatever additional data it
158  * needs. */
159 struct tc {
160     const struct tc_ops *ops;
161     struct hmap queues;         /* Contains "struct tc_queue"s.
162                                  * Read by generic TC layer.
163                                  * Written only by TC implementation. */
164 };
165
166 #define TC_INITIALIZER(TC, OPS) { OPS, HMAP_INITIALIZER(&(TC)->queues) }
167
168 /* One traffic control queue.
169  *
170  * Each TC implementation subclasses this with whatever additional data it
171  * needs. */
172 struct tc_queue {
173     struct hmap_node hmap_node; /* In struct tc's "queues" hmap. */
174     unsigned int queue_id;      /* OpenFlow queue ID. */
175     long long int created;      /* Time queue was created, in msecs. */
176 };
177
178 /* A particular kind of traffic control.  Each implementation generally maps to
179  * one particular Linux qdisc class.
180  *
181  * The functions below return 0 if successful or a positive errno value on
182  * failure, except where otherwise noted.  All of them must be provided, except
183  * where otherwise noted. */
184 struct tc_ops {
185     /* Name used by kernel in the TCA_KIND attribute of tcmsg, e.g. "htb".
186      * This is null for tc_ops_default and tc_ops_other, for which there are no
187      * appropriate values. */
188     const char *linux_name;
189
190     /* Name used in OVS database, e.g. "linux-htb".  Must be nonnull. */
191     const char *ovs_name;
192
193     /* Number of supported OpenFlow queues, 0 for qdiscs that have no
194      * queues.  The queues are numbered 0 through n_queues - 1. */
195     unsigned int n_queues;
196
197     /* Called to install this TC class on 'netdev'.  The implementation should
198      * make the Netlink calls required to set up 'netdev' with the right qdisc
199      * and configure it according to 'details'.  The implementation may assume
200      * that the current qdisc is the default; that is, there is no need for it
201      * to delete the current qdisc before installing itself.
202      *
203      * The contents of 'details' should be documented as valid for 'ovs_name'
204      * in the "other_config" column in the "QoS" table in vswitchd/vswitch.xml
205      * (which is built as ovs-vswitchd.conf.db(8)).
206      *
207      * This function must return 0 if and only if it sets 'netdev->tc' to an
208      * initialized 'struct tc'.
209      *
210      * (This function is null for tc_ops_other, which cannot be installed.  For
211      * other TC classes it should always be nonnull.) */
212     int (*tc_install)(struct netdev *netdev, const struct smap *details);
213
214     /* Called when the netdev code determines (through a Netlink query) that
215      * this TC class's qdisc is installed on 'netdev', but we didn't install
216      * it ourselves and so don't know any of the details.
217      *
218      * 'nlmsg' is the kernel reply to a RTM_GETQDISC Netlink message for
219      * 'netdev'.  The TCA_KIND attribute of 'nlmsg' is 'linux_name'.  The
220      * implementation should parse the other attributes of 'nlmsg' as
221      * necessary to determine its configuration.  If necessary it should also
222      * use Netlink queries to determine the configuration of queues on
223      * 'netdev'.
224      *
225      * This function must return 0 if and only if it sets 'netdev->tc' to an
226      * initialized 'struct tc'. */
227     int (*tc_load)(struct netdev *netdev, struct ofpbuf *nlmsg);
228
229     /* Destroys the data structures allocated by the implementation as part of
230      * 'tc'.  (This includes destroying 'tc->queues' by calling
231      * tc_destroy(tc).
232      *
233      * The implementation should not need to perform any Netlink calls.  If
234      * desirable, the caller is responsible for deconfiguring the kernel qdisc.
235      * (But it may not be desirable.)
236      *
237      * This function may be null if 'tc' is trivial. */
238     void (*tc_destroy)(struct tc *tc);
239
240     /* Retrieves details of 'netdev->tc' configuration into 'details'.
241      *
242      * The implementation should not need to perform any Netlink calls, because
243      * the 'tc_install' or 'tc_load' that instantiated 'netdev->tc' should have
244      * cached the configuration.
245      *
246      * The contents of 'details' should be documented as valid for 'ovs_name'
247      * in the "other_config" column in the "QoS" table in vswitchd/vswitch.xml
248      * (which is built as ovs-vswitchd.conf.db(8)).
249      *
250      * This function may be null if 'tc' is not configurable.
251      */
252     int (*qdisc_get)(const struct netdev *netdev, struct smap *details);
253
254     /* Reconfigures 'netdev->tc' according to 'details', performing any
255      * required Netlink calls to complete the reconfiguration.
256      *
257      * The contents of 'details' should be documented as valid for 'ovs_name'
258      * in the "other_config" column in the "QoS" table in vswitchd/vswitch.xml
259      * (which is built as ovs-vswitchd.conf.db(8)).
260      *
261      * This function may be null if 'tc' is not configurable.
262      */
263     int (*qdisc_set)(struct netdev *, const struct smap *details);
264
265     /* Retrieves details of 'queue' on 'netdev->tc' into 'details'.  'queue' is
266      * one of the 'struct tc_queue's within 'netdev->tc->queues'.
267      *
268      * The contents of 'details' should be documented as valid for 'ovs_name'
269      * in the "other_config" column in the "Queue" table in
270      * vswitchd/vswitch.xml (which is built as ovs-vswitchd.conf.db(8)).
271      *
272      * The implementation should not need to perform any Netlink calls, because
273      * the 'tc_install' or 'tc_load' that instantiated 'netdev->tc' should have
274      * cached the queue configuration.
275      *
276      * This function may be null if 'tc' does not have queues ('n_queues' is
277      * 0). */
278     int (*class_get)(const struct netdev *netdev, const struct tc_queue *queue,
279                      struct smap *details);
280
281     /* Configures or reconfigures 'queue_id' on 'netdev->tc' according to
282      * 'details', perfoming any required Netlink calls to complete the
283      * reconfiguration.  The caller ensures that 'queue_id' is less than
284      * 'n_queues'.
285      *
286      * The contents of 'details' should be documented as valid for 'ovs_name'
287      * in the "other_config" column in the "Queue" table in
288      * vswitchd/vswitch.xml (which is built as ovs-vswitchd.conf.db(8)).
289      *
290      * This function may be null if 'tc' does not have queues or its queues are
291      * not configurable. */
292     int (*class_set)(struct netdev *, unsigned int queue_id,
293                      const struct smap *details);
294
295     /* Deletes 'queue' from 'netdev->tc'.  'queue' is one of the 'struct
296      * tc_queue's within 'netdev->tc->queues'.
297      *
298      * This function may be null if 'tc' does not have queues or its queues
299      * cannot be deleted. */
300     int (*class_delete)(struct netdev *, struct tc_queue *queue);
301
302     /* Obtains stats for 'queue' from 'netdev->tc'.  'queue' is one of the
303      * 'struct tc_queue's within 'netdev->tc->queues'.
304      *
305      * On success, initializes '*stats'.
306      *
307      * This function may be null if 'tc' does not have queues or if it cannot
308      * report queue statistics. */
309     int (*class_get_stats)(const struct netdev *netdev,
310                            const struct tc_queue *queue,
311                            struct netdev_queue_stats *stats);
312
313     /* Extracts queue stats from 'nlmsg', which is a response to a
314      * RTM_GETTCLASS message, and passes them to 'cb' along with 'aux'.
315      *
316      * This function may be null if 'tc' does not have queues or if it cannot
317      * report queue statistics. */
318     int (*class_dump_stats)(const struct netdev *netdev,
319                             const struct ofpbuf *nlmsg,
320                             netdev_dump_queue_stats_cb *cb, void *aux);
321 };
322
323 static void
324 tc_init(struct tc *tc, const struct tc_ops *ops)
325 {
326     tc->ops = ops;
327     hmap_init(&tc->queues);
328 }
329
330 static void
331 tc_destroy(struct tc *tc)
332 {
333     hmap_destroy(&tc->queues);
334 }
335
336 static const struct tc_ops tc_ops_htb;
337 static const struct tc_ops tc_ops_hfsc;
338 static const struct tc_ops tc_ops_default;
339 static const struct tc_ops tc_ops_other;
340
341 static const struct tc_ops *const tcs[] = {
342     &tc_ops_htb,                /* Hierarchy token bucket (see tc-htb(8)). */
343     &tc_ops_hfsc,               /* Hierarchical fair service curve. */
344     &tc_ops_default,            /* Default qdisc (see tc-pfifo_fast(8)). */
345     &tc_ops_other,              /* Some other qdisc. */
346     NULL
347 };
348
349 static unsigned int tc_make_handle(unsigned int major, unsigned int minor);
350 static unsigned int tc_get_major(unsigned int handle);
351 static unsigned int tc_get_minor(unsigned int handle);
352
353 static unsigned int tc_ticks_to_bytes(unsigned int rate, unsigned int ticks);
354 static unsigned int tc_bytes_to_ticks(unsigned int rate, unsigned int size);
355 static unsigned int tc_buffer_per_jiffy(unsigned int rate);
356
357 static struct tcmsg *tc_make_request(const struct netdev *, int type,
358                                      unsigned int flags, struct ofpbuf *);
359 static int tc_transact(struct ofpbuf *request, struct ofpbuf **replyp);
360 static int tc_add_del_ingress_qdisc(struct netdev *netdev, bool add);
361 static int tc_add_policer(struct netdev *netdev, int kbits_rate,
362                           int kbits_burst);
363
364 static int tc_parse_qdisc(const struct ofpbuf *, const char **kind,
365                           struct nlattr **options);
366 static int tc_parse_class(const struct ofpbuf *, unsigned int *queue_id,
367                           struct nlattr **options,
368                           struct netdev_queue_stats *);
369 static int tc_query_class(const struct netdev *,
370                           unsigned int handle, unsigned int parent,
371                           struct ofpbuf **replyp);
372 static int tc_delete_class(const struct netdev *, unsigned int handle);
373
374 static int tc_del_qdisc(struct netdev *netdev);
375 static int tc_query_qdisc(const struct netdev *netdev);
376
377 static int tc_calc_cell_log(unsigned int mtu);
378 static void tc_fill_rate(struct tc_ratespec *rate, uint64_t bps, int mtu);
379 static void tc_put_rtab(struct ofpbuf *, uint16_t type,
380                         const struct tc_ratespec *rate);
381 static int tc_calc_buffer(unsigned int Bps, int mtu, uint64_t burst_bytes);
382 \f
383 struct netdev_linux {
384     struct netdev up;
385
386     /* Protects all members below. */
387     struct ovs_mutex mutex;
388
389     unsigned int cache_valid;
390
391     bool miimon;                    /* Link status of last poll. */
392     long long int miimon_interval;  /* Miimon Poll rate. Disabled if <= 0. */
393     struct timer miimon_timer;
394
395     /* The following are figured out "on demand" only.  They are only valid
396      * when the corresponding VALID_* bit in 'cache_valid' is set. */
397     int ifindex;
398     uint8_t etheraddr[ETH_ADDR_LEN];
399     struct in_addr address, netmask;
400     struct in6_addr in6;
401     int mtu;
402     unsigned int ifi_flags;
403     long long int carrier_resets;
404     uint32_t kbits_rate;        /* Policing data. */
405     uint32_t kbits_burst;
406     int vport_stats_error;      /* Cached error code from vport_get_stats().
407                                    0 or an errno value. */
408     int netdev_mtu_error;       /* Cached error code from SIOCGIFMTU or SIOCSIFMTU. */
409     int ether_addr_error;       /* Cached error code from set/get etheraddr. */
410     int netdev_policing_error;  /* Cached error code from set policing. */
411     int get_features_error;     /* Cached error code from ETHTOOL_GSET. */
412     int get_ifindex_error;      /* Cached error code from SIOCGIFINDEX. */
413
414     enum netdev_features current;    /* Cached from ETHTOOL_GSET. */
415     enum netdev_features advertised; /* Cached from ETHTOOL_GSET. */
416     enum netdev_features supported;  /* Cached from ETHTOOL_GSET. */
417
418     struct ethtool_drvinfo drvinfo;  /* Cached from ETHTOOL_GDRVINFO. */
419     struct tc *tc;
420
421     /* For devices of class netdev_tap_class only. */
422     int tap_fd;
423 };
424
425 struct netdev_rxq_linux {
426     struct netdev_rxq up;
427     bool is_tap;
428     int fd;
429 };
430
431 /* This is set pretty low because we probably won't learn anything from the
432  * additional log messages. */
433 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
434
435 /* Polling miimon status for all ports causes performance degradation when
436  * handling a large number of ports. If there are no devices using miimon, then
437  * we skip netdev_linux_miimon_run() and netdev_linux_miimon_wait(). */
438 static atomic_int miimon_cnt = ATOMIC_VAR_INIT(0);
439
440 static void netdev_linux_run(void);
441
442 static int netdev_linux_do_ethtool(const char *name, struct ethtool_cmd *,
443                                    int cmd, const char *cmd_name);
444 static int netdev_linux_get_ipv4(const struct netdev *, struct in_addr *,
445                                  int cmd, const char *cmd_name);
446 static int get_flags(const struct netdev *, unsigned int *flags);
447 static int set_flags(const char *, unsigned int flags);
448 static int update_flags(struct netdev_linux *netdev, enum netdev_flags off,
449                         enum netdev_flags on, enum netdev_flags *old_flagsp)
450     OVS_REQUIRES(netdev->mutex);
451 static int do_get_ifindex(const char *netdev_name);
452 static int get_ifindex(const struct netdev *, int *ifindexp);
453 static int do_set_addr(struct netdev *netdev,
454                        int ioctl_nr, const char *ioctl_name,
455                        struct in_addr addr);
456 static int get_etheraddr(const char *netdev_name, uint8_t ea[ETH_ADDR_LEN]);
457 static int set_etheraddr(const char *netdev_name, const uint8_t[ETH_ADDR_LEN]);
458 static int get_stats_via_netlink(const struct netdev *, struct netdev_stats *);
459 static int af_packet_sock(void);
460 static bool netdev_linux_miimon_enabled(void);
461 static void netdev_linux_miimon_run(void);
462 static void netdev_linux_miimon_wait(void);
463 static int netdev_linux_get_mtu__(struct netdev_linux *netdev, int *mtup);
464
465 static bool
466 is_netdev_linux_class(const struct netdev_class *netdev_class)
467 {
468     return netdev_class->run == netdev_linux_run;
469 }
470
471 static bool
472 is_tap_netdev(const struct netdev *netdev)
473 {
474     return netdev_get_class(netdev) == &netdev_tap_class;
475 }
476
477 static struct netdev_linux *
478 netdev_linux_cast(const struct netdev *netdev)
479 {
480     ovs_assert(is_netdev_linux_class(netdev_get_class(netdev)));
481
482     return CONTAINER_OF(netdev, struct netdev_linux, up);
483 }
484
485 static struct netdev_rxq_linux *
486 netdev_rxq_linux_cast(const struct netdev_rxq *rx)
487 {
488     ovs_assert(is_netdev_linux_class(netdev_get_class(rx->netdev)));
489     return CONTAINER_OF(rx, struct netdev_rxq_linux, up);
490 }
491 \f
492 static void netdev_linux_update(struct netdev_linux *netdev,
493                                 const struct rtnetlink_link_change *)
494     OVS_REQUIRES(netdev->mutex);
495 static void netdev_linux_changed(struct netdev_linux *netdev,
496                                  unsigned int ifi_flags, unsigned int mask)
497     OVS_REQUIRES(netdev->mutex);
498
499 /* Returns a NETLINK_ROUTE socket listening for RTNLGRP_LINK changes, or NULL
500  * if no such socket could be created. */
501 static struct nl_sock *
502 netdev_linux_notify_sock(void)
503 {
504     static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
505     static struct nl_sock *sock;
506
507     if (ovsthread_once_start(&once)) {
508         int error;
509
510         error = nl_sock_create(NETLINK_ROUTE, &sock);
511         if (!error) {
512             error = nl_sock_join_mcgroup(sock, RTNLGRP_LINK);
513             if (error) {
514                 nl_sock_destroy(sock);
515                 sock = NULL;
516             }
517         }
518         ovsthread_once_done(&once);
519     }
520
521     return sock;
522 }
523
524 static bool
525 netdev_linux_miimon_enabled(void)
526 {
527     int miimon;
528
529     atomic_read(&miimon_cnt, &miimon);
530     return miimon > 0;
531 }
532
533 static void
534 netdev_linux_run(void)
535 {
536     struct nl_sock *sock;
537     int error;
538
539     if (netdev_linux_miimon_enabled()) {
540         netdev_linux_miimon_run();
541     }
542
543     sock = netdev_linux_notify_sock();
544     if (!sock) {
545         return;
546     }
547
548     do {
549         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
550         uint64_t buf_stub[4096 / 8];
551         struct ofpbuf buf;
552
553         ofpbuf_use_stub(&buf, buf_stub, sizeof buf_stub);
554         error = nl_sock_recv(sock, &buf, false);
555         if (!error) {
556             struct rtnetlink_link_change change;
557
558             if (rtnetlink_link_parse(&buf, &change)) {
559                 struct netdev *netdev_ = netdev_from_name(change.ifname);
560                 if (netdev_ && is_netdev_linux_class(netdev_->netdev_class)) {
561                     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
562
563                     ovs_mutex_lock(&netdev->mutex);
564                     netdev_linux_update(netdev, &change);
565                     ovs_mutex_unlock(&netdev->mutex);
566                 }
567                 netdev_close(netdev_);
568             }
569         } else if (error == ENOBUFS) {
570             struct shash device_shash;
571             struct shash_node *node;
572
573             nl_sock_drain(sock);
574
575             shash_init(&device_shash);
576             netdev_get_devices(&netdev_linux_class, &device_shash);
577             SHASH_FOR_EACH (node, &device_shash) {
578                 struct netdev *netdev_ = node->data;
579                 struct netdev_linux *netdev = netdev_linux_cast(netdev_);
580                 unsigned int flags;
581
582                 ovs_mutex_lock(&netdev->mutex);
583                 get_flags(netdev_, &flags);
584                 netdev_linux_changed(netdev, flags, 0);
585                 ovs_mutex_unlock(&netdev->mutex);
586
587                 netdev_close(netdev_);
588             }
589             shash_destroy(&device_shash);
590         } else if (error != EAGAIN) {
591             VLOG_WARN_RL(&rl, "error reading or parsing netlink (%s)",
592                          ovs_strerror(error));
593         }
594         ofpbuf_uninit(&buf);
595     } while (!error);
596 }
597
598 static void
599 netdev_linux_wait(void)
600 {
601     struct nl_sock *sock;
602
603     if (netdev_linux_miimon_enabled()) {
604         netdev_linux_miimon_wait();
605     }
606     sock = netdev_linux_notify_sock();
607     if (sock) {
608         nl_sock_wait(sock, POLLIN);
609     }
610 }
611
612 static void
613 netdev_linux_changed(struct netdev_linux *dev,
614                      unsigned int ifi_flags, unsigned int mask)
615     OVS_REQUIRES(dev->mutex)
616 {
617     netdev_change_seq_changed(&dev->up);
618
619     if ((dev->ifi_flags ^ ifi_flags) & IFF_RUNNING) {
620         dev->carrier_resets++;
621     }
622     dev->ifi_flags = ifi_flags;
623
624     dev->cache_valid &= mask;
625 }
626
627 static void
628 netdev_linux_update(struct netdev_linux *dev,
629                     const struct rtnetlink_link_change *change)
630     OVS_REQUIRES(dev->mutex)
631 {
632     if (change->nlmsg_type == RTM_NEWLINK) {
633         /* Keep drv-info */
634         netdev_linux_changed(dev, change->ifi_flags, VALID_DRVINFO);
635
636         /* Update netdev from rtnl-change msg. */
637         if (change->mtu) {
638             dev->mtu = change->mtu;
639             dev->cache_valid |= VALID_MTU;
640             dev->netdev_mtu_error = 0;
641         }
642
643         if (!eth_addr_is_zero(change->addr)) {
644             memcpy(dev->etheraddr, change->addr, ETH_ADDR_LEN);
645             dev->cache_valid |= VALID_ETHERADDR;
646             dev->ether_addr_error = 0;
647         }
648
649         dev->ifindex = change->ifi_index;
650         dev->cache_valid |= VALID_IFINDEX;
651         dev->get_ifindex_error = 0;
652
653     } else {
654         netdev_linux_changed(dev, change->ifi_flags, 0);
655     }
656 }
657
658 static struct netdev *
659 netdev_linux_alloc(void)
660 {
661     struct netdev_linux *netdev = xzalloc(sizeof *netdev);
662     return &netdev->up;
663 }
664
665 static void
666 netdev_linux_common_construct(struct netdev_linux *netdev)
667 {
668     ovs_mutex_init(&netdev->mutex);
669 }
670
671 /* Creates system and internal devices. */
672 static int
673 netdev_linux_construct(struct netdev *netdev_)
674 {
675     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
676     int error;
677
678     netdev_linux_common_construct(netdev);
679
680     error = get_flags(&netdev->up, &netdev->ifi_flags);
681     if (error == ENODEV) {
682         if (netdev->up.netdev_class != &netdev_internal_class) {
683             /* The device does not exist, so don't allow it to be opened. */
684             return ENODEV;
685         } else {
686             /* "Internal" netdevs have to be created as netdev objects before
687              * they exist in the kernel, because creating them in the kernel
688              * happens by passing a netdev object to dpif_port_add().
689              * Therefore, ignore the error. */
690         }
691     }
692
693     return 0;
694 }
695
696 /* For most types of netdevs we open the device for each call of
697  * netdev_open().  However, this is not the case with tap devices,
698  * since it is only possible to open the device once.  In this
699  * situation we share a single file descriptor, and consequently
700  * buffers, across all readers.  Therefore once data is read it will
701  * be unavailable to other reads for tap devices. */
702 static int
703 netdev_linux_construct_tap(struct netdev *netdev_)
704 {
705     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
706     static const char tap_dev[] = "/dev/net/tun";
707     const char *name = netdev_->name;
708     struct ifreq ifr;
709     int error;
710
711     netdev_linux_common_construct(netdev);
712
713     /* Open tap device. */
714     netdev->tap_fd = open(tap_dev, O_RDWR);
715     if (netdev->tap_fd < 0) {
716         error = errno;
717         VLOG_WARN("opening \"%s\" failed: %s", tap_dev, ovs_strerror(error));
718         return error;
719     }
720
721     /* Create tap device. */
722     ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
723     ovs_strzcpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
724     if (ioctl(netdev->tap_fd, TUNSETIFF, &ifr) == -1) {
725         VLOG_WARN("%s: creating tap device failed: %s", name,
726                   ovs_strerror(errno));
727         error = errno;
728         goto error_close;
729     }
730
731     /* Make non-blocking. */
732     error = set_nonblocking(netdev->tap_fd);
733     if (error) {
734         goto error_close;
735     }
736
737     return 0;
738
739 error_close:
740     close(netdev->tap_fd);
741     return error;
742 }
743
744 static void
745 netdev_linux_destruct(struct netdev *netdev_)
746 {
747     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
748
749     if (netdev->tc && netdev->tc->ops->tc_destroy) {
750         netdev->tc->ops->tc_destroy(netdev->tc);
751     }
752
753     if (netdev_get_class(netdev_) == &netdev_tap_class
754         && netdev->tap_fd >= 0)
755     {
756         close(netdev->tap_fd);
757     }
758
759     if (netdev->miimon_interval > 0) {
760         int junk;
761         atomic_sub(&miimon_cnt, 1, &junk);
762     }
763
764     ovs_mutex_destroy(&netdev->mutex);
765 }
766
767 static void
768 netdev_linux_dealloc(struct netdev *netdev_)
769 {
770     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
771     free(netdev);
772 }
773
774 static struct netdev_rxq *
775 netdev_linux_rxq_alloc(void)
776 {
777     struct netdev_rxq_linux *rx = xzalloc(sizeof *rx);
778     return &rx->up;
779 }
780
781 static int
782 netdev_linux_rxq_construct(struct netdev_rxq *rxq_)
783 {
784     struct netdev_rxq_linux *rx = netdev_rxq_linux_cast(rxq_);
785     struct netdev *netdev_ = rx->up.netdev;
786     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
787     int error;
788
789     ovs_mutex_lock(&netdev->mutex);
790     rx->is_tap = is_tap_netdev(netdev_);
791     if (rx->is_tap) {
792         rx->fd = netdev->tap_fd;
793     } else {
794         struct sockaddr_ll sll;
795         int ifindex, val;
796         /* Result of tcpdump -dd inbound */
797         static const struct sock_filter filt[] = {
798             { 0x28, 0, 0, 0xfffff004 }, /* ldh [0] */
799             { 0x15, 0, 1, 0x00000004 }, /* jeq #4     jt 2  jf 3 */
800             { 0x6, 0, 0, 0x00000000 },  /* ret #0 */
801             { 0x6, 0, 0, 0x0000ffff }   /* ret #65535 */
802         };
803         static const struct sock_fprog fprog = {
804             ARRAY_SIZE(filt), (struct sock_filter *) filt
805         };
806
807         /* Create file descriptor. */
808         rx->fd = socket(PF_PACKET, SOCK_RAW, 0);
809         if (rx->fd < 0) {
810             error = errno;
811             VLOG_ERR("failed to create raw socket (%s)", ovs_strerror(error));
812             goto error;
813         }
814
815         val = 1;
816         if (setsockopt(rx->fd, SOL_PACKET, PACKET_AUXDATA, &val, sizeof val)) {
817             error = errno;
818             VLOG_ERR("%s: failed to mark socket for auxdata (%s)",
819                      netdev_get_name(netdev_), ovs_strerror(error));
820             goto error;
821         }
822
823         /* Set non-blocking mode. */
824         error = set_nonblocking(rx->fd);
825         if (error) {
826             goto error;
827         }
828
829         /* Get ethernet device index. */
830         error = get_ifindex(&netdev->up, &ifindex);
831         if (error) {
832             goto error;
833         }
834
835         /* Bind to specific ethernet device. */
836         memset(&sll, 0, sizeof sll);
837         sll.sll_family = AF_PACKET;
838         sll.sll_ifindex = ifindex;
839         sll.sll_protocol = htons(ETH_P_ALL);
840         if (bind(rx->fd, (struct sockaddr *) &sll, sizeof sll) < 0) {
841             error = errno;
842             VLOG_ERR("%s: failed to bind raw socket (%s)",
843                      netdev_get_name(netdev_), ovs_strerror(error));
844             goto error;
845         }
846
847         /* Filter for only inbound packets. */
848         error = setsockopt(rx->fd, SOL_SOCKET, SO_ATTACH_FILTER, &fprog,
849                            sizeof fprog);
850         if (error) {
851             error = errno;
852             VLOG_ERR("%s: failed to attach filter (%s)",
853                      netdev_get_name(netdev_), ovs_strerror(error));
854             goto error;
855         }
856     }
857     ovs_mutex_unlock(&netdev->mutex);
858
859     return 0;
860
861 error:
862     if (rx->fd >= 0) {
863         close(rx->fd);
864     }
865     ovs_mutex_unlock(&netdev->mutex);
866     return error;
867 }
868
869 static void
870 netdev_linux_rxq_destruct(struct netdev_rxq *rxq_)
871 {
872     struct netdev_rxq_linux *rx = netdev_rxq_linux_cast(rxq_);
873
874     if (!rx->is_tap) {
875         close(rx->fd);
876     }
877 }
878
879 static void
880 netdev_linux_rxq_dealloc(struct netdev_rxq *rxq_)
881 {
882     struct netdev_rxq_linux *rx = netdev_rxq_linux_cast(rxq_);
883
884     free(rx);
885 }
886
887 static ovs_be16
888 auxdata_to_vlan_tpid(const struct tpacket_auxdata *aux)
889 {
890     if (aux->tp_status & TP_STATUS_VLAN_TPID_VALID) {
891         return htons(aux->tp_vlan_tpid);
892     } else {
893         return htons(ETH_TYPE_VLAN);
894     }
895 }
896
897 static bool
898 auxdata_has_vlan_tci(const struct tpacket_auxdata *aux)
899 {
900     return aux->tp_vlan_tci || aux->tp_status & TP_STATUS_VLAN_VALID;
901 }
902
903 static int
904 netdev_linux_rxq_recv_sock(int fd, struct ofpbuf *buffer)
905 {
906     size_t size;
907     ssize_t retval;
908     struct iovec iov;
909     struct cmsghdr *cmsg;
910     union {
911         struct cmsghdr cmsg;
912         char buffer[CMSG_SPACE(sizeof(struct tpacket_auxdata))];
913     } cmsg_buffer;
914     struct msghdr msgh;
915
916     /* Reserve headroom for a single VLAN tag */
917     ofpbuf_reserve(buffer, VLAN_HEADER_LEN);
918     size = ofpbuf_tailroom(buffer);
919
920     iov.iov_base = ofpbuf_data(buffer);
921     iov.iov_len = size;
922     msgh.msg_name = NULL;
923     msgh.msg_namelen = 0;
924     msgh.msg_iov = &iov;
925     msgh.msg_iovlen = 1;
926     msgh.msg_control = &cmsg_buffer;
927     msgh.msg_controllen = sizeof cmsg_buffer;
928     msgh.msg_flags = 0;
929
930     do {
931         retval = recvmsg(fd, &msgh, MSG_TRUNC);
932     } while (retval < 0 && errno == EINTR);
933
934     if (retval < 0) {
935         return errno;
936     } else if (retval > size) {
937         return EMSGSIZE;
938     }
939
940     ofpbuf_set_size(buffer, ofpbuf_size(buffer) + retval);
941
942     for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg; cmsg = CMSG_NXTHDR(&msgh, cmsg)) {
943         const struct tpacket_auxdata *aux;
944
945         if (cmsg->cmsg_level != SOL_PACKET
946             || cmsg->cmsg_type != PACKET_AUXDATA
947             || cmsg->cmsg_len < CMSG_LEN(sizeof(struct tpacket_auxdata))) {
948             continue;
949         }
950
951         aux = ALIGNED_CAST(struct tpacket_auxdata *, CMSG_DATA(cmsg));
952         if (auxdata_has_vlan_tci(aux)) {
953             if (retval < ETH_HEADER_LEN) {
954                 return EINVAL;
955             }
956
957             eth_push_vlan(buffer, auxdata_to_vlan_tpid(aux),
958                           htons(aux->tp_vlan_tci));
959             break;
960         }
961     }
962
963     return 0;
964 }
965
966 static int
967 netdev_linux_rxq_recv_tap(int fd, struct ofpbuf *buffer)
968 {
969     ssize_t retval;
970     size_t size = ofpbuf_tailroom(buffer);
971
972     do {
973         retval = read(fd, ofpbuf_data(buffer), size);
974     } while (retval < 0 && errno == EINTR);
975
976     if (retval < 0) {
977         return errno;
978     } else if (retval > size) {
979         return EMSGSIZE;
980     }
981
982     ofpbuf_set_size(buffer, ofpbuf_size(buffer) + retval);
983     return 0;
984 }
985
986 static int
987 netdev_linux_rxq_recv(struct netdev_rxq *rxq_, struct ofpbuf **packet, int *c)
988 {
989     struct netdev_rxq_linux *rx = netdev_rxq_linux_cast(rxq_);
990     struct netdev *netdev = rx->up.netdev;
991     struct ofpbuf *buffer;
992     ssize_t retval;
993     int mtu;
994
995     if (netdev_linux_get_mtu__(netdev_linux_cast(netdev), &mtu)) {
996         mtu = ETH_PAYLOAD_MAX;
997     }
998
999     buffer = ofpbuf_new_with_headroom(VLAN_ETH_HEADER_LEN + mtu, DP_NETDEV_HEADROOM);
1000
1001     retval = (rx->is_tap
1002               ? netdev_linux_rxq_recv_tap(rx->fd, buffer)
1003               : netdev_linux_rxq_recv_sock(rx->fd, buffer));
1004
1005     if (retval) {
1006         if (retval != EAGAIN && retval != EMSGSIZE) {
1007             VLOG_WARN_RL(&rl, "error receiving Ethernet packet on %s: %s",
1008                          ovs_strerror(errno), netdev_rxq_get_name(rxq_));
1009         }
1010         ofpbuf_delete(buffer);
1011     } else {
1012         dp_packet_pad(buffer);
1013         packet[0] = buffer;
1014         *c = 1;
1015     }
1016
1017     return retval;
1018 }
1019
1020 static void
1021 netdev_linux_rxq_wait(struct netdev_rxq *rxq_)
1022 {
1023     struct netdev_rxq_linux *rx = netdev_rxq_linux_cast(rxq_);
1024     poll_fd_wait(rx->fd, POLLIN);
1025 }
1026
1027 static int
1028 netdev_linux_rxq_drain(struct netdev_rxq *rxq_)
1029 {
1030     struct netdev_rxq_linux *rx = netdev_rxq_linux_cast(rxq_);
1031     if (rx->is_tap) {
1032         struct ifreq ifr;
1033         int error = af_inet_ifreq_ioctl(netdev_rxq_get_name(rxq_), &ifr,
1034                                         SIOCGIFTXQLEN, "SIOCGIFTXQLEN");
1035         if (error) {
1036             return error;
1037         }
1038         drain_fd(rx->fd, ifr.ifr_qlen);
1039         return 0;
1040     } else {
1041         return drain_rcvbuf(rx->fd);
1042     }
1043 }
1044
1045 /* Sends 'buffer' on 'netdev'.  Returns 0 if successful, otherwise a positive
1046  * errno value.  Returns EAGAIN without blocking if the packet cannot be queued
1047  * immediately.  Returns EMSGSIZE if a partial packet was transmitted or if
1048  * the packet is too big or too small to transmit on the device.
1049  *
1050  * The caller retains ownership of 'buffer' in all cases.
1051  *
1052  * The kernel maintains a packet transmission queue, so the caller is not
1053  * expected to do additional queuing of packets. */
1054 static int
1055 netdev_linux_send(struct netdev *netdev_, struct ofpbuf *pkt, bool may_steal)
1056 {
1057     const void *data = ofpbuf_data(pkt);
1058     size_t size = ofpbuf_size(pkt);
1059
1060     for (;;) {
1061         ssize_t retval;
1062
1063         if (!is_tap_netdev(netdev_)) {
1064             /* Use our AF_PACKET socket to send to this device. */
1065             struct sockaddr_ll sll;
1066             struct msghdr msg;
1067             struct iovec iov;
1068             int ifindex;
1069             int sock;
1070
1071             sock = af_packet_sock();
1072             if (sock < 0) {
1073                 return -sock;
1074             }
1075
1076             ifindex = netdev_get_ifindex(netdev_);
1077             if (ifindex < 0) {
1078                 return -ifindex;
1079             }
1080
1081             /* We don't bother setting most fields in sockaddr_ll because the
1082              * kernel ignores them for SOCK_RAW. */
1083             memset(&sll, 0, sizeof sll);
1084             sll.sll_family = AF_PACKET;
1085             sll.sll_ifindex = ifindex;
1086
1087             iov.iov_base = CONST_CAST(void *, data);
1088             iov.iov_len = size;
1089
1090             msg.msg_name = &sll;
1091             msg.msg_namelen = sizeof sll;
1092             msg.msg_iov = &iov;
1093             msg.msg_iovlen = 1;
1094             msg.msg_control = NULL;
1095             msg.msg_controllen = 0;
1096             msg.msg_flags = 0;
1097
1098             retval = sendmsg(sock, &msg, 0);
1099         } else {
1100             /* Use the tap fd to send to this device.  This is essential for
1101              * tap devices, because packets sent to a tap device with an
1102              * AF_PACKET socket will loop back to be *received* again on the
1103              * tap device.  This doesn't occur on other interface types
1104              * because we attach a socket filter to the rx socket. */
1105             struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1106
1107             retval = write(netdev->tap_fd, data, size);
1108         }
1109
1110         if (may_steal) {
1111             ofpbuf_delete(pkt);
1112         }
1113
1114         if (retval < 0) {
1115             /* The Linux AF_PACKET implementation never blocks waiting for room
1116              * for packets, instead returning ENOBUFS.  Translate this into
1117              * EAGAIN for the caller. */
1118             if (errno == ENOBUFS) {
1119                 return EAGAIN;
1120             } else if (errno == EINTR) {
1121                 continue;
1122             } else if (errno != EAGAIN) {
1123                 VLOG_WARN_RL(&rl, "error sending Ethernet packet on %s: %s",
1124                              netdev_get_name(netdev_), ovs_strerror(errno));
1125             }
1126             return errno;
1127         } else if (retval != size) {
1128             VLOG_WARN_RL(&rl, "sent partial Ethernet packet (%"PRIuSIZE"d bytes of "
1129                          "%"PRIuSIZE") on %s", retval, size, netdev_get_name(netdev_));
1130             return EMSGSIZE;
1131         } else {
1132             return 0;
1133         }
1134     }
1135 }
1136
1137 /* Registers with the poll loop to wake up from the next call to poll_block()
1138  * when the packet transmission queue has sufficient room to transmit a packet
1139  * with netdev_send().
1140  *
1141  * The kernel maintains a packet transmission queue, so the client is not
1142  * expected to do additional queuing of packets.  Thus, this function is
1143  * unlikely to ever be used.  It is included for completeness. */
1144 static void
1145 netdev_linux_send_wait(struct netdev *netdev)
1146 {
1147     if (is_tap_netdev(netdev)) {
1148         /* TAP device always accepts packets.*/
1149         poll_immediate_wake();
1150     }
1151 }
1152
1153 /* Attempts to set 'netdev''s MAC address to 'mac'.  Returns 0 if successful,
1154  * otherwise a positive errno value. */
1155 static int
1156 netdev_linux_set_etheraddr(struct netdev *netdev_,
1157                            const uint8_t mac[ETH_ADDR_LEN])
1158 {
1159     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1160     enum netdev_flags old_flags = 0;
1161     int error;
1162
1163     ovs_mutex_lock(&netdev->mutex);
1164
1165     if (netdev->cache_valid & VALID_ETHERADDR) {
1166         error = netdev->ether_addr_error;
1167         if (error || eth_addr_equals(netdev->etheraddr, mac)) {
1168             goto exit;
1169         }
1170         netdev->cache_valid &= ~VALID_ETHERADDR;
1171     }
1172
1173     /* Tap devices must be brought down before setting the address. */
1174     if (is_tap_netdev(netdev_)) {
1175         update_flags(netdev, NETDEV_UP, 0, &old_flags);
1176     }
1177     error = set_etheraddr(netdev_get_name(netdev_), mac);
1178     if (!error || error == ENODEV) {
1179         netdev->ether_addr_error = error;
1180         netdev->cache_valid |= VALID_ETHERADDR;
1181         if (!error) {
1182             memcpy(netdev->etheraddr, mac, ETH_ADDR_LEN);
1183         }
1184     }
1185
1186     if (is_tap_netdev(netdev_) && old_flags & NETDEV_UP) {
1187         update_flags(netdev, 0, NETDEV_UP, &old_flags);
1188     }
1189
1190 exit:
1191     ovs_mutex_unlock(&netdev->mutex);
1192     return error;
1193 }
1194
1195 /* Copies 'netdev''s MAC address to 'mac' which is passed as param. */
1196 static int
1197 netdev_linux_get_etheraddr(const struct netdev *netdev_,
1198                            uint8_t mac[ETH_ADDR_LEN])
1199 {
1200     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1201     int error;
1202
1203     ovs_mutex_lock(&netdev->mutex);
1204     if (!(netdev->cache_valid & VALID_ETHERADDR)) {
1205         netdev->ether_addr_error = get_etheraddr(netdev_get_name(netdev_),
1206                                                  netdev->etheraddr);
1207         netdev->cache_valid |= VALID_ETHERADDR;
1208     }
1209
1210     error = netdev->ether_addr_error;
1211     if (!error) {
1212         memcpy(mac, netdev->etheraddr, ETH_ADDR_LEN);
1213     }
1214     ovs_mutex_unlock(&netdev->mutex);
1215
1216     return error;
1217 }
1218
1219 static int
1220 netdev_linux_get_mtu__(struct netdev_linux *netdev, int *mtup)
1221 {
1222     int error;
1223
1224     if (!(netdev->cache_valid & VALID_MTU)) {
1225         struct ifreq ifr;
1226
1227         netdev->netdev_mtu_error = af_inet_ifreq_ioctl(
1228             netdev_get_name(&netdev->up), &ifr, SIOCGIFMTU, "SIOCGIFMTU");
1229         netdev->mtu = ifr.ifr_mtu;
1230         netdev->cache_valid |= VALID_MTU;
1231     }
1232
1233     error = netdev->netdev_mtu_error;
1234     if (!error) {
1235         *mtup = netdev->mtu;
1236     }
1237
1238     return error;
1239 }
1240
1241 /* Returns the maximum size of transmitted (and received) packets on 'netdev',
1242  * in bytes, not including the hardware header; thus, this is typically 1500
1243  * bytes for Ethernet devices. */
1244 static int
1245 netdev_linux_get_mtu(const struct netdev *netdev_, int *mtup)
1246 {
1247     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1248     int error;
1249
1250     ovs_mutex_lock(&netdev->mutex);
1251     error = netdev_linux_get_mtu__(netdev, mtup);
1252     ovs_mutex_unlock(&netdev->mutex);
1253
1254     return error;
1255 }
1256
1257 /* Sets the maximum size of transmitted (MTU) for given device using linux
1258  * networking ioctl interface.
1259  */
1260 static int
1261 netdev_linux_set_mtu(const struct netdev *netdev_, int mtu)
1262 {
1263     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1264     struct ifreq ifr;
1265     int error;
1266
1267     ovs_mutex_lock(&netdev->mutex);
1268     if (netdev->cache_valid & VALID_MTU) {
1269         error = netdev->netdev_mtu_error;
1270         if (error || netdev->mtu == mtu) {
1271             goto exit;
1272         }
1273         netdev->cache_valid &= ~VALID_MTU;
1274     }
1275     ifr.ifr_mtu = mtu;
1276     error = af_inet_ifreq_ioctl(netdev_get_name(netdev_), &ifr,
1277                                 SIOCSIFMTU, "SIOCSIFMTU");
1278     if (!error || error == ENODEV) {
1279         netdev->netdev_mtu_error = error;
1280         netdev->mtu = ifr.ifr_mtu;
1281         netdev->cache_valid |= VALID_MTU;
1282     }
1283 exit:
1284     ovs_mutex_unlock(&netdev->mutex);
1285     return error;
1286 }
1287
1288 /* Returns the ifindex of 'netdev', if successful, as a positive number.
1289  * On failure, returns a negative errno value. */
1290 static int
1291 netdev_linux_get_ifindex(const struct netdev *netdev_)
1292 {
1293     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1294     int ifindex, error;
1295
1296     ovs_mutex_lock(&netdev->mutex);
1297     error = get_ifindex(netdev_, &ifindex);
1298     ovs_mutex_unlock(&netdev->mutex);
1299
1300     return error ? -error : ifindex;
1301 }
1302
1303 static int
1304 netdev_linux_get_carrier(const struct netdev *netdev_, bool *carrier)
1305 {
1306     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1307
1308     ovs_mutex_lock(&netdev->mutex);
1309     if (netdev->miimon_interval > 0) {
1310         *carrier = netdev->miimon;
1311     } else {
1312         *carrier = (netdev->ifi_flags & IFF_RUNNING) != 0;
1313     }
1314     ovs_mutex_unlock(&netdev->mutex);
1315
1316     return 0;
1317 }
1318
1319 static long long int
1320 netdev_linux_get_carrier_resets(const struct netdev *netdev_)
1321 {
1322     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1323     long long int carrier_resets;
1324
1325     ovs_mutex_lock(&netdev->mutex);
1326     carrier_resets = netdev->carrier_resets;
1327     ovs_mutex_unlock(&netdev->mutex);
1328
1329     return carrier_resets;
1330 }
1331
1332 static int
1333 netdev_linux_do_miimon(const char *name, int cmd, const char *cmd_name,
1334                        struct mii_ioctl_data *data)
1335 {
1336     struct ifreq ifr;
1337     int error;
1338
1339     memset(&ifr, 0, sizeof ifr);
1340     memcpy(&ifr.ifr_data, data, sizeof *data);
1341     error = af_inet_ifreq_ioctl(name, &ifr, cmd, cmd_name);
1342     memcpy(data, &ifr.ifr_data, sizeof *data);
1343
1344     return error;
1345 }
1346
1347 static int
1348 netdev_linux_get_miimon(const char *name, bool *miimon)
1349 {
1350     struct mii_ioctl_data data;
1351     int error;
1352
1353     *miimon = false;
1354
1355     memset(&data, 0, sizeof data);
1356     error = netdev_linux_do_miimon(name, SIOCGMIIPHY, "SIOCGMIIPHY", &data);
1357     if (!error) {
1358         /* data.phy_id is filled out by previous SIOCGMIIPHY miimon call. */
1359         data.reg_num = MII_BMSR;
1360         error = netdev_linux_do_miimon(name, SIOCGMIIREG, "SIOCGMIIREG",
1361                                        &data);
1362
1363         if (!error) {
1364             *miimon = !!(data.val_out & BMSR_LSTATUS);
1365         } else {
1366             VLOG_WARN_RL(&rl, "%s: failed to query MII", name);
1367         }
1368     } else {
1369         struct ethtool_cmd ecmd;
1370
1371         VLOG_DBG_RL(&rl, "%s: failed to query MII, falling back to ethtool",
1372                     name);
1373
1374         COVERAGE_INC(netdev_get_ethtool);
1375         memset(&ecmd, 0, sizeof ecmd);
1376         error = netdev_linux_do_ethtool(name, &ecmd, ETHTOOL_GLINK,
1377                                         "ETHTOOL_GLINK");
1378         if (!error) {
1379             struct ethtool_value eval;
1380
1381             memcpy(&eval, &ecmd, sizeof eval);
1382             *miimon = !!eval.data;
1383         } else {
1384             VLOG_WARN_RL(&rl, "%s: ethtool link status failed", name);
1385         }
1386     }
1387
1388     return error;
1389 }
1390
1391 static int
1392 netdev_linux_set_miimon_interval(struct netdev *netdev_,
1393                                  long long int interval)
1394 {
1395     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1396
1397     ovs_mutex_lock(&netdev->mutex);
1398     interval = interval > 0 ? MAX(interval, 100) : 0;
1399     if (netdev->miimon_interval != interval) {
1400         int junk;
1401
1402         if (interval && !netdev->miimon_interval) {
1403             atomic_add(&miimon_cnt, 1, &junk);
1404         } else if (!interval && netdev->miimon_interval) {
1405             atomic_sub(&miimon_cnt, 1, &junk);
1406         }
1407
1408         netdev->miimon_interval = interval;
1409         timer_set_expired(&netdev->miimon_timer);
1410     }
1411     ovs_mutex_unlock(&netdev->mutex);
1412
1413     return 0;
1414 }
1415
1416 static void
1417 netdev_linux_miimon_run(void)
1418 {
1419     struct shash device_shash;
1420     struct shash_node *node;
1421
1422     shash_init(&device_shash);
1423     netdev_get_devices(&netdev_linux_class, &device_shash);
1424     SHASH_FOR_EACH (node, &device_shash) {
1425         struct netdev *netdev = node->data;
1426         struct netdev_linux *dev = netdev_linux_cast(netdev);
1427         bool miimon;
1428
1429         ovs_mutex_lock(&dev->mutex);
1430         if (dev->miimon_interval > 0 && timer_expired(&dev->miimon_timer)) {
1431             netdev_linux_get_miimon(dev->up.name, &miimon);
1432             if (miimon != dev->miimon) {
1433                 dev->miimon = miimon;
1434                 netdev_linux_changed(dev, dev->ifi_flags, 0);
1435             }
1436
1437             timer_set_duration(&dev->miimon_timer, dev->miimon_interval);
1438         }
1439         ovs_mutex_unlock(&dev->mutex);
1440         netdev_close(netdev);
1441     }
1442
1443     shash_destroy(&device_shash);
1444 }
1445
1446 static void
1447 netdev_linux_miimon_wait(void)
1448 {
1449     struct shash device_shash;
1450     struct shash_node *node;
1451
1452     shash_init(&device_shash);
1453     netdev_get_devices(&netdev_linux_class, &device_shash);
1454     SHASH_FOR_EACH (node, &device_shash) {
1455         struct netdev *netdev = node->data;
1456         struct netdev_linux *dev = netdev_linux_cast(netdev);
1457
1458         ovs_mutex_lock(&dev->mutex);
1459         if (dev->miimon_interval > 0) {
1460             timer_wait(&dev->miimon_timer);
1461         }
1462         ovs_mutex_unlock(&dev->mutex);
1463         netdev_close(netdev);
1464     }
1465     shash_destroy(&device_shash);
1466 }
1467
1468 static void
1469 swap_uint64(uint64_t *a, uint64_t *b)
1470 {
1471     uint64_t tmp = *a;
1472     *a = *b;
1473     *b = tmp;
1474 }
1475
1476 /* Copies 'src' into 'dst', performing format conversion in the process.
1477  *
1478  * 'src' is allowed to be misaligned. */
1479 static void
1480 netdev_stats_from_ovs_vport_stats(struct netdev_stats *dst,
1481                                   const struct ovs_vport_stats *src)
1482 {
1483     dst->rx_packets = get_unaligned_u64(&src->rx_packets);
1484     dst->tx_packets = get_unaligned_u64(&src->tx_packets);
1485     dst->rx_bytes = get_unaligned_u64(&src->rx_bytes);
1486     dst->tx_bytes = get_unaligned_u64(&src->tx_bytes);
1487     dst->rx_errors = get_unaligned_u64(&src->rx_errors);
1488     dst->tx_errors = get_unaligned_u64(&src->tx_errors);
1489     dst->rx_dropped = get_unaligned_u64(&src->rx_dropped);
1490     dst->tx_dropped = get_unaligned_u64(&src->tx_dropped);
1491     dst->multicast = 0;
1492     dst->collisions = 0;
1493     dst->rx_length_errors = 0;
1494     dst->rx_over_errors = 0;
1495     dst->rx_crc_errors = 0;
1496     dst->rx_frame_errors = 0;
1497     dst->rx_fifo_errors = 0;
1498     dst->rx_missed_errors = 0;
1499     dst->tx_aborted_errors = 0;
1500     dst->tx_carrier_errors = 0;
1501     dst->tx_fifo_errors = 0;
1502     dst->tx_heartbeat_errors = 0;
1503     dst->tx_window_errors = 0;
1504 }
1505
1506 static int
1507 get_stats_via_vport__(const struct netdev *netdev, struct netdev_stats *stats)
1508 {
1509     struct dpif_linux_vport reply;
1510     struct ofpbuf *buf;
1511     int error;
1512
1513     error = dpif_linux_vport_get(netdev_get_name(netdev), &reply, &buf);
1514     if (error) {
1515         return error;
1516     } else if (!reply.stats) {
1517         ofpbuf_delete(buf);
1518         return EOPNOTSUPP;
1519     }
1520
1521     netdev_stats_from_ovs_vport_stats(stats, reply.stats);
1522
1523     ofpbuf_delete(buf);
1524
1525     return 0;
1526 }
1527
1528 static void
1529 get_stats_via_vport(const struct netdev *netdev_,
1530                     struct netdev_stats *stats)
1531 {
1532     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1533
1534     if (!netdev->vport_stats_error ||
1535         !(netdev->cache_valid & VALID_VPORT_STAT_ERROR)) {
1536         int error;
1537
1538         error = get_stats_via_vport__(netdev_, stats);
1539         if (error && error != ENOENT) {
1540             VLOG_WARN_RL(&rl, "%s: obtaining netdev stats via vport failed "
1541                          "(%s)",
1542                          netdev_get_name(netdev_), ovs_strerror(error));
1543         }
1544         netdev->vport_stats_error = error;
1545         netdev->cache_valid |= VALID_VPORT_STAT_ERROR;
1546     }
1547 }
1548
1549 /* Retrieves current device stats for 'netdev-linux'. */
1550 static int
1551 netdev_linux_get_stats(const struct netdev *netdev_,
1552                        struct netdev_stats *stats)
1553 {
1554     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1555     struct netdev_stats dev_stats;
1556     int error;
1557
1558     ovs_mutex_lock(&netdev->mutex);
1559     get_stats_via_vport(netdev_, stats);
1560     error = get_stats_via_netlink(netdev_, &dev_stats);
1561     if (error) {
1562         if (!netdev->vport_stats_error) {
1563             error = 0;
1564         }
1565     } else if (netdev->vport_stats_error) {
1566         /* stats not available from OVS then use ioctl stats. */
1567         *stats = dev_stats;
1568     } else {
1569         stats->rx_errors           += dev_stats.rx_errors;
1570         stats->tx_errors           += dev_stats.tx_errors;
1571         stats->rx_dropped          += dev_stats.rx_dropped;
1572         stats->tx_dropped          += dev_stats.tx_dropped;
1573         stats->multicast           += dev_stats.multicast;
1574         stats->collisions          += dev_stats.collisions;
1575         stats->rx_length_errors    += dev_stats.rx_length_errors;
1576         stats->rx_over_errors      += dev_stats.rx_over_errors;
1577         stats->rx_crc_errors       += dev_stats.rx_crc_errors;
1578         stats->rx_frame_errors     += dev_stats.rx_frame_errors;
1579         stats->rx_fifo_errors      += dev_stats.rx_fifo_errors;
1580         stats->rx_missed_errors    += dev_stats.rx_missed_errors;
1581         stats->tx_aborted_errors   += dev_stats.tx_aborted_errors;
1582         stats->tx_carrier_errors   += dev_stats.tx_carrier_errors;
1583         stats->tx_fifo_errors      += dev_stats.tx_fifo_errors;
1584         stats->tx_heartbeat_errors += dev_stats.tx_heartbeat_errors;
1585         stats->tx_window_errors    += dev_stats.tx_window_errors;
1586     }
1587     ovs_mutex_unlock(&netdev->mutex);
1588
1589     return error;
1590 }
1591
1592 /* Retrieves current device stats for 'netdev-tap' netdev or
1593  * netdev-internal. */
1594 static int
1595 netdev_tap_get_stats(const struct netdev *netdev_, struct netdev_stats *stats)
1596 {
1597     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1598     struct netdev_stats dev_stats;
1599     int error;
1600
1601     ovs_mutex_lock(&netdev->mutex);
1602     get_stats_via_vport(netdev_, stats);
1603     error = get_stats_via_netlink(netdev_, &dev_stats);
1604     if (error) {
1605         if (!netdev->vport_stats_error) {
1606             error = 0;
1607         }
1608     } else if (netdev->vport_stats_error) {
1609         /* Transmit and receive stats will appear to be swapped relative to the
1610          * other ports since we are the one sending the data, not a remote
1611          * computer.  For consistency, we swap them back here. This does not
1612          * apply if we are getting stats from the vport layer because it always
1613          * tracks stats from the perspective of the switch. */
1614
1615         *stats = dev_stats;
1616         swap_uint64(&stats->rx_packets, &stats->tx_packets);
1617         swap_uint64(&stats->rx_bytes, &stats->tx_bytes);
1618         swap_uint64(&stats->rx_errors, &stats->tx_errors);
1619         swap_uint64(&stats->rx_dropped, &stats->tx_dropped);
1620         stats->rx_length_errors = 0;
1621         stats->rx_over_errors = 0;
1622         stats->rx_crc_errors = 0;
1623         stats->rx_frame_errors = 0;
1624         stats->rx_fifo_errors = 0;
1625         stats->rx_missed_errors = 0;
1626         stats->tx_aborted_errors = 0;
1627         stats->tx_carrier_errors = 0;
1628         stats->tx_fifo_errors = 0;
1629         stats->tx_heartbeat_errors = 0;
1630         stats->tx_window_errors = 0;
1631     } else {
1632         stats->rx_dropped          += dev_stats.tx_dropped;
1633         stats->tx_dropped          += dev_stats.rx_dropped;
1634
1635         stats->rx_errors           += dev_stats.tx_errors;
1636         stats->tx_errors           += dev_stats.rx_errors;
1637
1638         stats->multicast           += dev_stats.multicast;
1639         stats->collisions          += dev_stats.collisions;
1640     }
1641     ovs_mutex_unlock(&netdev->mutex);
1642
1643     return error;
1644 }
1645
1646 static int
1647 netdev_internal_get_stats(const struct netdev *netdev_,
1648                           struct netdev_stats *stats)
1649 {
1650     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1651     int error;
1652
1653     ovs_mutex_lock(&netdev->mutex);
1654     get_stats_via_vport(netdev_, stats);
1655     error = netdev->vport_stats_error;
1656     ovs_mutex_unlock(&netdev->mutex);
1657
1658     return error;
1659 }
1660
1661 static int
1662 netdev_internal_set_stats(struct netdev *netdev,
1663                           const struct netdev_stats *stats)
1664 {
1665     struct ovs_vport_stats vport_stats;
1666     struct dpif_linux_vport vport;
1667     int err;
1668
1669     vport_stats.rx_packets = stats->rx_packets;
1670     vport_stats.tx_packets = stats->tx_packets;
1671     vport_stats.rx_bytes = stats->rx_bytes;
1672     vport_stats.tx_bytes = stats->tx_bytes;
1673     vport_stats.rx_errors = stats->rx_errors;
1674     vport_stats.tx_errors = stats->tx_errors;
1675     vport_stats.rx_dropped = stats->rx_dropped;
1676     vport_stats.tx_dropped = stats->tx_dropped;
1677
1678     dpif_linux_vport_init(&vport);
1679     vport.cmd = OVS_VPORT_CMD_SET;
1680     vport.name = netdev_get_name(netdev);
1681     vport.stats = &vport_stats;
1682
1683     err = dpif_linux_vport_transact(&vport, NULL, NULL);
1684
1685     /* If the vport layer doesn't know about the device, that doesn't mean it
1686      * doesn't exist (after all were able to open it when netdev_open() was
1687      * called), it just means that it isn't attached and we'll be getting
1688      * stats a different way. */
1689     if (err == ENODEV) {
1690         err = EOPNOTSUPP;
1691     }
1692
1693     return err;
1694 }
1695
1696 static void
1697 netdev_linux_read_features(struct netdev_linux *netdev)
1698 {
1699     struct ethtool_cmd ecmd;
1700     uint32_t speed;
1701     int error;
1702
1703     if (netdev->cache_valid & VALID_FEATURES) {
1704         return;
1705     }
1706
1707     COVERAGE_INC(netdev_get_ethtool);
1708     memset(&ecmd, 0, sizeof ecmd);
1709     error = netdev_linux_do_ethtool(netdev->up.name, &ecmd,
1710                                     ETHTOOL_GSET, "ETHTOOL_GSET");
1711     if (error) {
1712         goto out;
1713     }
1714
1715     /* Supported features. */
1716     netdev->supported = 0;
1717     if (ecmd.supported & SUPPORTED_10baseT_Half) {
1718         netdev->supported |= NETDEV_F_10MB_HD;
1719     }
1720     if (ecmd.supported & SUPPORTED_10baseT_Full) {
1721         netdev->supported |= NETDEV_F_10MB_FD;
1722     }
1723     if (ecmd.supported & SUPPORTED_100baseT_Half)  {
1724         netdev->supported |= NETDEV_F_100MB_HD;
1725     }
1726     if (ecmd.supported & SUPPORTED_100baseT_Full) {
1727         netdev->supported |= NETDEV_F_100MB_FD;
1728     }
1729     if (ecmd.supported & SUPPORTED_1000baseT_Half) {
1730         netdev->supported |= NETDEV_F_1GB_HD;
1731     }
1732     if (ecmd.supported & SUPPORTED_1000baseT_Full) {
1733         netdev->supported |= NETDEV_F_1GB_FD;
1734     }
1735     if (ecmd.supported & SUPPORTED_10000baseT_Full) {
1736         netdev->supported |= NETDEV_F_10GB_FD;
1737     }
1738     if (ecmd.supported & SUPPORTED_TP) {
1739         netdev->supported |= NETDEV_F_COPPER;
1740     }
1741     if (ecmd.supported & SUPPORTED_FIBRE) {
1742         netdev->supported |= NETDEV_F_FIBER;
1743     }
1744     if (ecmd.supported & SUPPORTED_Autoneg) {
1745         netdev->supported |= NETDEV_F_AUTONEG;
1746     }
1747     if (ecmd.supported & SUPPORTED_Pause) {
1748         netdev->supported |= NETDEV_F_PAUSE;
1749     }
1750     if (ecmd.supported & SUPPORTED_Asym_Pause) {
1751         netdev->supported |= NETDEV_F_PAUSE_ASYM;
1752     }
1753
1754     /* Advertised features. */
1755     netdev->advertised = 0;
1756     if (ecmd.advertising & ADVERTISED_10baseT_Half) {
1757         netdev->advertised |= NETDEV_F_10MB_HD;
1758     }
1759     if (ecmd.advertising & ADVERTISED_10baseT_Full) {
1760         netdev->advertised |= NETDEV_F_10MB_FD;
1761     }
1762     if (ecmd.advertising & ADVERTISED_100baseT_Half) {
1763         netdev->advertised |= NETDEV_F_100MB_HD;
1764     }
1765     if (ecmd.advertising & ADVERTISED_100baseT_Full) {
1766         netdev->advertised |= NETDEV_F_100MB_FD;
1767     }
1768     if (ecmd.advertising & ADVERTISED_1000baseT_Half) {
1769         netdev->advertised |= NETDEV_F_1GB_HD;
1770     }
1771     if (ecmd.advertising & ADVERTISED_1000baseT_Full) {
1772         netdev->advertised |= NETDEV_F_1GB_FD;
1773     }
1774     if (ecmd.advertising & ADVERTISED_10000baseT_Full) {
1775         netdev->advertised |= NETDEV_F_10GB_FD;
1776     }
1777     if (ecmd.advertising & ADVERTISED_TP) {
1778         netdev->advertised |= NETDEV_F_COPPER;
1779     }
1780     if (ecmd.advertising & ADVERTISED_FIBRE) {
1781         netdev->advertised |= NETDEV_F_FIBER;
1782     }
1783     if (ecmd.advertising & ADVERTISED_Autoneg) {
1784         netdev->advertised |= NETDEV_F_AUTONEG;
1785     }
1786     if (ecmd.advertising & ADVERTISED_Pause) {
1787         netdev->advertised |= NETDEV_F_PAUSE;
1788     }
1789     if (ecmd.advertising & ADVERTISED_Asym_Pause) {
1790         netdev->advertised |= NETDEV_F_PAUSE_ASYM;
1791     }
1792
1793     /* Current settings. */
1794     speed = ecmd.speed;
1795     if (speed == SPEED_10) {
1796         netdev->current = ecmd.duplex ? NETDEV_F_10MB_FD : NETDEV_F_10MB_HD;
1797     } else if (speed == SPEED_100) {
1798         netdev->current = ecmd.duplex ? NETDEV_F_100MB_FD : NETDEV_F_100MB_HD;
1799     } else if (speed == SPEED_1000) {
1800         netdev->current = ecmd.duplex ? NETDEV_F_1GB_FD : NETDEV_F_1GB_HD;
1801     } else if (speed == SPEED_10000) {
1802         netdev->current = NETDEV_F_10GB_FD;
1803     } else if (speed == 40000) {
1804         netdev->current = NETDEV_F_40GB_FD;
1805     } else if (speed == 100000) {
1806         netdev->current = NETDEV_F_100GB_FD;
1807     } else if (speed == 1000000) {
1808         netdev->current = NETDEV_F_1TB_FD;
1809     } else {
1810         netdev->current = 0;
1811     }
1812
1813     if (ecmd.port == PORT_TP) {
1814         netdev->current |= NETDEV_F_COPPER;
1815     } else if (ecmd.port == PORT_FIBRE) {
1816         netdev->current |= NETDEV_F_FIBER;
1817     }
1818
1819     if (ecmd.autoneg) {
1820         netdev->current |= NETDEV_F_AUTONEG;
1821     }
1822
1823 out:
1824     netdev->cache_valid |= VALID_FEATURES;
1825     netdev->get_features_error = error;
1826 }
1827
1828 /* Stores the features supported by 'netdev' into of '*current', '*advertised',
1829  * '*supported', and '*peer'.  Each value is a bitmap of NETDEV_* bits.
1830  * Returns 0 if successful, otherwise a positive errno value. */
1831 static int
1832 netdev_linux_get_features(const struct netdev *netdev_,
1833                           enum netdev_features *current,
1834                           enum netdev_features *advertised,
1835                           enum netdev_features *supported,
1836                           enum netdev_features *peer)
1837 {
1838     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1839     int error;
1840
1841     ovs_mutex_lock(&netdev->mutex);
1842     netdev_linux_read_features(netdev);
1843     if (!netdev->get_features_error) {
1844         *current = netdev->current;
1845         *advertised = netdev->advertised;
1846         *supported = netdev->supported;
1847         *peer = 0;              /* XXX */
1848     }
1849     error = netdev->get_features_error;
1850     ovs_mutex_unlock(&netdev->mutex);
1851
1852     return error;
1853 }
1854
1855 /* Set the features advertised by 'netdev' to 'advertise'. */
1856 static int
1857 netdev_linux_set_advertisements(struct netdev *netdev_,
1858                                 enum netdev_features advertise)
1859 {
1860     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1861     struct ethtool_cmd ecmd;
1862     int error;
1863
1864     ovs_mutex_lock(&netdev->mutex);
1865
1866     COVERAGE_INC(netdev_get_ethtool);
1867     memset(&ecmd, 0, sizeof ecmd);
1868     error = netdev_linux_do_ethtool(netdev_get_name(netdev_), &ecmd,
1869                                     ETHTOOL_GSET, "ETHTOOL_GSET");
1870     if (error) {
1871         goto exit;
1872     }
1873
1874     ecmd.advertising = 0;
1875     if (advertise & NETDEV_F_10MB_HD) {
1876         ecmd.advertising |= ADVERTISED_10baseT_Half;
1877     }
1878     if (advertise & NETDEV_F_10MB_FD) {
1879         ecmd.advertising |= ADVERTISED_10baseT_Full;
1880     }
1881     if (advertise & NETDEV_F_100MB_HD) {
1882         ecmd.advertising |= ADVERTISED_100baseT_Half;
1883     }
1884     if (advertise & NETDEV_F_100MB_FD) {
1885         ecmd.advertising |= ADVERTISED_100baseT_Full;
1886     }
1887     if (advertise & NETDEV_F_1GB_HD) {
1888         ecmd.advertising |= ADVERTISED_1000baseT_Half;
1889     }
1890     if (advertise & NETDEV_F_1GB_FD) {
1891         ecmd.advertising |= ADVERTISED_1000baseT_Full;
1892     }
1893     if (advertise & NETDEV_F_10GB_FD) {
1894         ecmd.advertising |= ADVERTISED_10000baseT_Full;
1895     }
1896     if (advertise & NETDEV_F_COPPER) {
1897         ecmd.advertising |= ADVERTISED_TP;
1898     }
1899     if (advertise & NETDEV_F_FIBER) {
1900         ecmd.advertising |= ADVERTISED_FIBRE;
1901     }
1902     if (advertise & NETDEV_F_AUTONEG) {
1903         ecmd.advertising |= ADVERTISED_Autoneg;
1904     }
1905     if (advertise & NETDEV_F_PAUSE) {
1906         ecmd.advertising |= ADVERTISED_Pause;
1907     }
1908     if (advertise & NETDEV_F_PAUSE_ASYM) {
1909         ecmd.advertising |= ADVERTISED_Asym_Pause;
1910     }
1911     COVERAGE_INC(netdev_set_ethtool);
1912     error = netdev_linux_do_ethtool(netdev_get_name(netdev_), &ecmd,
1913                                     ETHTOOL_SSET, "ETHTOOL_SSET");
1914
1915 exit:
1916     ovs_mutex_unlock(&netdev->mutex);
1917     return error;
1918 }
1919
1920 /* Attempts to set input rate limiting (policing) policy.  Returns 0 if
1921  * successful, otherwise a positive errno value. */
1922 static int
1923 netdev_linux_set_policing(struct netdev *netdev_,
1924                           uint32_t kbits_rate, uint32_t kbits_burst)
1925 {
1926     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
1927     const char *netdev_name = netdev_get_name(netdev_);
1928     int error;
1929
1930     kbits_burst = (!kbits_rate ? 0       /* Force to 0 if no rate specified. */
1931                    : !kbits_burst ? 1000 /* Default to 1000 kbits if 0. */
1932                    : kbits_burst);       /* Stick with user-specified value. */
1933
1934     ovs_mutex_lock(&netdev->mutex);
1935     if (netdev->cache_valid & VALID_POLICING) {
1936         error = netdev->netdev_policing_error;
1937         if (error || (netdev->kbits_rate == kbits_rate &&
1938                       netdev->kbits_burst == kbits_burst)) {
1939             /* Assume that settings haven't changed since we last set them. */
1940             goto out;
1941         }
1942         netdev->cache_valid &= ~VALID_POLICING;
1943     }
1944
1945     COVERAGE_INC(netdev_set_policing);
1946     /* Remove any existing ingress qdisc. */
1947     error = tc_add_del_ingress_qdisc(netdev_, false);
1948     if (error) {
1949         VLOG_WARN_RL(&rl, "%s: removing policing failed: %s",
1950                      netdev_name, ovs_strerror(error));
1951         goto out;
1952     }
1953
1954     if (kbits_rate) {
1955         error = tc_add_del_ingress_qdisc(netdev_, true);
1956         if (error) {
1957             VLOG_WARN_RL(&rl, "%s: adding policing qdisc failed: %s",
1958                          netdev_name, ovs_strerror(error));
1959             goto out;
1960         }
1961
1962         error = tc_add_policer(netdev_, kbits_rate, kbits_burst);
1963         if (error){
1964             VLOG_WARN_RL(&rl, "%s: adding policing action failed: %s",
1965                     netdev_name, ovs_strerror(error));
1966             goto out;
1967         }
1968     }
1969
1970     netdev->kbits_rate = kbits_rate;
1971     netdev->kbits_burst = kbits_burst;
1972
1973 out:
1974     if (!error || error == ENODEV) {
1975         netdev->netdev_policing_error = error;
1976         netdev->cache_valid |= VALID_POLICING;
1977     }
1978     ovs_mutex_unlock(&netdev->mutex);
1979     return error;
1980 }
1981
1982 static int
1983 netdev_linux_get_qos_types(const struct netdev *netdev OVS_UNUSED,
1984                            struct sset *types)
1985 {
1986     const struct tc_ops *const *opsp;
1987
1988     for (opsp = tcs; *opsp != NULL; opsp++) {
1989         const struct tc_ops *ops = *opsp;
1990         if (ops->tc_install && ops->ovs_name[0] != '\0') {
1991             sset_add(types, ops->ovs_name);
1992         }
1993     }
1994     return 0;
1995 }
1996
1997 static const struct tc_ops *
1998 tc_lookup_ovs_name(const char *name)
1999 {
2000     const struct tc_ops *const *opsp;
2001
2002     for (opsp = tcs; *opsp != NULL; opsp++) {
2003         const struct tc_ops *ops = *opsp;
2004         if (!strcmp(name, ops->ovs_name)) {
2005             return ops;
2006         }
2007     }
2008     return NULL;
2009 }
2010
2011 static const struct tc_ops *
2012 tc_lookup_linux_name(const char *name)
2013 {
2014     const struct tc_ops *const *opsp;
2015
2016     for (opsp = tcs; *opsp != NULL; opsp++) {
2017         const struct tc_ops *ops = *opsp;
2018         if (ops->linux_name && !strcmp(name, ops->linux_name)) {
2019             return ops;
2020         }
2021     }
2022     return NULL;
2023 }
2024
2025 static struct tc_queue *
2026 tc_find_queue__(const struct netdev *netdev_, unsigned int queue_id,
2027                 size_t hash)
2028 {
2029     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2030     struct tc_queue *queue;
2031
2032     HMAP_FOR_EACH_IN_BUCKET (queue, hmap_node, hash, &netdev->tc->queues) {
2033         if (queue->queue_id == queue_id) {
2034             return queue;
2035         }
2036     }
2037     return NULL;
2038 }
2039
2040 static struct tc_queue *
2041 tc_find_queue(const struct netdev *netdev, unsigned int queue_id)
2042 {
2043     return tc_find_queue__(netdev, queue_id, hash_int(queue_id, 0));
2044 }
2045
2046 static int
2047 netdev_linux_get_qos_capabilities(const struct netdev *netdev OVS_UNUSED,
2048                                   const char *type,
2049                                   struct netdev_qos_capabilities *caps)
2050 {
2051     const struct tc_ops *ops = tc_lookup_ovs_name(type);
2052     if (!ops) {
2053         return EOPNOTSUPP;
2054     }
2055     caps->n_queues = ops->n_queues;
2056     return 0;
2057 }
2058
2059 static int
2060 netdev_linux_get_qos(const struct netdev *netdev_,
2061                      const char **typep, struct smap *details)
2062 {
2063     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2064     int error;
2065
2066     ovs_mutex_lock(&netdev->mutex);
2067     error = tc_query_qdisc(netdev_);
2068     if (!error) {
2069         *typep = netdev->tc->ops->ovs_name;
2070         error = (netdev->tc->ops->qdisc_get
2071                  ? netdev->tc->ops->qdisc_get(netdev_, details)
2072                  : 0);
2073     }
2074     ovs_mutex_unlock(&netdev->mutex);
2075
2076     return error;
2077 }
2078
2079 static int
2080 netdev_linux_set_qos(struct netdev *netdev_,
2081                      const char *type, const struct smap *details)
2082 {
2083     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2084     const struct tc_ops *new_ops;
2085     int error;
2086
2087     new_ops = tc_lookup_ovs_name(type);
2088     if (!new_ops || !new_ops->tc_install) {
2089         return EOPNOTSUPP;
2090     }
2091
2092     ovs_mutex_lock(&netdev->mutex);
2093     error = tc_query_qdisc(netdev_);
2094     if (error) {
2095         goto exit;
2096     }
2097
2098     if (new_ops == netdev->tc->ops) {
2099         error = new_ops->qdisc_set ? new_ops->qdisc_set(netdev_, details) : 0;
2100     } else {
2101         /* Delete existing qdisc. */
2102         error = tc_del_qdisc(netdev_);
2103         if (error) {
2104             goto exit;
2105         }
2106         ovs_assert(netdev->tc == NULL);
2107
2108         /* Install new qdisc. */
2109         error = new_ops->tc_install(netdev_, details);
2110         ovs_assert((error == 0) == (netdev->tc != NULL));
2111     }
2112
2113 exit:
2114     ovs_mutex_unlock(&netdev->mutex);
2115     return error;
2116 }
2117
2118 static int
2119 netdev_linux_get_queue(const struct netdev *netdev_,
2120                        unsigned int queue_id, struct smap *details)
2121 {
2122     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2123     int error;
2124
2125     ovs_mutex_lock(&netdev->mutex);
2126     error = tc_query_qdisc(netdev_);
2127     if (!error) {
2128         struct tc_queue *queue = tc_find_queue(netdev_, queue_id);
2129         error = (queue
2130                 ? netdev->tc->ops->class_get(netdev_, queue, details)
2131                 : ENOENT);
2132     }
2133     ovs_mutex_unlock(&netdev->mutex);
2134
2135     return error;
2136 }
2137
2138 static int
2139 netdev_linux_set_queue(struct netdev *netdev_,
2140                        unsigned int queue_id, const struct smap *details)
2141 {
2142     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2143     int error;
2144
2145     ovs_mutex_lock(&netdev->mutex);
2146     error = tc_query_qdisc(netdev_);
2147     if (!error) {
2148         error = (queue_id < netdev->tc->ops->n_queues
2149                  && netdev->tc->ops->class_set
2150                  ? netdev->tc->ops->class_set(netdev_, queue_id, details)
2151                  : EINVAL);
2152     }
2153     ovs_mutex_unlock(&netdev->mutex);
2154
2155     return error;
2156 }
2157
2158 static int
2159 netdev_linux_delete_queue(struct netdev *netdev_, unsigned int queue_id)
2160 {
2161     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2162     int error;
2163
2164     ovs_mutex_lock(&netdev->mutex);
2165     error = tc_query_qdisc(netdev_);
2166     if (!error) {
2167         if (netdev->tc->ops->class_delete) {
2168             struct tc_queue *queue = tc_find_queue(netdev_, queue_id);
2169             error = (queue
2170                      ? netdev->tc->ops->class_delete(netdev_, queue)
2171                      : ENOENT);
2172         } else {
2173             error = EINVAL;
2174         }
2175     }
2176     ovs_mutex_unlock(&netdev->mutex);
2177
2178     return error;
2179 }
2180
2181 static int
2182 netdev_linux_get_queue_stats(const struct netdev *netdev_,
2183                              unsigned int queue_id,
2184                              struct netdev_queue_stats *stats)
2185 {
2186     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2187     int error;
2188
2189     ovs_mutex_lock(&netdev->mutex);
2190     error = tc_query_qdisc(netdev_);
2191     if (!error) {
2192         if (netdev->tc->ops->class_get_stats) {
2193             const struct tc_queue *queue = tc_find_queue(netdev_, queue_id);
2194             if (queue) {
2195                 stats->created = queue->created;
2196                 error = netdev->tc->ops->class_get_stats(netdev_, queue,
2197                                                          stats);
2198             } else {
2199                 error = ENOENT;
2200             }
2201         } else {
2202             error = EOPNOTSUPP;
2203         }
2204     }
2205     ovs_mutex_unlock(&netdev->mutex);
2206
2207     return error;
2208 }
2209
2210 struct queue_dump_state {
2211     struct nl_dump dump;
2212     struct ofpbuf buf;
2213 };
2214
2215 static bool
2216 start_queue_dump(const struct netdev *netdev, struct queue_dump_state *state)
2217 {
2218     struct ofpbuf request;
2219     struct tcmsg *tcmsg;
2220
2221     tcmsg = tc_make_request(netdev, RTM_GETTCLASS, 0, &request);
2222     if (!tcmsg) {
2223         return false;
2224     }
2225     tcmsg->tcm_parent = 0;
2226     nl_dump_start(&state->dump, NETLINK_ROUTE, &request);
2227     ofpbuf_uninit(&request);
2228
2229     ofpbuf_init(&state->buf, NL_DUMP_BUFSIZE);
2230     return true;
2231 }
2232
2233 static int
2234 finish_queue_dump(struct queue_dump_state *state)
2235 {
2236     ofpbuf_uninit(&state->buf);
2237     return nl_dump_done(&state->dump);
2238 }
2239
2240 struct netdev_linux_queue_state {
2241     unsigned int *queues;
2242     size_t cur_queue;
2243     size_t n_queues;
2244 };
2245
2246 static int
2247 netdev_linux_queue_dump_start(const struct netdev *netdev_, void **statep)
2248 {
2249     const struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2250     int error;
2251
2252     ovs_mutex_lock(&netdev->mutex);
2253     error = tc_query_qdisc(netdev_);
2254     if (!error) {
2255         if (netdev->tc->ops->class_get) {
2256             struct netdev_linux_queue_state *state;
2257             struct tc_queue *queue;
2258             size_t i;
2259
2260             *statep = state = xmalloc(sizeof *state);
2261             state->n_queues = hmap_count(&netdev->tc->queues);
2262             state->cur_queue = 0;
2263             state->queues = xmalloc(state->n_queues * sizeof *state->queues);
2264
2265             i = 0;
2266             HMAP_FOR_EACH (queue, hmap_node, &netdev->tc->queues) {
2267                 state->queues[i++] = queue->queue_id;
2268             }
2269         } else {
2270             error = EOPNOTSUPP;
2271         }
2272     }
2273     ovs_mutex_unlock(&netdev->mutex);
2274
2275     return error;
2276 }
2277
2278 static int
2279 netdev_linux_queue_dump_next(const struct netdev *netdev_, void *state_,
2280                              unsigned int *queue_idp, struct smap *details)
2281 {
2282     const struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2283     struct netdev_linux_queue_state *state = state_;
2284     int error = EOF;
2285
2286     ovs_mutex_lock(&netdev->mutex);
2287     while (state->cur_queue < state->n_queues) {
2288         unsigned int queue_id = state->queues[state->cur_queue++];
2289         struct tc_queue *queue = tc_find_queue(netdev_, queue_id);
2290
2291         if (queue) {
2292             *queue_idp = queue_id;
2293             error = netdev->tc->ops->class_get(netdev_, queue, details);
2294             break;
2295         }
2296     }
2297     ovs_mutex_unlock(&netdev->mutex);
2298
2299     return error;
2300 }
2301
2302 static int
2303 netdev_linux_queue_dump_done(const struct netdev *netdev OVS_UNUSED,
2304                              void *state_)
2305 {
2306     struct netdev_linux_queue_state *state = state_;
2307
2308     free(state->queues);
2309     free(state);
2310     return 0;
2311 }
2312
2313 static int
2314 netdev_linux_dump_queue_stats(const struct netdev *netdev_,
2315                               netdev_dump_queue_stats_cb *cb, void *aux)
2316 {
2317     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2318     int error;
2319
2320     ovs_mutex_lock(&netdev->mutex);
2321     error = tc_query_qdisc(netdev_);
2322     if (!error) {
2323         struct queue_dump_state state;
2324
2325         if (!netdev->tc->ops->class_dump_stats) {
2326             error = EOPNOTSUPP;
2327         } else if (!start_queue_dump(netdev_, &state)) {
2328             error = ENODEV;
2329         } else {
2330             struct ofpbuf msg;
2331             int retval;
2332
2333             while (nl_dump_next(&state.dump, &msg, &state.buf)) {
2334                 retval = netdev->tc->ops->class_dump_stats(netdev_, &msg,
2335                                                            cb, aux);
2336                 if (retval) {
2337                     error = retval;
2338                 }
2339             }
2340
2341             retval = finish_queue_dump(&state);
2342             if (retval) {
2343                 error = retval;
2344             }
2345         }
2346     }
2347     ovs_mutex_unlock(&netdev->mutex);
2348
2349     return error;
2350 }
2351
2352 static int
2353 netdev_linux_get_in4(const struct netdev *netdev_,
2354                      struct in_addr *address, struct in_addr *netmask)
2355 {
2356     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2357     int error;
2358
2359     ovs_mutex_lock(&netdev->mutex);
2360     if (!(netdev->cache_valid & VALID_IN4)) {
2361         error = netdev_linux_get_ipv4(netdev_, &netdev->address,
2362                                       SIOCGIFADDR, "SIOCGIFADDR");
2363         if (!error) {
2364             error = netdev_linux_get_ipv4(netdev_, &netdev->netmask,
2365                                           SIOCGIFNETMASK, "SIOCGIFNETMASK");
2366             if (!error) {
2367                 netdev->cache_valid |= VALID_IN4;
2368             }
2369         }
2370     } else {
2371         error = 0;
2372     }
2373
2374     if (!error) {
2375         if (netdev->address.s_addr != INADDR_ANY) {
2376             *address = netdev->address;
2377             *netmask = netdev->netmask;
2378         } else {
2379             error = EADDRNOTAVAIL;
2380         }
2381     }
2382     ovs_mutex_unlock(&netdev->mutex);
2383
2384     return error;
2385 }
2386
2387 static int
2388 netdev_linux_set_in4(struct netdev *netdev_, struct in_addr address,
2389                      struct in_addr netmask)
2390 {
2391     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2392     int error;
2393
2394     ovs_mutex_lock(&netdev->mutex);
2395     error = do_set_addr(netdev_, SIOCSIFADDR, "SIOCSIFADDR", address);
2396     if (!error) {
2397         netdev->cache_valid |= VALID_IN4;
2398         netdev->address = address;
2399         netdev->netmask = netmask;
2400         if (address.s_addr != INADDR_ANY) {
2401             error = do_set_addr(netdev_, SIOCSIFNETMASK,
2402                                 "SIOCSIFNETMASK", netmask);
2403         }
2404     }
2405     ovs_mutex_unlock(&netdev->mutex);
2406
2407     return error;
2408 }
2409
2410 static bool
2411 parse_if_inet6_line(const char *line,
2412                     struct in6_addr *in6, char ifname[16 + 1])
2413 {
2414     uint8_t *s6 = in6->s6_addr;
2415 #define X8 "%2"SCNx8
2416     return ovs_scan(line,
2417                     " "X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8
2418                     "%*x %*x %*x %*x %16s\n",
2419                     &s6[0], &s6[1], &s6[2], &s6[3],
2420                     &s6[4], &s6[5], &s6[6], &s6[7],
2421                     &s6[8], &s6[9], &s6[10], &s6[11],
2422                     &s6[12], &s6[13], &s6[14], &s6[15],
2423                     ifname);
2424 }
2425
2426 /* If 'netdev' has an assigned IPv6 address, sets '*in6' to that address (if
2427  * 'in6' is non-null) and returns true.  Otherwise, returns false. */
2428 static int
2429 netdev_linux_get_in6(const struct netdev *netdev_, struct in6_addr *in6)
2430 {
2431     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2432
2433     ovs_mutex_lock(&netdev->mutex);
2434     if (!(netdev->cache_valid & VALID_IN6)) {
2435         FILE *file;
2436         char line[128];
2437
2438         netdev->in6 = in6addr_any;
2439
2440         file = fopen("/proc/net/if_inet6", "r");
2441         if (file != NULL) {
2442             const char *name = netdev_get_name(netdev_);
2443             while (fgets(line, sizeof line, file)) {
2444                 struct in6_addr in6_tmp;
2445                 char ifname[16 + 1];
2446                 if (parse_if_inet6_line(line, &in6_tmp, ifname)
2447                     && !strcmp(name, ifname))
2448                 {
2449                     netdev->in6 = in6_tmp;
2450                     break;
2451                 }
2452             }
2453             fclose(file);
2454         }
2455         netdev->cache_valid |= VALID_IN6;
2456     }
2457     *in6 = netdev->in6;
2458     ovs_mutex_unlock(&netdev->mutex);
2459
2460     return 0;
2461 }
2462
2463 static void
2464 make_in4_sockaddr(struct sockaddr *sa, struct in_addr addr)
2465 {
2466     struct sockaddr_in sin;
2467     memset(&sin, 0, sizeof sin);
2468     sin.sin_family = AF_INET;
2469     sin.sin_addr = addr;
2470     sin.sin_port = 0;
2471
2472     memset(sa, 0, sizeof *sa);
2473     memcpy(sa, &sin, sizeof sin);
2474 }
2475
2476 static int
2477 do_set_addr(struct netdev *netdev,
2478             int ioctl_nr, const char *ioctl_name, struct in_addr addr)
2479 {
2480     struct ifreq ifr;
2481
2482     make_in4_sockaddr(&ifr.ifr_addr, addr);
2483     return af_inet_ifreq_ioctl(netdev_get_name(netdev), &ifr, ioctl_nr,
2484                                ioctl_name);
2485 }
2486
2487 /* Adds 'router' as a default IP gateway. */
2488 static int
2489 netdev_linux_add_router(struct netdev *netdev OVS_UNUSED, struct in_addr router)
2490 {
2491     struct in_addr any = { INADDR_ANY };
2492     struct rtentry rt;
2493     int error;
2494
2495     memset(&rt, 0, sizeof rt);
2496     make_in4_sockaddr(&rt.rt_dst, any);
2497     make_in4_sockaddr(&rt.rt_gateway, router);
2498     make_in4_sockaddr(&rt.rt_genmask, any);
2499     rt.rt_flags = RTF_UP | RTF_GATEWAY;
2500     error = af_inet_ioctl(SIOCADDRT, &rt);
2501     if (error) {
2502         VLOG_WARN("ioctl(SIOCADDRT): %s", ovs_strerror(error));
2503     }
2504     return error;
2505 }
2506
2507 static int
2508 netdev_linux_get_next_hop(const struct in_addr *host, struct in_addr *next_hop,
2509                           char **netdev_name)
2510 {
2511     static const char fn[] = "/proc/net/route";
2512     FILE *stream;
2513     char line[256];
2514     int ln;
2515
2516     *netdev_name = NULL;
2517     stream = fopen(fn, "r");
2518     if (stream == NULL) {
2519         VLOG_WARN_RL(&rl, "%s: open failed: %s", fn, ovs_strerror(errno));
2520         return errno;
2521     }
2522
2523     ln = 0;
2524     while (fgets(line, sizeof line, stream)) {
2525         if (++ln >= 2) {
2526             char iface[17];
2527             ovs_be32 dest, gateway, mask;
2528             int refcnt, metric, mtu;
2529             unsigned int flags, use, window, irtt;
2530
2531             if (!ovs_scan(line,
2532                           "%16s %"SCNx32" %"SCNx32" %04X %d %u %d %"SCNx32
2533                           " %d %u %u\n",
2534                           iface, &dest, &gateway, &flags, &refcnt,
2535                           &use, &metric, &mask, &mtu, &window, &irtt)) {
2536                 VLOG_WARN_RL(&rl, "%s: could not parse line %d: %s",
2537                         fn, ln, line);
2538                 continue;
2539             }
2540             if (!(flags & RTF_UP)) {
2541                 /* Skip routes that aren't up. */
2542                 continue;
2543             }
2544
2545             /* The output of 'dest', 'mask', and 'gateway' were given in
2546              * network byte order, so we don't need need any endian
2547              * conversions here. */
2548             if ((dest & mask) == (host->s_addr & mask)) {
2549                 if (!gateway) {
2550                     /* The host is directly reachable. */
2551                     next_hop->s_addr = 0;
2552                 } else {
2553                     /* To reach the host, we must go through a gateway. */
2554                     next_hop->s_addr = gateway;
2555                 }
2556                 *netdev_name = xstrdup(iface);
2557                 fclose(stream);
2558                 return 0;
2559             }
2560         }
2561     }
2562
2563     fclose(stream);
2564     return ENXIO;
2565 }
2566
2567 static int
2568 netdev_linux_get_status(const struct netdev *netdev_, struct smap *smap)
2569 {
2570     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2571     int error = 0;
2572
2573     ovs_mutex_lock(&netdev->mutex);
2574     if (!(netdev->cache_valid & VALID_DRVINFO)) {
2575         struct ethtool_cmd *cmd = (struct ethtool_cmd *) &netdev->drvinfo;
2576
2577         COVERAGE_INC(netdev_get_ethtool);
2578         memset(&netdev->drvinfo, 0, sizeof netdev->drvinfo);
2579         error = netdev_linux_do_ethtool(netdev->up.name,
2580                                         cmd,
2581                                         ETHTOOL_GDRVINFO,
2582                                         "ETHTOOL_GDRVINFO");
2583         if (!error) {
2584             netdev->cache_valid |= VALID_DRVINFO;
2585         }
2586     }
2587
2588     if (!error) {
2589         smap_add(smap, "driver_name", netdev->drvinfo.driver);
2590         smap_add(smap, "driver_version", netdev->drvinfo.version);
2591         smap_add(smap, "firmware_version", netdev->drvinfo.fw_version);
2592     }
2593     ovs_mutex_unlock(&netdev->mutex);
2594
2595     return error;
2596 }
2597
2598 static int
2599 netdev_internal_get_status(const struct netdev *netdev OVS_UNUSED,
2600                            struct smap *smap)
2601 {
2602     smap_add(smap, "driver_name", "openvswitch");
2603     return 0;
2604 }
2605
2606 /* Looks up the ARP table entry for 'ip' on 'netdev'.  If one exists and can be
2607  * successfully retrieved, it stores the corresponding MAC address in 'mac' and
2608  * returns 0.  Otherwise, it returns a positive errno value; in particular,
2609  * ENXIO indicates that there is not ARP table entry for 'ip' on 'netdev'. */
2610 static int
2611 netdev_linux_arp_lookup(const struct netdev *netdev,
2612                         ovs_be32 ip, uint8_t mac[ETH_ADDR_LEN])
2613 {
2614     struct arpreq r;
2615     struct sockaddr_in sin;
2616     int retval;
2617
2618     memset(&r, 0, sizeof r);
2619     memset(&sin, 0, sizeof sin);
2620     sin.sin_family = AF_INET;
2621     sin.sin_addr.s_addr = ip;
2622     sin.sin_port = 0;
2623     memcpy(&r.arp_pa, &sin, sizeof sin);
2624     r.arp_ha.sa_family = ARPHRD_ETHER;
2625     r.arp_flags = 0;
2626     ovs_strzcpy(r.arp_dev, netdev_get_name(netdev), sizeof r.arp_dev);
2627     COVERAGE_INC(netdev_arp_lookup);
2628     retval = af_inet_ioctl(SIOCGARP, &r);
2629     if (!retval) {
2630         memcpy(mac, r.arp_ha.sa_data, ETH_ADDR_LEN);
2631     } else if (retval != ENXIO) {
2632         VLOG_WARN_RL(&rl, "%s: could not look up ARP entry for "IP_FMT": %s",
2633                      netdev_get_name(netdev), IP_ARGS(ip),
2634                      ovs_strerror(retval));
2635     }
2636     return retval;
2637 }
2638
2639 static int
2640 nd_to_iff_flags(enum netdev_flags nd)
2641 {
2642     int iff = 0;
2643     if (nd & NETDEV_UP) {
2644         iff |= IFF_UP;
2645     }
2646     if (nd & NETDEV_PROMISC) {
2647         iff |= IFF_PROMISC;
2648     }
2649     if (nd & NETDEV_LOOPBACK) {
2650         iff |= IFF_LOOPBACK;
2651     }
2652     return iff;
2653 }
2654
2655 static int
2656 iff_to_nd_flags(int iff)
2657 {
2658     enum netdev_flags nd = 0;
2659     if (iff & IFF_UP) {
2660         nd |= NETDEV_UP;
2661     }
2662     if (iff & IFF_PROMISC) {
2663         nd |= NETDEV_PROMISC;
2664     }
2665     if (iff & IFF_LOOPBACK) {
2666         nd |= NETDEV_LOOPBACK;
2667     }
2668     return nd;
2669 }
2670
2671 static int
2672 update_flags(struct netdev_linux *netdev, enum netdev_flags off,
2673              enum netdev_flags on, enum netdev_flags *old_flagsp)
2674     OVS_REQUIRES(netdev->mutex)
2675 {
2676     int old_flags, new_flags;
2677     int error = 0;
2678
2679     old_flags = netdev->ifi_flags;
2680     *old_flagsp = iff_to_nd_flags(old_flags);
2681     new_flags = (old_flags & ~nd_to_iff_flags(off)) | nd_to_iff_flags(on);
2682     if (new_flags != old_flags) {
2683         error = set_flags(netdev_get_name(&netdev->up), new_flags);
2684         get_flags(&netdev->up, &netdev->ifi_flags);
2685     }
2686
2687     return error;
2688 }
2689
2690 static int
2691 netdev_linux_update_flags(struct netdev *netdev_, enum netdev_flags off,
2692                           enum netdev_flags on, enum netdev_flags *old_flagsp)
2693 {
2694     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2695     int error;
2696
2697     ovs_mutex_lock(&netdev->mutex);
2698     error = update_flags(netdev, off, on, old_flagsp);
2699     ovs_mutex_unlock(&netdev->mutex);
2700
2701     return error;
2702 }
2703
2704 #define NETDEV_LINUX_CLASS(NAME, CONSTRUCT, GET_STATS, SET_STATS,  \
2705                            GET_FEATURES, GET_STATUS)            \
2706 {                                                               \
2707     NAME,                                                       \
2708                                                                 \
2709     NULL,                                                       \
2710     netdev_linux_run,                                           \
2711     netdev_linux_wait,                                          \
2712                                                                 \
2713     netdev_linux_alloc,                                         \
2714     CONSTRUCT,                                                  \
2715     netdev_linux_destruct,                                      \
2716     netdev_linux_dealloc,                                       \
2717     NULL,                       /* get_config */                \
2718     NULL,                       /* set_config */                \
2719     NULL,                       /* get_tunnel_config */         \
2720                                                                 \
2721     netdev_linux_send,                                          \
2722     netdev_linux_send_wait,                                     \
2723                                                                 \
2724     netdev_linux_set_etheraddr,                                 \
2725     netdev_linux_get_etheraddr,                                 \
2726     netdev_linux_get_mtu,                                       \
2727     netdev_linux_set_mtu,                                       \
2728     netdev_linux_get_ifindex,                                   \
2729     netdev_linux_get_carrier,                                   \
2730     netdev_linux_get_carrier_resets,                            \
2731     netdev_linux_set_miimon_interval,                           \
2732     GET_STATS,                                                  \
2733     SET_STATS,                                                  \
2734                                                                 \
2735     GET_FEATURES,                                               \
2736     netdev_linux_set_advertisements,                            \
2737                                                                 \
2738     netdev_linux_set_policing,                                  \
2739     netdev_linux_get_qos_types,                                 \
2740     netdev_linux_get_qos_capabilities,                          \
2741     netdev_linux_get_qos,                                       \
2742     netdev_linux_set_qos,                                       \
2743     netdev_linux_get_queue,                                     \
2744     netdev_linux_set_queue,                                     \
2745     netdev_linux_delete_queue,                                  \
2746     netdev_linux_get_queue_stats,                               \
2747     netdev_linux_queue_dump_start,                              \
2748     netdev_linux_queue_dump_next,                               \
2749     netdev_linux_queue_dump_done,                               \
2750     netdev_linux_dump_queue_stats,                              \
2751                                                                 \
2752     netdev_linux_get_in4,                                       \
2753     netdev_linux_set_in4,                                       \
2754     netdev_linux_get_in6,                                       \
2755     netdev_linux_add_router,                                    \
2756     netdev_linux_get_next_hop,                                  \
2757     GET_STATUS,                                                 \
2758     netdev_linux_arp_lookup,                                    \
2759                                                                 \
2760     netdev_linux_update_flags,                                  \
2761                                                                 \
2762     netdev_linux_rxq_alloc,                                     \
2763     netdev_linux_rxq_construct,                                 \
2764     netdev_linux_rxq_destruct,                                  \
2765     netdev_linux_rxq_dealloc,                                   \
2766     netdev_linux_rxq_recv,                                      \
2767     netdev_linux_rxq_wait,                                      \
2768     netdev_linux_rxq_drain,                                     \
2769 }
2770
2771 const struct netdev_class netdev_linux_class =
2772     NETDEV_LINUX_CLASS(
2773         "system",
2774         netdev_linux_construct,
2775         netdev_linux_get_stats,
2776         NULL,                    /* set_stats */
2777         netdev_linux_get_features,
2778         netdev_linux_get_status);
2779
2780 const struct netdev_class netdev_tap_class =
2781     NETDEV_LINUX_CLASS(
2782         "tap",
2783         netdev_linux_construct_tap,
2784         netdev_tap_get_stats,
2785         NULL,                   /* set_stats */
2786         netdev_linux_get_features,
2787         netdev_linux_get_status);
2788
2789 const struct netdev_class netdev_internal_class =
2790     NETDEV_LINUX_CLASS(
2791         "internal",
2792         netdev_linux_construct,
2793         netdev_internal_get_stats,
2794         netdev_internal_set_stats,
2795         NULL,                  /* get_features */
2796         netdev_internal_get_status);
2797 \f
2798 /* HTB traffic control class. */
2799
2800 #define HTB_N_QUEUES 0xf000
2801
2802 struct htb {
2803     struct tc tc;
2804     unsigned int max_rate;      /* In bytes/s. */
2805 };
2806
2807 struct htb_class {
2808     struct tc_queue tc_queue;
2809     unsigned int min_rate;      /* In bytes/s. */
2810     unsigned int max_rate;      /* In bytes/s. */
2811     unsigned int burst;         /* In bytes. */
2812     unsigned int priority;      /* Lower values are higher priorities. */
2813 };
2814
2815 static struct htb *
2816 htb_get__(const struct netdev *netdev_)
2817 {
2818     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2819     return CONTAINER_OF(netdev->tc, struct htb, tc);
2820 }
2821
2822 static void
2823 htb_install__(struct netdev *netdev_, uint64_t max_rate)
2824 {
2825     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2826     struct htb *htb;
2827
2828     htb = xmalloc(sizeof *htb);
2829     tc_init(&htb->tc, &tc_ops_htb);
2830     htb->max_rate = max_rate;
2831
2832     netdev->tc = &htb->tc;
2833 }
2834
2835 /* Create an HTB qdisc.
2836  *
2837  * Equivalent to "tc qdisc add dev <dev> root handle 1: htb default 1". */
2838 static int
2839 htb_setup_qdisc__(struct netdev *netdev)
2840 {
2841     size_t opt_offset;
2842     struct tc_htb_glob opt;
2843     struct ofpbuf request;
2844     struct tcmsg *tcmsg;
2845
2846     tc_del_qdisc(netdev);
2847
2848     tcmsg = tc_make_request(netdev, RTM_NEWQDISC,
2849                             NLM_F_EXCL | NLM_F_CREATE, &request);
2850     if (!tcmsg) {
2851         return ENODEV;
2852     }
2853     tcmsg->tcm_handle = tc_make_handle(1, 0);
2854     tcmsg->tcm_parent = TC_H_ROOT;
2855
2856     nl_msg_put_string(&request, TCA_KIND, "htb");
2857
2858     memset(&opt, 0, sizeof opt);
2859     opt.rate2quantum = 10;
2860     opt.version = 3;
2861     opt.defcls = 1;
2862
2863     opt_offset = nl_msg_start_nested(&request, TCA_OPTIONS);
2864     nl_msg_put_unspec(&request, TCA_HTB_INIT, &opt, sizeof opt);
2865     nl_msg_end_nested(&request, opt_offset);
2866
2867     return tc_transact(&request, NULL);
2868 }
2869
2870 /* Equivalent to "tc class replace <dev> classid <handle> parent <parent> htb
2871  * rate <min_rate>bps ceil <max_rate>bps burst <burst>b prio <priority>". */
2872 static int
2873 htb_setup_class__(struct netdev *netdev, unsigned int handle,
2874                   unsigned int parent, struct htb_class *class)
2875 {
2876     size_t opt_offset;
2877     struct tc_htb_opt opt;
2878     struct ofpbuf request;
2879     struct tcmsg *tcmsg;
2880     int error;
2881     int mtu;
2882
2883     error = netdev_linux_get_mtu__(netdev_linux_cast(netdev), &mtu);
2884     if (error) {
2885         VLOG_WARN_RL(&rl, "cannot set up HTB on device %s that lacks MTU",
2886                      netdev_get_name(netdev));
2887         return error;
2888     }
2889
2890     memset(&opt, 0, sizeof opt);
2891     tc_fill_rate(&opt.rate, class->min_rate, mtu);
2892     tc_fill_rate(&opt.ceil, class->max_rate, mtu);
2893     opt.buffer = tc_calc_buffer(opt.rate.rate, mtu, class->burst);
2894     opt.cbuffer = tc_calc_buffer(opt.ceil.rate, mtu, class->burst);
2895     opt.prio = class->priority;
2896
2897     tcmsg = tc_make_request(netdev, RTM_NEWTCLASS, NLM_F_CREATE, &request);
2898     if (!tcmsg) {
2899         return ENODEV;
2900     }
2901     tcmsg->tcm_handle = handle;
2902     tcmsg->tcm_parent = parent;
2903
2904     nl_msg_put_string(&request, TCA_KIND, "htb");
2905     opt_offset = nl_msg_start_nested(&request, TCA_OPTIONS);
2906     nl_msg_put_unspec(&request, TCA_HTB_PARMS, &opt, sizeof opt);
2907     tc_put_rtab(&request, TCA_HTB_RTAB, &opt.rate);
2908     tc_put_rtab(&request, TCA_HTB_CTAB, &opt.ceil);
2909     nl_msg_end_nested(&request, opt_offset);
2910
2911     error = tc_transact(&request, NULL);
2912     if (error) {
2913         VLOG_WARN_RL(&rl, "failed to replace %s class %u:%u, parent %u:%u, "
2914                      "min_rate=%u max_rate=%u burst=%u prio=%u (%s)",
2915                      netdev_get_name(netdev),
2916                      tc_get_major(handle), tc_get_minor(handle),
2917                      tc_get_major(parent), tc_get_minor(parent),
2918                      class->min_rate, class->max_rate,
2919                      class->burst, class->priority, ovs_strerror(error));
2920     }
2921     return error;
2922 }
2923
2924 /* Parses Netlink attributes in 'options' for HTB parameters and stores a
2925  * description of them into 'details'.  The description complies with the
2926  * specification given in the vswitch database documentation for linux-htb
2927  * queue details. */
2928 static int
2929 htb_parse_tca_options__(struct nlattr *nl_options, struct htb_class *class)
2930 {
2931     static const struct nl_policy tca_htb_policy[] = {
2932         [TCA_HTB_PARMS] = { .type = NL_A_UNSPEC, .optional = false,
2933                             .min_len = sizeof(struct tc_htb_opt) },
2934     };
2935
2936     struct nlattr *attrs[ARRAY_SIZE(tca_htb_policy)];
2937     const struct tc_htb_opt *htb;
2938
2939     if (!nl_parse_nested(nl_options, tca_htb_policy,
2940                          attrs, ARRAY_SIZE(tca_htb_policy))) {
2941         VLOG_WARN_RL(&rl, "failed to parse HTB class options");
2942         return EPROTO;
2943     }
2944
2945     htb = nl_attr_get(attrs[TCA_HTB_PARMS]);
2946     class->min_rate = htb->rate.rate;
2947     class->max_rate = htb->ceil.rate;
2948     class->burst = tc_ticks_to_bytes(htb->rate.rate, htb->buffer);
2949     class->priority = htb->prio;
2950     return 0;
2951 }
2952
2953 static int
2954 htb_parse_tcmsg__(struct ofpbuf *tcmsg, unsigned int *queue_id,
2955                   struct htb_class *options,
2956                   struct netdev_queue_stats *stats)
2957 {
2958     struct nlattr *nl_options;
2959     unsigned int handle;
2960     int error;
2961
2962     error = tc_parse_class(tcmsg, &handle, &nl_options, stats);
2963     if (!error && queue_id) {
2964         unsigned int major = tc_get_major(handle);
2965         unsigned int minor = tc_get_minor(handle);
2966         if (major == 1 && minor > 0 && minor <= HTB_N_QUEUES) {
2967             *queue_id = minor - 1;
2968         } else {
2969             error = EPROTO;
2970         }
2971     }
2972     if (!error && options) {
2973         error = htb_parse_tca_options__(nl_options, options);
2974     }
2975     return error;
2976 }
2977
2978 static void
2979 htb_parse_qdisc_details__(struct netdev *netdev_,
2980                           const struct smap *details, struct htb_class *hc)
2981 {
2982     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
2983     const char *max_rate_s;
2984
2985     max_rate_s = smap_get(details, "max-rate");
2986     hc->max_rate = max_rate_s ? strtoull(max_rate_s, NULL, 10) / 8 : 0;
2987     if (!hc->max_rate) {
2988         enum netdev_features current;
2989
2990         netdev_linux_read_features(netdev);
2991         current = !netdev->get_features_error ? netdev->current : 0;
2992         hc->max_rate = netdev_features_to_bps(current, 100 * 1000 * 1000) / 8;
2993     }
2994     hc->min_rate = hc->max_rate;
2995     hc->burst = 0;
2996     hc->priority = 0;
2997 }
2998
2999 static int
3000 htb_parse_class_details__(struct netdev *netdev,
3001                           const struct smap *details, struct htb_class *hc)
3002 {
3003     const struct htb *htb = htb_get__(netdev);
3004     const char *min_rate_s = smap_get(details, "min-rate");
3005     const char *max_rate_s = smap_get(details, "max-rate");
3006     const char *burst_s = smap_get(details, "burst");
3007     const char *priority_s = smap_get(details, "priority");
3008     int mtu, error;
3009
3010     error = netdev_linux_get_mtu__(netdev_linux_cast(netdev), &mtu);
3011     if (error) {
3012         VLOG_WARN_RL(&rl, "cannot parse HTB class on device %s that lacks MTU",
3013                      netdev_get_name(netdev));
3014         return error;
3015     }
3016
3017     /* HTB requires at least an mtu sized min-rate to send any traffic even
3018      * on uncongested links. */
3019     hc->min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0;
3020     hc->min_rate = MAX(hc->min_rate, mtu);
3021     hc->min_rate = MIN(hc->min_rate, htb->max_rate);
3022
3023     /* max-rate */
3024     hc->max_rate = (max_rate_s
3025                     ? strtoull(max_rate_s, NULL, 10) / 8
3026                     : htb->max_rate);
3027     hc->max_rate = MAX(hc->max_rate, hc->min_rate);
3028     hc->max_rate = MIN(hc->max_rate, htb->max_rate);
3029
3030     /* burst
3031      *
3032      * According to hints in the documentation that I've read, it is important
3033      * that 'burst' be at least as big as the largest frame that might be
3034      * transmitted.  Also, making 'burst' a bit bigger than necessary is OK,
3035      * but having it a bit too small is a problem.  Since netdev_get_mtu()
3036      * doesn't include the Ethernet header, we need to add at least 14 (18?) to
3037      * the MTU.  We actually add 64, instead of 14, as a guard against
3038      * additional headers get tacked on somewhere that we're not aware of. */
3039     hc->burst = burst_s ? strtoull(burst_s, NULL, 10) / 8 : 0;
3040     hc->burst = MAX(hc->burst, mtu + 64);
3041
3042     /* priority */
3043     hc->priority = priority_s ? strtoul(priority_s, NULL, 10) : 0;
3044
3045     return 0;
3046 }
3047
3048 static int
3049 htb_query_class__(const struct netdev *netdev, unsigned int handle,
3050                   unsigned int parent, struct htb_class *options,
3051                   struct netdev_queue_stats *stats)
3052 {
3053     struct ofpbuf *reply;
3054     int error;
3055
3056     error = tc_query_class(netdev, handle, parent, &reply);
3057     if (!error) {
3058         error = htb_parse_tcmsg__(reply, NULL, options, stats);
3059         ofpbuf_delete(reply);
3060     }
3061     return error;
3062 }
3063
3064 static int
3065 htb_tc_install(struct netdev *netdev, const struct smap *details)
3066 {
3067     int error;
3068
3069     error = htb_setup_qdisc__(netdev);
3070     if (!error) {
3071         struct htb_class hc;
3072
3073         htb_parse_qdisc_details__(netdev, details, &hc);
3074         error = htb_setup_class__(netdev, tc_make_handle(1, 0xfffe),
3075                                   tc_make_handle(1, 0), &hc);
3076         if (!error) {
3077             htb_install__(netdev, hc.max_rate);
3078         }
3079     }
3080     return error;
3081 }
3082
3083 static struct htb_class *
3084 htb_class_cast__(const struct tc_queue *queue)
3085 {
3086     return CONTAINER_OF(queue, struct htb_class, tc_queue);
3087 }
3088
3089 static void
3090 htb_update_queue__(struct netdev *netdev, unsigned int queue_id,
3091                    const struct htb_class *hc)
3092 {
3093     struct htb *htb = htb_get__(netdev);
3094     size_t hash = hash_int(queue_id, 0);
3095     struct tc_queue *queue;
3096     struct htb_class *hcp;
3097
3098     queue = tc_find_queue__(netdev, queue_id, hash);
3099     if (queue) {
3100         hcp = htb_class_cast__(queue);
3101     } else {
3102         hcp = xmalloc(sizeof *hcp);
3103         queue = &hcp->tc_queue;
3104         queue->queue_id = queue_id;
3105         queue->created = time_msec();
3106         hmap_insert(&htb->tc.queues, &queue->hmap_node, hash);
3107     }
3108
3109     hcp->min_rate = hc->min_rate;
3110     hcp->max_rate = hc->max_rate;
3111     hcp->burst = hc->burst;
3112     hcp->priority = hc->priority;
3113 }
3114
3115 static int
3116 htb_tc_load(struct netdev *netdev, struct ofpbuf *nlmsg OVS_UNUSED)
3117 {
3118     struct ofpbuf msg;
3119     struct queue_dump_state state;
3120     struct htb_class hc;
3121
3122     /* Get qdisc options. */
3123     hc.max_rate = 0;
3124     htb_query_class__(netdev, tc_make_handle(1, 0xfffe), 0, &hc, NULL);
3125     htb_install__(netdev, hc.max_rate);
3126
3127     /* Get queues. */
3128     if (!start_queue_dump(netdev, &state)) {
3129         return ENODEV;
3130     }
3131     while (nl_dump_next(&state.dump, &msg, &state.buf)) {
3132         unsigned int queue_id;
3133
3134         if (!htb_parse_tcmsg__(&msg, &queue_id, &hc, NULL)) {
3135             htb_update_queue__(netdev, queue_id, &hc);
3136         }
3137     }
3138     finish_queue_dump(&state);
3139
3140     return 0;
3141 }
3142
3143 static void
3144 htb_tc_destroy(struct tc *tc)
3145 {
3146     struct htb *htb = CONTAINER_OF(tc, struct htb, tc);
3147     struct htb_class *hc, *next;
3148
3149     HMAP_FOR_EACH_SAFE (hc, next, tc_queue.hmap_node, &htb->tc.queues) {
3150         hmap_remove(&htb->tc.queues, &hc->tc_queue.hmap_node);
3151         free(hc);
3152     }
3153     tc_destroy(tc);
3154     free(htb);
3155 }
3156
3157 static int
3158 htb_qdisc_get(const struct netdev *netdev, struct smap *details)
3159 {
3160     const struct htb *htb = htb_get__(netdev);
3161     smap_add_format(details, "max-rate", "%llu", 8ULL * htb->max_rate);
3162     return 0;
3163 }
3164
3165 static int
3166 htb_qdisc_set(struct netdev *netdev, const struct smap *details)
3167 {
3168     struct htb_class hc;
3169     int error;
3170
3171     htb_parse_qdisc_details__(netdev, details, &hc);
3172     error = htb_setup_class__(netdev, tc_make_handle(1, 0xfffe),
3173                               tc_make_handle(1, 0), &hc);
3174     if (!error) {
3175         htb_get__(netdev)->max_rate = hc.max_rate;
3176     }
3177     return error;
3178 }
3179
3180 static int
3181 htb_class_get(const struct netdev *netdev OVS_UNUSED,
3182               const struct tc_queue *queue, struct smap *details)
3183 {
3184     const struct htb_class *hc = htb_class_cast__(queue);
3185
3186     smap_add_format(details, "min-rate", "%llu", 8ULL * hc->min_rate);
3187     if (hc->min_rate != hc->max_rate) {
3188         smap_add_format(details, "max-rate", "%llu", 8ULL * hc->max_rate);
3189     }
3190     smap_add_format(details, "burst", "%llu", 8ULL * hc->burst);
3191     if (hc->priority) {
3192         smap_add_format(details, "priority", "%u", hc->priority);
3193     }
3194     return 0;
3195 }
3196
3197 static int
3198 htb_class_set(struct netdev *netdev, unsigned int queue_id,
3199               const struct smap *details)
3200 {
3201     struct htb_class hc;
3202     int error;
3203
3204     error = htb_parse_class_details__(netdev, details, &hc);
3205     if (error) {
3206         return error;
3207     }
3208
3209     error = htb_setup_class__(netdev, tc_make_handle(1, queue_id + 1),
3210                               tc_make_handle(1, 0xfffe), &hc);
3211     if (error) {
3212         return error;
3213     }
3214
3215     htb_update_queue__(netdev, queue_id, &hc);
3216     return 0;
3217 }
3218
3219 static int
3220 htb_class_delete(struct netdev *netdev, struct tc_queue *queue)
3221 {
3222     struct htb_class *hc = htb_class_cast__(queue);
3223     struct htb *htb = htb_get__(netdev);
3224     int error;
3225
3226     error = tc_delete_class(netdev, tc_make_handle(1, queue->queue_id + 1));
3227     if (!error) {
3228         hmap_remove(&htb->tc.queues, &hc->tc_queue.hmap_node);
3229         free(hc);
3230     }
3231     return error;
3232 }
3233
3234 static int
3235 htb_class_get_stats(const struct netdev *netdev, const struct tc_queue *queue,
3236                     struct netdev_queue_stats *stats)
3237 {
3238     return htb_query_class__(netdev, tc_make_handle(1, queue->queue_id + 1),
3239                              tc_make_handle(1, 0xfffe), NULL, stats);
3240 }
3241
3242 static int
3243 htb_class_dump_stats(const struct netdev *netdev OVS_UNUSED,
3244                      const struct ofpbuf *nlmsg,
3245                      netdev_dump_queue_stats_cb *cb, void *aux)
3246 {
3247     struct netdev_queue_stats stats;
3248     unsigned int handle, major, minor;
3249     int error;
3250
3251     error = tc_parse_class(nlmsg, &handle, NULL, &stats);
3252     if (error) {
3253         return error;
3254     }
3255
3256     major = tc_get_major(handle);
3257     minor = tc_get_minor(handle);
3258     if (major == 1 && minor > 0 && minor <= HTB_N_QUEUES) {
3259         (*cb)(minor - 1, &stats, aux);
3260     }
3261     return 0;
3262 }
3263
3264 static const struct tc_ops tc_ops_htb = {
3265     "htb",                      /* linux_name */
3266     "linux-htb",                /* ovs_name */
3267     HTB_N_QUEUES,               /* n_queues */
3268     htb_tc_install,
3269     htb_tc_load,
3270     htb_tc_destroy,
3271     htb_qdisc_get,
3272     htb_qdisc_set,
3273     htb_class_get,
3274     htb_class_set,
3275     htb_class_delete,
3276     htb_class_get_stats,
3277     htb_class_dump_stats
3278 };
3279 \f
3280 /* "linux-hfsc" traffic control class. */
3281
3282 #define HFSC_N_QUEUES 0xf000
3283
3284 struct hfsc {
3285     struct tc tc;
3286     uint32_t max_rate;
3287 };
3288
3289 struct hfsc_class {
3290     struct tc_queue tc_queue;
3291     uint32_t min_rate;
3292     uint32_t max_rate;
3293 };
3294
3295 static struct hfsc *
3296 hfsc_get__(const struct netdev *netdev_)
3297 {
3298     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
3299     return CONTAINER_OF(netdev->tc, struct hfsc, tc);
3300 }
3301
3302 static struct hfsc_class *
3303 hfsc_class_cast__(const struct tc_queue *queue)
3304 {
3305     return CONTAINER_OF(queue, struct hfsc_class, tc_queue);
3306 }
3307
3308 static void
3309 hfsc_install__(struct netdev *netdev_, uint32_t max_rate)
3310 {
3311     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
3312     struct hfsc *hfsc;
3313
3314     hfsc = xmalloc(sizeof *hfsc);
3315     tc_init(&hfsc->tc, &tc_ops_hfsc);
3316     hfsc->max_rate = max_rate;
3317     netdev->tc = &hfsc->tc;
3318 }
3319
3320 static void
3321 hfsc_update_queue__(struct netdev *netdev, unsigned int queue_id,
3322                     const struct hfsc_class *hc)
3323 {
3324     size_t hash;
3325     struct hfsc *hfsc;
3326     struct hfsc_class *hcp;
3327     struct tc_queue *queue;
3328
3329     hfsc = hfsc_get__(netdev);
3330     hash = hash_int(queue_id, 0);
3331
3332     queue = tc_find_queue__(netdev, queue_id, hash);
3333     if (queue) {
3334         hcp = hfsc_class_cast__(queue);
3335     } else {
3336         hcp             = xmalloc(sizeof *hcp);
3337         queue           = &hcp->tc_queue;
3338         queue->queue_id = queue_id;
3339         queue->created  = time_msec();
3340         hmap_insert(&hfsc->tc.queues, &queue->hmap_node, hash);
3341     }
3342
3343     hcp->min_rate = hc->min_rate;
3344     hcp->max_rate = hc->max_rate;
3345 }
3346
3347 static int
3348 hfsc_parse_tca_options__(struct nlattr *nl_options, struct hfsc_class *class)
3349 {
3350     const struct tc_service_curve *rsc, *fsc, *usc;
3351     static const struct nl_policy tca_hfsc_policy[] = {
3352         [TCA_HFSC_RSC] = {
3353             .type      = NL_A_UNSPEC,
3354             .optional  = false,
3355             .min_len   = sizeof(struct tc_service_curve),
3356         },
3357         [TCA_HFSC_FSC] = {
3358             .type      = NL_A_UNSPEC,
3359             .optional  = false,
3360             .min_len   = sizeof(struct tc_service_curve),
3361         },
3362         [TCA_HFSC_USC] = {
3363             .type      = NL_A_UNSPEC,
3364             .optional  = false,
3365             .min_len   = sizeof(struct tc_service_curve),
3366         },
3367     };
3368     struct nlattr *attrs[ARRAY_SIZE(tca_hfsc_policy)];
3369
3370     if (!nl_parse_nested(nl_options, tca_hfsc_policy,
3371                          attrs, ARRAY_SIZE(tca_hfsc_policy))) {
3372         VLOG_WARN_RL(&rl, "failed to parse HFSC class options");
3373         return EPROTO;
3374     }
3375
3376     rsc = nl_attr_get(attrs[TCA_HFSC_RSC]);
3377     fsc = nl_attr_get(attrs[TCA_HFSC_FSC]);
3378     usc = nl_attr_get(attrs[TCA_HFSC_USC]);
3379
3380     if (rsc->m1 != 0 || rsc->d != 0 ||
3381         fsc->m1 != 0 || fsc->d != 0 ||
3382         usc->m1 != 0 || usc->d != 0) {
3383         VLOG_WARN_RL(&rl, "failed to parse HFSC class options. "
3384                      "Non-linear service curves are not supported.");
3385         return EPROTO;
3386     }
3387
3388     if (rsc->m2 != fsc->m2) {
3389         VLOG_WARN_RL(&rl, "failed to parse HFSC class options. "
3390                      "Real-time service curves are not supported ");
3391         return EPROTO;
3392     }
3393
3394     if (rsc->m2 > usc->m2) {
3395         VLOG_WARN_RL(&rl, "failed to parse HFSC class options. "
3396                      "Min-rate service curve is greater than "
3397                      "the max-rate service curve.");
3398         return EPROTO;
3399     }
3400
3401     class->min_rate = fsc->m2;
3402     class->max_rate = usc->m2;
3403     return 0;
3404 }
3405
3406 static int
3407 hfsc_parse_tcmsg__(struct ofpbuf *tcmsg, unsigned int *queue_id,
3408                    struct hfsc_class *options,
3409                    struct netdev_queue_stats *stats)
3410 {
3411     int error;
3412     unsigned int handle;
3413     struct nlattr *nl_options;
3414
3415     error = tc_parse_class(tcmsg, &handle, &nl_options, stats);
3416     if (error) {
3417         return error;
3418     }
3419
3420     if (queue_id) {
3421         unsigned int major, minor;
3422
3423         major = tc_get_major(handle);
3424         minor = tc_get_minor(handle);
3425         if (major == 1 && minor > 0 && minor <= HFSC_N_QUEUES) {
3426             *queue_id = minor - 1;
3427         } else {
3428             return EPROTO;
3429         }
3430     }
3431
3432     if (options) {
3433         error = hfsc_parse_tca_options__(nl_options, options);
3434     }
3435
3436     return error;
3437 }
3438
3439 static int
3440 hfsc_query_class__(const struct netdev *netdev, unsigned int handle,
3441                    unsigned int parent, struct hfsc_class *options,
3442                    struct netdev_queue_stats *stats)
3443 {
3444     int error;
3445     struct ofpbuf *reply;
3446
3447     error = tc_query_class(netdev, handle, parent, &reply);
3448     if (error) {
3449         return error;
3450     }
3451
3452     error = hfsc_parse_tcmsg__(reply, NULL, options, stats);
3453     ofpbuf_delete(reply);
3454     return error;
3455 }
3456
3457 static void
3458 hfsc_parse_qdisc_details__(struct netdev *netdev_, const struct smap *details,
3459                            struct hfsc_class *class)
3460 {
3461     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
3462     uint32_t max_rate;
3463     const char *max_rate_s;
3464
3465     max_rate_s = smap_get(details, "max-rate");
3466     max_rate   = max_rate_s ? strtoull(max_rate_s, NULL, 10) / 8 : 0;
3467
3468     if (!max_rate) {
3469         enum netdev_features current;
3470
3471         netdev_linux_read_features(netdev);
3472         current = !netdev->get_features_error ? netdev->current : 0;
3473         max_rate = netdev_features_to_bps(current, 100 * 1000 * 1000) / 8;
3474     }
3475
3476     class->min_rate = max_rate;
3477     class->max_rate = max_rate;
3478 }
3479
3480 static int
3481 hfsc_parse_class_details__(struct netdev *netdev,
3482                            const struct smap *details,
3483                            struct hfsc_class * class)
3484 {
3485     const struct hfsc *hfsc;
3486     uint32_t min_rate, max_rate;
3487     const char *min_rate_s, *max_rate_s;
3488
3489     hfsc       = hfsc_get__(netdev);
3490     min_rate_s = smap_get(details, "min-rate");
3491     max_rate_s = smap_get(details, "max-rate");
3492
3493     min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0;
3494     min_rate = MAX(min_rate, 1);
3495     min_rate = MIN(min_rate, hfsc->max_rate);
3496
3497     max_rate = (max_rate_s
3498                 ? strtoull(max_rate_s, NULL, 10) / 8
3499                 : hfsc->max_rate);
3500     max_rate = MAX(max_rate, min_rate);
3501     max_rate = MIN(max_rate, hfsc->max_rate);
3502
3503     class->min_rate = min_rate;
3504     class->max_rate = max_rate;
3505
3506     return 0;
3507 }
3508
3509 /* Create an HFSC qdisc.
3510  *
3511  * Equivalent to "tc qdisc add dev <dev> root handle 1: hfsc default 1". */
3512 static int
3513 hfsc_setup_qdisc__(struct netdev * netdev)
3514 {
3515     struct tcmsg *tcmsg;
3516     struct ofpbuf request;
3517     struct tc_hfsc_qopt opt;
3518
3519     tc_del_qdisc(netdev);
3520
3521     tcmsg = tc_make_request(netdev, RTM_NEWQDISC,
3522                             NLM_F_EXCL | NLM_F_CREATE, &request);
3523
3524     if (!tcmsg) {
3525         return ENODEV;
3526     }
3527
3528     tcmsg->tcm_handle = tc_make_handle(1, 0);
3529     tcmsg->tcm_parent = TC_H_ROOT;
3530
3531     memset(&opt, 0, sizeof opt);
3532     opt.defcls = 1;
3533
3534     nl_msg_put_string(&request, TCA_KIND, "hfsc");
3535     nl_msg_put_unspec(&request, TCA_OPTIONS, &opt, sizeof opt);
3536
3537     return tc_transact(&request, NULL);
3538 }
3539
3540 /* Create an HFSC class.
3541  *
3542  * Equivalent to "tc class add <dev> parent <parent> classid <handle> hfsc
3543  * sc rate <min_rate> ul rate <max_rate>" */
3544 static int
3545 hfsc_setup_class__(struct netdev *netdev, unsigned int handle,
3546                    unsigned int parent, struct hfsc_class *class)
3547 {
3548     int error;
3549     size_t opt_offset;
3550     struct tcmsg *tcmsg;
3551     struct ofpbuf request;
3552     struct tc_service_curve min, max;
3553
3554     tcmsg = tc_make_request(netdev, RTM_NEWTCLASS, NLM_F_CREATE, &request);
3555
3556     if (!tcmsg) {
3557         return ENODEV;
3558     }
3559
3560     tcmsg->tcm_handle = handle;
3561     tcmsg->tcm_parent = parent;
3562
3563     min.m1 = 0;
3564     min.d  = 0;
3565     min.m2 = class->min_rate;
3566
3567     max.m1 = 0;
3568     max.d  = 0;
3569     max.m2 = class->max_rate;
3570
3571     nl_msg_put_string(&request, TCA_KIND, "hfsc");
3572     opt_offset = nl_msg_start_nested(&request, TCA_OPTIONS);
3573     nl_msg_put_unspec(&request, TCA_HFSC_RSC, &min, sizeof min);
3574     nl_msg_put_unspec(&request, TCA_HFSC_FSC, &min, sizeof min);
3575     nl_msg_put_unspec(&request, TCA_HFSC_USC, &max, sizeof max);
3576     nl_msg_end_nested(&request, opt_offset);
3577
3578     error = tc_transact(&request, NULL);
3579     if (error) {
3580         VLOG_WARN_RL(&rl, "failed to replace %s class %u:%u, parent %u:%u, "
3581                      "min-rate %ubps, max-rate %ubps (%s)",
3582                      netdev_get_name(netdev),
3583                      tc_get_major(handle), tc_get_minor(handle),
3584                      tc_get_major(parent), tc_get_minor(parent),
3585                      class->min_rate, class->max_rate, ovs_strerror(error));
3586     }
3587
3588     return error;
3589 }
3590
3591 static int
3592 hfsc_tc_install(struct netdev *netdev, const struct smap *details)
3593 {
3594     int error;
3595     struct hfsc_class class;
3596
3597     error = hfsc_setup_qdisc__(netdev);
3598
3599     if (error) {
3600         return error;
3601     }
3602
3603     hfsc_parse_qdisc_details__(netdev, details, &class);
3604     error = hfsc_setup_class__(netdev, tc_make_handle(1, 0xfffe),
3605                                tc_make_handle(1, 0), &class);
3606
3607     if (error) {
3608         return error;
3609     }
3610
3611     hfsc_install__(netdev, class.max_rate);
3612     return 0;
3613 }
3614
3615 static int
3616 hfsc_tc_load(struct netdev *netdev, struct ofpbuf *nlmsg OVS_UNUSED)
3617 {
3618     struct ofpbuf msg;
3619     struct queue_dump_state state;
3620     struct hfsc_class hc;
3621
3622     hc.max_rate = 0;
3623     hfsc_query_class__(netdev, tc_make_handle(1, 0xfffe), 0, &hc, NULL);
3624     hfsc_install__(netdev, hc.max_rate);
3625
3626     if (!start_queue_dump(netdev, &state)) {
3627         return ENODEV;
3628     }
3629
3630     while (nl_dump_next(&state.dump, &msg, &state.buf)) {
3631         unsigned int queue_id;
3632
3633         if (!hfsc_parse_tcmsg__(&msg, &queue_id, &hc, NULL)) {
3634             hfsc_update_queue__(netdev, queue_id, &hc);
3635         }
3636     }
3637
3638     finish_queue_dump(&state);
3639     return 0;
3640 }
3641
3642 static void
3643 hfsc_tc_destroy(struct tc *tc)
3644 {
3645     struct hfsc *hfsc;
3646     struct hfsc_class *hc, *next;
3647
3648     hfsc = CONTAINER_OF(tc, struct hfsc, tc);
3649
3650     HMAP_FOR_EACH_SAFE (hc, next, tc_queue.hmap_node, &hfsc->tc.queues) {
3651         hmap_remove(&hfsc->tc.queues, &hc->tc_queue.hmap_node);
3652         free(hc);
3653     }
3654
3655     tc_destroy(tc);
3656     free(hfsc);
3657 }
3658
3659 static int
3660 hfsc_qdisc_get(const struct netdev *netdev, struct smap *details)
3661 {
3662     const struct hfsc *hfsc;
3663     hfsc = hfsc_get__(netdev);
3664     smap_add_format(details, "max-rate", "%llu", 8ULL * hfsc->max_rate);
3665     return 0;
3666 }
3667
3668 static int
3669 hfsc_qdisc_set(struct netdev *netdev, const struct smap *details)
3670 {
3671     int error;
3672     struct hfsc_class class;
3673
3674     hfsc_parse_qdisc_details__(netdev, details, &class);
3675     error = hfsc_setup_class__(netdev, tc_make_handle(1, 0xfffe),
3676                                tc_make_handle(1, 0), &class);
3677
3678     if (!error) {
3679         hfsc_get__(netdev)->max_rate = class.max_rate;
3680     }
3681
3682     return error;
3683 }
3684
3685 static int
3686 hfsc_class_get(const struct netdev *netdev OVS_UNUSED,
3687               const struct tc_queue *queue, struct smap *details)
3688 {
3689     const struct hfsc_class *hc;
3690
3691     hc = hfsc_class_cast__(queue);
3692     smap_add_format(details, "min-rate", "%llu", 8ULL * hc->min_rate);
3693     if (hc->min_rate != hc->max_rate) {
3694         smap_add_format(details, "max-rate", "%llu", 8ULL * hc->max_rate);
3695     }
3696     return 0;
3697 }
3698
3699 static int
3700 hfsc_class_set(struct netdev *netdev, unsigned int queue_id,
3701                const struct smap *details)
3702 {
3703     int error;
3704     struct hfsc_class class;
3705
3706     error = hfsc_parse_class_details__(netdev, details, &class);
3707     if (error) {
3708         return error;
3709     }
3710
3711     error = hfsc_setup_class__(netdev, tc_make_handle(1, queue_id + 1),
3712                                tc_make_handle(1, 0xfffe), &class);
3713     if (error) {
3714         return error;
3715     }
3716
3717     hfsc_update_queue__(netdev, queue_id, &class);
3718     return 0;
3719 }
3720
3721 static int
3722 hfsc_class_delete(struct netdev *netdev, struct tc_queue *queue)
3723 {
3724     int error;
3725     struct hfsc *hfsc;
3726     struct hfsc_class *hc;
3727
3728     hc   = hfsc_class_cast__(queue);
3729     hfsc = hfsc_get__(netdev);
3730
3731     error = tc_delete_class(netdev, tc_make_handle(1, queue->queue_id + 1));
3732     if (!error) {
3733         hmap_remove(&hfsc->tc.queues, &hc->tc_queue.hmap_node);
3734         free(hc);
3735     }
3736     return error;
3737 }
3738
3739 static int
3740 hfsc_class_get_stats(const struct netdev *netdev, const struct tc_queue *queue,
3741                      struct netdev_queue_stats *stats)
3742 {
3743     return hfsc_query_class__(netdev, tc_make_handle(1, queue->queue_id + 1),
3744                              tc_make_handle(1, 0xfffe), NULL, stats);
3745 }
3746
3747 static int
3748 hfsc_class_dump_stats(const struct netdev *netdev OVS_UNUSED,
3749                       const struct ofpbuf *nlmsg,
3750                       netdev_dump_queue_stats_cb *cb, void *aux)
3751 {
3752     struct netdev_queue_stats stats;
3753     unsigned int handle, major, minor;
3754     int error;
3755
3756     error = tc_parse_class(nlmsg, &handle, NULL, &stats);
3757     if (error) {
3758         return error;
3759     }
3760
3761     major = tc_get_major(handle);
3762     minor = tc_get_minor(handle);
3763     if (major == 1 && minor > 0 && minor <= HFSC_N_QUEUES) {
3764         (*cb)(minor - 1, &stats, aux);
3765     }
3766     return 0;
3767 }
3768
3769 static const struct tc_ops tc_ops_hfsc = {
3770     "hfsc",                     /* linux_name */
3771     "linux-hfsc",               /* ovs_name */
3772     HFSC_N_QUEUES,              /* n_queues */
3773     hfsc_tc_install,            /* tc_install */
3774     hfsc_tc_load,               /* tc_load */
3775     hfsc_tc_destroy,            /* tc_destroy */
3776     hfsc_qdisc_get,             /* qdisc_get */
3777     hfsc_qdisc_set,             /* qdisc_set */
3778     hfsc_class_get,             /* class_get */
3779     hfsc_class_set,             /* class_set */
3780     hfsc_class_delete,          /* class_delete */
3781     hfsc_class_get_stats,       /* class_get_stats */
3782     hfsc_class_dump_stats       /* class_dump_stats */
3783 };
3784 \f
3785 /* "linux-default" traffic control class.
3786  *
3787  * This class represents the default, unnamed Linux qdisc.  It corresponds to
3788  * the "" (empty string) QoS type in the OVS database. */
3789
3790 static void
3791 default_install__(struct netdev *netdev_)
3792 {
3793     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
3794     static const struct tc tc = TC_INITIALIZER(&tc, &tc_ops_default);
3795
3796     /* Nothing but a tc class implementation is allowed to write to a tc.  This
3797      * class never does that, so we can legitimately use a const tc object. */
3798     netdev->tc = CONST_CAST(struct tc *, &tc);
3799 }
3800
3801 static int
3802 default_tc_install(struct netdev *netdev,
3803                    const struct smap *details OVS_UNUSED)
3804 {
3805     default_install__(netdev);
3806     return 0;
3807 }
3808
3809 static int
3810 default_tc_load(struct netdev *netdev, struct ofpbuf *nlmsg OVS_UNUSED)
3811 {
3812     default_install__(netdev);
3813     return 0;
3814 }
3815
3816 static const struct tc_ops tc_ops_default = {
3817     NULL,                       /* linux_name */
3818     "",                         /* ovs_name */
3819     0,                          /* n_queues */
3820     default_tc_install,
3821     default_tc_load,
3822     NULL,                       /* tc_destroy */
3823     NULL,                       /* qdisc_get */
3824     NULL,                       /* qdisc_set */
3825     NULL,                       /* class_get */
3826     NULL,                       /* class_set */
3827     NULL,                       /* class_delete */
3828     NULL,                       /* class_get_stats */
3829     NULL                        /* class_dump_stats */
3830 };
3831 \f
3832 /* "linux-other" traffic control class.
3833  *
3834  * */
3835
3836 static int
3837 other_tc_load(struct netdev *netdev_, struct ofpbuf *nlmsg OVS_UNUSED)
3838 {
3839     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
3840     static const struct tc tc = TC_INITIALIZER(&tc, &tc_ops_other);
3841
3842     /* Nothing but a tc class implementation is allowed to write to a tc.  This
3843      * class never does that, so we can legitimately use a const tc object. */
3844     netdev->tc = CONST_CAST(struct tc *, &tc);
3845     return 0;
3846 }
3847
3848 static const struct tc_ops tc_ops_other = {
3849     NULL,                       /* linux_name */
3850     "linux-other",              /* ovs_name */
3851     0,                          /* n_queues */
3852     NULL,                       /* tc_install */
3853     other_tc_load,
3854     NULL,                       /* tc_destroy */
3855     NULL,                       /* qdisc_get */
3856     NULL,                       /* qdisc_set */
3857     NULL,                       /* class_get */
3858     NULL,                       /* class_set */
3859     NULL,                       /* class_delete */
3860     NULL,                       /* class_get_stats */
3861     NULL                        /* class_dump_stats */
3862 };
3863 \f
3864 /* Traffic control. */
3865
3866 /* Number of kernel "tc" ticks per second. */
3867 static double ticks_per_s;
3868
3869 /* Number of kernel "jiffies" per second.  This is used for the purpose of
3870  * computing buffer sizes.  Generally kernel qdiscs need to be able to buffer
3871  * one jiffy's worth of data.
3872  *
3873  * There are two possibilities here:
3874  *
3875  *    - 'buffer_hz' is the kernel's real timer tick rate, a small number in the
3876  *      approximate range of 100 to 1024.  That means that we really need to
3877  *      make sure that the qdisc can buffer that much data.
3878  *
3879  *    - 'buffer_hz' is an absurdly large number.  That means that the kernel
3880  *      has finely granular timers and there's no need to fudge additional room
3881  *      for buffers.  (There's no extra effort needed to implement that: the
3882  *      large 'buffer_hz' is used as a divisor, so practically any number will
3883  *      come out as 0 in the division.  Small integer results in the case of
3884  *      really high dividends won't have any real effect anyhow.)
3885  */
3886 static unsigned int buffer_hz;
3887
3888 /* Returns tc handle 'major':'minor'. */
3889 static unsigned int
3890 tc_make_handle(unsigned int major, unsigned int minor)
3891 {
3892     return TC_H_MAKE(major << 16, minor);
3893 }
3894
3895 /* Returns the major number from 'handle'. */
3896 static unsigned int
3897 tc_get_major(unsigned int handle)
3898 {
3899     return TC_H_MAJ(handle) >> 16;
3900 }
3901
3902 /* Returns the minor number from 'handle'. */
3903 static unsigned int
3904 tc_get_minor(unsigned int handle)
3905 {
3906     return TC_H_MIN(handle);
3907 }
3908
3909 static struct tcmsg *
3910 tc_make_request(const struct netdev *netdev, int type, unsigned int flags,
3911                 struct ofpbuf *request)
3912 {
3913     struct tcmsg *tcmsg;
3914     int ifindex;
3915     int error;
3916
3917     error = get_ifindex(netdev, &ifindex);
3918     if (error) {
3919         return NULL;
3920     }
3921
3922     ofpbuf_init(request, 512);
3923     nl_msg_put_nlmsghdr(request, sizeof *tcmsg, type, NLM_F_REQUEST | flags);
3924     tcmsg = ofpbuf_put_zeros(request, sizeof *tcmsg);
3925     tcmsg->tcm_family = AF_UNSPEC;
3926     tcmsg->tcm_ifindex = ifindex;
3927     /* Caller should fill in tcmsg->tcm_handle. */
3928     /* Caller should fill in tcmsg->tcm_parent. */
3929
3930     return tcmsg;
3931 }
3932
3933 static int
3934 tc_transact(struct ofpbuf *request, struct ofpbuf **replyp)
3935 {
3936     int error = nl_transact(NETLINK_ROUTE, request, replyp);
3937     ofpbuf_uninit(request);
3938     return error;
3939 }
3940
3941 /* Adds or deletes a root ingress qdisc on 'netdev'.  We use this for
3942  * policing configuration.
3943  *
3944  * This function is equivalent to running the following when 'add' is true:
3945  *     /sbin/tc qdisc add dev <devname> handle ffff: ingress
3946  *
3947  * This function is equivalent to running the following when 'add' is false:
3948  *     /sbin/tc qdisc del dev <devname> handle ffff: ingress
3949  *
3950  * The configuration and stats may be seen with the following command:
3951  *     /sbin/tc -s qdisc show dev <devname>
3952  *
3953  * Returns 0 if successful, otherwise a positive errno value.
3954  */
3955 static int
3956 tc_add_del_ingress_qdisc(struct netdev *netdev, bool add)
3957 {
3958     struct ofpbuf request;
3959     struct tcmsg *tcmsg;
3960     int error;
3961     int type = add ? RTM_NEWQDISC : RTM_DELQDISC;
3962     int flags = add ? NLM_F_EXCL | NLM_F_CREATE : 0;
3963
3964     tcmsg = tc_make_request(netdev, type, flags, &request);
3965     if (!tcmsg) {
3966         return ENODEV;
3967     }
3968     tcmsg->tcm_handle = tc_make_handle(0xffff, 0);
3969     tcmsg->tcm_parent = TC_H_INGRESS;
3970     nl_msg_put_string(&request, TCA_KIND, "ingress");
3971     nl_msg_put_unspec(&request, TCA_OPTIONS, NULL, 0);
3972
3973     error = tc_transact(&request, NULL);
3974     if (error) {
3975         /* If we're deleting the qdisc, don't worry about some of the
3976          * error conditions. */
3977         if (!add && (error == ENOENT || error == EINVAL)) {
3978             return 0;
3979         }
3980         return error;
3981     }
3982
3983     return 0;
3984 }
3985
3986 /* Adds a policer to 'netdev' with a rate of 'kbits_rate' and a burst size
3987  * of 'kbits_burst'.
3988  *
3989  * This function is equivalent to running:
3990  *     /sbin/tc filter add dev <devname> parent ffff: protocol all prio 49
3991  *              basic police rate <kbits_rate>kbit burst <kbits_burst>k
3992  *              mtu 65535 drop
3993  *
3994  * The configuration and stats may be seen with the following command:
3995  *     /sbin/tc -s filter show <devname> eth0 parent ffff:
3996  *
3997  * Returns 0 if successful, otherwise a positive errno value.
3998  */
3999 static int
4000 tc_add_policer(struct netdev *netdev, int kbits_rate, int kbits_burst)
4001 {
4002     struct tc_police tc_police;
4003     struct ofpbuf request;
4004     struct tcmsg *tcmsg;
4005     size_t basic_offset;
4006     size_t police_offset;
4007     int error;
4008     int mtu = 65535;
4009
4010     memset(&tc_police, 0, sizeof tc_police);
4011     tc_police.action = TC_POLICE_SHOT;
4012     tc_police.mtu = mtu;
4013     tc_fill_rate(&tc_police.rate, (kbits_rate * 1000)/8, mtu);
4014     tc_police.burst = tc_bytes_to_ticks(tc_police.rate.rate,
4015                                         kbits_burst * 1024);
4016
4017     tcmsg = tc_make_request(netdev, RTM_NEWTFILTER,
4018                             NLM_F_EXCL | NLM_F_CREATE, &request);
4019     if (!tcmsg) {
4020         return ENODEV;
4021     }
4022     tcmsg->tcm_parent = tc_make_handle(0xffff, 0);
4023     tcmsg->tcm_info = tc_make_handle(49,
4024                                      (OVS_FORCE uint16_t) htons(ETH_P_ALL));
4025
4026     nl_msg_put_string(&request, TCA_KIND, "basic");
4027     basic_offset = nl_msg_start_nested(&request, TCA_OPTIONS);
4028     police_offset = nl_msg_start_nested(&request, TCA_BASIC_POLICE);
4029     nl_msg_put_unspec(&request, TCA_POLICE_TBF, &tc_police, sizeof tc_police);
4030     tc_put_rtab(&request, TCA_POLICE_RATE, &tc_police.rate);
4031     nl_msg_end_nested(&request, police_offset);
4032     nl_msg_end_nested(&request, basic_offset);
4033
4034     error = tc_transact(&request, NULL);
4035     if (error) {
4036         return error;
4037     }
4038
4039     return 0;
4040 }
4041
4042 static void
4043 read_psched(void)
4044 {
4045     /* The values in psched are not individually very meaningful, but they are
4046      * important.  The tables below show some values seen in the wild.
4047      *
4048      * Some notes:
4049      *
4050      *   - "c" has always been a constant 1000000 since at least Linux 2.4.14.
4051      *     (Before that, there are hints that it was 1000000000.)
4052      *
4053      *   - "d" can be unrealistically large, see the comment on 'buffer_hz'
4054      *     above.
4055      *
4056      *                        /proc/net/psched
4057      *     -----------------------------------
4058      * [1] 000c8000 000f4240 000f4240 00000064
4059      * [2] 000003e8 00000400 000f4240 3b9aca00
4060      * [3] 000003e8 00000400 000f4240 3b9aca00
4061      * [4] 000003e8 00000400 000f4240 00000064
4062      * [5] 000003e8 00000040 000f4240 3b9aca00
4063      * [6] 000003e8 00000040 000f4240 000000f9
4064      *
4065      *           a         b          c             d ticks_per_s     buffer_hz
4066      *     ------- --------- ---------- ------------- ----------- -------------
4067      * [1] 819,200 1,000,000  1,000,000           100     819,200           100
4068      * [2]   1,000     1,024  1,000,000 1,000,000,000     976,562 1,000,000,000
4069      * [3]   1,000     1,024  1,000,000 1,000,000,000     976,562 1,000,000,000
4070      * [4]   1,000     1,024  1,000,000           100     976,562           100
4071      * [5]   1,000        64  1,000,000 1,000,000,000  15,625,000 1,000,000,000
4072      * [6]   1,000        64  1,000,000           249  15,625,000           249
4073      *
4074      * [1] 2.6.18-128.1.6.el5.xs5.5.0.505.1024xen from XenServer 5.5.0-24648p
4075      * [2] 2.6.26-1-686-bigmem from Debian lenny
4076      * [3] 2.6.26-2-sparc64 from Debian lenny
4077      * [4] 2.6.27.42-0.1.1.xs5.6.810.44.111163xen from XenServer 5.6.810-31078p
4078      * [5] 2.6.32.21.22 (approx.) from Ubuntu 10.04 on VMware Fusion
4079      * [6] 2.6.34 from kernel.org on KVM
4080      */
4081     static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
4082     static const char fn[] = "/proc/net/psched";
4083     unsigned int a, b, c, d;
4084     FILE *stream;
4085
4086     if (!ovsthread_once_start(&once)) {
4087         return;
4088     }
4089
4090     ticks_per_s = 1.0;
4091     buffer_hz = 100;
4092
4093     stream = fopen(fn, "r");
4094     if (!stream) {
4095         VLOG_WARN("%s: open failed: %s", fn, ovs_strerror(errno));
4096         goto exit;
4097     }
4098
4099     if (fscanf(stream, "%x %x %x %x", &a, &b, &c, &d) != 4) {
4100         VLOG_WARN("%s: read failed", fn);
4101         fclose(stream);
4102         goto exit;
4103     }
4104     VLOG_DBG("%s: psched parameters are: %u %u %u %u", fn, a, b, c, d);
4105     fclose(stream);
4106
4107     if (!a || !c) {
4108         VLOG_WARN("%s: invalid scheduler parameters", fn);
4109         goto exit;
4110     }
4111
4112     ticks_per_s = (double) a * c / b;
4113     if (c == 1000000) {
4114         buffer_hz = d;
4115     } else {
4116         VLOG_WARN("%s: unexpected psched parameters: %u %u %u %u",
4117                   fn, a, b, c, d);
4118     }
4119     VLOG_DBG("%s: ticks_per_s=%f buffer_hz=%u", fn, ticks_per_s, buffer_hz);
4120
4121 exit:
4122     ovsthread_once_done(&once);
4123 }
4124
4125 /* Returns the number of bytes that can be transmitted in 'ticks' ticks at a
4126  * rate of 'rate' bytes per second. */
4127 static unsigned int
4128 tc_ticks_to_bytes(unsigned int rate, unsigned int ticks)
4129 {
4130     read_psched();
4131     return (rate * ticks) / ticks_per_s;
4132 }
4133
4134 /* Returns the number of ticks that it would take to transmit 'size' bytes at a
4135  * rate of 'rate' bytes per second. */
4136 static unsigned int
4137 tc_bytes_to_ticks(unsigned int rate, unsigned int size)
4138 {
4139     read_psched();
4140     return rate ? ((unsigned long long int) ticks_per_s * size) / rate : 0;
4141 }
4142
4143 /* Returns the number of bytes that need to be reserved for qdisc buffering at
4144  * a transmission rate of 'rate' bytes per second. */
4145 static unsigned int
4146 tc_buffer_per_jiffy(unsigned int rate)
4147 {
4148     read_psched();
4149     return rate / buffer_hz;
4150 }
4151
4152 /* Given Netlink 'msg' that describes a qdisc, extracts the name of the qdisc,
4153  * e.g. "htb", into '*kind' (if it is nonnull).  If 'options' is nonnull,
4154  * extracts 'msg''s TCA_OPTIONS attributes into '*options' if it is present or
4155  * stores NULL into it if it is absent.
4156  *
4157  * '*kind' and '*options' point into 'msg', so they are owned by whoever owns
4158  * 'msg'.
4159  *
4160  * Returns 0 if successful, otherwise a positive errno value. */
4161 static int
4162 tc_parse_qdisc(const struct ofpbuf *msg, const char **kind,
4163                struct nlattr **options)
4164 {
4165     static const struct nl_policy tca_policy[] = {
4166         [TCA_KIND] = { .type = NL_A_STRING, .optional = false },
4167         [TCA_OPTIONS] = { .type = NL_A_NESTED, .optional = true },
4168     };
4169     struct nlattr *ta[ARRAY_SIZE(tca_policy)];
4170
4171     if (!nl_policy_parse(msg, NLMSG_HDRLEN + sizeof(struct tcmsg),
4172                          tca_policy, ta, ARRAY_SIZE(ta))) {
4173         VLOG_WARN_RL(&rl, "failed to parse qdisc message");
4174         goto error;
4175     }
4176
4177     if (kind) {
4178         *kind = nl_attr_get_string(ta[TCA_KIND]);
4179     }
4180
4181     if (options) {
4182         *options = ta[TCA_OPTIONS];
4183     }
4184
4185     return 0;
4186
4187 error:
4188     if (kind) {
4189         *kind = NULL;
4190     }
4191     if (options) {
4192         *options = NULL;
4193     }
4194     return EPROTO;
4195 }
4196
4197 /* Given Netlink 'msg' that describes a class, extracts the queue ID (e.g. the
4198  * minor number of its class ID) into '*queue_id', its TCA_OPTIONS attribute
4199  * into '*options', and its queue statistics into '*stats'.  Any of the output
4200  * arguments may be null.
4201  *
4202  * Returns 0 if successful, otherwise a positive errno value. */
4203 static int
4204 tc_parse_class(const struct ofpbuf *msg, unsigned int *handlep,
4205                struct nlattr **options, struct netdev_queue_stats *stats)
4206 {
4207     static const struct nl_policy tca_policy[] = {
4208         [TCA_OPTIONS] = { .type = NL_A_NESTED, .optional = false },
4209         [TCA_STATS2] = { .type = NL_A_NESTED, .optional = false },
4210     };
4211     struct nlattr *ta[ARRAY_SIZE(tca_policy)];
4212
4213     if (!nl_policy_parse(msg, NLMSG_HDRLEN + sizeof(struct tcmsg),
4214                          tca_policy, ta, ARRAY_SIZE(ta))) {
4215         VLOG_WARN_RL(&rl, "failed to parse class message");
4216         goto error;
4217     }
4218
4219     if (handlep) {
4220         struct tcmsg *tc = ofpbuf_at_assert(msg, NLMSG_HDRLEN, sizeof *tc);
4221         *handlep = tc->tcm_handle;
4222     }
4223
4224     if (options) {
4225         *options = ta[TCA_OPTIONS];
4226     }
4227
4228     if (stats) {
4229         const struct gnet_stats_queue *gsq;
4230         struct gnet_stats_basic gsb;
4231
4232         static const struct nl_policy stats_policy[] = {
4233             [TCA_STATS_BASIC] = { .type = NL_A_UNSPEC, .optional = false,
4234                                   .min_len = sizeof gsb },
4235             [TCA_STATS_QUEUE] = { .type = NL_A_UNSPEC, .optional = false,
4236                                   .min_len = sizeof *gsq },
4237         };
4238         struct nlattr *sa[ARRAY_SIZE(stats_policy)];
4239
4240         if (!nl_parse_nested(ta[TCA_STATS2], stats_policy,
4241                              sa, ARRAY_SIZE(sa))) {
4242             VLOG_WARN_RL(&rl, "failed to parse class stats");
4243             goto error;
4244         }
4245
4246         /* Alignment issues screw up the length of struct gnet_stats_basic on
4247          * some arch/bitsize combinations.  Newer versions of Linux have a
4248          * struct gnet_stats_basic_packed, but we can't depend on that.  The
4249          * easiest thing to do is just to make a copy. */
4250         memset(&gsb, 0, sizeof gsb);
4251         memcpy(&gsb, nl_attr_get(sa[TCA_STATS_BASIC]),
4252                MIN(nl_attr_get_size(sa[TCA_STATS_BASIC]), sizeof gsb));
4253         stats->tx_bytes = gsb.bytes;
4254         stats->tx_packets = gsb.packets;
4255
4256         gsq = nl_attr_get(sa[TCA_STATS_QUEUE]);
4257         stats->tx_errors = gsq->drops;
4258     }
4259
4260     return 0;
4261
4262 error:
4263     if (options) {
4264         *options = NULL;
4265     }
4266     if (stats) {
4267         memset(stats, 0, sizeof *stats);
4268     }
4269     return EPROTO;
4270 }
4271
4272 /* Queries the kernel for class with identifier 'handle' and parent 'parent'
4273  * on 'netdev'. */
4274 static int
4275 tc_query_class(const struct netdev *netdev,
4276                unsigned int handle, unsigned int parent,
4277                struct ofpbuf **replyp)
4278 {
4279     struct ofpbuf request;
4280     struct tcmsg *tcmsg;
4281     int error;
4282
4283     tcmsg = tc_make_request(netdev, RTM_GETTCLASS, NLM_F_ECHO, &request);
4284     if (!tcmsg) {
4285         return ENODEV;
4286     }
4287     tcmsg->tcm_handle = handle;
4288     tcmsg->tcm_parent = parent;
4289
4290     error = tc_transact(&request, replyp);
4291     if (error) {
4292         VLOG_WARN_RL(&rl, "query %s class %u:%u (parent %u:%u) failed (%s)",
4293                      netdev_get_name(netdev),
4294                      tc_get_major(handle), tc_get_minor(handle),
4295                      tc_get_major(parent), tc_get_minor(parent),
4296                      ovs_strerror(error));
4297     }
4298     return error;
4299 }
4300
4301 /* Equivalent to "tc class del dev <name> handle <handle>". */
4302 static int
4303 tc_delete_class(const struct netdev *netdev, unsigned int handle)
4304 {
4305     struct ofpbuf request;
4306     struct tcmsg *tcmsg;
4307     int error;
4308
4309     tcmsg = tc_make_request(netdev, RTM_DELTCLASS, 0, &request);
4310     if (!tcmsg) {
4311         return ENODEV;
4312     }
4313     tcmsg->tcm_handle = handle;
4314     tcmsg->tcm_parent = 0;
4315
4316     error = tc_transact(&request, NULL);
4317     if (error) {
4318         VLOG_WARN_RL(&rl, "delete %s class %u:%u failed (%s)",
4319                      netdev_get_name(netdev),
4320                      tc_get_major(handle), tc_get_minor(handle),
4321                      ovs_strerror(error));
4322     }
4323     return error;
4324 }
4325
4326 /* Equivalent to "tc qdisc del dev <name> root". */
4327 static int
4328 tc_del_qdisc(struct netdev *netdev_)
4329 {
4330     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
4331     struct ofpbuf request;
4332     struct tcmsg *tcmsg;
4333     int error;
4334
4335     tcmsg = tc_make_request(netdev_, RTM_DELQDISC, 0, &request);
4336     if (!tcmsg) {
4337         return ENODEV;
4338     }
4339     tcmsg->tcm_handle = tc_make_handle(1, 0);
4340     tcmsg->tcm_parent = TC_H_ROOT;
4341
4342     error = tc_transact(&request, NULL);
4343     if (error == EINVAL) {
4344         /* EINVAL probably means that the default qdisc was in use, in which
4345          * case we've accomplished our purpose. */
4346         error = 0;
4347     }
4348     if (!error && netdev->tc) {
4349         if (netdev->tc->ops->tc_destroy) {
4350             netdev->tc->ops->tc_destroy(netdev->tc);
4351         }
4352         netdev->tc = NULL;
4353     }
4354     return error;
4355 }
4356
4357 /* If 'netdev''s qdisc type and parameters are not yet known, queries the
4358  * kernel to determine what they are.  Returns 0 if successful, otherwise a
4359  * positive errno value. */
4360 static int
4361 tc_query_qdisc(const struct netdev *netdev_)
4362 {
4363     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
4364     struct ofpbuf request, *qdisc;
4365     const struct tc_ops *ops;
4366     struct tcmsg *tcmsg;
4367     int load_error;
4368     int error;
4369
4370     if (netdev->tc) {
4371         return 0;
4372     }
4373
4374     /* This RTM_GETQDISC is crafted to avoid OOPSing kernels that do not have
4375      * commit 53b0f08 "net_sched: Fix qdisc_notify()", which is anything before
4376      * 2.6.35 without that fix backported to it.
4377      *
4378      * To avoid the OOPS, we must not make a request that would attempt to dump
4379      * a "built-in" qdisc, that is, the default pfifo_fast qdisc or one of a
4380      * few others.  There are a few ways that I can see to do this, but most of
4381      * them seem to be racy (and if you lose the race the kernel OOPSes).  The
4382      * technique chosen here is to assume that any non-default qdisc that we
4383      * create will have a class with handle 1:0.  The built-in qdiscs only have
4384      * a class with handle 0:0.
4385      *
4386      * We could check for Linux 2.6.35+ and use a more straightforward method
4387      * there. */
4388     tcmsg = tc_make_request(netdev_, RTM_GETQDISC, NLM_F_ECHO, &request);
4389     if (!tcmsg) {
4390         return ENODEV;
4391     }
4392     tcmsg->tcm_handle = tc_make_handle(1, 0);
4393     tcmsg->tcm_parent = 0;
4394
4395     /* Figure out what tc class to instantiate. */
4396     error = tc_transact(&request, &qdisc);
4397     if (!error) {
4398         const char *kind;
4399
4400         error = tc_parse_qdisc(qdisc, &kind, NULL);
4401         if (error) {
4402             ops = &tc_ops_other;
4403         } else {
4404             ops = tc_lookup_linux_name(kind);
4405             if (!ops) {
4406                 static struct vlog_rate_limit rl2 = VLOG_RATE_LIMIT_INIT(1, 1);
4407                 VLOG_INFO_RL(&rl2, "unknown qdisc \"%s\"", kind);
4408
4409                 ops = &tc_ops_other;
4410             }
4411         }
4412     } else if (error == ENOENT) {
4413         /* Either it's a built-in qdisc, or it's a qdisc set up by some
4414          * other entity that doesn't have a handle 1:0.  We will assume
4415          * that it's the system default qdisc. */
4416         ops = &tc_ops_default;
4417         error = 0;
4418     } else {
4419         /* Who knows?  Maybe the device got deleted. */
4420         VLOG_WARN_RL(&rl, "query %s qdisc failed (%s)",
4421                      netdev_get_name(netdev_), ovs_strerror(error));
4422         ops = &tc_ops_other;
4423     }
4424
4425     /* Instantiate it. */
4426     load_error = ops->tc_load(CONST_CAST(struct netdev *, netdev_), qdisc);
4427     ovs_assert((load_error == 0) == (netdev->tc != NULL));
4428     ofpbuf_delete(qdisc);
4429
4430     return error ? error : load_error;
4431 }
4432
4433 /* Linux traffic control uses tables with 256 entries ("rtab" tables) to
4434    approximate the time to transmit packets of various lengths.  For an MTU of
4435    256 or less, each entry is exact; for an MTU of 257 through 512, each entry
4436    represents two possible packet lengths; for a MTU of 513 through 1024, four
4437    possible lengths; and so on.
4438
4439    Returns, for the specified 'mtu', the number of bits that packet lengths
4440    need to be shifted right to fit within such a 256-entry table. */
4441 static int
4442 tc_calc_cell_log(unsigned int mtu)
4443 {
4444     int cell_log;
4445
4446     if (!mtu) {
4447         mtu = ETH_PAYLOAD_MAX;
4448     }
4449     mtu += ETH_HEADER_LEN + VLAN_HEADER_LEN;
4450
4451     for (cell_log = 0; mtu >= 256; cell_log++) {
4452         mtu >>= 1;
4453     }
4454
4455     return cell_log;
4456 }
4457
4458 /* Initializes 'rate' properly for a rate of 'Bps' bytes per second with an MTU
4459  * of 'mtu'. */
4460 static void
4461 tc_fill_rate(struct tc_ratespec *rate, uint64_t Bps, int mtu)
4462 {
4463     memset(rate, 0, sizeof *rate);
4464     rate->cell_log = tc_calc_cell_log(mtu);
4465     /* rate->overhead = 0; */           /* New in 2.6.24, not yet in some */
4466     /* rate->cell_align = 0; */         /* distro headers. */
4467     rate->mpu = ETH_TOTAL_MIN;
4468     rate->rate = Bps;
4469 }
4470
4471 /* Appends to 'msg' an "rtab" table for the specified 'rate' as a Netlink
4472  * attribute of the specified "type".
4473  *
4474  * See tc_calc_cell_log() above for a description of "rtab"s. */
4475 static void
4476 tc_put_rtab(struct ofpbuf *msg, uint16_t type, const struct tc_ratespec *rate)
4477 {
4478     uint32_t *rtab;
4479     unsigned int i;
4480
4481     rtab = nl_msg_put_unspec_uninit(msg, type, TC_RTAB_SIZE);
4482     for (i = 0; i < TC_RTAB_SIZE / sizeof *rtab; i++) {
4483         unsigned packet_size = (i + 1) << rate->cell_log;
4484         if (packet_size < rate->mpu) {
4485             packet_size = rate->mpu;
4486         }
4487         rtab[i] = tc_bytes_to_ticks(rate->rate, packet_size);
4488     }
4489 }
4490
4491 /* Calculates the proper value of 'buffer' or 'cbuffer' in HTB options given a
4492  * rate of 'Bps' bytes per second, the specified 'mtu', and a user-requested
4493  * burst size of 'burst_bytes'.  (If no value was requested, a 'burst_bytes' of
4494  * 0 is fine.) */
4495 static int
4496 tc_calc_buffer(unsigned int Bps, int mtu, uint64_t burst_bytes)
4497 {
4498     unsigned int min_burst = tc_buffer_per_jiffy(Bps) + mtu;
4499     return tc_bytes_to_ticks(Bps, MAX(burst_bytes, min_burst));
4500 }
4501 \f
4502 /* Linux-only functions declared in netdev-linux.h  */
4503
4504 /* Modifies the 'flag' bit in ethtool's flags field for 'netdev'.  If
4505  * 'enable' is true, the bit is set.  Otherwise, it is cleared. */
4506 int
4507 netdev_linux_ethtool_set_flag(struct netdev *netdev, uint32_t flag,
4508                               const char *flag_name, bool enable)
4509 {
4510     const char *netdev_name = netdev_get_name(netdev);
4511     struct ethtool_value evalue;
4512     uint32_t new_flags;
4513     int error;
4514
4515     COVERAGE_INC(netdev_get_ethtool);
4516     memset(&evalue, 0, sizeof evalue);
4517     error = netdev_linux_do_ethtool(netdev_name,
4518                                     (struct ethtool_cmd *)&evalue,
4519                                     ETHTOOL_GFLAGS, "ETHTOOL_GFLAGS");
4520     if (error) {
4521         return error;
4522     }
4523
4524     COVERAGE_INC(netdev_set_ethtool);
4525     evalue.data = new_flags = (evalue.data & ~flag) | (enable ? flag : 0);
4526     error = netdev_linux_do_ethtool(netdev_name,
4527                                     (struct ethtool_cmd *)&evalue,
4528                                     ETHTOOL_SFLAGS, "ETHTOOL_SFLAGS");
4529     if (error) {
4530         return error;
4531     }
4532
4533     COVERAGE_INC(netdev_get_ethtool);
4534     memset(&evalue, 0, sizeof evalue);
4535     error = netdev_linux_do_ethtool(netdev_name,
4536                                     (struct ethtool_cmd *)&evalue,
4537                                     ETHTOOL_GFLAGS, "ETHTOOL_GFLAGS");
4538     if (error) {
4539         return error;
4540     }
4541
4542     if (new_flags != evalue.data) {
4543         VLOG_WARN_RL(&rl, "attempt to %s ethtool %s flag on network "
4544                      "device %s failed", enable ? "enable" : "disable",
4545                      flag_name, netdev_name);
4546         return EOPNOTSUPP;
4547     }
4548
4549     return 0;
4550 }
4551 \f
4552 /* Utility functions. */
4553
4554 /* Copies 'src' into 'dst', performing format conversion in the process. */
4555 static void
4556 netdev_stats_from_rtnl_link_stats(struct netdev_stats *dst,
4557                                   const struct rtnl_link_stats *src)
4558 {
4559     dst->rx_packets = src->rx_packets;
4560     dst->tx_packets = src->tx_packets;
4561     dst->rx_bytes = src->rx_bytes;
4562     dst->tx_bytes = src->tx_bytes;
4563     dst->rx_errors = src->rx_errors;
4564     dst->tx_errors = src->tx_errors;
4565     dst->rx_dropped = src->rx_dropped;
4566     dst->tx_dropped = src->tx_dropped;
4567     dst->multicast = src->multicast;
4568     dst->collisions = src->collisions;
4569     dst->rx_length_errors = src->rx_length_errors;
4570     dst->rx_over_errors = src->rx_over_errors;
4571     dst->rx_crc_errors = src->rx_crc_errors;
4572     dst->rx_frame_errors = src->rx_frame_errors;
4573     dst->rx_fifo_errors = src->rx_fifo_errors;
4574     dst->rx_missed_errors = src->rx_missed_errors;
4575     dst->tx_aborted_errors = src->tx_aborted_errors;
4576     dst->tx_carrier_errors = src->tx_carrier_errors;
4577     dst->tx_fifo_errors = src->tx_fifo_errors;
4578     dst->tx_heartbeat_errors = src->tx_heartbeat_errors;
4579     dst->tx_window_errors = src->tx_window_errors;
4580 }
4581
4582 static int
4583 get_stats_via_netlink(const struct netdev *netdev_, struct netdev_stats *stats)
4584 {
4585     struct ofpbuf request;
4586     struct ofpbuf *reply;
4587     int error;
4588
4589     ofpbuf_init(&request, 0);
4590     nl_msg_put_nlmsghdr(&request,
4591                         sizeof(struct ifinfomsg) + NL_ATTR_SIZE(IFNAMSIZ),
4592                         RTM_GETLINK, NLM_F_REQUEST);
4593     ofpbuf_put_zeros(&request, sizeof(struct ifinfomsg));
4594     nl_msg_put_string(&request, IFLA_IFNAME, netdev_get_name(netdev_));
4595     error = nl_transact(NETLINK_ROUTE, &request, &reply);
4596     ofpbuf_uninit(&request);
4597     if (error) {
4598         return error;
4599     }
4600
4601     if (ofpbuf_try_pull(reply, NLMSG_HDRLEN + sizeof(struct ifinfomsg))) {
4602         const struct nlattr *a = nl_attr_find(reply, 0, IFLA_STATS);
4603         if (a && nl_attr_get_size(a) >= sizeof(struct rtnl_link_stats)) {
4604             netdev_stats_from_rtnl_link_stats(stats, nl_attr_get(a));
4605             error = 0;
4606         } else {
4607             VLOG_WARN_RL(&rl, "RTM_GETLINK reply lacks stats");
4608             error = EPROTO;
4609         }
4610     } else {
4611         VLOG_WARN_RL(&rl, "short RTM_GETLINK reply");
4612         error = EPROTO;
4613     }
4614
4615
4616     ofpbuf_delete(reply);
4617     return error;
4618 }
4619
4620 static int
4621 get_flags(const struct netdev *dev, unsigned int *flags)
4622 {
4623     struct ifreq ifr;
4624     int error;
4625
4626     *flags = 0;
4627     error = af_inet_ifreq_ioctl(dev->name, &ifr, SIOCGIFFLAGS, "SIOCGIFFLAGS");
4628     if (!error) {
4629         *flags = ifr.ifr_flags;
4630     }
4631     return error;
4632 }
4633
4634 static int
4635 set_flags(const char *name, unsigned int flags)
4636 {
4637     struct ifreq ifr;
4638
4639     ifr.ifr_flags = flags;
4640     return af_inet_ifreq_ioctl(name, &ifr, SIOCSIFFLAGS, "SIOCSIFFLAGS");
4641 }
4642
4643 static int
4644 do_get_ifindex(const char *netdev_name)
4645 {
4646     struct ifreq ifr;
4647     int error;
4648
4649     ovs_strzcpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name);
4650     COVERAGE_INC(netdev_get_ifindex);
4651
4652     error = af_inet_ioctl(SIOCGIFINDEX, &ifr);
4653     if (error) {
4654         VLOG_WARN_RL(&rl, "ioctl(SIOCGIFINDEX) on %s device failed: %s",
4655                      netdev_name, ovs_strerror(error));
4656         return -error;
4657     }
4658     return ifr.ifr_ifindex;
4659 }
4660
4661 static int
4662 get_ifindex(const struct netdev *netdev_, int *ifindexp)
4663 {
4664     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
4665
4666     if (!(netdev->cache_valid & VALID_IFINDEX)) {
4667         int ifindex = do_get_ifindex(netdev_get_name(netdev_));
4668
4669         if (ifindex < 0) {
4670             netdev->get_ifindex_error = -ifindex;
4671             netdev->ifindex = 0;
4672         } else {
4673             netdev->get_ifindex_error = 0;
4674             netdev->ifindex = ifindex;
4675         }
4676         netdev->cache_valid |= VALID_IFINDEX;
4677     }
4678
4679     *ifindexp = netdev->ifindex;
4680     return netdev->get_ifindex_error;
4681 }
4682
4683 static int
4684 get_etheraddr(const char *netdev_name, uint8_t ea[ETH_ADDR_LEN])
4685 {
4686     struct ifreq ifr;
4687     int hwaddr_family;
4688     int error;
4689
4690     memset(&ifr, 0, sizeof ifr);
4691     ovs_strzcpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name);
4692     COVERAGE_INC(netdev_get_hwaddr);
4693     error = af_inet_ioctl(SIOCGIFHWADDR, &ifr);
4694     if (error) {
4695         /* ENODEV probably means that a vif disappeared asynchronously and
4696          * hasn't been removed from the database yet, so reduce the log level
4697          * to INFO for that case. */
4698         VLOG(error == ENODEV ? VLL_INFO : VLL_ERR,
4699              "ioctl(SIOCGIFHWADDR) on %s device failed: %s",
4700              netdev_name, ovs_strerror(error));
4701         return error;
4702     }
4703     hwaddr_family = ifr.ifr_hwaddr.sa_family;
4704     if (hwaddr_family != AF_UNSPEC && hwaddr_family != ARPHRD_ETHER) {
4705         VLOG_WARN("%s device has unknown hardware address family %d",
4706                   netdev_name, hwaddr_family);
4707     }
4708     memcpy(ea, ifr.ifr_hwaddr.sa_data, ETH_ADDR_LEN);
4709     return 0;
4710 }
4711
4712 static int
4713 set_etheraddr(const char *netdev_name,
4714               const uint8_t mac[ETH_ADDR_LEN])
4715 {
4716     struct ifreq ifr;
4717     int error;
4718
4719     memset(&ifr, 0, sizeof ifr);
4720     ovs_strzcpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name);
4721     ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
4722     memcpy(ifr.ifr_hwaddr.sa_data, mac, ETH_ADDR_LEN);
4723     COVERAGE_INC(netdev_set_hwaddr);
4724     error = af_inet_ioctl(SIOCSIFHWADDR, &ifr);
4725     if (error) {
4726         VLOG_ERR("ioctl(SIOCSIFHWADDR) on %s device failed: %s",
4727                  netdev_name, ovs_strerror(error));
4728     }
4729     return error;
4730 }
4731
4732 static int
4733 netdev_linux_do_ethtool(const char *name, struct ethtool_cmd *ecmd,
4734                         int cmd, const char *cmd_name)
4735 {
4736     struct ifreq ifr;
4737     int error;
4738
4739     memset(&ifr, 0, sizeof ifr);
4740     ovs_strzcpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
4741     ifr.ifr_data = (caddr_t) ecmd;
4742
4743     ecmd->cmd = cmd;
4744     error = af_inet_ioctl(SIOCETHTOOL, &ifr);
4745     if (error) {
4746         if (error != EOPNOTSUPP) {
4747             VLOG_WARN_RL(&rl, "ethtool command %s on network device %s "
4748                          "failed: %s", cmd_name, name, ovs_strerror(error));
4749         } else {
4750             /* The device doesn't support this operation.  That's pretty
4751              * common, so there's no point in logging anything. */
4752         }
4753     }
4754     return error;
4755 }
4756
4757 static int
4758 netdev_linux_get_ipv4(const struct netdev *netdev, struct in_addr *ip,
4759                       int cmd, const char *cmd_name)
4760 {
4761     struct ifreq ifr;
4762     int error;
4763
4764     ifr.ifr_addr.sa_family = AF_INET;
4765     error = af_inet_ifreq_ioctl(netdev_get_name(netdev), &ifr, cmd, cmd_name);
4766     if (!error) {
4767         const struct sockaddr_in *sin = ALIGNED_CAST(struct sockaddr_in *,
4768                                                      &ifr.ifr_addr);
4769         *ip = sin->sin_addr;
4770     }
4771     return error;
4772 }
4773
4774 /* Returns an AF_PACKET raw socket or a negative errno value. */
4775 static int
4776 af_packet_sock(void)
4777 {
4778     static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
4779     static int sock;
4780
4781     if (ovsthread_once_start(&once)) {
4782         sock = socket(AF_PACKET, SOCK_RAW, 0);
4783         if (sock >= 0) {
4784             int error = set_nonblocking(sock);
4785             if (error) {
4786                 close(sock);
4787                 sock = -error;
4788             }
4789         } else {
4790             sock = -errno;
4791             VLOG_ERR("failed to create packet socket: %s",
4792                      ovs_strerror(errno));
4793         }
4794         ovsthread_once_done(&once);
4795     }
4796
4797     return sock;
4798 }