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