struct netdev_class netdev_class;
};
-static int netdev_vport_create(const struct netdev_class *, const char *,
- struct netdev **);
+static int netdev_vport_construct(struct netdev *);
static int get_patch_config(const struct netdev *, struct smap *args);
static int get_tunnel_config(const struct netdev *, struct smap *args);
static void netdev_vport_poll_notify(struct netdev_vport *);
static bool
is_vport_class(const struct netdev_class *class)
{
- return class->create == netdev_vport_create;
+ return class->construct == netdev_vport_construct;
}
static const struct vport_class *
sizeof namebuf));
}
+static struct netdev *
+netdev_vport_alloc(void)
+{
+ struct netdev_vport *netdev = xzalloc(sizeof *netdev);
+ return &netdev->up;
+}
+
static int
-netdev_vport_create(const struct netdev_class *netdev_class, const char *name,
- struct netdev **netdevp)
+netdev_vport_construct(struct netdev *netdev_)
{
- struct netdev_vport *dev;
+ struct netdev_vport *netdev = netdev_vport_cast(netdev_);
- dev = xzalloc(sizeof *dev);
- netdev_init(&dev->up, name, netdev_class);
- dev->change_seq = 1;
- eth_addr_random(dev->etheraddr);
+ netdev->change_seq = 1;
+ eth_addr_random(netdev->etheraddr);
- *netdevp = &dev->up;
route_table_register();
return 0;
}
static void
-netdev_vport_destroy(struct netdev *netdev_)
+netdev_vport_destruct(struct netdev *netdev_)
{
struct netdev_vport *netdev = netdev_vport_cast(netdev_);
route_table_unregister();
free(netdev->peer);
+}
+
+static void
+netdev_vport_dealloc(struct netdev *netdev_)
+{
+ struct netdev_vport *netdev = netdev_vport_cast(netdev_);
free(netdev);
}
}
if (tnl_cfg.ipsec) {
+ static struct ovs_mutex mutex = OVS_MUTEX_INITIALIZER;
static pid_t pid = 0;
+
+ ovs_mutex_lock(&mutex);
if (pid <= 0) {
char *file_name = xasprintf("%s/%s", ovs_rundir(),
"ovs-monitor-ipsec.pid");
pid = read_pidfile(file_name);
free(file_name);
}
+ ovs_mutex_unlock(&mutex);
if (pid < 0) {
VLOG_ERR("%s: IPsec requires the ovs-monitor-ipsec daemon",
\f
/* Code specific to patch ports. */
-const char *
-netdev_vport_patch_peer(const struct netdev *netdev)
+/* If 'netdev' is a patch port, returns the name of its peer as a malloc()'d
+ * string that the caller must free.
+ *
+ * If 'netdev' is not a patch port, returns NULL. */
+char *
+netdev_vport_patch_peer(const struct netdev *netdev_)
{
- return (netdev_vport_is_patch(netdev)
- ? netdev_vport_cast(netdev)->peer
- : NULL);
+ char *peer = NULL;
+
+ if (netdev_vport_is_patch(netdev_)) {
+ struct netdev_vport *netdev = netdev_vport_cast(netdev_);
+ if (netdev->peer) {
+ peer = xstrdup(netdev->peer);
+ }
+ }
+
+ return peer;
}
void
netdev_vport_run, \
netdev_vport_wait, \
\
- netdev_vport_create, \
- netdev_vport_destroy, \
+ netdev_vport_alloc, \
+ netdev_vport_construct, \
+ netdev_vport_destruct, \
+ netdev_vport_dealloc, \
GET_CONFIG, \
SET_CONFIG, \
GET_TUNNEL_CONFIG, \
\
- NULL, /* rx_open */ \
- \
NULL, /* send */ \
NULL, /* send_wait */ \
\
\
netdev_vport_update_flags, \
\
- netdev_vport_change_seq
+ netdev_vport_change_seq, \
+ \
+ NULL, /* rx_alloc */ \
+ NULL, /* rx_construct */ \
+ NULL, /* rx_destruct */ \
+ NULL, /* rx_dealloc */ \
+ NULL, /* rx_recv */ \
+ NULL, /* rx_wait */ \
+ NULL, /* rx_drain */
#define TUNNEL_CLASS(NAME, DPIF_PORT) \
{ DPIF_PORT, \