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