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