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