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