netdev-linux: Use "read", not "recv", for tap devices.
[sliver-openvswitch.git] / lib / netdev-linux.c
1 /*
2  * Copyright (c) 2009, 2010, 2011, 2012 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_VPORT_STAT_ERROR  = 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     int vport_stats_error;      /* Cached error code from vport_get_stats().
376                                    0 or an errno value. */
377     struct tc *tc;
378
379     union {
380         struct tap_state tap;
381     } state;
382 };
383
384 struct netdev_linux {
385     struct netdev netdev;
386     int fd;
387 };
388
389 /* Sockets used for ioctl operations. */
390 static int af_inet_sock = -1;   /* AF_INET, SOCK_DGRAM. */
391
392 /* A Netlink routing socket that is not subscribed to any multicast groups. */
393 static struct nl_sock *rtnl_sock;
394
395 /* This is set pretty low because we probably won't learn anything from the
396  * additional log messages. */
397 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
398
399 static int netdev_linux_init(void);
400
401 static int netdev_linux_do_ethtool(const char *name, struct ethtool_cmd *,
402                                    int cmd, const char *cmd_name);
403 static int netdev_linux_do_ioctl(const char *name, struct ifreq *, int cmd,
404                                  const char *cmd_name);
405 static int netdev_linux_get_ipv4(const struct netdev *, struct in_addr *,
406                                  int cmd, const char *cmd_name);
407 static int get_flags(const struct netdev_dev *, unsigned int *flags);
408 static int set_flags(struct netdev *, unsigned int flags);
409 static int do_get_ifindex(const char *netdev_name);
410 static int get_ifindex(const struct netdev *, int *ifindexp);
411 static int do_set_addr(struct netdev *netdev,
412                        int ioctl_nr, const char *ioctl_name,
413                        struct in_addr addr);
414 static int get_etheraddr(const char *netdev_name, uint8_t ea[ETH_ADDR_LEN]);
415 static int set_etheraddr(const char *netdev_name, int hwaddr_family,
416                          const uint8_t[ETH_ADDR_LEN]);
417 static int get_stats_via_netlink(int ifindex, struct netdev_stats *stats);
418 static int get_stats_via_proc(const char *netdev_name, struct netdev_stats *stats);
419 static int af_packet_sock(void);
420 static void netdev_linux_miimon_run(void);
421 static void netdev_linux_miimon_wait(void);
422
423 static bool
424 is_netdev_linux_class(const struct netdev_class *netdev_class)
425 {
426     return netdev_class->init == netdev_linux_init;
427 }
428
429 static struct netdev_dev_linux *
430 netdev_dev_linux_cast(const struct netdev_dev *netdev_dev)
431 {
432     const struct netdev_class *netdev_class = netdev_dev_get_class(netdev_dev);
433     assert(is_netdev_linux_class(netdev_class));
434
435     return CONTAINER_OF(netdev_dev, struct netdev_dev_linux, netdev_dev);
436 }
437
438 static struct netdev_linux *
439 netdev_linux_cast(const struct netdev *netdev)
440 {
441     struct netdev_dev *netdev_dev = netdev_get_dev(netdev);
442     const struct netdev_class *netdev_class = netdev_dev_get_class(netdev_dev);
443     assert(is_netdev_linux_class(netdev_class));
444
445     return CONTAINER_OF(netdev, struct netdev_linux, netdev);
446 }
447 \f
448 static int
449 netdev_linux_init(void)
450 {
451     static int status = -1;
452     if (status < 0) {
453         /* Create AF_INET socket. */
454         af_inet_sock = socket(AF_INET, SOCK_DGRAM, 0);
455         status = af_inet_sock >= 0 ? 0 : errno;
456         if (status) {
457             VLOG_ERR("failed to create inet socket: %s", strerror(status));
458         }
459
460         /* Create rtnetlink socket. */
461         if (!status) {
462             status = nl_sock_create(NETLINK_ROUTE, &rtnl_sock);
463             if (status) {
464                 VLOG_ERR_RL(&rl, "failed to create rtnetlink socket: %s",
465                             strerror(status));
466             }
467         }
468     }
469     return status;
470 }
471
472 static void
473 netdev_linux_run(void)
474 {
475     rtnetlink_link_run();
476     netdev_linux_miimon_run();
477 }
478
479 static void
480 netdev_linux_wait(void)
481 {
482     rtnetlink_link_wait();
483     netdev_linux_miimon_wait();
484 }
485
486 static void
487 netdev_dev_linux_changed(struct netdev_dev_linux *dev, unsigned int ifi_flags)
488 {
489     dev->change_seq++;
490     if (!dev->change_seq) {
491         dev->change_seq++;
492     }
493
494     if ((dev->ifi_flags ^ ifi_flags) & IFF_RUNNING) {
495         dev->carrier_resets++;
496     }
497     dev->ifi_flags = ifi_flags;
498
499     dev->cache_valid = 0;
500 }
501
502 static void
503 netdev_linux_cache_cb(const struct rtnetlink_link_change *change,
504                       void *aux OVS_UNUSED)
505 {
506     struct netdev_dev_linux *dev;
507     if (change) {
508         struct netdev_dev *base_dev = netdev_dev_from_name(change->ifname);
509         if (base_dev) {
510             const struct netdev_class *netdev_class =
511                                                 netdev_dev_get_class(base_dev);
512
513             if (is_netdev_linux_class(netdev_class)) {
514                 dev = netdev_dev_linux_cast(base_dev);
515                 netdev_dev_linux_changed(dev, change->ifi_flags);
516             }
517         }
518     } else {
519         struct shash device_shash;
520         struct shash_node *node;
521
522         shash_init(&device_shash);
523         netdev_dev_get_devices(&netdev_linux_class, &device_shash);
524         SHASH_FOR_EACH (node, &device_shash) {
525             unsigned int flags;
526
527             dev = node->data;
528
529             get_flags(&dev->netdev_dev, &flags);
530             netdev_dev_linux_changed(dev, flags);
531         }
532         shash_destroy(&device_shash);
533     }
534 }
535
536 static int
537 cache_notifier_ref(void)
538 {
539     if (!cache_notifier_refcount) {
540         assert(!netdev_linux_cache_notifier);
541
542         netdev_linux_cache_notifier =
543             rtnetlink_link_notifier_create(netdev_linux_cache_cb, NULL);
544
545         if (!netdev_linux_cache_notifier) {
546             return EINVAL;
547         }
548     }
549     cache_notifier_refcount++;
550
551     return 0;
552 }
553
554 static void
555 cache_notifier_unref(void)
556 {
557     assert(cache_notifier_refcount > 0);
558     if (!--cache_notifier_refcount) {
559         assert(netdev_linux_cache_notifier);
560         rtnetlink_link_notifier_destroy(netdev_linux_cache_notifier);
561         netdev_linux_cache_notifier = NULL;
562     }
563 }
564
565 /* Creates system and internal devices. */
566 static int
567 netdev_linux_create(const struct netdev_class *class, const char *name,
568                     struct netdev_dev **netdev_devp)
569 {
570     struct netdev_dev_linux *netdev_dev;
571     int error;
572
573     error = cache_notifier_ref();
574     if (error) {
575         return error;
576     }
577
578     netdev_dev = xzalloc(sizeof *netdev_dev);
579     netdev_dev->change_seq = 1;
580     netdev_dev_init(&netdev_dev->netdev_dev, name, class);
581     get_flags(&netdev_dev->netdev_dev, &netdev_dev->ifi_flags);
582
583     *netdev_devp = &netdev_dev->netdev_dev;
584     return 0;
585 }
586
587 /* For most types of netdevs we open the device for each call of
588  * netdev_open().  However, this is not the case with tap devices,
589  * since it is only possible to open the device once.  In this
590  * situation we share a single file descriptor, and consequently
591  * buffers, across all readers.  Therefore once data is read it will
592  * be unavailable to other reads for tap devices. */
593 static int
594 netdev_linux_create_tap(const struct netdev_class *class OVS_UNUSED,
595                         const char *name, struct netdev_dev **netdev_devp)
596 {
597     struct netdev_dev_linux *netdev_dev;
598     struct tap_state *state;
599     static const char tap_dev[] = "/dev/net/tun";
600     struct ifreq ifr;
601     int error;
602
603     netdev_dev = xzalloc(sizeof *netdev_dev);
604     state = &netdev_dev->state.tap;
605
606     error = cache_notifier_ref();
607     if (error) {
608         goto error;
609     }
610
611     /* Open tap device. */
612     state->fd = open(tap_dev, O_RDWR);
613     if (state->fd < 0) {
614         error = errno;
615         VLOG_WARN("opening \"%s\" failed: %s", tap_dev, strerror(error));
616         goto error_unref_notifier;
617     }
618
619     /* Create tap device. */
620     ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
621     ovs_strzcpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
622     if (ioctl(state->fd, TUNSETIFF, &ifr) == -1) {
623         VLOG_WARN("%s: creating tap device failed: %s", name,
624                   strerror(errno));
625         error = errno;
626         goto error_unref_notifier;
627     }
628
629     /* Make non-blocking. */
630     error = set_nonblocking(state->fd);
631     if (error) {
632         goto error_unref_notifier;
633     }
634
635     netdev_dev_init(&netdev_dev->netdev_dev, name, &netdev_tap_class);
636     *netdev_devp = &netdev_dev->netdev_dev;
637     return 0;
638
639 error_unref_notifier:
640     cache_notifier_unref();
641 error:
642     free(netdev_dev);
643     return error;
644 }
645
646 static void
647 destroy_tap(struct netdev_dev_linux *netdev_dev)
648 {
649     struct tap_state *state = &netdev_dev->state.tap;
650
651     if (state->fd >= 0) {
652         close(state->fd);
653     }
654 }
655
656 /* Destroys the netdev device 'netdev_dev_'. */
657 static void
658 netdev_linux_destroy(struct netdev_dev *netdev_dev_)
659 {
660     struct netdev_dev_linux *netdev_dev = netdev_dev_linux_cast(netdev_dev_);
661     const struct netdev_class *class = netdev_dev_get_class(netdev_dev_);
662
663     if (netdev_dev->tc && netdev_dev->tc->ops->tc_destroy) {
664         netdev_dev->tc->ops->tc_destroy(netdev_dev->tc);
665     }
666
667     if (class == &netdev_tap_class) {
668         destroy_tap(netdev_dev);
669     }
670     free(netdev_dev);
671
672     cache_notifier_unref();
673 }
674
675 static int
676 netdev_linux_open(struct netdev_dev *netdev_dev_, struct netdev **netdevp)
677 {
678     struct netdev_dev_linux *netdev_dev = netdev_dev_linux_cast(netdev_dev_);
679     struct netdev_linux *netdev;
680     enum netdev_flags flags;
681     int error;
682
683     /* Allocate network device. */
684     netdev = xzalloc(sizeof *netdev);
685     netdev->fd = -1;
686     netdev_init(&netdev->netdev, netdev_dev_);
687
688     /* Verify that the device really exists, by attempting to read its flags.
689      * (The flags might be cached, in which case this won't actually do an
690      * ioctl.)
691      *
692      * Don't do this for "internal" netdevs, though, because those have to be
693      * created as netdev objects before they exist in the kernel, because
694      * creating them in the kernel happens by passing a netdev object to
695      * dpif_port_add(). */
696     if (netdev_dev_get_class(netdev_dev_) != &netdev_internal_class) {
697         error = netdev_get_flags(&netdev->netdev, &flags);
698         if (error == ENODEV) {
699             goto error;
700         }
701     }
702
703     if (!strcmp(netdev_dev_get_type(netdev_dev_), "tap") &&
704         !netdev_dev->state.tap.opened) {
705
706         /* We assume that the first user of the tap device is the primary user
707          * and give them the tap FD.  Subsequent users probably just expect
708          * this to be a system device so open it normally to avoid send/receive
709          * directions appearing to be reversed. */
710         netdev->fd = netdev_dev->state.tap.fd;
711         netdev_dev->state.tap.opened = true;
712     }
713
714     *netdevp = &netdev->netdev;
715     return 0;
716
717 error:
718     netdev_uninit(&netdev->netdev, true);
719     return error;
720 }
721
722 /* Closes and destroys 'netdev'. */
723 static void
724 netdev_linux_close(struct netdev *netdev_)
725 {
726     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
727
728     if (netdev->fd > 0 && strcmp(netdev_get_type(netdev_), "tap")) {
729         close(netdev->fd);
730     }
731     free(netdev);
732 }
733
734 static int
735 netdev_linux_listen(struct netdev *netdev_)
736 {
737     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
738     struct sockaddr_ll sll;
739     int ifindex;
740     int error;
741     int fd;
742
743     if (netdev->fd >= 0) {
744         return 0;
745     }
746
747     /* Create file descriptor. */
748     fd = socket(PF_PACKET, SOCK_RAW, 0);
749     if (fd < 0) {
750         error = errno;
751         VLOG_ERR("failed to create raw socket (%s)", strerror(error));
752         goto error;
753     }
754
755     /* Set non-blocking mode. */
756     error = set_nonblocking(fd);
757     if (error) {
758         goto error;
759     }
760
761     /* Get ethernet device index. */
762     error = get_ifindex(&netdev->netdev, &ifindex);
763     if (error) {
764         goto error;
765     }
766
767     /* Bind to specific ethernet device. */
768     memset(&sll, 0, sizeof sll);
769     sll.sll_family = AF_PACKET;
770     sll.sll_ifindex = ifindex;
771     sll.sll_protocol = (OVS_FORCE unsigned short int) htons(ETH_P_ALL);
772     if (bind(fd, (struct sockaddr *) &sll, sizeof sll) < 0) {
773         error = errno;
774         VLOG_ERR("%s: failed to bind raw socket (%s)",
775                  netdev_get_name(netdev_), strerror(error));
776         goto error;
777     }
778
779     netdev->fd = fd;
780     return 0;
781
782 error:
783     if (fd >= 0) {
784         close(fd);
785     }
786     return error;
787 }
788
789 static int
790 netdev_linux_recv(struct netdev *netdev_, void *data, size_t size)
791 {
792     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
793
794     if (netdev->fd < 0) {
795         /* Device is not listening. */
796         return -EAGAIN;
797     }
798
799     for (;;) {
800         ssize_t retval;
801
802         retval = (netdev_->netdev_dev->netdev_class == &netdev_tap_class
803                   ? read(netdev->fd, data, size)
804                   : 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, dev->ifi_flags);
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->vport_stats_error ||
1245         !(netdev_dev->cache_valid & VALID_VPORT_STAT_ERROR)) {
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->vport_stats_error = error;
1254         netdev_dev->cache_valid |= VALID_VPORT_STAT_ERROR;
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->vport_stats_error) {
1304             return error;
1305         } else {
1306             return 0;
1307         }
1308     }
1309
1310     if (netdev_dev->vport_stats_error) {
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_tap_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->vport_stats_error) {
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->vport_stats_error) {
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 static int
1394 netdev_internal_get_stats(const struct netdev *netdev_,
1395                           struct netdev_stats *stats)
1396 {
1397     struct netdev_dev_linux *netdev_dev =
1398                                 netdev_dev_linux_cast(netdev_get_dev(netdev_));
1399
1400     get_stats_via_vport(netdev_, stats);
1401     return netdev_dev->vport_stats_error;
1402 }
1403
1404 /* Stores the features supported by 'netdev' into each of '*current',
1405  * '*advertised', '*supported', and '*peer' that are non-null.  Each value is a
1406  * bitmap of NETDEV_* bits.  Returns 0 if successful, otherwise a positive
1407  * errno value. */
1408 static int
1409 netdev_linux_get_features(const struct netdev *netdev,
1410                           enum netdev_features *current,
1411                           enum netdev_features *advertised,
1412                           enum netdev_features *supported,
1413                           enum netdev_features *peer)
1414 {
1415     struct ethtool_cmd ecmd;
1416     uint32_t speed;
1417     int error;
1418
1419     memset(&ecmd, 0, sizeof ecmd);
1420     error = netdev_linux_do_ethtool(netdev_get_name(netdev), &ecmd,
1421                                     ETHTOOL_GSET, "ETHTOOL_GSET");
1422     if (error) {
1423         return error;
1424     }
1425
1426     /* Supported features. */
1427     *supported = 0;
1428     if (ecmd.supported & SUPPORTED_10baseT_Half) {
1429         *supported |= NETDEV_F_10MB_HD;
1430     }
1431     if (ecmd.supported & SUPPORTED_10baseT_Full) {
1432         *supported |= NETDEV_F_10MB_FD;
1433     }
1434     if (ecmd.supported & SUPPORTED_100baseT_Half)  {
1435         *supported |= NETDEV_F_100MB_HD;
1436     }
1437     if (ecmd.supported & SUPPORTED_100baseT_Full) {
1438         *supported |= NETDEV_F_100MB_FD;
1439     }
1440     if (ecmd.supported & SUPPORTED_1000baseT_Half) {
1441         *supported |= NETDEV_F_1GB_HD;
1442     }
1443     if (ecmd.supported & SUPPORTED_1000baseT_Full) {
1444         *supported |= NETDEV_F_1GB_FD;
1445     }
1446     if (ecmd.supported & SUPPORTED_10000baseT_Full) {
1447         *supported |= NETDEV_F_10GB_FD;
1448     }
1449     if (ecmd.supported & SUPPORTED_TP) {
1450         *supported |= NETDEV_F_COPPER;
1451     }
1452     if (ecmd.supported & SUPPORTED_FIBRE) {
1453         *supported |= NETDEV_F_FIBER;
1454     }
1455     if (ecmd.supported & SUPPORTED_Autoneg) {
1456         *supported |= NETDEV_F_AUTONEG;
1457     }
1458     if (ecmd.supported & SUPPORTED_Pause) {
1459         *supported |= NETDEV_F_PAUSE;
1460     }
1461     if (ecmd.supported & SUPPORTED_Asym_Pause) {
1462         *supported |= NETDEV_F_PAUSE_ASYM;
1463     }
1464
1465     /* Advertised features. */
1466     *advertised = 0;
1467     if (ecmd.advertising & ADVERTISED_10baseT_Half) {
1468         *advertised |= NETDEV_F_10MB_HD;
1469     }
1470     if (ecmd.advertising & ADVERTISED_10baseT_Full) {
1471         *advertised |= NETDEV_F_10MB_FD;
1472     }
1473     if (ecmd.advertising & ADVERTISED_100baseT_Half) {
1474         *advertised |= NETDEV_F_100MB_HD;
1475     }
1476     if (ecmd.advertising & ADVERTISED_100baseT_Full) {
1477         *advertised |= NETDEV_F_100MB_FD;
1478     }
1479     if (ecmd.advertising & ADVERTISED_1000baseT_Half) {
1480         *advertised |= NETDEV_F_1GB_HD;
1481     }
1482     if (ecmd.advertising & ADVERTISED_1000baseT_Full) {
1483         *advertised |= NETDEV_F_1GB_FD;
1484     }
1485     if (ecmd.advertising & ADVERTISED_10000baseT_Full) {
1486         *advertised |= NETDEV_F_10GB_FD;
1487     }
1488     if (ecmd.advertising & ADVERTISED_TP) {
1489         *advertised |= NETDEV_F_COPPER;
1490     }
1491     if (ecmd.advertising & ADVERTISED_FIBRE) {
1492         *advertised |= NETDEV_F_FIBER;
1493     }
1494     if (ecmd.advertising & ADVERTISED_Autoneg) {
1495         *advertised |= NETDEV_F_AUTONEG;
1496     }
1497     if (ecmd.advertising & ADVERTISED_Pause) {
1498         *advertised |= NETDEV_F_PAUSE;
1499     }
1500     if (ecmd.advertising & ADVERTISED_Asym_Pause) {
1501         *advertised |= NETDEV_F_PAUSE_ASYM;
1502     }
1503
1504     /* Current settings. */
1505     speed = ecmd.speed;
1506     if (speed == SPEED_10) {
1507         *current = ecmd.duplex ? NETDEV_F_10MB_FD : NETDEV_F_10MB_HD;
1508     } else if (speed == SPEED_100) {
1509         *current = ecmd.duplex ? NETDEV_F_100MB_FD : NETDEV_F_100MB_HD;
1510     } else if (speed == SPEED_1000) {
1511         *current = ecmd.duplex ? NETDEV_F_1GB_FD : NETDEV_F_1GB_HD;
1512     } else if (speed == SPEED_10000) {
1513         *current = NETDEV_F_10GB_FD;
1514     } else if (speed == 40000) {
1515         *current = NETDEV_F_40GB_FD;
1516     } else if (speed == 100000) {
1517         *current = NETDEV_F_100GB_FD;
1518     } else if (speed == 1000000) {
1519         *current = NETDEV_F_1TB_FD;
1520     } else {
1521         *current = 0;
1522     }
1523
1524     if (ecmd.port == PORT_TP) {
1525         *current |= NETDEV_F_COPPER;
1526     } else if (ecmd.port == PORT_FIBRE) {
1527         *current |= NETDEV_F_FIBER;
1528     }
1529
1530     if (ecmd.autoneg) {
1531         *current |= NETDEV_F_AUTONEG;
1532     }
1533
1534     /* Peer advertisements. */
1535     *peer = 0;                  /* XXX */
1536
1537     return 0;
1538 }
1539
1540 /* Set the features advertised by 'netdev' to 'advertise'. */
1541 static int
1542 netdev_linux_set_advertisements(struct netdev *netdev,
1543                                 enum netdev_features advertise)
1544 {
1545     struct ethtool_cmd ecmd;
1546     int error;
1547
1548     memset(&ecmd, 0, sizeof ecmd);
1549     error = netdev_linux_do_ethtool(netdev_get_name(netdev), &ecmd,
1550                                     ETHTOOL_GSET, "ETHTOOL_GSET");
1551     if (error) {
1552         return error;
1553     }
1554
1555     ecmd.advertising = 0;
1556     if (advertise & NETDEV_F_10MB_HD) {
1557         ecmd.advertising |= ADVERTISED_10baseT_Half;
1558     }
1559     if (advertise & NETDEV_F_10MB_FD) {
1560         ecmd.advertising |= ADVERTISED_10baseT_Full;
1561     }
1562     if (advertise & NETDEV_F_100MB_HD) {
1563         ecmd.advertising |= ADVERTISED_100baseT_Half;
1564     }
1565     if (advertise & NETDEV_F_100MB_FD) {
1566         ecmd.advertising |= ADVERTISED_100baseT_Full;
1567     }
1568     if (advertise & NETDEV_F_1GB_HD) {
1569         ecmd.advertising |= ADVERTISED_1000baseT_Half;
1570     }
1571     if (advertise & NETDEV_F_1GB_FD) {
1572         ecmd.advertising |= ADVERTISED_1000baseT_Full;
1573     }
1574     if (advertise & NETDEV_F_10GB_FD) {
1575         ecmd.advertising |= ADVERTISED_10000baseT_Full;
1576     }
1577     if (advertise & NETDEV_F_COPPER) {
1578         ecmd.advertising |= ADVERTISED_TP;
1579     }
1580     if (advertise & NETDEV_F_FIBER) {
1581         ecmd.advertising |= ADVERTISED_FIBRE;
1582     }
1583     if (advertise & NETDEV_F_AUTONEG) {
1584         ecmd.advertising |= ADVERTISED_Autoneg;
1585     }
1586     if (advertise & NETDEV_F_PAUSE) {
1587         ecmd.advertising |= ADVERTISED_Pause;
1588     }
1589     if (advertise & NETDEV_F_PAUSE_ASYM) {
1590         ecmd.advertising |= ADVERTISED_Asym_Pause;
1591     }
1592     return netdev_linux_do_ethtool(netdev_get_name(netdev), &ecmd,
1593                                    ETHTOOL_SSET, "ETHTOOL_SSET");
1594 }
1595
1596 /* Attempts to set input rate limiting (policing) policy.  Returns 0 if
1597  * successful, otherwise a positive errno value. */
1598 static int
1599 netdev_linux_set_policing(struct netdev *netdev,
1600                           uint32_t kbits_rate, uint32_t kbits_burst)
1601 {
1602     struct netdev_dev_linux *netdev_dev =
1603         netdev_dev_linux_cast(netdev_get_dev(netdev));
1604     const char *netdev_name = netdev_get_name(netdev);
1605     int error;
1606
1607
1608     kbits_burst = (!kbits_rate ? 0       /* Force to 0 if no rate specified. */
1609                    : !kbits_burst ? 1000 /* Default to 1000 kbits if 0. */
1610                    : kbits_burst);       /* Stick with user-specified value. */
1611
1612     if (netdev_dev->cache_valid & VALID_POLICING
1613         && netdev_dev->kbits_rate == kbits_rate
1614         && netdev_dev->kbits_burst == kbits_burst) {
1615         /* Assume that settings haven't changed since we last set them. */
1616         return 0;
1617     }
1618
1619     COVERAGE_INC(netdev_set_policing);
1620     /* Remove any existing ingress qdisc. */
1621     error = tc_add_del_ingress_qdisc(netdev, false);
1622     if (error) {
1623         VLOG_WARN_RL(&rl, "%s: removing policing failed: %s",
1624                      netdev_name, strerror(error));
1625         return error;
1626     }
1627
1628     if (kbits_rate) {
1629         error = tc_add_del_ingress_qdisc(netdev, true);
1630         if (error) {
1631             VLOG_WARN_RL(&rl, "%s: adding policing qdisc failed: %s",
1632                          netdev_name, strerror(error));
1633             return error;
1634         }
1635
1636         error = tc_add_policer(netdev, kbits_rate, kbits_burst);
1637         if (error){
1638             VLOG_WARN_RL(&rl, "%s: adding policing action failed: %s",
1639                     netdev_name, strerror(error));
1640             return error;
1641         }
1642     }
1643
1644     netdev_dev->kbits_rate = kbits_rate;
1645     netdev_dev->kbits_burst = kbits_burst;
1646     netdev_dev->cache_valid |= VALID_POLICING;
1647
1648     return 0;
1649 }
1650
1651 static int
1652 netdev_linux_get_qos_types(const struct netdev *netdev OVS_UNUSED,
1653                            struct sset *types)
1654 {
1655     const struct tc_ops **opsp;
1656
1657     for (opsp = tcs; *opsp != NULL; opsp++) {
1658         const struct tc_ops *ops = *opsp;
1659         if (ops->tc_install && ops->ovs_name[0] != '\0') {
1660             sset_add(types, ops->ovs_name);
1661         }
1662     }
1663     return 0;
1664 }
1665
1666 static const struct tc_ops *
1667 tc_lookup_ovs_name(const char *name)
1668 {
1669     const struct tc_ops **opsp;
1670
1671     for (opsp = tcs; *opsp != NULL; opsp++) {
1672         const struct tc_ops *ops = *opsp;
1673         if (!strcmp(name, ops->ovs_name)) {
1674             return ops;
1675         }
1676     }
1677     return NULL;
1678 }
1679
1680 static const struct tc_ops *
1681 tc_lookup_linux_name(const char *name)
1682 {
1683     const struct tc_ops **opsp;
1684
1685     for (opsp = tcs; *opsp != NULL; opsp++) {
1686         const struct tc_ops *ops = *opsp;
1687         if (ops->linux_name && !strcmp(name, ops->linux_name)) {
1688             return ops;
1689         }
1690     }
1691     return NULL;
1692 }
1693
1694 static struct tc_queue *
1695 tc_find_queue__(const struct netdev *netdev, unsigned int queue_id,
1696                 size_t hash)
1697 {
1698     struct netdev_dev_linux *netdev_dev =
1699                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
1700     struct tc_queue *queue;
1701
1702     HMAP_FOR_EACH_IN_BUCKET (queue, hmap_node, hash, &netdev_dev->tc->queues) {
1703         if (queue->queue_id == queue_id) {
1704             return queue;
1705         }
1706     }
1707     return NULL;
1708 }
1709
1710 static struct tc_queue *
1711 tc_find_queue(const struct netdev *netdev, unsigned int queue_id)
1712 {
1713     return tc_find_queue__(netdev, queue_id, hash_int(queue_id, 0));
1714 }
1715
1716 static int
1717 netdev_linux_get_qos_capabilities(const struct netdev *netdev OVS_UNUSED,
1718                                   const char *type,
1719                                   struct netdev_qos_capabilities *caps)
1720 {
1721     const struct tc_ops *ops = tc_lookup_ovs_name(type);
1722     if (!ops) {
1723         return EOPNOTSUPP;
1724     }
1725     caps->n_queues = ops->n_queues;
1726     return 0;
1727 }
1728
1729 static int
1730 netdev_linux_get_qos(const struct netdev *netdev,
1731                      const char **typep, struct shash *details)
1732 {
1733     struct netdev_dev_linux *netdev_dev =
1734                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
1735     int error;
1736
1737     error = tc_query_qdisc(netdev);
1738     if (error) {
1739         return error;
1740     }
1741
1742     *typep = netdev_dev->tc->ops->ovs_name;
1743     return (netdev_dev->tc->ops->qdisc_get
1744             ? netdev_dev->tc->ops->qdisc_get(netdev, details)
1745             : 0);
1746 }
1747
1748 static int
1749 netdev_linux_set_qos(struct netdev *netdev,
1750                      const char *type, const struct shash *details)
1751 {
1752     struct netdev_dev_linux *netdev_dev =
1753                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
1754     const struct tc_ops *new_ops;
1755     int error;
1756
1757     new_ops = tc_lookup_ovs_name(type);
1758     if (!new_ops || !new_ops->tc_install) {
1759         return EOPNOTSUPP;
1760     }
1761
1762     error = tc_query_qdisc(netdev);
1763     if (error) {
1764         return error;
1765     }
1766
1767     if (new_ops == netdev_dev->tc->ops) {
1768         return new_ops->qdisc_set ? new_ops->qdisc_set(netdev, details) : 0;
1769     } else {
1770         /* Delete existing qdisc. */
1771         error = tc_del_qdisc(netdev);
1772         if (error) {
1773             return error;
1774         }
1775         assert(netdev_dev->tc == NULL);
1776
1777         /* Install new qdisc. */
1778         error = new_ops->tc_install(netdev, details);
1779         assert((error == 0) == (netdev_dev->tc != NULL));
1780
1781         return error;
1782     }
1783 }
1784
1785 static int
1786 netdev_linux_get_queue(const struct netdev *netdev,
1787                        unsigned int queue_id, struct shash *details)
1788 {
1789     struct netdev_dev_linux *netdev_dev =
1790                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
1791     int error;
1792
1793     error = tc_query_qdisc(netdev);
1794     if (error) {
1795         return error;
1796     } else {
1797         struct tc_queue *queue = tc_find_queue(netdev, queue_id);
1798         return (queue
1799                 ? netdev_dev->tc->ops->class_get(netdev, queue, details)
1800                 : ENOENT);
1801     }
1802 }
1803
1804 static int
1805 netdev_linux_set_queue(struct netdev *netdev,
1806                        unsigned int queue_id, const struct shash *details)
1807 {
1808     struct netdev_dev_linux *netdev_dev =
1809                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
1810     int error;
1811
1812     error = tc_query_qdisc(netdev);
1813     if (error) {
1814         return error;
1815     } else if (queue_id >= netdev_dev->tc->ops->n_queues
1816                || !netdev_dev->tc->ops->class_set) {
1817         return EINVAL;
1818     }
1819
1820     return netdev_dev->tc->ops->class_set(netdev, queue_id, details);
1821 }
1822
1823 static int
1824 netdev_linux_delete_queue(struct netdev *netdev, unsigned int queue_id)
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_delete) {
1834         return EINVAL;
1835     } else {
1836         struct tc_queue *queue = tc_find_queue(netdev, queue_id);
1837         return (queue
1838                 ? netdev_dev->tc->ops->class_delete(netdev, queue)
1839                 : ENOENT);
1840     }
1841 }
1842
1843 static int
1844 netdev_linux_get_queue_stats(const struct netdev *netdev,
1845                              unsigned int queue_id,
1846                              struct netdev_queue_stats *stats)
1847 {
1848     struct netdev_dev_linux *netdev_dev =
1849                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
1850     int error;
1851
1852     error = tc_query_qdisc(netdev);
1853     if (error) {
1854         return error;
1855     } else if (!netdev_dev->tc->ops->class_get_stats) {
1856         return EOPNOTSUPP;
1857     } else {
1858         const struct tc_queue *queue = tc_find_queue(netdev, queue_id);
1859         return (queue
1860                 ? netdev_dev->tc->ops->class_get_stats(netdev, queue, stats)
1861                 : ENOENT);
1862     }
1863 }
1864
1865 static bool
1866 start_queue_dump(const struct netdev *netdev, struct nl_dump *dump)
1867 {
1868     struct ofpbuf request;
1869     struct tcmsg *tcmsg;
1870
1871     tcmsg = tc_make_request(netdev, RTM_GETTCLASS, 0, &request);
1872     if (!tcmsg) {
1873         return false;
1874     }
1875     tcmsg->tcm_parent = 0;
1876     nl_dump_start(dump, rtnl_sock, &request);
1877     ofpbuf_uninit(&request);
1878     return true;
1879 }
1880
1881 static int
1882 netdev_linux_dump_queues(const struct netdev *netdev,
1883                          netdev_dump_queues_cb *cb, void *aux)
1884 {
1885     struct netdev_dev_linux *netdev_dev =
1886                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
1887     struct tc_queue *queue;
1888     struct shash details;
1889     int last_error;
1890     int error;
1891
1892     error = tc_query_qdisc(netdev);
1893     if (error) {
1894         return error;
1895     } else if (!netdev_dev->tc->ops->class_get) {
1896         return EOPNOTSUPP;
1897     }
1898
1899     last_error = 0;
1900     shash_init(&details);
1901     HMAP_FOR_EACH (queue, hmap_node, &netdev_dev->tc->queues) {
1902         shash_clear(&details);
1903
1904         error = netdev_dev->tc->ops->class_get(netdev, queue, &details);
1905         if (!error) {
1906             (*cb)(queue->queue_id, &details, aux);
1907         } else {
1908             last_error = error;
1909         }
1910     }
1911     shash_destroy(&details);
1912
1913     return last_error;
1914 }
1915
1916 static int
1917 netdev_linux_dump_queue_stats(const struct netdev *netdev,
1918                               netdev_dump_queue_stats_cb *cb, void *aux)
1919 {
1920     struct netdev_dev_linux *netdev_dev =
1921                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
1922     struct nl_dump dump;
1923     struct ofpbuf msg;
1924     int last_error;
1925     int error;
1926
1927     error = tc_query_qdisc(netdev);
1928     if (error) {
1929         return error;
1930     } else if (!netdev_dev->tc->ops->class_dump_stats) {
1931         return EOPNOTSUPP;
1932     }
1933
1934     last_error = 0;
1935     if (!start_queue_dump(netdev, &dump)) {
1936         return ENODEV;
1937     }
1938     while (nl_dump_next(&dump, &msg)) {
1939         error = netdev_dev->tc->ops->class_dump_stats(netdev, &msg, cb, aux);
1940         if (error) {
1941             last_error = error;
1942         }
1943     }
1944
1945     error = nl_dump_done(&dump);
1946     return error ? error : last_error;
1947 }
1948
1949 static int
1950 netdev_linux_get_in4(const struct netdev *netdev_,
1951                      struct in_addr *address, struct in_addr *netmask)
1952 {
1953     struct netdev_dev_linux *netdev_dev =
1954                                 netdev_dev_linux_cast(netdev_get_dev(netdev_));
1955
1956     if (!(netdev_dev->cache_valid & VALID_IN4)) {
1957         int error;
1958
1959         error = netdev_linux_get_ipv4(netdev_, &netdev_dev->address,
1960                                       SIOCGIFADDR, "SIOCGIFADDR");
1961         if (error) {
1962             return error;
1963         }
1964
1965         error = netdev_linux_get_ipv4(netdev_, &netdev_dev->netmask,
1966                                       SIOCGIFNETMASK, "SIOCGIFNETMASK");
1967         if (error) {
1968             return error;
1969         }
1970
1971         netdev_dev->cache_valid |= VALID_IN4;
1972     }
1973     *address = netdev_dev->address;
1974     *netmask = netdev_dev->netmask;
1975     return address->s_addr == INADDR_ANY ? EADDRNOTAVAIL : 0;
1976 }
1977
1978 static int
1979 netdev_linux_set_in4(struct netdev *netdev_, struct in_addr address,
1980                      struct in_addr netmask)
1981 {
1982     struct netdev_dev_linux *netdev_dev =
1983                                 netdev_dev_linux_cast(netdev_get_dev(netdev_));
1984     int error;
1985
1986     error = do_set_addr(netdev_, SIOCSIFADDR, "SIOCSIFADDR", address);
1987     if (!error) {
1988         netdev_dev->cache_valid |= VALID_IN4;
1989         netdev_dev->address = address;
1990         netdev_dev->netmask = netmask;
1991         if (address.s_addr != INADDR_ANY) {
1992             error = do_set_addr(netdev_, SIOCSIFNETMASK,
1993                                 "SIOCSIFNETMASK", netmask);
1994         }
1995     }
1996     return error;
1997 }
1998
1999 static bool
2000 parse_if_inet6_line(const char *line,
2001                     struct in6_addr *in6, char ifname[16 + 1])
2002 {
2003     uint8_t *s6 = in6->s6_addr;
2004 #define X8 "%2"SCNx8
2005     return sscanf(line,
2006                   " "X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8 X8
2007                   "%*x %*x %*x %*x %16s\n",
2008                   &s6[0], &s6[1], &s6[2], &s6[3],
2009                   &s6[4], &s6[5], &s6[6], &s6[7],
2010                   &s6[8], &s6[9], &s6[10], &s6[11],
2011                   &s6[12], &s6[13], &s6[14], &s6[15],
2012                   ifname) == 17;
2013 }
2014
2015 /* If 'netdev' has an assigned IPv6 address, sets '*in6' to that address (if
2016  * 'in6' is non-null) and returns true.  Otherwise, returns false. */
2017 static int
2018 netdev_linux_get_in6(const struct netdev *netdev_, struct in6_addr *in6)
2019 {
2020     struct netdev_dev_linux *netdev_dev =
2021                                 netdev_dev_linux_cast(netdev_get_dev(netdev_));
2022     if (!(netdev_dev->cache_valid & VALID_IN6)) {
2023         FILE *file;
2024         char line[128];
2025
2026         netdev_dev->in6 = in6addr_any;
2027
2028         file = fopen("/proc/net/if_inet6", "r");
2029         if (file != NULL) {
2030             const char *name = netdev_get_name(netdev_);
2031             while (fgets(line, sizeof line, file)) {
2032                 struct in6_addr in6_tmp;
2033                 char ifname[16 + 1];
2034                 if (parse_if_inet6_line(line, &in6_tmp, ifname)
2035                     && !strcmp(name, ifname))
2036                 {
2037                     netdev_dev->in6 = in6_tmp;
2038                     break;
2039                 }
2040             }
2041             fclose(file);
2042         }
2043         netdev_dev->cache_valid |= VALID_IN6;
2044     }
2045     *in6 = netdev_dev->in6;
2046     return 0;
2047 }
2048
2049 static void
2050 make_in4_sockaddr(struct sockaddr *sa, struct in_addr addr)
2051 {
2052     struct sockaddr_in sin;
2053     memset(&sin, 0, sizeof sin);
2054     sin.sin_family = AF_INET;
2055     sin.sin_addr = addr;
2056     sin.sin_port = 0;
2057
2058     memset(sa, 0, sizeof *sa);
2059     memcpy(sa, &sin, sizeof sin);
2060 }
2061
2062 static int
2063 do_set_addr(struct netdev *netdev,
2064             int ioctl_nr, const char *ioctl_name, struct in_addr addr)
2065 {
2066     struct ifreq ifr;
2067     ovs_strzcpy(ifr.ifr_name, netdev_get_name(netdev), sizeof ifr.ifr_name);
2068     make_in4_sockaddr(&ifr.ifr_addr, addr);
2069
2070     return netdev_linux_do_ioctl(netdev_get_name(netdev), &ifr, ioctl_nr,
2071                                  ioctl_name);
2072 }
2073
2074 /* Adds 'router' as a default IP gateway. */
2075 static int
2076 netdev_linux_add_router(struct netdev *netdev OVS_UNUSED, struct in_addr router)
2077 {
2078     struct in_addr any = { INADDR_ANY };
2079     struct rtentry rt;
2080     int error;
2081
2082     memset(&rt, 0, sizeof rt);
2083     make_in4_sockaddr(&rt.rt_dst, any);
2084     make_in4_sockaddr(&rt.rt_gateway, router);
2085     make_in4_sockaddr(&rt.rt_genmask, any);
2086     rt.rt_flags = RTF_UP | RTF_GATEWAY;
2087     error = ioctl(af_inet_sock, SIOCADDRT, &rt) < 0 ? errno : 0;
2088     if (error) {
2089         VLOG_WARN("ioctl(SIOCADDRT): %s", strerror(error));
2090     }
2091     return error;
2092 }
2093
2094 static int
2095 netdev_linux_get_next_hop(const struct in_addr *host, struct in_addr *next_hop,
2096                           char **netdev_name)
2097 {
2098     static const char fn[] = "/proc/net/route";
2099     FILE *stream;
2100     char line[256];
2101     int ln;
2102
2103     *netdev_name = NULL;
2104     stream = fopen(fn, "r");
2105     if (stream == NULL) {
2106         VLOG_WARN_RL(&rl, "%s: open failed: %s", fn, strerror(errno));
2107         return errno;
2108     }
2109
2110     ln = 0;
2111     while (fgets(line, sizeof line, stream)) {
2112         if (++ln >= 2) {
2113             char iface[17];
2114             ovs_be32 dest, gateway, mask;
2115             int refcnt, metric, mtu;
2116             unsigned int flags, use, window, irtt;
2117
2118             if (sscanf(line,
2119                        "%16s %"SCNx32" %"SCNx32" %04X %d %u %d %"SCNx32
2120                        " %d %u %u\n",
2121                        iface, &dest, &gateway, &flags, &refcnt,
2122                        &use, &metric, &mask, &mtu, &window, &irtt) != 11) {
2123
2124                 VLOG_WARN_RL(&rl, "%s: could not parse line %d: %s",
2125                         fn, ln, line);
2126                 continue;
2127             }
2128             if (!(flags & RTF_UP)) {
2129                 /* Skip routes that aren't up. */
2130                 continue;
2131             }
2132
2133             /* The output of 'dest', 'mask', and 'gateway' were given in
2134              * network byte order, so we don't need need any endian
2135              * conversions here. */
2136             if ((dest & mask) == (host->s_addr & mask)) {
2137                 if (!gateway) {
2138                     /* The host is directly reachable. */
2139                     next_hop->s_addr = 0;
2140                 } else {
2141                     /* To reach the host, we must go through a gateway. */
2142                     next_hop->s_addr = gateway;
2143                 }
2144                 *netdev_name = xstrdup(iface);
2145                 fclose(stream);
2146                 return 0;
2147             }
2148         }
2149     }
2150
2151     fclose(stream);
2152     return ENXIO;
2153 }
2154
2155 static int
2156 netdev_linux_get_status(const struct netdev *netdev, struct shash *sh)
2157 {
2158     struct ethtool_drvinfo drvinfo;
2159     int error;
2160
2161     memset(&drvinfo, 0, sizeof drvinfo);
2162     error = netdev_linux_do_ethtool(netdev_get_name(netdev),
2163                                     (struct ethtool_cmd *)&drvinfo,
2164                                     ETHTOOL_GDRVINFO,
2165                                     "ETHTOOL_GDRVINFO");
2166     if (!error) {
2167         shash_add(sh, "driver_name", xstrdup(drvinfo.driver));
2168         shash_add(sh, "driver_version", xstrdup(drvinfo.version));
2169         shash_add(sh, "firmware_version", xstrdup(drvinfo.fw_version));
2170     }
2171
2172     return error;
2173 }
2174
2175 /* Looks up the ARP table entry for 'ip' on 'netdev'.  If one exists and can be
2176  * successfully retrieved, it stores the corresponding MAC address in 'mac' and
2177  * returns 0.  Otherwise, it returns a positive errno value; in particular,
2178  * ENXIO indicates that there is not ARP table entry for 'ip' on 'netdev'. */
2179 static int
2180 netdev_linux_arp_lookup(const struct netdev *netdev,
2181                         ovs_be32 ip, uint8_t mac[ETH_ADDR_LEN])
2182 {
2183     struct arpreq r;
2184     struct sockaddr_in sin;
2185     int retval;
2186
2187     memset(&r, 0, sizeof r);
2188     memset(&sin, 0, sizeof sin);
2189     sin.sin_family = AF_INET;
2190     sin.sin_addr.s_addr = ip;
2191     sin.sin_port = 0;
2192     memcpy(&r.arp_pa, &sin, sizeof sin);
2193     r.arp_ha.sa_family = ARPHRD_ETHER;
2194     r.arp_flags = 0;
2195     ovs_strzcpy(r.arp_dev, netdev_get_name(netdev), sizeof r.arp_dev);
2196     COVERAGE_INC(netdev_arp_lookup);
2197     retval = ioctl(af_inet_sock, SIOCGARP, &r) < 0 ? errno : 0;
2198     if (!retval) {
2199         memcpy(mac, r.arp_ha.sa_data, ETH_ADDR_LEN);
2200     } else if (retval != ENXIO) {
2201         VLOG_WARN_RL(&rl, "%s: could not look up ARP entry for "IP_FMT": %s",
2202                      netdev_get_name(netdev), IP_ARGS(&ip), strerror(retval));
2203     }
2204     return retval;
2205 }
2206
2207 static int
2208 nd_to_iff_flags(enum netdev_flags nd)
2209 {
2210     int iff = 0;
2211     if (nd & NETDEV_UP) {
2212         iff |= IFF_UP;
2213     }
2214     if (nd & NETDEV_PROMISC) {
2215         iff |= IFF_PROMISC;
2216     }
2217     return iff;
2218 }
2219
2220 static int
2221 iff_to_nd_flags(int iff)
2222 {
2223     enum netdev_flags nd = 0;
2224     if (iff & IFF_UP) {
2225         nd |= NETDEV_UP;
2226     }
2227     if (iff & IFF_PROMISC) {
2228         nd |= NETDEV_PROMISC;
2229     }
2230     return nd;
2231 }
2232
2233 static int
2234 netdev_linux_update_flags(struct netdev *netdev, enum netdev_flags off,
2235                           enum netdev_flags on, enum netdev_flags *old_flagsp)
2236 {
2237     struct netdev_dev_linux *netdev_dev;
2238     int old_flags, new_flags;
2239     int error = 0;
2240
2241     netdev_dev = netdev_dev_linux_cast(netdev_get_dev(netdev));
2242     old_flags = netdev_dev->ifi_flags;
2243     *old_flagsp = iff_to_nd_flags(old_flags);
2244     new_flags = (old_flags & ~nd_to_iff_flags(off)) | nd_to_iff_flags(on);
2245     if (new_flags != old_flags) {
2246         error = set_flags(netdev, new_flags);
2247         get_flags(&netdev_dev->netdev_dev, &netdev_dev->ifi_flags);
2248     }
2249     return error;
2250 }
2251
2252 static unsigned int
2253 netdev_linux_change_seq(const struct netdev *netdev)
2254 {
2255     return netdev_dev_linux_cast(netdev_get_dev(netdev))->change_seq;
2256 }
2257
2258 #define NETDEV_LINUX_CLASS(NAME, CREATE, GET_STATS, SET_STATS)  \
2259 {                                                               \
2260     NAME,                                                       \
2261                                                                 \
2262     netdev_linux_init,                                          \
2263     netdev_linux_run,                                           \
2264     netdev_linux_wait,                                          \
2265                                                                 \
2266     CREATE,                                                     \
2267     netdev_linux_destroy,                                       \
2268     NULL,                       /* get_config */                \
2269     NULL,                       /* set_config */                \
2270                                                                 \
2271     netdev_linux_open,                                          \
2272     netdev_linux_close,                                         \
2273                                                                 \
2274     netdev_linux_listen,                                        \
2275     netdev_linux_recv,                                          \
2276     netdev_linux_recv_wait,                                     \
2277     netdev_linux_drain,                                         \
2278                                                                 \
2279     netdev_linux_send,                                          \
2280     netdev_linux_send_wait,                                     \
2281                                                                 \
2282     netdev_linux_set_etheraddr,                                 \
2283     netdev_linux_get_etheraddr,                                 \
2284     netdev_linux_get_mtu,                                       \
2285     netdev_linux_set_mtu,                                       \
2286     netdev_linux_get_ifindex,                                   \
2287     netdev_linux_get_carrier,                                   \
2288     netdev_linux_get_carrier_resets,                            \
2289     netdev_linux_set_miimon_interval,                           \
2290     GET_STATS,                                                  \
2291     SET_STATS,                                                  \
2292                                                                 \
2293     netdev_linux_get_features,                                  \
2294     netdev_linux_set_advertisements,                            \
2295                                                                 \
2296     netdev_linux_set_policing,                                  \
2297     netdev_linux_get_qos_types,                                 \
2298     netdev_linux_get_qos_capabilities,                          \
2299     netdev_linux_get_qos,                                       \
2300     netdev_linux_set_qos,                                       \
2301     netdev_linux_get_queue,                                     \
2302     netdev_linux_set_queue,                                     \
2303     netdev_linux_delete_queue,                                  \
2304     netdev_linux_get_queue_stats,                               \
2305     netdev_linux_dump_queues,                                   \
2306     netdev_linux_dump_queue_stats,                              \
2307                                                                 \
2308     netdev_linux_get_in4,                                       \
2309     netdev_linux_set_in4,                                       \
2310     netdev_linux_get_in6,                                       \
2311     netdev_linux_add_router,                                    \
2312     netdev_linux_get_next_hop,                                  \
2313     netdev_linux_get_status,                                    \
2314     netdev_linux_arp_lookup,                                    \
2315                                                                 \
2316     netdev_linux_update_flags,                                  \
2317                                                                 \
2318     netdev_linux_change_seq                                     \
2319 }
2320
2321 const struct netdev_class netdev_linux_class =
2322     NETDEV_LINUX_CLASS(
2323         "system",
2324         netdev_linux_create,
2325         netdev_linux_get_stats,
2326         NULL);                  /* set_stats */
2327
2328 const struct netdev_class netdev_tap_class =
2329     NETDEV_LINUX_CLASS(
2330         "tap",
2331         netdev_linux_create_tap,
2332         netdev_tap_get_stats,
2333         NULL);                  /* set_stats */
2334
2335 const struct netdev_class netdev_internal_class =
2336     NETDEV_LINUX_CLASS(
2337         "internal",
2338         netdev_linux_create,
2339         netdev_internal_get_stats,
2340         netdev_vport_set_stats);
2341 \f
2342 /* HTB traffic control class. */
2343
2344 #define HTB_N_QUEUES 0xf000
2345
2346 struct htb {
2347     struct tc tc;
2348     unsigned int max_rate;      /* In bytes/s. */
2349 };
2350
2351 struct htb_class {
2352     struct tc_queue tc_queue;
2353     unsigned int min_rate;      /* In bytes/s. */
2354     unsigned int max_rate;      /* In bytes/s. */
2355     unsigned int burst;         /* In bytes. */
2356     unsigned int priority;      /* Lower values are higher priorities. */
2357 };
2358
2359 static struct htb *
2360 htb_get__(const struct netdev *netdev)
2361 {
2362     struct netdev_dev_linux *netdev_dev =
2363                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
2364     return CONTAINER_OF(netdev_dev->tc, struct htb, tc);
2365 }
2366
2367 static void
2368 htb_install__(struct netdev *netdev, uint64_t max_rate)
2369 {
2370     struct netdev_dev_linux *netdev_dev =
2371                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
2372     struct htb *htb;
2373
2374     htb = xmalloc(sizeof *htb);
2375     tc_init(&htb->tc, &tc_ops_htb);
2376     htb->max_rate = max_rate;
2377
2378     netdev_dev->tc = &htb->tc;
2379 }
2380
2381 /* Create an HTB qdisc.
2382  *
2383  * Equivalent to "tc qdisc add dev <dev> root handle 1: htb default 1". */
2384 static int
2385 htb_setup_qdisc__(struct netdev *netdev)
2386 {
2387     size_t opt_offset;
2388     struct tc_htb_glob opt;
2389     struct ofpbuf request;
2390     struct tcmsg *tcmsg;
2391
2392     tc_del_qdisc(netdev);
2393
2394     tcmsg = tc_make_request(netdev, RTM_NEWQDISC,
2395                             NLM_F_EXCL | NLM_F_CREATE, &request);
2396     if (!tcmsg) {
2397         return ENODEV;
2398     }
2399     tcmsg->tcm_handle = tc_make_handle(1, 0);
2400     tcmsg->tcm_parent = TC_H_ROOT;
2401
2402     nl_msg_put_string(&request, TCA_KIND, "htb");
2403
2404     memset(&opt, 0, sizeof opt);
2405     opt.rate2quantum = 10;
2406     opt.version = 3;
2407     opt.defcls = 1;
2408
2409     opt_offset = nl_msg_start_nested(&request, TCA_OPTIONS);
2410     nl_msg_put_unspec(&request, TCA_HTB_INIT, &opt, sizeof opt);
2411     nl_msg_end_nested(&request, opt_offset);
2412
2413     return tc_transact(&request, NULL);
2414 }
2415
2416 /* Equivalent to "tc class replace <dev> classid <handle> parent <parent> htb
2417  * rate <min_rate>bps ceil <max_rate>bps burst <burst>b prio <priority>". */
2418 static int
2419 htb_setup_class__(struct netdev *netdev, unsigned int handle,
2420                   unsigned int parent, struct htb_class *class)
2421 {
2422     size_t opt_offset;
2423     struct tc_htb_opt opt;
2424     struct ofpbuf request;
2425     struct tcmsg *tcmsg;
2426     int error;
2427     int mtu;
2428
2429     error = netdev_get_mtu(netdev, &mtu);
2430     if (error) {
2431         VLOG_WARN_RL(&rl, "cannot set up HTB on device %s that lacks MTU",
2432                      netdev_get_name(netdev));
2433         return error;
2434     }
2435
2436     memset(&opt, 0, sizeof opt);
2437     tc_fill_rate(&opt.rate, class->min_rate, mtu);
2438     tc_fill_rate(&opt.ceil, class->max_rate, mtu);
2439     opt.buffer = tc_calc_buffer(opt.rate.rate, mtu, class->burst);
2440     opt.cbuffer = tc_calc_buffer(opt.ceil.rate, mtu, class->burst);
2441     opt.prio = class->priority;
2442
2443     tcmsg = tc_make_request(netdev, RTM_NEWTCLASS, NLM_F_CREATE, &request);
2444     if (!tcmsg) {
2445         return ENODEV;
2446     }
2447     tcmsg->tcm_handle = handle;
2448     tcmsg->tcm_parent = parent;
2449
2450     nl_msg_put_string(&request, TCA_KIND, "htb");
2451     opt_offset = nl_msg_start_nested(&request, TCA_OPTIONS);
2452     nl_msg_put_unspec(&request, TCA_HTB_PARMS, &opt, sizeof opt);
2453     tc_put_rtab(&request, TCA_HTB_RTAB, &opt.rate);
2454     tc_put_rtab(&request, TCA_HTB_CTAB, &opt.ceil);
2455     nl_msg_end_nested(&request, opt_offset);
2456
2457     error = tc_transact(&request, NULL);
2458     if (error) {
2459         VLOG_WARN_RL(&rl, "failed to replace %s class %u:%u, parent %u:%u, "
2460                      "min_rate=%u max_rate=%u burst=%u prio=%u (%s)",
2461                      netdev_get_name(netdev),
2462                      tc_get_major(handle), tc_get_minor(handle),
2463                      tc_get_major(parent), tc_get_minor(parent),
2464                      class->min_rate, class->max_rate,
2465                      class->burst, class->priority, strerror(error));
2466     }
2467     return error;
2468 }
2469
2470 /* Parses Netlink attributes in 'options' for HTB parameters and stores a
2471  * description of them into 'details'.  The description complies with the
2472  * specification given in the vswitch database documentation for linux-htb
2473  * queue details. */
2474 static int
2475 htb_parse_tca_options__(struct nlattr *nl_options, struct htb_class *class)
2476 {
2477     static const struct nl_policy tca_htb_policy[] = {
2478         [TCA_HTB_PARMS] = { .type = NL_A_UNSPEC, .optional = false,
2479                             .min_len = sizeof(struct tc_htb_opt) },
2480     };
2481
2482     struct nlattr *attrs[ARRAY_SIZE(tca_htb_policy)];
2483     const struct tc_htb_opt *htb;
2484
2485     if (!nl_parse_nested(nl_options, tca_htb_policy,
2486                          attrs, ARRAY_SIZE(tca_htb_policy))) {
2487         VLOG_WARN_RL(&rl, "failed to parse HTB class options");
2488         return EPROTO;
2489     }
2490
2491     htb = nl_attr_get(attrs[TCA_HTB_PARMS]);
2492     class->min_rate = htb->rate.rate;
2493     class->max_rate = htb->ceil.rate;
2494     class->burst = tc_ticks_to_bytes(htb->rate.rate, htb->buffer);
2495     class->priority = htb->prio;
2496     return 0;
2497 }
2498
2499 static int
2500 htb_parse_tcmsg__(struct ofpbuf *tcmsg, unsigned int *queue_id,
2501                   struct htb_class *options,
2502                   struct netdev_queue_stats *stats)
2503 {
2504     struct nlattr *nl_options;
2505     unsigned int handle;
2506     int error;
2507
2508     error = tc_parse_class(tcmsg, &handle, &nl_options, stats);
2509     if (!error && queue_id) {
2510         unsigned int major = tc_get_major(handle);
2511         unsigned int minor = tc_get_minor(handle);
2512         if (major == 1 && minor > 0 && minor <= HTB_N_QUEUES) {
2513             *queue_id = minor - 1;
2514         } else {
2515             error = EPROTO;
2516         }
2517     }
2518     if (!error && options) {
2519         error = htb_parse_tca_options__(nl_options, options);
2520     }
2521     return error;
2522 }
2523
2524 static void
2525 htb_parse_qdisc_details__(struct netdev *netdev,
2526                           const struct shash *details, struct htb_class *hc)
2527 {
2528     const char *max_rate_s;
2529
2530     max_rate_s = shash_find_data(details, "max-rate");
2531     hc->max_rate = max_rate_s ? strtoull(max_rate_s, NULL, 10) / 8 : 0;
2532     if (!hc->max_rate) {
2533         uint32_t current;
2534
2535         netdev_get_features(netdev, &current, NULL, NULL, NULL);
2536         hc->max_rate = netdev_features_to_bps(current) / 8;
2537     }
2538     hc->min_rate = hc->max_rate;
2539     hc->burst = 0;
2540     hc->priority = 0;
2541 }
2542
2543 static int
2544 htb_parse_class_details__(struct netdev *netdev,
2545                           const struct shash *details, struct htb_class *hc)
2546 {
2547     const struct htb *htb = htb_get__(netdev);
2548     const char *min_rate_s = shash_find_data(details, "min-rate");
2549     const char *max_rate_s = shash_find_data(details, "max-rate");
2550     const char *burst_s = shash_find_data(details, "burst");
2551     const char *priority_s = shash_find_data(details, "priority");
2552     int mtu, error;
2553
2554     error = netdev_get_mtu(netdev, &mtu);
2555     if (error) {
2556         VLOG_WARN_RL(&rl, "cannot parse HTB class on device %s that lacks MTU",
2557                      netdev_get_name(netdev));
2558         return error;
2559     }
2560
2561     /* HTB requires at least an mtu sized min-rate to send any traffic even
2562      * on uncongested links. */
2563     hc->min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0;
2564     hc->min_rate = MAX(hc->min_rate, mtu);
2565     hc->min_rate = MIN(hc->min_rate, htb->max_rate);
2566
2567     /* max-rate */
2568     hc->max_rate = (max_rate_s
2569                     ? strtoull(max_rate_s, NULL, 10) / 8
2570                     : htb->max_rate);
2571     hc->max_rate = MAX(hc->max_rate, hc->min_rate);
2572     hc->max_rate = MIN(hc->max_rate, htb->max_rate);
2573
2574     /* burst
2575      *
2576      * According to hints in the documentation that I've read, it is important
2577      * that 'burst' be at least as big as the largest frame that might be
2578      * transmitted.  Also, making 'burst' a bit bigger than necessary is OK,
2579      * but having it a bit too small is a problem.  Since netdev_get_mtu()
2580      * doesn't include the Ethernet header, we need to add at least 14 (18?) to
2581      * the MTU.  We actually add 64, instead of 14, as a guard against
2582      * additional headers get tacked on somewhere that we're not aware of. */
2583     hc->burst = burst_s ? strtoull(burst_s, NULL, 10) / 8 : 0;
2584     hc->burst = MAX(hc->burst, mtu + 64);
2585
2586     /* priority */
2587     hc->priority = priority_s ? strtoul(priority_s, NULL, 10) : 0;
2588
2589     return 0;
2590 }
2591
2592 static int
2593 htb_query_class__(const struct netdev *netdev, unsigned int handle,
2594                   unsigned int parent, struct htb_class *options,
2595                   struct netdev_queue_stats *stats)
2596 {
2597     struct ofpbuf *reply;
2598     int error;
2599
2600     error = tc_query_class(netdev, handle, parent, &reply);
2601     if (!error) {
2602         error = htb_parse_tcmsg__(reply, NULL, options, stats);
2603         ofpbuf_delete(reply);
2604     }
2605     return error;
2606 }
2607
2608 static int
2609 htb_tc_install(struct netdev *netdev, const struct shash *details)
2610 {
2611     int error;
2612
2613     error = htb_setup_qdisc__(netdev);
2614     if (!error) {
2615         struct htb_class hc;
2616
2617         htb_parse_qdisc_details__(netdev, details, &hc);
2618         error = htb_setup_class__(netdev, tc_make_handle(1, 0xfffe),
2619                                   tc_make_handle(1, 0), &hc);
2620         if (!error) {
2621             htb_install__(netdev, hc.max_rate);
2622         }
2623     }
2624     return error;
2625 }
2626
2627 static struct htb_class *
2628 htb_class_cast__(const struct tc_queue *queue)
2629 {
2630     return CONTAINER_OF(queue, struct htb_class, tc_queue);
2631 }
2632
2633 static void
2634 htb_update_queue__(struct netdev *netdev, unsigned int queue_id,
2635                    const struct htb_class *hc)
2636 {
2637     struct htb *htb = htb_get__(netdev);
2638     size_t hash = hash_int(queue_id, 0);
2639     struct tc_queue *queue;
2640     struct htb_class *hcp;
2641
2642     queue = tc_find_queue__(netdev, queue_id, hash);
2643     if (queue) {
2644         hcp = htb_class_cast__(queue);
2645     } else {
2646         hcp = xmalloc(sizeof *hcp);
2647         queue = &hcp->tc_queue;
2648         queue->queue_id = queue_id;
2649         hmap_insert(&htb->tc.queues, &queue->hmap_node, hash);
2650     }
2651
2652     hcp->min_rate = hc->min_rate;
2653     hcp->max_rate = hc->max_rate;
2654     hcp->burst = hc->burst;
2655     hcp->priority = hc->priority;
2656 }
2657
2658 static int
2659 htb_tc_load(struct netdev *netdev, struct ofpbuf *nlmsg OVS_UNUSED)
2660 {
2661     struct ofpbuf msg;
2662     struct nl_dump dump;
2663     struct htb_class hc;
2664
2665     /* Get qdisc options. */
2666     hc.max_rate = 0;
2667     htb_query_class__(netdev, tc_make_handle(1, 0xfffe), 0, &hc, NULL);
2668     htb_install__(netdev, hc.max_rate);
2669
2670     /* Get queues. */
2671     if (!start_queue_dump(netdev, &dump)) {
2672         return ENODEV;
2673     }
2674     while (nl_dump_next(&dump, &msg)) {
2675         unsigned int queue_id;
2676
2677         if (!htb_parse_tcmsg__(&msg, &queue_id, &hc, NULL)) {
2678             htb_update_queue__(netdev, queue_id, &hc);
2679         }
2680     }
2681     nl_dump_done(&dump);
2682
2683     return 0;
2684 }
2685
2686 static void
2687 htb_tc_destroy(struct tc *tc)
2688 {
2689     struct htb *htb = CONTAINER_OF(tc, struct htb, tc);
2690     struct htb_class *hc, *next;
2691
2692     HMAP_FOR_EACH_SAFE (hc, next, tc_queue.hmap_node, &htb->tc.queues) {
2693         hmap_remove(&htb->tc.queues, &hc->tc_queue.hmap_node);
2694         free(hc);
2695     }
2696     tc_destroy(tc);
2697     free(htb);
2698 }
2699
2700 static int
2701 htb_qdisc_get(const struct netdev *netdev, struct shash *details)
2702 {
2703     const struct htb *htb = htb_get__(netdev);
2704     shash_add(details, "max-rate", xasprintf("%llu", 8ULL * htb->max_rate));
2705     return 0;
2706 }
2707
2708 static int
2709 htb_qdisc_set(struct netdev *netdev, const struct shash *details)
2710 {
2711     struct htb_class hc;
2712     int error;
2713
2714     htb_parse_qdisc_details__(netdev, details, &hc);
2715     error = htb_setup_class__(netdev, tc_make_handle(1, 0xfffe),
2716                               tc_make_handle(1, 0), &hc);
2717     if (!error) {
2718         htb_get__(netdev)->max_rate = hc.max_rate;
2719     }
2720     return error;
2721 }
2722
2723 static int
2724 htb_class_get(const struct netdev *netdev OVS_UNUSED,
2725               const struct tc_queue *queue, struct shash *details)
2726 {
2727     const struct htb_class *hc = htb_class_cast__(queue);
2728
2729     shash_add(details, "min-rate", xasprintf("%llu", 8ULL * hc->min_rate));
2730     if (hc->min_rate != hc->max_rate) {
2731         shash_add(details, "max-rate", xasprintf("%llu", 8ULL * hc->max_rate));
2732     }
2733     shash_add(details, "burst", xasprintf("%llu", 8ULL * hc->burst));
2734     if (hc->priority) {
2735         shash_add(details, "priority", xasprintf("%u", hc->priority));
2736     }
2737     return 0;
2738 }
2739
2740 static int
2741 htb_class_set(struct netdev *netdev, unsigned int queue_id,
2742               const struct shash *details)
2743 {
2744     struct htb_class hc;
2745     int error;
2746
2747     error = htb_parse_class_details__(netdev, details, &hc);
2748     if (error) {
2749         return error;
2750     }
2751
2752     error = htb_setup_class__(netdev, tc_make_handle(1, queue_id + 1),
2753                               tc_make_handle(1, 0xfffe), &hc);
2754     if (error) {
2755         return error;
2756     }
2757
2758     htb_update_queue__(netdev, queue_id, &hc);
2759     return 0;
2760 }
2761
2762 static int
2763 htb_class_delete(struct netdev *netdev, struct tc_queue *queue)
2764 {
2765     struct htb_class *hc = htb_class_cast__(queue);
2766     struct htb *htb = htb_get__(netdev);
2767     int error;
2768
2769     error = tc_delete_class(netdev, tc_make_handle(1, queue->queue_id + 1));
2770     if (!error) {
2771         hmap_remove(&htb->tc.queues, &hc->tc_queue.hmap_node);
2772         free(hc);
2773     }
2774     return error;
2775 }
2776
2777 static int
2778 htb_class_get_stats(const struct netdev *netdev, const struct tc_queue *queue,
2779                     struct netdev_queue_stats *stats)
2780 {
2781     return htb_query_class__(netdev, tc_make_handle(1, queue->queue_id + 1),
2782                              tc_make_handle(1, 0xfffe), NULL, stats);
2783 }
2784
2785 static int
2786 htb_class_dump_stats(const struct netdev *netdev OVS_UNUSED,
2787                      const struct ofpbuf *nlmsg,
2788                      netdev_dump_queue_stats_cb *cb, void *aux)
2789 {
2790     struct netdev_queue_stats stats;
2791     unsigned int handle, major, minor;
2792     int error;
2793
2794     error = tc_parse_class(nlmsg, &handle, NULL, &stats);
2795     if (error) {
2796         return error;
2797     }
2798
2799     major = tc_get_major(handle);
2800     minor = tc_get_minor(handle);
2801     if (major == 1 && minor > 0 && minor <= HTB_N_QUEUES) {
2802         (*cb)(minor - 1, &stats, aux);
2803     }
2804     return 0;
2805 }
2806
2807 static const struct tc_ops tc_ops_htb = {
2808     "htb",                      /* linux_name */
2809     "linux-htb",                /* ovs_name */
2810     HTB_N_QUEUES,               /* n_queues */
2811     htb_tc_install,
2812     htb_tc_load,
2813     htb_tc_destroy,
2814     htb_qdisc_get,
2815     htb_qdisc_set,
2816     htb_class_get,
2817     htb_class_set,
2818     htb_class_delete,
2819     htb_class_get_stats,
2820     htb_class_dump_stats
2821 };
2822 \f
2823 /* "linux-hfsc" traffic control class. */
2824
2825 #define HFSC_N_QUEUES 0xf000
2826
2827 struct hfsc {
2828     struct tc tc;
2829     uint32_t max_rate;
2830 };
2831
2832 struct hfsc_class {
2833     struct tc_queue tc_queue;
2834     uint32_t min_rate;
2835     uint32_t max_rate;
2836 };
2837
2838 static struct hfsc *
2839 hfsc_get__(const struct netdev *netdev)
2840 {
2841     struct netdev_dev_linux *netdev_dev;
2842     netdev_dev = netdev_dev_linux_cast(netdev_get_dev(netdev));
2843     return CONTAINER_OF(netdev_dev->tc, struct hfsc, tc);
2844 }
2845
2846 static struct hfsc_class *
2847 hfsc_class_cast__(const struct tc_queue *queue)
2848 {
2849     return CONTAINER_OF(queue, struct hfsc_class, tc_queue);
2850 }
2851
2852 static void
2853 hfsc_install__(struct netdev *netdev, uint32_t max_rate)
2854 {
2855     struct netdev_dev_linux * netdev_dev;
2856     struct hfsc *hfsc;
2857
2858     netdev_dev = netdev_dev_linux_cast(netdev_get_dev(netdev));
2859     hfsc = xmalloc(sizeof *hfsc);
2860     tc_init(&hfsc->tc, &tc_ops_hfsc);
2861     hfsc->max_rate = max_rate;
2862     netdev_dev->tc = &hfsc->tc;
2863 }
2864
2865 static void
2866 hfsc_update_queue__(struct netdev *netdev, unsigned int queue_id,
2867                     const struct hfsc_class *hc)
2868 {
2869     size_t hash;
2870     struct hfsc *hfsc;
2871     struct hfsc_class *hcp;
2872     struct tc_queue *queue;
2873
2874     hfsc = hfsc_get__(netdev);
2875     hash = hash_int(queue_id, 0);
2876
2877     queue = tc_find_queue__(netdev, queue_id, hash);
2878     if (queue) {
2879         hcp = hfsc_class_cast__(queue);
2880     } else {
2881         hcp             = xmalloc(sizeof *hcp);
2882         queue           = &hcp->tc_queue;
2883         queue->queue_id = queue_id;
2884         hmap_insert(&hfsc->tc.queues, &queue->hmap_node, hash);
2885     }
2886
2887     hcp->min_rate = hc->min_rate;
2888     hcp->max_rate = hc->max_rate;
2889 }
2890
2891 static int
2892 hfsc_parse_tca_options__(struct nlattr *nl_options, struct hfsc_class *class)
2893 {
2894     const struct tc_service_curve *rsc, *fsc, *usc;
2895     static const struct nl_policy tca_hfsc_policy[] = {
2896         [TCA_HFSC_RSC] = {
2897             .type      = NL_A_UNSPEC,
2898             .optional  = false,
2899             .min_len   = sizeof(struct tc_service_curve),
2900         },
2901         [TCA_HFSC_FSC] = {
2902             .type      = NL_A_UNSPEC,
2903             .optional  = false,
2904             .min_len   = sizeof(struct tc_service_curve),
2905         },
2906         [TCA_HFSC_USC] = {
2907             .type      = NL_A_UNSPEC,
2908             .optional  = false,
2909             .min_len   = sizeof(struct tc_service_curve),
2910         },
2911     };
2912     struct nlattr *attrs[ARRAY_SIZE(tca_hfsc_policy)];
2913
2914     if (!nl_parse_nested(nl_options, tca_hfsc_policy,
2915                          attrs, ARRAY_SIZE(tca_hfsc_policy))) {
2916         VLOG_WARN_RL(&rl, "failed to parse HFSC class options");
2917         return EPROTO;
2918     }
2919
2920     rsc = nl_attr_get(attrs[TCA_HFSC_RSC]);
2921     fsc = nl_attr_get(attrs[TCA_HFSC_FSC]);
2922     usc = nl_attr_get(attrs[TCA_HFSC_USC]);
2923
2924     if (rsc->m1 != 0 || rsc->d != 0 ||
2925         fsc->m1 != 0 || fsc->d != 0 ||
2926         usc->m1 != 0 || usc->d != 0) {
2927         VLOG_WARN_RL(&rl, "failed to parse HFSC class options. "
2928                      "Non-linear service curves are not supported.");
2929         return EPROTO;
2930     }
2931
2932     if (rsc->m2 != fsc->m2) {
2933         VLOG_WARN_RL(&rl, "failed to parse HFSC class options. "
2934                      "Real-time service curves are not supported ");
2935         return EPROTO;
2936     }
2937
2938     if (rsc->m2 > usc->m2) {
2939         VLOG_WARN_RL(&rl, "failed to parse HFSC class options. "
2940                      "Min-rate service curve is greater than "
2941                      "the max-rate service curve.");
2942         return EPROTO;
2943     }
2944
2945     class->min_rate = fsc->m2;
2946     class->max_rate = usc->m2;
2947     return 0;
2948 }
2949
2950 static int
2951 hfsc_parse_tcmsg__(struct ofpbuf *tcmsg, unsigned int *queue_id,
2952                    struct hfsc_class *options,
2953                    struct netdev_queue_stats *stats)
2954 {
2955     int error;
2956     unsigned int handle;
2957     struct nlattr *nl_options;
2958
2959     error = tc_parse_class(tcmsg, &handle, &nl_options, stats);
2960     if (error) {
2961         return error;
2962     }
2963
2964     if (queue_id) {
2965         unsigned int major, minor;
2966
2967         major = tc_get_major(handle);
2968         minor = tc_get_minor(handle);
2969         if (major == 1 && minor > 0 && minor <= HFSC_N_QUEUES) {
2970             *queue_id = minor - 1;
2971         } else {
2972             return EPROTO;
2973         }
2974     }
2975
2976     if (options) {
2977         error = hfsc_parse_tca_options__(nl_options, options);
2978     }
2979
2980     return error;
2981 }
2982
2983 static int
2984 hfsc_query_class__(const struct netdev *netdev, unsigned int handle,
2985                    unsigned int parent, struct hfsc_class *options,
2986                    struct netdev_queue_stats *stats)
2987 {
2988     int error;
2989     struct ofpbuf *reply;
2990
2991     error = tc_query_class(netdev, handle, parent, &reply);
2992     if (error) {
2993         return error;
2994     }
2995
2996     error = hfsc_parse_tcmsg__(reply, NULL, options, stats);
2997     ofpbuf_delete(reply);
2998     return error;
2999 }
3000
3001 static void
3002 hfsc_parse_qdisc_details__(struct netdev *netdev, const struct shash *details,
3003                            struct hfsc_class *class)
3004 {
3005     uint32_t max_rate;
3006     const char *max_rate_s;
3007
3008     max_rate_s = shash_find_data(details, "max-rate");
3009     max_rate   = max_rate_s ? strtoull(max_rate_s, NULL, 10) / 8 : 0;
3010
3011     if (!max_rate) {
3012         uint32_t current;
3013
3014         netdev_get_features(netdev, &current, NULL, NULL, NULL);
3015         max_rate = netdev_features_to_bps(current) / 8;
3016     }
3017
3018     class->min_rate = max_rate;
3019     class->max_rate = max_rate;
3020 }
3021
3022 static int
3023 hfsc_parse_class_details__(struct netdev *netdev,
3024                            const struct shash *details,
3025                            struct hfsc_class * class)
3026 {
3027     const struct hfsc *hfsc;
3028     uint32_t min_rate, max_rate;
3029     const char *min_rate_s, *max_rate_s;
3030
3031     hfsc       = hfsc_get__(netdev);
3032     min_rate_s = shash_find_data(details, "min-rate");
3033     max_rate_s = shash_find_data(details, "max-rate");
3034
3035     min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0;
3036     min_rate = MAX(min_rate, 1);
3037     min_rate = MIN(min_rate, hfsc->max_rate);
3038
3039     max_rate = (max_rate_s
3040                 ? strtoull(max_rate_s, NULL, 10) / 8
3041                 : hfsc->max_rate);
3042     max_rate = MAX(max_rate, min_rate);
3043     max_rate = MIN(max_rate, hfsc->max_rate);
3044
3045     class->min_rate = min_rate;
3046     class->max_rate = max_rate;
3047
3048     return 0;
3049 }
3050
3051 /* Create an HFSC qdisc.
3052  *
3053  * Equivalent to "tc qdisc add dev <dev> root handle 1: hfsc default 1". */
3054 static int
3055 hfsc_setup_qdisc__(struct netdev * netdev)
3056 {
3057     struct tcmsg *tcmsg;
3058     struct ofpbuf request;
3059     struct tc_hfsc_qopt opt;
3060
3061     tc_del_qdisc(netdev);
3062
3063     tcmsg = tc_make_request(netdev, RTM_NEWQDISC,
3064                             NLM_F_EXCL | NLM_F_CREATE, &request);
3065
3066     if (!tcmsg) {
3067         return ENODEV;
3068     }
3069
3070     tcmsg->tcm_handle = tc_make_handle(1, 0);
3071     tcmsg->tcm_parent = TC_H_ROOT;
3072
3073     memset(&opt, 0, sizeof opt);
3074     opt.defcls = 1;
3075
3076     nl_msg_put_string(&request, TCA_KIND, "hfsc");
3077     nl_msg_put_unspec(&request, TCA_OPTIONS, &opt, sizeof opt);
3078
3079     return tc_transact(&request, NULL);
3080 }
3081
3082 /* Create an HFSC class.
3083  *
3084  * Equivalent to "tc class add <dev> parent <parent> classid <handle> hfsc
3085  * sc rate <min_rate> ul rate <max_rate>" */
3086 static int
3087 hfsc_setup_class__(struct netdev *netdev, unsigned int handle,
3088                    unsigned int parent, struct hfsc_class *class)
3089 {
3090     int error;
3091     size_t opt_offset;
3092     struct tcmsg *tcmsg;
3093     struct ofpbuf request;
3094     struct tc_service_curve min, max;
3095
3096     tcmsg = tc_make_request(netdev, RTM_NEWTCLASS, NLM_F_CREATE, &request);
3097
3098     if (!tcmsg) {
3099         return ENODEV;
3100     }
3101
3102     tcmsg->tcm_handle = handle;
3103     tcmsg->tcm_parent = parent;
3104
3105     min.m1 = 0;
3106     min.d  = 0;
3107     min.m2 = class->min_rate;
3108
3109     max.m1 = 0;
3110     max.d  = 0;
3111     max.m2 = class->max_rate;
3112
3113     nl_msg_put_string(&request, TCA_KIND, "hfsc");
3114     opt_offset = nl_msg_start_nested(&request, TCA_OPTIONS);
3115     nl_msg_put_unspec(&request, TCA_HFSC_RSC, &min, sizeof min);
3116     nl_msg_put_unspec(&request, TCA_HFSC_FSC, &min, sizeof min);
3117     nl_msg_put_unspec(&request, TCA_HFSC_USC, &max, sizeof max);
3118     nl_msg_end_nested(&request, opt_offset);
3119
3120     error = tc_transact(&request, NULL);
3121     if (error) {
3122         VLOG_WARN_RL(&rl, "failed to replace %s class %u:%u, parent %u:%u, "
3123                      "min-rate %ubps, max-rate %ubps (%s)",
3124                      netdev_get_name(netdev),
3125                      tc_get_major(handle), tc_get_minor(handle),
3126                      tc_get_major(parent), tc_get_minor(parent),
3127                      class->min_rate, class->max_rate, strerror(error));
3128     }
3129
3130     return error;
3131 }
3132
3133 static int
3134 hfsc_tc_install(struct netdev *netdev, const struct shash *details)
3135 {
3136     int error;
3137     struct hfsc_class class;
3138
3139     error = hfsc_setup_qdisc__(netdev);
3140
3141     if (error) {
3142         return error;
3143     }
3144
3145     hfsc_parse_qdisc_details__(netdev, details, &class);
3146     error = hfsc_setup_class__(netdev, tc_make_handle(1, 0xfffe),
3147                                tc_make_handle(1, 0), &class);
3148
3149     if (error) {
3150         return error;
3151     }
3152
3153     hfsc_install__(netdev, class.max_rate);
3154     return 0;
3155 }
3156
3157 static int
3158 hfsc_tc_load(struct netdev *netdev, struct ofpbuf *nlmsg OVS_UNUSED)
3159 {
3160     struct ofpbuf msg;
3161     struct nl_dump dump;
3162     struct hfsc_class hc;
3163
3164     hc.max_rate = 0;
3165     hfsc_query_class__(netdev, tc_make_handle(1, 0xfffe), 0, &hc, NULL);
3166     hfsc_install__(netdev, hc.max_rate);
3167
3168     if (!start_queue_dump(netdev, &dump)) {
3169         return ENODEV;
3170     }
3171
3172     while (nl_dump_next(&dump, &msg)) {
3173         unsigned int queue_id;
3174
3175         if (!hfsc_parse_tcmsg__(&msg, &queue_id, &hc, NULL)) {
3176             hfsc_update_queue__(netdev, queue_id, &hc);
3177         }
3178     }
3179
3180     nl_dump_done(&dump);
3181     return 0;
3182 }
3183
3184 static void
3185 hfsc_tc_destroy(struct tc *tc)
3186 {
3187     struct hfsc *hfsc;
3188     struct hfsc_class *hc, *next;
3189
3190     hfsc = CONTAINER_OF(tc, struct hfsc, tc);
3191
3192     HMAP_FOR_EACH_SAFE (hc, next, tc_queue.hmap_node, &hfsc->tc.queues) {
3193         hmap_remove(&hfsc->tc.queues, &hc->tc_queue.hmap_node);
3194         free(hc);
3195     }
3196
3197     tc_destroy(tc);
3198     free(hfsc);
3199 }
3200
3201 static int
3202 hfsc_qdisc_get(const struct netdev *netdev, struct shash *details)
3203 {
3204     const struct hfsc *hfsc;
3205     hfsc = hfsc_get__(netdev);
3206     shash_add(details, "max-rate", xasprintf("%llu", 8ULL * hfsc->max_rate));
3207     return 0;
3208 }
3209
3210 static int
3211 hfsc_qdisc_set(struct netdev *netdev, const struct shash *details)
3212 {
3213     int error;
3214     struct hfsc_class class;
3215
3216     hfsc_parse_qdisc_details__(netdev, details, &class);
3217     error = hfsc_setup_class__(netdev, tc_make_handle(1, 0xfffe),
3218                                tc_make_handle(1, 0), &class);
3219
3220     if (!error) {
3221         hfsc_get__(netdev)->max_rate = class.max_rate;
3222     }
3223
3224     return error;
3225 }
3226
3227 static int
3228 hfsc_class_get(const struct netdev *netdev OVS_UNUSED,
3229               const struct tc_queue *queue, struct shash *details)
3230 {
3231     const struct hfsc_class *hc;
3232
3233     hc = hfsc_class_cast__(queue);
3234     shash_add(details, "min-rate", xasprintf("%llu", 8ULL * hc->min_rate));
3235     if (hc->min_rate != hc->max_rate) {
3236         shash_add(details, "max-rate", xasprintf("%llu", 8ULL * hc->max_rate));
3237     }
3238     return 0;
3239 }
3240
3241 static int
3242 hfsc_class_set(struct netdev *netdev, unsigned int queue_id,
3243                const struct shash *details)
3244 {
3245     int error;
3246     struct hfsc_class class;
3247
3248     error = hfsc_parse_class_details__(netdev, details, &class);
3249     if (error) {
3250         return error;
3251     }
3252
3253     error = hfsc_setup_class__(netdev, tc_make_handle(1, queue_id + 1),
3254                                tc_make_handle(1, 0xfffe), &class);
3255     if (error) {
3256         return error;
3257     }
3258
3259     hfsc_update_queue__(netdev, queue_id, &class);
3260     return 0;
3261 }
3262
3263 static int
3264 hfsc_class_delete(struct netdev *netdev, struct tc_queue *queue)
3265 {
3266     int error;
3267     struct hfsc *hfsc;
3268     struct hfsc_class *hc;
3269
3270     hc   = hfsc_class_cast__(queue);
3271     hfsc = hfsc_get__(netdev);
3272
3273     error = tc_delete_class(netdev, tc_make_handle(1, queue->queue_id + 1));
3274     if (!error) {
3275         hmap_remove(&hfsc->tc.queues, &hc->tc_queue.hmap_node);
3276         free(hc);
3277     }
3278     return error;
3279 }
3280
3281 static int
3282 hfsc_class_get_stats(const struct netdev *netdev, const struct tc_queue *queue,
3283                      struct netdev_queue_stats *stats)
3284 {
3285     return hfsc_query_class__(netdev, tc_make_handle(1, queue->queue_id + 1),
3286                              tc_make_handle(1, 0xfffe), NULL, stats);
3287 }
3288
3289 static int
3290 hfsc_class_dump_stats(const struct netdev *netdev OVS_UNUSED,
3291                       const struct ofpbuf *nlmsg,
3292                       netdev_dump_queue_stats_cb *cb, void *aux)
3293 {
3294     struct netdev_queue_stats stats;
3295     unsigned int handle, major, minor;
3296     int error;
3297
3298     error = tc_parse_class(nlmsg, &handle, NULL, &stats);
3299     if (error) {
3300         return error;
3301     }
3302
3303     major = tc_get_major(handle);
3304     minor = tc_get_minor(handle);
3305     if (major == 1 && minor > 0 && minor <= HFSC_N_QUEUES) {
3306         (*cb)(minor - 1, &stats, aux);
3307     }
3308     return 0;
3309 }
3310
3311 static const struct tc_ops tc_ops_hfsc = {
3312     "hfsc",                     /* linux_name */
3313     "linux-hfsc",               /* ovs_name */
3314     HFSC_N_QUEUES,              /* n_queues */
3315     hfsc_tc_install,            /* tc_install */
3316     hfsc_tc_load,               /* tc_load */
3317     hfsc_tc_destroy,            /* tc_destroy */
3318     hfsc_qdisc_get,             /* qdisc_get */
3319     hfsc_qdisc_set,             /* qdisc_set */
3320     hfsc_class_get,             /* class_get */
3321     hfsc_class_set,             /* class_set */
3322     hfsc_class_delete,          /* class_delete */
3323     hfsc_class_get_stats,       /* class_get_stats */
3324     hfsc_class_dump_stats       /* class_dump_stats */
3325 };
3326 \f
3327 /* "linux-default" traffic control class.
3328  *
3329  * This class represents the default, unnamed Linux qdisc.  It corresponds to
3330  * the "" (empty string) QoS type in the OVS database. */
3331
3332 static void
3333 default_install__(struct netdev *netdev)
3334 {
3335     struct netdev_dev_linux *netdev_dev =
3336                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
3337     static struct tc *tc;
3338
3339     if (!tc) {
3340         tc = xmalloc(sizeof *tc);
3341         tc_init(tc, &tc_ops_default);
3342     }
3343     netdev_dev->tc = tc;
3344 }
3345
3346 static int
3347 default_tc_install(struct netdev *netdev,
3348                    const struct shash *details OVS_UNUSED)
3349 {
3350     default_install__(netdev);
3351     return 0;
3352 }
3353
3354 static int
3355 default_tc_load(struct netdev *netdev, struct ofpbuf *nlmsg OVS_UNUSED)
3356 {
3357     default_install__(netdev);
3358     return 0;
3359 }
3360
3361 static const struct tc_ops tc_ops_default = {
3362     NULL,                       /* linux_name */
3363     "",                         /* ovs_name */
3364     0,                          /* n_queues */
3365     default_tc_install,
3366     default_tc_load,
3367     NULL,                       /* tc_destroy */
3368     NULL,                       /* qdisc_get */
3369     NULL,                       /* qdisc_set */
3370     NULL,                       /* class_get */
3371     NULL,                       /* class_set */
3372     NULL,                       /* class_delete */
3373     NULL,                       /* class_get_stats */
3374     NULL                        /* class_dump_stats */
3375 };
3376 \f
3377 /* "linux-other" traffic control class.
3378  *
3379  * */
3380
3381 static int
3382 other_tc_load(struct netdev *netdev, struct ofpbuf *nlmsg OVS_UNUSED)
3383 {
3384     struct netdev_dev_linux *netdev_dev =
3385                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
3386     static struct tc *tc;
3387
3388     if (!tc) {
3389         tc = xmalloc(sizeof *tc);
3390         tc_init(tc, &tc_ops_other);
3391     }
3392     netdev_dev->tc = tc;
3393     return 0;
3394 }
3395
3396 static const struct tc_ops tc_ops_other = {
3397     NULL,                       /* linux_name */
3398     "linux-other",              /* ovs_name */
3399     0,                          /* n_queues */
3400     NULL,                       /* tc_install */
3401     other_tc_load,
3402     NULL,                       /* tc_destroy */
3403     NULL,                       /* qdisc_get */
3404     NULL,                       /* qdisc_set */
3405     NULL,                       /* class_get */
3406     NULL,                       /* class_set */
3407     NULL,                       /* class_delete */
3408     NULL,                       /* class_get_stats */
3409     NULL                        /* class_dump_stats */
3410 };
3411 \f
3412 /* Traffic control. */
3413
3414 /* Number of kernel "tc" ticks per second. */
3415 static double ticks_per_s;
3416
3417 /* Number of kernel "jiffies" per second.  This is used for the purpose of
3418  * computing buffer sizes.  Generally kernel qdiscs need to be able to buffer
3419  * one jiffy's worth of data.
3420  *
3421  * There are two possibilities here:
3422  *
3423  *    - 'buffer_hz' is the kernel's real timer tick rate, a small number in the
3424  *      approximate range of 100 to 1024.  That means that we really need to
3425  *      make sure that the qdisc can buffer that much data.
3426  *
3427  *    - 'buffer_hz' is an absurdly large number.  That means that the kernel
3428  *      has finely granular timers and there's no need to fudge additional room
3429  *      for buffers.  (There's no extra effort needed to implement that: the
3430  *      large 'buffer_hz' is used as a divisor, so practically any number will
3431  *      come out as 0 in the division.  Small integer results in the case of
3432  *      really high dividends won't have any real effect anyhow.)
3433  */
3434 static unsigned int buffer_hz;
3435
3436 /* Returns tc handle 'major':'minor'. */
3437 static unsigned int
3438 tc_make_handle(unsigned int major, unsigned int minor)
3439 {
3440     return TC_H_MAKE(major << 16, minor);
3441 }
3442
3443 /* Returns the major number from 'handle'. */
3444 static unsigned int
3445 tc_get_major(unsigned int handle)
3446 {
3447     return TC_H_MAJ(handle) >> 16;
3448 }
3449
3450 /* Returns the minor number from 'handle'. */
3451 static unsigned int
3452 tc_get_minor(unsigned int handle)
3453 {
3454     return TC_H_MIN(handle);
3455 }
3456
3457 static struct tcmsg *
3458 tc_make_request(const struct netdev *netdev, int type, unsigned int flags,
3459                 struct ofpbuf *request)
3460 {
3461     struct tcmsg *tcmsg;
3462     int ifindex;
3463     int error;
3464
3465     error = get_ifindex(netdev, &ifindex);
3466     if (error) {
3467         return NULL;
3468     }
3469
3470     ofpbuf_init(request, 512);
3471     nl_msg_put_nlmsghdr(request, sizeof *tcmsg, type, NLM_F_REQUEST | flags);
3472     tcmsg = ofpbuf_put_zeros(request, sizeof *tcmsg);
3473     tcmsg->tcm_family = AF_UNSPEC;
3474     tcmsg->tcm_ifindex = ifindex;
3475     /* Caller should fill in tcmsg->tcm_handle. */
3476     /* Caller should fill in tcmsg->tcm_parent. */
3477
3478     return tcmsg;
3479 }
3480
3481 static int
3482 tc_transact(struct ofpbuf *request, struct ofpbuf **replyp)
3483 {
3484     int error = nl_sock_transact(rtnl_sock, request, replyp);
3485     ofpbuf_uninit(request);
3486     return error;
3487 }
3488
3489 /* Adds or deletes a root ingress qdisc on 'netdev'.  We use this for
3490  * policing configuration.
3491  *
3492  * This function is equivalent to running the following when 'add' is true:
3493  *     /sbin/tc qdisc add dev <devname> handle ffff: ingress
3494  *
3495  * This function is equivalent to running the following when 'add' is false:
3496  *     /sbin/tc qdisc del dev <devname> handle ffff: ingress
3497  *
3498  * The configuration and stats may be seen with the following command:
3499  *     /sbin/tc -s qdisc show dev <devname>
3500  *
3501  * Returns 0 if successful, otherwise a positive errno value.
3502  */
3503 static int
3504 tc_add_del_ingress_qdisc(struct netdev *netdev, bool add)
3505 {
3506     struct ofpbuf request;
3507     struct tcmsg *tcmsg;
3508     int error;
3509     int type = add ? RTM_NEWQDISC : RTM_DELQDISC;
3510     int flags = add ? NLM_F_EXCL | NLM_F_CREATE : 0;
3511
3512     tcmsg = tc_make_request(netdev, type, flags, &request);
3513     if (!tcmsg) {
3514         return ENODEV;
3515     }
3516     tcmsg->tcm_handle = tc_make_handle(0xffff, 0);
3517     tcmsg->tcm_parent = TC_H_INGRESS;
3518     nl_msg_put_string(&request, TCA_KIND, "ingress");
3519     nl_msg_put_unspec(&request, TCA_OPTIONS, NULL, 0);
3520
3521     error = tc_transact(&request, NULL);
3522     if (error) {
3523         /* If we're deleting the qdisc, don't worry about some of the
3524          * error conditions. */
3525         if (!add && (error == ENOENT || error == EINVAL)) {
3526             return 0;
3527         }
3528         return error;
3529     }
3530
3531     return 0;
3532 }
3533
3534 /* Adds a policer to 'netdev' with a rate of 'kbits_rate' and a burst size
3535  * of 'kbits_burst'.
3536  *
3537  * This function is equivalent to running:
3538  *     /sbin/tc filter add dev <devname> parent ffff: protocol all prio 49
3539  *              basic police rate <kbits_rate>kbit burst <kbits_burst>k
3540  *              mtu 65535 drop
3541  *
3542  * The configuration and stats may be seen with the following command:
3543  *     /sbin/tc -s filter show <devname> eth0 parent ffff:
3544  *
3545  * Returns 0 if successful, otherwise a positive errno value.
3546  */
3547 static int
3548 tc_add_policer(struct netdev *netdev, int kbits_rate, int kbits_burst)
3549 {
3550     struct tc_police tc_police;
3551     struct ofpbuf request;
3552     struct tcmsg *tcmsg;
3553     size_t basic_offset;
3554     size_t police_offset;
3555     int error;
3556     int mtu = 65535;
3557
3558     memset(&tc_police, 0, sizeof tc_police);
3559     tc_police.action = TC_POLICE_SHOT;
3560     tc_police.mtu = mtu;
3561     tc_fill_rate(&tc_police.rate, kbits_rate/8 * 1000, mtu);
3562     tc_police.burst = tc_bytes_to_ticks(tc_police.rate.rate,
3563                                         kbits_burst * 1024);
3564
3565     tcmsg = tc_make_request(netdev, RTM_NEWTFILTER,
3566                             NLM_F_EXCL | NLM_F_CREATE, &request);
3567     if (!tcmsg) {
3568         return ENODEV;
3569     }
3570     tcmsg->tcm_parent = tc_make_handle(0xffff, 0);
3571     tcmsg->tcm_info = tc_make_handle(49,
3572                                      (OVS_FORCE uint16_t) htons(ETH_P_ALL));
3573
3574     nl_msg_put_string(&request, TCA_KIND, "basic");
3575     basic_offset = nl_msg_start_nested(&request, TCA_OPTIONS);
3576     police_offset = nl_msg_start_nested(&request, TCA_BASIC_POLICE);
3577     nl_msg_put_unspec(&request, TCA_POLICE_TBF, &tc_police, sizeof tc_police);
3578     tc_put_rtab(&request, TCA_POLICE_RATE, &tc_police.rate);
3579     nl_msg_end_nested(&request, police_offset);
3580     nl_msg_end_nested(&request, basic_offset);
3581
3582     error = tc_transact(&request, NULL);
3583     if (error) {
3584         return error;
3585     }
3586
3587     return 0;
3588 }
3589
3590 static void
3591 read_psched(void)
3592 {
3593     /* The values in psched are not individually very meaningful, but they are
3594      * important.  The tables below show some values seen in the wild.
3595      *
3596      * Some notes:
3597      *
3598      *   - "c" has always been a constant 1000000 since at least Linux 2.4.14.
3599      *     (Before that, there are hints that it was 1000000000.)
3600      *
3601      *   - "d" can be unrealistically large, see the comment on 'buffer_hz'
3602      *     above.
3603      *
3604      *                        /proc/net/psched
3605      *     -----------------------------------
3606      * [1] 000c8000 000f4240 000f4240 00000064
3607      * [2] 000003e8 00000400 000f4240 3b9aca00
3608      * [3] 000003e8 00000400 000f4240 3b9aca00
3609      * [4] 000003e8 00000400 000f4240 00000064
3610      * [5] 000003e8 00000040 000f4240 3b9aca00
3611      * [6] 000003e8 00000040 000f4240 000000f9
3612      *
3613      *           a         b          c             d ticks_per_s     buffer_hz
3614      *     ------- --------- ---------- ------------- ----------- -------------
3615      * [1] 819,200 1,000,000  1,000,000           100     819,200           100
3616      * [2]   1,000     1,024  1,000,000 1,000,000,000     976,562 1,000,000,000
3617      * [3]   1,000     1,024  1,000,000 1,000,000,000     976,562 1,000,000,000
3618      * [4]   1,000     1,024  1,000,000           100     976,562           100
3619      * [5]   1,000        64  1,000,000 1,000,000,000  15,625,000 1,000,000,000
3620      * [6]   1,000        64  1,000,000           249  15,625,000           249
3621      *
3622      * [1] 2.6.18-128.1.6.el5.xs5.5.0.505.1024xen from XenServer 5.5.0-24648p
3623      * [2] 2.6.26-1-686-bigmem from Debian lenny
3624      * [3] 2.6.26-2-sparc64 from Debian lenny
3625      * [4] 2.6.27.42-0.1.1.xs5.6.810.44.111163xen from XenServer 5.6.810-31078p
3626      * [5] 2.6.32.21.22 (approx.) from Ubuntu 10.04 on VMware Fusion
3627      * [6] 2.6.34 from kernel.org on KVM
3628      */
3629     static const char fn[] = "/proc/net/psched";
3630     unsigned int a, b, c, d;
3631     FILE *stream;
3632
3633     ticks_per_s = 1.0;
3634     buffer_hz = 100;
3635
3636     stream = fopen(fn, "r");
3637     if (!stream) {
3638         VLOG_WARN("%s: open failed: %s", fn, strerror(errno));
3639         return;
3640     }
3641
3642     if (fscanf(stream, "%x %x %x %x", &a, &b, &c, &d) != 4) {
3643         VLOG_WARN("%s: read failed", fn);
3644         fclose(stream);
3645         return;
3646     }
3647     VLOG_DBG("%s: psched parameters are: %u %u %u %u", fn, a, b, c, d);
3648     fclose(stream);
3649
3650     if (!a || !c) {
3651         VLOG_WARN("%s: invalid scheduler parameters", fn);
3652         return;
3653     }
3654
3655     ticks_per_s = (double) a * c / b;
3656     if (c == 1000000) {
3657         buffer_hz = d;
3658     } else {
3659         VLOG_WARN("%s: unexpected psched parameters: %u %u %u %u",
3660                   fn, a, b, c, d);
3661     }
3662     VLOG_DBG("%s: ticks_per_s=%f buffer_hz=%u", fn, ticks_per_s, buffer_hz);
3663 }
3664
3665 /* Returns the number of bytes that can be transmitted in 'ticks' ticks at a
3666  * rate of 'rate' bytes per second. */
3667 static unsigned int
3668 tc_ticks_to_bytes(unsigned int rate, unsigned int ticks)
3669 {
3670     if (!buffer_hz) {
3671         read_psched();
3672     }
3673     return (rate * ticks) / ticks_per_s;
3674 }
3675
3676 /* Returns the number of ticks that it would take to transmit 'size' bytes at a
3677  * rate of 'rate' bytes per second. */
3678 static unsigned int
3679 tc_bytes_to_ticks(unsigned int rate, unsigned int size)
3680 {
3681     if (!buffer_hz) {
3682         read_psched();
3683     }
3684     return rate ? ((unsigned long long int) ticks_per_s * size) / rate : 0;
3685 }
3686
3687 /* Returns the number of bytes that need to be reserved for qdisc buffering at
3688  * a transmission rate of 'rate' bytes per second. */
3689 static unsigned int
3690 tc_buffer_per_jiffy(unsigned int rate)
3691 {
3692     if (!buffer_hz) {
3693         read_psched();
3694     }
3695     return rate / buffer_hz;
3696 }
3697
3698 /* Given Netlink 'msg' that describes a qdisc, extracts the name of the qdisc,
3699  * e.g. "htb", into '*kind' (if it is nonnull).  If 'options' is nonnull,
3700  * extracts 'msg''s TCA_OPTIONS attributes into '*options' if it is present or
3701  * stores NULL into it if it is absent.
3702  *
3703  * '*kind' and '*options' point into 'msg', so they are owned by whoever owns
3704  * 'msg'.
3705  *
3706  * Returns 0 if successful, otherwise a positive errno value. */
3707 static int
3708 tc_parse_qdisc(const struct ofpbuf *msg, const char **kind,
3709                struct nlattr **options)
3710 {
3711     static const struct nl_policy tca_policy[] = {
3712         [TCA_KIND] = { .type = NL_A_STRING, .optional = false },
3713         [TCA_OPTIONS] = { .type = NL_A_NESTED, .optional = true },
3714     };
3715     struct nlattr *ta[ARRAY_SIZE(tca_policy)];
3716
3717     if (!nl_policy_parse(msg, NLMSG_HDRLEN + sizeof(struct tcmsg),
3718                          tca_policy, ta, ARRAY_SIZE(ta))) {
3719         VLOG_WARN_RL(&rl, "failed to parse qdisc message");
3720         goto error;
3721     }
3722
3723     if (kind) {
3724         *kind = nl_attr_get_string(ta[TCA_KIND]);
3725     }
3726
3727     if (options) {
3728         *options = ta[TCA_OPTIONS];
3729     }
3730
3731     return 0;
3732
3733 error:
3734     if (kind) {
3735         *kind = NULL;
3736     }
3737     if (options) {
3738         *options = NULL;
3739     }
3740     return EPROTO;
3741 }
3742
3743 /* Given Netlink 'msg' that describes a class, extracts the queue ID (e.g. the
3744  * minor number of its class ID) into '*queue_id', its TCA_OPTIONS attribute
3745  * into '*options', and its queue statistics into '*stats'.  Any of the output
3746  * arguments may be null.
3747  *
3748  * Returns 0 if successful, otherwise a positive errno value. */
3749 static int
3750 tc_parse_class(const struct ofpbuf *msg, unsigned int *handlep,
3751                struct nlattr **options, struct netdev_queue_stats *stats)
3752 {
3753     static const struct nl_policy tca_policy[] = {
3754         [TCA_OPTIONS] = { .type = NL_A_NESTED, .optional = false },
3755         [TCA_STATS2] = { .type = NL_A_NESTED, .optional = false },
3756     };
3757     struct nlattr *ta[ARRAY_SIZE(tca_policy)];
3758
3759     if (!nl_policy_parse(msg, NLMSG_HDRLEN + sizeof(struct tcmsg),
3760                          tca_policy, ta, ARRAY_SIZE(ta))) {
3761         VLOG_WARN_RL(&rl, "failed to parse class message");
3762         goto error;
3763     }
3764
3765     if (handlep) {
3766         struct tcmsg *tc = ofpbuf_at_assert(msg, NLMSG_HDRLEN, sizeof *tc);
3767         *handlep = tc->tcm_handle;
3768     }
3769
3770     if (options) {
3771         *options = ta[TCA_OPTIONS];
3772     }
3773
3774     if (stats) {
3775         const struct gnet_stats_queue *gsq;
3776         struct gnet_stats_basic gsb;
3777
3778         static const struct nl_policy stats_policy[] = {
3779             [TCA_STATS_BASIC] = { .type = NL_A_UNSPEC, .optional = false,
3780                                   .min_len = sizeof gsb },
3781             [TCA_STATS_QUEUE] = { .type = NL_A_UNSPEC, .optional = false,
3782                                   .min_len = sizeof *gsq },
3783         };
3784         struct nlattr *sa[ARRAY_SIZE(stats_policy)];
3785
3786         if (!nl_parse_nested(ta[TCA_STATS2], stats_policy,
3787                              sa, ARRAY_SIZE(sa))) {
3788             VLOG_WARN_RL(&rl, "failed to parse class stats");
3789             goto error;
3790         }
3791
3792         /* Alignment issues screw up the length of struct gnet_stats_basic on
3793          * some arch/bitsize combinations.  Newer versions of Linux have a
3794          * struct gnet_stats_basic_packed, but we can't depend on that.  The
3795          * easiest thing to do is just to make a copy. */
3796         memset(&gsb, 0, sizeof gsb);
3797         memcpy(&gsb, nl_attr_get(sa[TCA_STATS_BASIC]),
3798                MIN(nl_attr_get_size(sa[TCA_STATS_BASIC]), sizeof gsb));
3799         stats->tx_bytes = gsb.bytes;
3800         stats->tx_packets = gsb.packets;
3801
3802         gsq = nl_attr_get(sa[TCA_STATS_QUEUE]);
3803         stats->tx_errors = gsq->drops;
3804     }
3805
3806     return 0;
3807
3808 error:
3809     if (options) {
3810         *options = NULL;
3811     }
3812     if (stats) {
3813         memset(stats, 0, sizeof *stats);
3814     }
3815     return EPROTO;
3816 }
3817
3818 /* Queries the kernel for class with identifier 'handle' and parent 'parent'
3819  * on 'netdev'. */
3820 static int
3821 tc_query_class(const struct netdev *netdev,
3822                unsigned int handle, unsigned int parent,
3823                struct ofpbuf **replyp)
3824 {
3825     struct ofpbuf request;
3826     struct tcmsg *tcmsg;
3827     int error;
3828
3829     tcmsg = tc_make_request(netdev, RTM_GETTCLASS, NLM_F_ECHO, &request);
3830     if (!tcmsg) {
3831         return ENODEV;
3832     }
3833     tcmsg->tcm_handle = handle;
3834     tcmsg->tcm_parent = parent;
3835
3836     error = tc_transact(&request, replyp);
3837     if (error) {
3838         VLOG_WARN_RL(&rl, "query %s class %u:%u (parent %u:%u) failed (%s)",
3839                      netdev_get_name(netdev),
3840                      tc_get_major(handle), tc_get_minor(handle),
3841                      tc_get_major(parent), tc_get_minor(parent),
3842                      strerror(error));
3843     }
3844     return error;
3845 }
3846
3847 /* Equivalent to "tc class del dev <name> handle <handle>". */
3848 static int
3849 tc_delete_class(const struct netdev *netdev, unsigned int handle)
3850 {
3851     struct ofpbuf request;
3852     struct tcmsg *tcmsg;
3853     int error;
3854
3855     tcmsg = tc_make_request(netdev, RTM_DELTCLASS, 0, &request);
3856     if (!tcmsg) {
3857         return ENODEV;
3858     }
3859     tcmsg->tcm_handle = handle;
3860     tcmsg->tcm_parent = 0;
3861
3862     error = tc_transact(&request, NULL);
3863     if (error) {
3864         VLOG_WARN_RL(&rl, "delete %s class %u:%u failed (%s)",
3865                      netdev_get_name(netdev),
3866                      tc_get_major(handle), tc_get_minor(handle),
3867                      strerror(error));
3868     }
3869     return error;
3870 }
3871
3872 /* Equivalent to "tc qdisc del dev <name> root". */
3873 static int
3874 tc_del_qdisc(struct netdev *netdev)
3875 {
3876     struct netdev_dev_linux *netdev_dev =
3877                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
3878     struct ofpbuf request;
3879     struct tcmsg *tcmsg;
3880     int error;
3881
3882     tcmsg = tc_make_request(netdev, RTM_DELQDISC, 0, &request);
3883     if (!tcmsg) {
3884         return ENODEV;
3885     }
3886     tcmsg->tcm_handle = tc_make_handle(1, 0);
3887     tcmsg->tcm_parent = TC_H_ROOT;
3888
3889     error = tc_transact(&request, NULL);
3890     if (error == EINVAL) {
3891         /* EINVAL probably means that the default qdisc was in use, in which
3892          * case we've accomplished our purpose. */
3893         error = 0;
3894     }
3895     if (!error && netdev_dev->tc) {
3896         if (netdev_dev->tc->ops->tc_destroy) {
3897             netdev_dev->tc->ops->tc_destroy(netdev_dev->tc);
3898         }
3899         netdev_dev->tc = NULL;
3900     }
3901     return error;
3902 }
3903
3904 /* If 'netdev''s qdisc type and parameters are not yet known, queries the
3905  * kernel to determine what they are.  Returns 0 if successful, otherwise a
3906  * positive errno value. */
3907 static int
3908 tc_query_qdisc(const struct netdev *netdev)
3909 {
3910     struct netdev_dev_linux *netdev_dev =
3911                                 netdev_dev_linux_cast(netdev_get_dev(netdev));
3912     struct ofpbuf request, *qdisc;
3913     const struct tc_ops *ops;
3914     struct tcmsg *tcmsg;
3915     int load_error;
3916     int error;
3917
3918     if (netdev_dev->tc) {
3919         return 0;
3920     }
3921
3922     /* This RTM_GETQDISC is crafted to avoid OOPSing kernels that do not have
3923      * commit 53b0f08 "net_sched: Fix qdisc_notify()", which is anything before
3924      * 2.6.35 without that fix backported to it.
3925      *
3926      * To avoid the OOPS, we must not make a request that would attempt to dump
3927      * a "built-in" qdisc, that is, the default pfifo_fast qdisc or one of a
3928      * few others.  There are a few ways that I can see to do this, but most of
3929      * them seem to be racy (and if you lose the race the kernel OOPSes).  The
3930      * technique chosen here is to assume that any non-default qdisc that we
3931      * create will have a class with handle 1:0.  The built-in qdiscs only have
3932      * a class with handle 0:0.
3933      *
3934      * We could check for Linux 2.6.35+ and use a more straightforward method
3935      * there. */
3936     tcmsg = tc_make_request(netdev, RTM_GETQDISC, NLM_F_ECHO, &request);
3937     if (!tcmsg) {
3938         return ENODEV;
3939     }
3940     tcmsg->tcm_handle = tc_make_handle(1, 0);
3941     tcmsg->tcm_parent = 0;
3942
3943     /* Figure out what tc class to instantiate. */
3944     error = tc_transact(&request, &qdisc);
3945     if (!error) {
3946         const char *kind;
3947
3948         error = tc_parse_qdisc(qdisc, &kind, NULL);
3949         if (error) {
3950             ops = &tc_ops_other;
3951         } else {
3952             ops = tc_lookup_linux_name(kind);
3953             if (!ops) {
3954                 static struct vlog_rate_limit rl2 = VLOG_RATE_LIMIT_INIT(1, 1);
3955                 VLOG_INFO_RL(&rl2, "unknown qdisc \"%s\"", kind);
3956
3957                 ops = &tc_ops_other;
3958             }
3959         }
3960     } else if (error == ENOENT) {
3961         /* Either it's a built-in qdisc, or it's a qdisc set up by some
3962          * other entity that doesn't have a handle 1:0.  We will assume
3963          * that it's the system default qdisc. */
3964         ops = &tc_ops_default;
3965         error = 0;
3966     } else {
3967         /* Who knows?  Maybe the device got deleted. */
3968         VLOG_WARN_RL(&rl, "query %s qdisc failed (%s)",
3969                      netdev_get_name(netdev), strerror(error));
3970         ops = &tc_ops_other;
3971     }
3972
3973     /* Instantiate it. */
3974     load_error = ops->tc_load((struct netdev *) netdev, qdisc);
3975     assert((load_error == 0) == (netdev_dev->tc != NULL));
3976     ofpbuf_delete(qdisc);
3977
3978     return error ? error : load_error;
3979 }
3980
3981 /* Linux traffic control uses tables with 256 entries ("rtab" tables) to
3982    approximate the time to transmit packets of various lengths.  For an MTU of
3983    256 or less, each entry is exact; for an MTU of 257 through 512, each entry
3984    represents two possible packet lengths; for a MTU of 513 through 1024, four
3985    possible lengths; and so on.
3986
3987    Returns, for the specified 'mtu', the number of bits that packet lengths
3988    need to be shifted right to fit within such a 256-entry table. */
3989 static int
3990 tc_calc_cell_log(unsigned int mtu)
3991 {
3992     int cell_log;
3993
3994     if (!mtu) {
3995         mtu = ETH_PAYLOAD_MAX;
3996     }
3997     mtu += ETH_HEADER_LEN + VLAN_HEADER_LEN;
3998
3999     for (cell_log = 0; mtu >= 256; cell_log++) {
4000         mtu >>= 1;
4001     }
4002
4003     return cell_log;
4004 }
4005
4006 /* Initializes 'rate' properly for a rate of 'Bps' bytes per second with an MTU
4007  * of 'mtu'. */
4008 static void
4009 tc_fill_rate(struct tc_ratespec *rate, uint64_t Bps, int mtu)
4010 {
4011     memset(rate, 0, sizeof *rate);
4012     rate->cell_log = tc_calc_cell_log(mtu);
4013     /* rate->overhead = 0; */           /* New in 2.6.24, not yet in some */
4014     /* rate->cell_align = 0; */         /* distro headers. */
4015     rate->mpu = ETH_TOTAL_MIN;
4016     rate->rate = Bps;
4017 }
4018
4019 /* Appends to 'msg' an "rtab" table for the specified 'rate' as a Netlink
4020  * attribute of the specified "type".
4021  *
4022  * See tc_calc_cell_log() above for a description of "rtab"s. */
4023 static void
4024 tc_put_rtab(struct ofpbuf *msg, uint16_t type, const struct tc_ratespec *rate)
4025 {
4026     uint32_t *rtab;
4027     unsigned int i;
4028
4029     rtab = nl_msg_put_unspec_uninit(msg, type, TC_RTAB_SIZE);
4030     for (i = 0; i < TC_RTAB_SIZE / sizeof *rtab; i++) {
4031         unsigned packet_size = (i + 1) << rate->cell_log;
4032         if (packet_size < rate->mpu) {
4033             packet_size = rate->mpu;
4034         }
4035         rtab[i] = tc_bytes_to_ticks(rate->rate, packet_size);
4036     }
4037 }
4038
4039 /* Calculates the proper value of 'buffer' or 'cbuffer' in HTB options given a
4040  * rate of 'Bps' bytes per second, the specified 'mtu', and a user-requested
4041  * burst size of 'burst_bytes'.  (If no value was requested, a 'burst_bytes' of
4042  * 0 is fine.) */
4043 static int
4044 tc_calc_buffer(unsigned int Bps, int mtu, uint64_t burst_bytes)
4045 {
4046     unsigned int min_burst = tc_buffer_per_jiffy(Bps) + mtu;
4047     return tc_bytes_to_ticks(Bps, MAX(burst_bytes, min_burst));
4048 }
4049 \f
4050 /* Linux-only functions declared in netdev-linux.h  */
4051
4052 /* Returns a fd for an AF_INET socket or a negative errno value. */
4053 int
4054 netdev_linux_get_af_inet_sock(void)
4055 {
4056     int error = netdev_linux_init();
4057     return error ? -error : af_inet_sock;
4058 }
4059
4060 /* Modifies the 'flag' bit in ethtool's flags field for 'netdev'.  If
4061  * 'enable' is true, the bit is set.  Otherwise, it is cleared. */
4062 int
4063 netdev_linux_ethtool_set_flag(struct netdev *netdev, uint32_t flag,
4064                               const char *flag_name, bool enable)
4065 {
4066     const char *netdev_name = netdev_get_name(netdev);
4067     struct ethtool_value evalue;
4068     uint32_t new_flags;
4069     int error;
4070
4071     memset(&evalue, 0, sizeof evalue);
4072     error = netdev_linux_do_ethtool(netdev_name,
4073                                     (struct ethtool_cmd *)&evalue,
4074                                     ETHTOOL_GFLAGS, "ETHTOOL_GFLAGS");
4075     if (error) {
4076         return error;
4077     }
4078
4079     evalue.data = new_flags = (evalue.data & ~flag) | (enable ? flag : 0);
4080     error = netdev_linux_do_ethtool(netdev_name,
4081                                     (struct ethtool_cmd *)&evalue,
4082                                     ETHTOOL_SFLAGS, "ETHTOOL_SFLAGS");
4083     if (error) {
4084         return error;
4085     }
4086
4087     memset(&evalue, 0, sizeof evalue);
4088     error = netdev_linux_do_ethtool(netdev_name,
4089                                     (struct ethtool_cmd *)&evalue,
4090                                     ETHTOOL_GFLAGS, "ETHTOOL_GFLAGS");
4091     if (error) {
4092         return error;
4093     }
4094
4095     if (new_flags != evalue.data) {
4096         VLOG_WARN_RL(&rl, "attempt to %s ethtool %s flag on network "
4097                      "device %s failed", enable ? "enable" : "disable",
4098                      flag_name, netdev_name);
4099         return EOPNOTSUPP;
4100     }
4101
4102     return 0;
4103 }
4104 \f
4105 /* Utility functions. */
4106
4107 /* Copies 'src' into 'dst', performing format conversion in the process. */
4108 static void
4109 netdev_stats_from_rtnl_link_stats(struct netdev_stats *dst,
4110                                   const struct rtnl_link_stats *src)
4111 {
4112     dst->rx_packets = src->rx_packets;
4113     dst->tx_packets = src->tx_packets;
4114     dst->rx_bytes = src->rx_bytes;
4115     dst->tx_bytes = src->tx_bytes;
4116     dst->rx_errors = src->rx_errors;
4117     dst->tx_errors = src->tx_errors;
4118     dst->rx_dropped = src->rx_dropped;
4119     dst->tx_dropped = src->tx_dropped;
4120     dst->multicast = src->multicast;
4121     dst->collisions = src->collisions;
4122     dst->rx_length_errors = src->rx_length_errors;
4123     dst->rx_over_errors = src->rx_over_errors;
4124     dst->rx_crc_errors = src->rx_crc_errors;
4125     dst->rx_frame_errors = src->rx_frame_errors;
4126     dst->rx_fifo_errors = src->rx_fifo_errors;
4127     dst->rx_missed_errors = src->rx_missed_errors;
4128     dst->tx_aborted_errors = src->tx_aborted_errors;
4129     dst->tx_carrier_errors = src->tx_carrier_errors;
4130     dst->tx_fifo_errors = src->tx_fifo_errors;
4131     dst->tx_heartbeat_errors = src->tx_heartbeat_errors;
4132     dst->tx_window_errors = src->tx_window_errors;
4133 }
4134
4135 static int
4136 get_stats_via_netlink(int ifindex, struct netdev_stats *stats)
4137 {
4138     /* Policy for RTNLGRP_LINK messages.
4139      *
4140      * There are *many* more fields in these messages, but currently we only
4141      * care about these fields. */
4142     static const struct nl_policy rtnlgrp_link_policy[] = {
4143         [IFLA_IFNAME] = { .type = NL_A_STRING, .optional = false },
4144         [IFLA_STATS] = { .type = NL_A_UNSPEC, .optional = true,
4145                          .min_len = sizeof(struct rtnl_link_stats) },
4146     };
4147
4148     struct ofpbuf request;
4149     struct ofpbuf *reply;
4150     struct ifinfomsg *ifi;
4151     struct nlattr *attrs[ARRAY_SIZE(rtnlgrp_link_policy)];
4152     int error;
4153
4154     ofpbuf_init(&request, 0);
4155     nl_msg_put_nlmsghdr(&request, sizeof *ifi, RTM_GETLINK, NLM_F_REQUEST);
4156     ifi = ofpbuf_put_zeros(&request, sizeof *ifi);
4157     ifi->ifi_family = PF_UNSPEC;
4158     ifi->ifi_index = ifindex;
4159     error = nl_sock_transact(rtnl_sock, &request, &reply);
4160     ofpbuf_uninit(&request);
4161     if (error) {
4162         return error;
4163     }
4164
4165     if (!nl_policy_parse(reply, NLMSG_HDRLEN + sizeof(struct ifinfomsg),
4166                          rtnlgrp_link_policy,
4167                          attrs, ARRAY_SIZE(rtnlgrp_link_policy))) {
4168         ofpbuf_delete(reply);
4169         return EPROTO;
4170     }
4171
4172     if (!attrs[IFLA_STATS]) {
4173         VLOG_WARN_RL(&rl, "RTM_GETLINK reply lacks stats");
4174         ofpbuf_delete(reply);
4175         return EPROTO;
4176     }
4177
4178     netdev_stats_from_rtnl_link_stats(stats, nl_attr_get(attrs[IFLA_STATS]));
4179
4180     ofpbuf_delete(reply);
4181
4182     return 0;
4183 }
4184
4185 static int
4186 get_stats_via_proc(const char *netdev_name, struct netdev_stats *stats)
4187 {
4188     static const char fn[] = "/proc/net/dev";
4189     char line[1024];
4190     FILE *stream;
4191     int ln;
4192
4193     stream = fopen(fn, "r");
4194     if (!stream) {
4195         VLOG_WARN_RL(&rl, "%s: open failed: %s", fn, strerror(errno));
4196         return errno;
4197     }
4198
4199     ln = 0;
4200     while (fgets(line, sizeof line, stream)) {
4201         if (++ln >= 3) {
4202             char devname[16];
4203 #define X64 "%"SCNu64
4204             if (sscanf(line,
4205                        " %15[^:]:"
4206                        X64 X64 X64 X64 X64 X64 X64 "%*u"
4207                        X64 X64 X64 X64 X64 X64 X64 "%*u",
4208                        devname,
4209                        &stats->rx_bytes,
4210                        &stats->rx_packets,
4211                        &stats->rx_errors,
4212                        &stats->rx_dropped,
4213                        &stats->rx_fifo_errors,
4214                        &stats->rx_frame_errors,
4215                        &stats->multicast,
4216                        &stats->tx_bytes,
4217                        &stats->tx_packets,
4218                        &stats->tx_errors,
4219                        &stats->tx_dropped,
4220                        &stats->tx_fifo_errors,
4221                        &stats->collisions,
4222                        &stats->tx_carrier_errors) != 15) {
4223                 VLOG_WARN_RL(&rl, "%s:%d: parse error", fn, ln);
4224             } else if (!strcmp(devname, netdev_name)) {
4225                 stats->rx_length_errors = UINT64_MAX;
4226                 stats->rx_over_errors = UINT64_MAX;
4227                 stats->rx_crc_errors = UINT64_MAX;
4228                 stats->rx_missed_errors = UINT64_MAX;
4229                 stats->tx_aborted_errors = UINT64_MAX;
4230                 stats->tx_heartbeat_errors = UINT64_MAX;
4231                 stats->tx_window_errors = UINT64_MAX;
4232                 fclose(stream);
4233                 return 0;
4234             }
4235         }
4236     }
4237     VLOG_WARN_RL(&rl, "%s: no stats for %s", fn, netdev_name);
4238     fclose(stream);
4239     return ENODEV;
4240 }
4241
4242 static int
4243 get_flags(const struct netdev_dev *dev, unsigned int *flags)
4244 {
4245     struct ifreq ifr;
4246     int error;
4247
4248     *flags = 0;
4249     error = netdev_linux_do_ioctl(dev->name, &ifr, SIOCGIFFLAGS,
4250                                   "SIOCGIFFLAGS");
4251     if (!error) {
4252         *flags = ifr.ifr_flags;
4253     }
4254     return error;
4255 }
4256
4257 static int
4258 set_flags(struct netdev *netdev, unsigned int flags)
4259 {
4260     struct ifreq ifr;
4261
4262     ifr.ifr_flags = flags;
4263     return netdev_linux_do_ioctl(netdev_get_name(netdev), &ifr, SIOCSIFFLAGS,
4264                                  "SIOCSIFFLAGS");
4265 }
4266
4267 static int
4268 do_get_ifindex(const char *netdev_name)
4269 {
4270     struct ifreq ifr;
4271
4272     ovs_strzcpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name);
4273     COVERAGE_INC(netdev_get_ifindex);
4274     if (ioctl(af_inet_sock, SIOCGIFINDEX, &ifr) < 0) {
4275         VLOG_WARN_RL(&rl, "ioctl(SIOCGIFINDEX) on %s device failed: %s",
4276                      netdev_name, strerror(errno));
4277         return -errno;
4278     }
4279     return ifr.ifr_ifindex;
4280 }
4281
4282 static int
4283 get_ifindex(const struct netdev *netdev_, int *ifindexp)
4284 {
4285     struct netdev_dev_linux *netdev_dev =
4286                                 netdev_dev_linux_cast(netdev_get_dev(netdev_));
4287     *ifindexp = 0;
4288     if (!(netdev_dev->cache_valid & VALID_IFINDEX)) {
4289         int ifindex = do_get_ifindex(netdev_get_name(netdev_));
4290         if (ifindex < 0) {
4291             return -ifindex;
4292         }
4293         netdev_dev->cache_valid |= VALID_IFINDEX;
4294         netdev_dev->ifindex = ifindex;
4295     }
4296     *ifindexp = netdev_dev->ifindex;
4297     return 0;
4298 }
4299
4300 static int
4301 get_etheraddr(const char *netdev_name, uint8_t ea[ETH_ADDR_LEN])
4302 {
4303     struct ifreq ifr;
4304     int hwaddr_family;
4305
4306     memset(&ifr, 0, sizeof ifr);
4307     ovs_strzcpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name);
4308     COVERAGE_INC(netdev_get_hwaddr);
4309     if (ioctl(af_inet_sock, SIOCGIFHWADDR, &ifr) < 0) {
4310         /* ENODEV probably means that a vif disappeared asynchronously and
4311          * hasn't been removed from the database yet, so reduce the log level
4312          * to INFO for that case. */
4313         VLOG(errno == ENODEV ? VLL_INFO : VLL_ERR,
4314              "ioctl(SIOCGIFHWADDR) on %s device failed: %s",
4315              netdev_name, strerror(errno));
4316         return errno;
4317     }
4318     hwaddr_family = ifr.ifr_hwaddr.sa_family;
4319     if (hwaddr_family != AF_UNSPEC && hwaddr_family != ARPHRD_ETHER) {
4320         VLOG_WARN("%s device has unknown hardware address family %d",
4321                   netdev_name, hwaddr_family);
4322     }
4323     memcpy(ea, ifr.ifr_hwaddr.sa_data, ETH_ADDR_LEN);
4324     return 0;
4325 }
4326
4327 static int
4328 set_etheraddr(const char *netdev_name, int hwaddr_family,
4329               const uint8_t mac[ETH_ADDR_LEN])
4330 {
4331     struct ifreq ifr;
4332
4333     memset(&ifr, 0, sizeof ifr);
4334     ovs_strzcpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name);
4335     ifr.ifr_hwaddr.sa_family = hwaddr_family;
4336     memcpy(ifr.ifr_hwaddr.sa_data, mac, ETH_ADDR_LEN);
4337     COVERAGE_INC(netdev_set_hwaddr);
4338     if (ioctl(af_inet_sock, SIOCSIFHWADDR, &ifr) < 0) {
4339         VLOG_ERR("ioctl(SIOCSIFHWADDR) on %s device failed: %s",
4340                  netdev_name, strerror(errno));
4341         return errno;
4342     }
4343     return 0;
4344 }
4345
4346 static int
4347 netdev_linux_do_ethtool(const char *name, struct ethtool_cmd *ecmd,
4348                         int cmd, const char *cmd_name)
4349 {
4350     struct ifreq ifr;
4351
4352     memset(&ifr, 0, sizeof ifr);
4353     ovs_strzcpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
4354     ifr.ifr_data = (caddr_t) ecmd;
4355
4356     ecmd->cmd = cmd;
4357     COVERAGE_INC(netdev_ethtool);
4358     if (ioctl(af_inet_sock, SIOCETHTOOL, &ifr) == 0) {
4359         return 0;
4360     } else {
4361         if (errno != EOPNOTSUPP) {
4362             VLOG_WARN_RL(&rl, "ethtool command %s on network device %s "
4363                          "failed: %s", cmd_name, name, strerror(errno));
4364         } else {
4365             /* The device doesn't support this operation.  That's pretty
4366              * common, so there's no point in logging anything. */
4367         }
4368         return errno;
4369     }
4370 }
4371
4372 static int
4373 netdev_linux_do_ioctl(const char *name, struct ifreq *ifr, int cmd,
4374                       const char *cmd_name)
4375 {
4376     ovs_strzcpy(ifr->ifr_name, name, sizeof ifr->ifr_name);
4377     if (ioctl(af_inet_sock, cmd, ifr) == -1) {
4378         VLOG_DBG_RL(&rl, "%s: ioctl(%s) failed: %s", name, cmd_name,
4379                      strerror(errno));
4380         return errno;
4381     }
4382     return 0;
4383 }
4384
4385 static int
4386 netdev_linux_get_ipv4(const struct netdev *netdev, struct in_addr *ip,
4387                       int cmd, const char *cmd_name)
4388 {
4389     struct ifreq ifr;
4390     int error;
4391
4392     ifr.ifr_addr.sa_family = AF_INET;
4393     error = netdev_linux_do_ioctl(netdev_get_name(netdev), &ifr, cmd, cmd_name);
4394     if (!error) {
4395         const struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
4396         *ip = sin->sin_addr;
4397     }
4398     return error;
4399 }
4400
4401 /* Returns an AF_PACKET raw socket or a negative errno value. */
4402 static int
4403 af_packet_sock(void)
4404 {
4405     static int sock = INT_MIN;
4406
4407     if (sock == INT_MIN) {
4408         sock = socket(AF_PACKET, SOCK_RAW, 0);
4409         if (sock >= 0) {
4410             set_nonblocking(sock);
4411         } else {
4412             sock = -errno;
4413             VLOG_ERR("failed to create packet socket: %s", strerror(errno));
4414         }
4415     }
4416
4417     return sock;
4418 }