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