mirror of
https://github.com/openvswitch/ovs
synced 2025-09-02 07:15:17 +00:00
netdev-vport: Build on all platforms.
This patch removes the final bit of linux specific code which prevents building netdev-vport everywhere. With this, other platforms automatically get access to patch ports, and (if their datapath supports it), flow based tunneling. Signed-off-by: Ethan Jackson <ethan@nicira.com>
This commit is contained in:
@@ -91,6 +91,8 @@ lib_libopenvswitch_a_SOURCES = \
|
|||||||
lib/multipath.h \
|
lib/multipath.h \
|
||||||
lib/netdev-dummy.c \
|
lib/netdev-dummy.c \
|
||||||
lib/netdev-provider.h \
|
lib/netdev-provider.h \
|
||||||
|
lib/netdev-vport.c \
|
||||||
|
lib/netdev-vport.h \
|
||||||
lib/netdev.c \
|
lib/netdev.c \
|
||||||
lib/netdev.h \
|
lib/netdev.h \
|
||||||
lib/netflow.h \
|
lib/netflow.h \
|
||||||
@@ -237,8 +239,6 @@ lib_libopenvswitch_a_SOURCES += \
|
|||||||
lib/dpif-linux.h \
|
lib/dpif-linux.h \
|
||||||
lib/netdev-linux.c \
|
lib/netdev-linux.c \
|
||||||
lib/netdev-linux.h \
|
lib/netdev-linux.h \
|
||||||
lib/netdev-vport.c \
|
|
||||||
lib/netdev-vport.h \
|
|
||||||
lib/netlink-notifier.c \
|
lib/netlink-notifier.c \
|
||||||
lib/netlink-notifier.h \
|
lib/netlink-notifier.h \
|
||||||
lib/netlink-protocol.h \
|
lib/netlink-protocol.h \
|
||||||
|
@@ -455,6 +455,28 @@ get_vport_type(const struct dpif_linux_vport *vport)
|
|||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum ovs_vport_type
|
||||||
|
netdev_to_ovs_vport_type(const struct netdev *netdev)
|
||||||
|
{
|
||||||
|
const char *type = netdev_get_type(netdev);
|
||||||
|
|
||||||
|
if (!strcmp(type, "tap") || !strcmp(type, "system")) {
|
||||||
|
return OVS_VPORT_TYPE_NETDEV;
|
||||||
|
} else if (!strcmp(type, "internal")) {
|
||||||
|
return OVS_VPORT_TYPE_INTERNAL;
|
||||||
|
} else if (strstr(type, "gre64")) {
|
||||||
|
return OVS_VPORT_TYPE_GRE64;
|
||||||
|
} else if (strstr(type, "gre")) {
|
||||||
|
return OVS_VPORT_TYPE_GRE;
|
||||||
|
} else if (!strcmp(type, "capwap")) {
|
||||||
|
return OVS_VPORT_TYPE_CAPWAP;
|
||||||
|
} else if (!strcmp(type, "vxlan")) {
|
||||||
|
return OVS_VPORT_TYPE_VXLAN;
|
||||||
|
} else {
|
||||||
|
return OVS_VPORT_TYPE_UNSPEC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev,
|
dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev,
|
||||||
uint32_t *port_nop)
|
uint32_t *port_nop)
|
||||||
@@ -478,7 +500,7 @@ dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev,
|
|||||||
dpif_linux_vport_init(&request);
|
dpif_linux_vport_init(&request);
|
||||||
request.cmd = OVS_VPORT_CMD_NEW;
|
request.cmd = OVS_VPORT_CMD_NEW;
|
||||||
request.dp_ifindex = dpif->dp_ifindex;
|
request.dp_ifindex = dpif->dp_ifindex;
|
||||||
request.type = netdev_vport_get_vport_type(netdev);
|
request.type = netdev_to_ovs_vport_type(netdev);
|
||||||
if (request.type == OVS_VPORT_TYPE_UNSPEC) {
|
if (request.type == OVS_VPORT_TYPE_UNSPEC) {
|
||||||
VLOG_WARN_RL(&error_rl, "%s: cannot create port `%s' because it has "
|
VLOG_WARN_RL(&error_rl, "%s: cannot create port `%s' because it has "
|
||||||
"unsupported type `%s'",
|
"unsupported type `%s'",
|
||||||
|
@@ -324,7 +324,6 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <linux/openvswitch.h>
|
|
||||||
#include "openflow/openflow.h"
|
#include "openflow/openflow.h"
|
||||||
#include "netdev.h"
|
#include "netdev.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
#include "flow.h"
|
#include "flow.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "netdev-provider.h"
|
#include "netdev-provider.h"
|
||||||
|
#include "netdev-vport.h"
|
||||||
#include "odp-util.h"
|
#include "odp-util.h"
|
||||||
#include "ofp-print.h"
|
#include "ofp-print.h"
|
||||||
#include "ofpbuf.h"
|
#include "ofpbuf.h"
|
||||||
@@ -35,6 +36,12 @@
|
|||||||
|
|
||||||
VLOG_DEFINE_THIS_MODULE(netdev_dummy);
|
VLOG_DEFINE_THIS_MODULE(netdev_dummy);
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
#define FREE_BSD 1
|
||||||
|
#else
|
||||||
|
#define FREE_BSD 0
|
||||||
|
#endif
|
||||||
|
|
||||||
struct netdev_dev_dummy {
|
struct netdev_dev_dummy {
|
||||||
struct netdev_dev netdev_dev;
|
struct netdev_dev netdev_dev;
|
||||||
uint8_t hwaddr[ETH_ADDR_LEN];
|
uint8_t hwaddr[ETH_ADDR_LEN];
|
||||||
@@ -530,4 +537,8 @@ netdev_dummy_register(bool override)
|
|||||||
sset_destroy(&types);
|
sset_destroy(&types);
|
||||||
}
|
}
|
||||||
netdev_register_provider(&dummy_class);
|
netdev_register_provider(&dummy_class);
|
||||||
|
|
||||||
|
if (FREE_BSD) {
|
||||||
|
netdev_vport_tunnel_register();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -55,18 +55,19 @@
|
|||||||
#include "hmap.h"
|
#include "hmap.h"
|
||||||
#include "netdev-provider.h"
|
#include "netdev-provider.h"
|
||||||
#include "netdev-vport.h"
|
#include "netdev-vport.h"
|
||||||
#include "netlink.h"
|
|
||||||
#include "netlink-notifier.h"
|
#include "netlink-notifier.h"
|
||||||
#include "netlink-socket.h"
|
#include "netlink-socket.h"
|
||||||
|
#include "netlink.h"
|
||||||
#include "ofpbuf.h"
|
#include "ofpbuf.h"
|
||||||
#include "openflow/openflow.h"
|
#include "openflow/openflow.h"
|
||||||
#include "packets.h"
|
#include "packets.h"
|
||||||
#include "poll-loop.h"
|
#include "poll-loop.h"
|
||||||
#include "rtnetlink-link.h"
|
#include "rtnetlink-link.h"
|
||||||
#include "socket-util.h"
|
|
||||||
#include "shash.h"
|
#include "shash.h"
|
||||||
|
#include "socket-util.h"
|
||||||
#include "sset.h"
|
#include "sset.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
#include "unaligned.h"
|
||||||
#include "vlog.h"
|
#include "vlog.h"
|
||||||
|
|
||||||
VLOG_DEFINE_THIS_MODULE(netdev_linux);
|
VLOG_DEFINE_THIS_MODULE(netdev_linux);
|
||||||
@@ -1309,6 +1310,58 @@ swap_uint64(uint64_t *a, uint64_t *b)
|
|||||||
*b = tmp;
|
*b = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Copies 'src' into 'dst', performing format conversion in the process.
|
||||||
|
*
|
||||||
|
* 'src' is allowed to be misaligned. */
|
||||||
|
static void
|
||||||
|
netdev_stats_from_ovs_vport_stats(struct netdev_stats *dst,
|
||||||
|
const struct ovs_vport_stats *src)
|
||||||
|
{
|
||||||
|
dst->rx_packets = get_unaligned_u64(&src->rx_packets);
|
||||||
|
dst->tx_packets = get_unaligned_u64(&src->tx_packets);
|
||||||
|
dst->rx_bytes = get_unaligned_u64(&src->rx_bytes);
|
||||||
|
dst->tx_bytes = get_unaligned_u64(&src->tx_bytes);
|
||||||
|
dst->rx_errors = get_unaligned_u64(&src->rx_errors);
|
||||||
|
dst->tx_errors = get_unaligned_u64(&src->tx_errors);
|
||||||
|
dst->rx_dropped = get_unaligned_u64(&src->rx_dropped);
|
||||||
|
dst->tx_dropped = get_unaligned_u64(&src->tx_dropped);
|
||||||
|
dst->multicast = 0;
|
||||||
|
dst->collisions = 0;
|
||||||
|
dst->rx_length_errors = 0;
|
||||||
|
dst->rx_over_errors = 0;
|
||||||
|
dst->rx_crc_errors = 0;
|
||||||
|
dst->rx_frame_errors = 0;
|
||||||
|
dst->rx_fifo_errors = 0;
|
||||||
|
dst->rx_missed_errors = 0;
|
||||||
|
dst->tx_aborted_errors = 0;
|
||||||
|
dst->tx_carrier_errors = 0;
|
||||||
|
dst->tx_fifo_errors = 0;
|
||||||
|
dst->tx_heartbeat_errors = 0;
|
||||||
|
dst->tx_window_errors = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_stats_via_vport__(const struct netdev *netdev, struct netdev_stats *stats)
|
||||||
|
{
|
||||||
|
struct dpif_linux_vport reply;
|
||||||
|
struct ofpbuf *buf;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
error = dpif_linux_vport_get(netdev_get_name(netdev), &reply, &buf);
|
||||||
|
if (error) {
|
||||||
|
return error;
|
||||||
|
} else if (!reply.stats) {
|
||||||
|
ofpbuf_delete(buf);
|
||||||
|
return EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
netdev_stats_from_ovs_vport_stats(stats, reply.stats);
|
||||||
|
|
||||||
|
ofpbuf_delete(buf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
get_stats_via_vport(const struct netdev *netdev_,
|
get_stats_via_vport(const struct netdev *netdev_,
|
||||||
struct netdev_stats *stats)
|
struct netdev_stats *stats)
|
||||||
@@ -1320,7 +1373,7 @@ get_stats_via_vport(const struct netdev *netdev_,
|
|||||||
!(netdev_dev->cache_valid & VALID_VPORT_STAT_ERROR)) {
|
!(netdev_dev->cache_valid & VALID_VPORT_STAT_ERROR)) {
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
error = netdev_vport_get_stats(netdev_, stats);
|
error = get_stats_via_vport__(netdev_, stats);
|
||||||
if (error && error != ENOENT) {
|
if (error && error != ENOENT) {
|
||||||
VLOG_WARN_RL(&rl, "%s: obtaining netdev stats via vport failed "
|
VLOG_WARN_RL(&rl, "%s: obtaining netdev stats via vport failed "
|
||||||
"(%s)", netdev_get_name(netdev_), strerror(error));
|
"(%s)", netdev_get_name(netdev_), strerror(error));
|
||||||
|
@@ -601,7 +601,6 @@ const struct netdev_class *netdev_lookup_provider(const char *type);
|
|||||||
extern const struct netdev_class netdev_linux_class;
|
extern const struct netdev_class netdev_linux_class;
|
||||||
extern const struct netdev_class netdev_internal_class;
|
extern const struct netdev_class netdev_internal_class;
|
||||||
extern const struct netdev_class netdev_tap_class;
|
extern const struct netdev_class netdev_tap_class;
|
||||||
extern const struct netdev_class netdev_patch_class;
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
extern const struct netdev_class netdev_bsd_class;
|
extern const struct netdev_class netdev_bsd_class;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -21,8 +21,6 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <linux/openvswitch.h>
|
|
||||||
#include <linux/rtnetlink.h>
|
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
@@ -30,22 +28,15 @@
|
|||||||
#include "daemon.h"
|
#include "daemon.h"
|
||||||
#include "dirs.h"
|
#include "dirs.h"
|
||||||
#include "dpif.h"
|
#include "dpif.h"
|
||||||
#include "dpif-linux.h"
|
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "hmap.h"
|
#include "hmap.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "netdev-linux.h"
|
|
||||||
#include "netdev-provider.h"
|
#include "netdev-provider.h"
|
||||||
#include "netlink.h"
|
|
||||||
#include "netlink-notifier.h"
|
|
||||||
#include "netlink-socket.h"
|
|
||||||
#include "ofpbuf.h"
|
#include "ofpbuf.h"
|
||||||
#include "openvswitch/tunnel.h"
|
|
||||||
#include "packets.h"
|
#include "packets.h"
|
||||||
#include "route-table.h"
|
#include "route-table.h"
|
||||||
#include "shash.h"
|
#include "shash.h"
|
||||||
#include "socket-util.h"
|
#include "socket-util.h"
|
||||||
#include "unaligned.h"
|
|
||||||
#include "vlog.h"
|
#include "vlog.h"
|
||||||
|
|
||||||
VLOG_DEFINE_THIS_MODULE(netdev_vport);
|
VLOG_DEFINE_THIS_MODULE(netdev_vport);
|
||||||
@@ -69,7 +60,6 @@ struct netdev_dev_vport {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct vport_class {
|
struct vport_class {
|
||||||
enum ovs_vport_type type;
|
|
||||||
const char *dpif_port;
|
const char *dpif_port;
|
||||||
struct netdev_class netdev_class;
|
struct netdev_class netdev_class;
|
||||||
};
|
};
|
||||||
@@ -111,26 +101,13 @@ get_netdev_tunnel_config(const struct netdev_dev *netdev_dev)
|
|||||||
return &netdev_dev_vport_cast(netdev_dev)->tnl_cfg;
|
return &netdev_dev_vport_cast(netdev_dev)->tnl_cfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ovs_vport_type
|
|
||||||
netdev_vport_get_vport_type(const struct netdev *netdev)
|
|
||||||
{
|
|
||||||
const struct netdev_dev *dev = netdev_get_dev(netdev);
|
|
||||||
const struct netdev_class *class = netdev_dev_get_class(dev);
|
|
||||||
|
|
||||||
return (is_vport_class(class) ? vport_class_cast(class)->type
|
|
||||||
: class == &netdev_internal_class ? OVS_VPORT_TYPE_INTERNAL
|
|
||||||
: (class == &netdev_linux_class ||
|
|
||||||
class == &netdev_tap_class) ? OVS_VPORT_TYPE_NETDEV
|
|
||||||
: OVS_VPORT_TYPE_UNSPEC);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
netdev_vport_is_patch(const struct netdev *netdev)
|
netdev_vport_is_patch(const struct netdev *netdev)
|
||||||
{
|
{
|
||||||
const struct netdev_dev *dev = netdev_get_dev(netdev);
|
const struct netdev_dev *dev = netdev_get_dev(netdev);
|
||||||
const struct netdev_class *class = netdev_dev_get_class(dev);
|
const struct netdev_class *class = netdev_dev_get_class(dev);
|
||||||
|
|
||||||
return class->get_config == get_patch_config;
|
return class->get_config == get_patch_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
@@ -205,58 +182,6 @@ netdev_vport_get_etheraddr(const struct netdev *netdev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copies 'src' into 'dst', performing format conversion in the process.
|
|
||||||
*
|
|
||||||
* 'src' is allowed to be misaligned. */
|
|
||||||
static void
|
|
||||||
netdev_stats_from_ovs_vport_stats(struct netdev_stats *dst,
|
|
||||||
const struct ovs_vport_stats *src)
|
|
||||||
{
|
|
||||||
dst->rx_packets = get_unaligned_u64(&src->rx_packets);
|
|
||||||
dst->tx_packets = get_unaligned_u64(&src->tx_packets);
|
|
||||||
dst->rx_bytes = get_unaligned_u64(&src->rx_bytes);
|
|
||||||
dst->tx_bytes = get_unaligned_u64(&src->tx_bytes);
|
|
||||||
dst->rx_errors = get_unaligned_u64(&src->rx_errors);
|
|
||||||
dst->tx_errors = get_unaligned_u64(&src->tx_errors);
|
|
||||||
dst->rx_dropped = get_unaligned_u64(&src->rx_dropped);
|
|
||||||
dst->tx_dropped = get_unaligned_u64(&src->tx_dropped);
|
|
||||||
dst->multicast = 0;
|
|
||||||
dst->collisions = 0;
|
|
||||||
dst->rx_length_errors = 0;
|
|
||||||
dst->rx_over_errors = 0;
|
|
||||||
dst->rx_crc_errors = 0;
|
|
||||||
dst->rx_frame_errors = 0;
|
|
||||||
dst->rx_fifo_errors = 0;
|
|
||||||
dst->rx_missed_errors = 0;
|
|
||||||
dst->tx_aborted_errors = 0;
|
|
||||||
dst->tx_carrier_errors = 0;
|
|
||||||
dst->tx_fifo_errors = 0;
|
|
||||||
dst->tx_heartbeat_errors = 0;
|
|
||||||
dst->tx_window_errors = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
netdev_vport_get_stats(const struct netdev *netdev, struct netdev_stats *stats)
|
|
||||||
{
|
|
||||||
struct dpif_linux_vport reply;
|
|
||||||
struct ofpbuf *buf;
|
|
||||||
int error;
|
|
||||||
|
|
||||||
error = dpif_linux_vport_get(netdev_get_name(netdev), &reply, &buf);
|
|
||||||
if (error) {
|
|
||||||
return error;
|
|
||||||
} else if (!reply.stats) {
|
|
||||||
ofpbuf_delete(buf);
|
|
||||||
return EOPNOTSUPP;
|
|
||||||
}
|
|
||||||
|
|
||||||
netdev_stats_from_ovs_vport_stats(stats, reply.stats);
|
|
||||||
|
|
||||||
ofpbuf_delete(buf);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
tunnel_get_status(const struct netdev *netdev, struct smap *smap)
|
tunnel_get_status(const struct netdev *netdev, struct smap *smap)
|
||||||
{
|
{
|
||||||
@@ -721,29 +646,23 @@ get_stats(const struct netdev *netdev, struct netdev_stats *stats)
|
|||||||
\
|
\
|
||||||
netdev_vport_change_seq
|
netdev_vport_change_seq
|
||||||
|
|
||||||
#define TUNNEL_CLASS(NAME, VPORT_TYPE, DPIF_PORT) \
|
#define TUNNEL_CLASS(NAME, DPIF_PORT) \
|
||||||
{ VPORT_TYPE, DPIF_PORT, \
|
{ DPIF_PORT, \
|
||||||
{ NAME, VPORT_FUNCTIONS(get_tunnel_config, \
|
{ NAME, VPORT_FUNCTIONS(get_tunnel_config, \
|
||||||
set_tunnel_config, \
|
set_tunnel_config, \
|
||||||
get_netdev_tunnel_config, \
|
get_netdev_tunnel_config, \
|
||||||
tunnel_get_status) }}
|
tunnel_get_status) }}
|
||||||
|
|
||||||
void
|
void
|
||||||
netdev_vport_register(void)
|
netdev_vport_tunnel_register(void)
|
||||||
{
|
{
|
||||||
static const struct vport_class vport_classes[] = {
|
static const struct vport_class vport_classes[] = {
|
||||||
TUNNEL_CLASS("gre", OVS_VPORT_TYPE_GRE, "gre_system"),
|
TUNNEL_CLASS("gre", "gre_system"),
|
||||||
TUNNEL_CLASS("ipsec_gre", OVS_VPORT_TYPE_GRE, "gre_system"),
|
TUNNEL_CLASS("ipsec_gre", "gre_system"),
|
||||||
TUNNEL_CLASS("gre64", OVS_VPORT_TYPE_GRE64, "gre64_system"),
|
TUNNEL_CLASS("gre64", "gre64_system"),
|
||||||
TUNNEL_CLASS("ipsec_gre64", OVS_VPORT_TYPE_GRE64, "gre64_system"),
|
TUNNEL_CLASS("ipsec_gre64", "gre64_system"),
|
||||||
TUNNEL_CLASS("capwap", OVS_VPORT_TYPE_CAPWAP, "capwap_system"),
|
TUNNEL_CLASS("capwap", "capwap_system"),
|
||||||
TUNNEL_CLASS("vxlan", OVS_VPORT_TYPE_VXLAN, "vxlan_system"),
|
TUNNEL_CLASS("vxlan", "vxlan_system")
|
||||||
|
|
||||||
{ OVS_VPORT_TYPE_UNSPEC, NULL,
|
|
||||||
{ "patch", VPORT_FUNCTIONS(get_patch_config,
|
|
||||||
set_patch_config,
|
|
||||||
NULL,
|
|
||||||
NULL) }},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
@@ -752,3 +671,15 @@ netdev_vport_register(void)
|
|||||||
netdev_register_provider(&vport_classes[i].netdev_class);
|
netdev_register_provider(&vport_classes[i].netdev_class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
netdev_vport_patch_register(void)
|
||||||
|
{
|
||||||
|
static const struct vport_class patch_class =
|
||||||
|
{ NULL,
|
||||||
|
{ "patch", VPORT_FUNCTIONS(get_patch_config,
|
||||||
|
set_patch_config,
|
||||||
|
NULL,
|
||||||
|
NULL) }};
|
||||||
|
netdev_register_provider(&patch_class.netdev_class);
|
||||||
|
}
|
||||||
|
@@ -24,13 +24,11 @@ struct dpif_flow_stats;
|
|||||||
struct netdev;
|
struct netdev;
|
||||||
struct netdev_stats;
|
struct netdev_stats;
|
||||||
|
|
||||||
void netdev_vport_register(void);
|
void netdev_vport_tunnel_register(void);
|
||||||
|
void netdev_vport_patch_register(void);
|
||||||
|
|
||||||
enum ovs_vport_type netdev_vport_get_vport_type(const struct netdev *);
|
|
||||||
bool netdev_vport_is_patch(const struct netdev *);
|
bool netdev_vport_is_patch(const struct netdev *);
|
||||||
|
|
||||||
int netdev_vport_get_stats(const struct netdev *, struct netdev_stats *);
|
|
||||||
|
|
||||||
const char *netdev_vport_patch_peer(const struct netdev *netdev);
|
const char *netdev_vport_patch_peer(const struct netdev *netdev);
|
||||||
|
|
||||||
void netdev_vport_inc_rx(const struct netdev *,
|
void netdev_vport_inc_rx(const struct netdev *,
|
||||||
|
@@ -73,12 +73,13 @@ netdev_initialize(void)
|
|||||||
inited = true;
|
inited = true;
|
||||||
|
|
||||||
fatal_signal_add_hook(close_all_netdevs, NULL, NULL, true);
|
fatal_signal_add_hook(close_all_netdevs, NULL, NULL, true);
|
||||||
|
netdev_vport_patch_register();
|
||||||
|
|
||||||
#ifdef LINUX_DATAPATH
|
#ifdef LINUX_DATAPATH
|
||||||
netdev_register_provider(&netdev_linux_class);
|
netdev_register_provider(&netdev_linux_class);
|
||||||
netdev_register_provider(&netdev_internal_class);
|
netdev_register_provider(&netdev_internal_class);
|
||||||
netdev_register_provider(&netdev_tap_class);
|
netdev_register_provider(&netdev_tap_class);
|
||||||
netdev_vport_register();
|
netdev_vport_tunnel_register();
|
||||||
#endif
|
#endif
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
netdev_register_provider(&netdev_tap_class);
|
netdev_register_provider(&netdev_tap_class);
|
||||||
|
Reference in New Issue
Block a user