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