projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vlog: Make the vlog module catalog program-specific.
[openvswitch]
/
lib
/
dpif-linux.c
diff --git
a/lib/dpif-linux.c
b/lib/dpif-linux.c
index 15283b282cb398642f40ea7d111694db8e607d42..52d73c6bb76d404dd32dd70bfbd6775a20e242bd 100644
(file)
--- a/
lib/dpif-linux.c
+++ b/
lib/dpif-linux.c
@@
-23,11
+23,14
@@
#include <fcntl.h>
#include <inttypes.h>
#include <net/if.h>
#include <fcntl.h>
#include <inttypes.h>
#include <net/if.h>
+#include <linux/types.h>
#include <linux/ethtool.h>
#include <linux/ethtool.h>
+#include <linux/pkt_sched.h>
#include <linux/rtnetlink.h>
#include <linux/sockios.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/rtnetlink.h>
#include <linux/sockios.h>
#include <stdlib.h>
#include <sys/ioctl.h>
+#include <sys/stat.h>
#include <unistd.h>
#include "dpif-provider.h"
#include <unistd.h>
#include "dpif-provider.h"
@@
-35,11
+38,12
@@
#include "ofpbuf.h"
#include "poll-loop.h"
#include "rtnetlink.h"
#include "ofpbuf.h"
#include "poll-loop.h"
#include "rtnetlink.h"
+#include "shash.h"
#include "svec.h"
#include "util.h"
#include "svec.h"
#include "util.h"
-
#include "vlog.h"
#include "vlog.h"
-#define THIS_MODULE VLM_dpif_linux
+
+VLOG_DEFINE_THIS_MODULE(dpif_linux)
/* Datapath interface for the openvswitch Linux kernel module. */
struct dpif_linux {
/* Datapath interface for the openvswitch Linux kernel module. */
struct dpif_linux {
@@
-52,7
+56,7
@@
struct dpif_linux {
/* Change notification. */
int local_ifindex; /* Ifindex of local port. */
/* Change notification. */
int local_ifindex; /* Ifindex of local port. */
- struct s
vec
changed_ports; /* Ports that have changed. */
+ struct s
hash
changed_ports; /* Ports that have changed. */
struct rtnetlink_notifier port_notifier;
bool change_error;
};
struct rtnetlink_notifier port_notifier;
bool change_error;
};
@@
-172,7
+176,7
@@
dpif_linux_close(struct dpif *dpif_)
{
struct dpif_linux *dpif = dpif_linux_cast(dpif_);
rtnetlink_notifier_unregister(&dpif->port_notifier);
{
struct dpif_linux *dpif = dpif_linux_cast(dpif_);
rtnetlink_notifier_unregister(&dpif->port_notifier);
- s
vec
_destroy(&dpif->changed_ports);
+ s
hash
_destroy(&dpif->changed_ports);
free(dpif->local_ifname);
close(dpif->fd);
free(dpif);
free(dpif->local_ifname);
close(dpif->fd);
free(dpif);
@@
-330,10
+334,12
@@
dpif_linux_port_poll(const struct dpif *dpif_, char **devnamep)
if (dpif->change_error) {
dpif->change_error = false;
if (dpif->change_error) {
dpif->change_error = false;
- s
vec
_clear(&dpif->changed_ports);
+ s
hash
_clear(&dpif->changed_ports);
return ENOBUFS;
return ENOBUFS;
- } else if (dpif->changed_ports.n) {
- *devnamep = dpif->changed_ports.names[--dpif->changed_ports.n];
+ } else if (!shash_is_empty(&dpif->changed_ports)) {
+ struct shash_node *node = shash_first(&dpif->changed_ports);
+ *devnamep = xstrdup(node->name);
+ shash_delete(&dpif->changed_ports, node);
return 0;
} else {
return EAGAIN;
return 0;
} else {
return EAGAIN;
@@
-344,7
+350,7
@@
static void
dpif_linux_port_poll_wait(const struct dpif *dpif_)
{
struct dpif_linux *dpif = dpif_linux_cast(dpif_);
dpif_linux_port_poll_wait(const struct dpif *dpif_)
{
struct dpif_linux *dpif = dpif_linux_cast(dpif_);
- if (
dpif->changed_ports.n
|| dpif->change_error) {
+ if (
!shash_is_empty(&dpif->changed_ports)
|| dpif->change_error) {
poll_immediate_wake();
} else {
rtnetlink_notifier_wait();
poll_immediate_wake();
} else {
rtnetlink_notifier_wait();
@@
-452,6
+458,18
@@
dpif_linux_set_sflow_probability(struct dpif *dpif_, uint32_t probability)
return do_ioctl(dpif_, ODP_SET_SFLOW_PROBABILITY, &probability);
}
return do_ioctl(dpif_, ODP_SET_SFLOW_PROBABILITY, &probability);
}
+static int
+dpif_linux_queue_to_priority(const struct dpif *dpif OVS_UNUSED,
+ uint32_t queue_id, uint32_t *priority)
+{
+ if (queue_id < 0xf000) {
+ *priority = TC_H_MAKE(1 << 16, queue_id + 1);
+ return 0;
+ } else {
+ return EINVAL;
+ }
+}
+
static int
dpif_linux_recv(struct dpif *dpif_, struct ofpbuf **bufp)
{
static int
dpif_linux_recv(struct dpif *dpif_, struct ofpbuf **bufp)
{
@@
-534,6
+552,7
@@
const struct dpif_class dpif_linux_class = {
dpif_linux_recv_set_mask,
dpif_linux_get_sflow_probability,
dpif_linux_set_sflow_probability,
dpif_linux_recv_set_mask,
dpif_linux_get_sflow_probability,
dpif_linux_set_sflow_probability,
+ dpif_linux_queue_to_priority,
dpif_linux_recv,
dpif_linux_recv_wait,
};
dpif_linux_recv,
dpif_linux_recv_wait,
};
@@
-786,7
+805,7
@@
open_minor(int minor, struct dpif **dpifp)
dpif->local_ifname = NULL;
dpif->minor = minor;
dpif->local_ifindex = 0;
dpif->local_ifname = NULL;
dpif->minor = minor;
dpif->local_ifindex = 0;
- s
vec
_init(&dpif->changed_ports);
+ s
hash
_init(&dpif->changed_ports);
dpif->change_error = false;
*dpifp = &dpif->dpif;
} else {
dpif->change_error = false;
*dpifp = &dpif->dpif;
} else {
@@
-813,10
+832,7
@@
dpif_linux_port_changed(const struct rtnetlink_change *change, void *dpif_)
{
/* Our datapath changed, either adding a new port or deleting an
* existing one. */
{
/* Our datapath changed, either adding a new port or deleting an
* existing one. */
- if (!svec_contains(&dpif->changed_ports, change->ifname)) {
- svec_add(&dpif->changed_ports, change->ifname);
- svec_sort(&dpif->changed_ports);
- }
+ shash_add_once(&dpif->changed_ports, change->ifname, NULL);
}
} else {
dpif->change_error = true;
}
} else {
dpif->change_error = true;