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