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