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