mirror of
https://github.com/openvswitch/ovs
synced 2025-10-25 15:07:05 +00:00
patch: Remove veth driver.
Now that we have a new patch implementation, remove the veth driver and its userspace components. Then rename 'patchnew' to 'patch'. The new implementation is a drop-in replacement for the old one.
This commit is contained in:
@@ -90,10 +90,6 @@ struct tap_state {
|
||||
int fd;
|
||||
};
|
||||
|
||||
struct patch_state {
|
||||
char *peer;
|
||||
};
|
||||
|
||||
struct netdev_dev_linux {
|
||||
struct netdev_dev netdev_dev;
|
||||
|
||||
@@ -115,7 +111,6 @@ struct netdev_dev_linux {
|
||||
|
||||
union {
|
||||
struct tap_state tap;
|
||||
struct patch_state patch;
|
||||
} state;
|
||||
};
|
||||
|
||||
@@ -243,123 +238,6 @@ netdev_linux_cache_cb(const struct rtnetlink_change *change,
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
if_up(const char *name)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
|
||||
strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
|
||||
ifr.ifr_flags = IFF_UP;
|
||||
|
||||
if (ioctl(af_inet_sock, SIOCSIFFLAGS, &ifr) == -1) {
|
||||
VLOG_DBG_RL(&rl, "%s: failed to bring device up: %s",
|
||||
name, strerror(errno));
|
||||
return errno;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* A veth may be created using the 'command' "+<name>,<peer>". A veth may
|
||||
* be destroyed by using the 'command' "-<name>", where <name> can be
|
||||
* either side of the device.
|
||||
*/
|
||||
static int
|
||||
modify_veth(const char *format, ...)
|
||||
{
|
||||
FILE *veth_file;
|
||||
va_list args;
|
||||
int retval;
|
||||
|
||||
veth_file = fopen("/sys/class/net/veth_pairs", "w");
|
||||
if (!veth_file) {
|
||||
VLOG_WARN_RL(&rl, "could not open veth device. Are you running a "
|
||||
"supported XenServer with the kernel module loaded?");
|
||||
return ENODEV;
|
||||
}
|
||||
setvbuf(veth_file, NULL, _IONBF, 0);
|
||||
|
||||
va_start(args, format);
|
||||
retval = vfprintf(veth_file, format, args);
|
||||
va_end(args);
|
||||
|
||||
fclose(veth_file);
|
||||
if (retval < 0) {
|
||||
VLOG_WARN_RL(&rl, "could not destroy patch: %s", strerror(errno));
|
||||
return errno;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
create_patch(const char *name, const char *peer)
|
||||
{
|
||||
int retval;
|
||||
struct netdev_dev *peer_nd;
|
||||
|
||||
|
||||
/* Only create the veth if the peer didn't already do it. */
|
||||
peer_nd = netdev_dev_from_name(peer);
|
||||
if (peer_nd) {
|
||||
if (!strcmp("patch", netdev_dev_get_type(peer_nd))) {
|
||||
struct netdev_dev_linux *ndl = netdev_dev_linux_cast(peer_nd);
|
||||
if (!strcmp(name, ndl->state.patch.peer)) {
|
||||
return 0;
|
||||
} else {
|
||||
VLOG_WARN_RL(&rl, "peer '%s' already paired with '%s'",
|
||||
peer, ndl->state.patch.peer);
|
||||
return EINVAL;
|
||||
}
|
||||
} else {
|
||||
VLOG_WARN_RL(&rl, "peer '%s' exists and is not a patch", peer);
|
||||
return EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
retval = modify_veth("+%s,%s", name, peer);
|
||||
if (retval) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
retval = if_up(name);
|
||||
if (retval) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
retval = if_up(peer);
|
||||
if (retval) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
setup_patch(const char *name, const struct shash *args, char **peer_)
|
||||
{
|
||||
const char *peer;
|
||||
|
||||
peer = shash_find_data(args, "peer");
|
||||
if (!peer) {
|
||||
VLOG_WARN("patch type requires valid 'peer' argument");
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
if (shash_count(args) > 1) {
|
||||
VLOG_WARN("patch type takes only a 'peer' argument");
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
if (strlen(peer) >= IFNAMSIZ) {
|
||||
VLOG_WARN_RL(&rl, "patch 'peer' arg too long");
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
*peer_ = xstrdup(peer);
|
||||
return create_patch(name, peer);
|
||||
}
|
||||
|
||||
/* Creates the netdev device of 'type' with 'name'. */
|
||||
static int
|
||||
netdev_linux_create_system(const char *name, const char *type OVS_UNUSED,
|
||||
@@ -444,28 +322,6 @@ error:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int
|
||||
netdev_linux_create_patch(const char *name, const char *type OVS_UNUSED,
|
||||
const struct shash *args, struct netdev_dev **netdev_devp)
|
||||
{
|
||||
struct netdev_dev_linux *netdev_dev;
|
||||
char *peer = NULL;
|
||||
int error;
|
||||
|
||||
error = setup_patch(name, args, &peer);
|
||||
if (error) {
|
||||
free(peer);
|
||||
return error;
|
||||
}
|
||||
|
||||
netdev_dev = xzalloc(sizeof *netdev_dev);
|
||||
netdev_dev->state.patch.peer = peer;
|
||||
netdev_dev_init(&netdev_dev->netdev_dev, name, &netdev_patch_class);
|
||||
*netdev_devp = &netdev_dev->netdev_dev;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_tap(struct netdev_dev_linux *netdev_dev)
|
||||
{
|
||||
@@ -476,19 +332,6 @@ destroy_tap(struct netdev_dev_linux *netdev_dev)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_patch(struct netdev_dev_linux *netdev_dev)
|
||||
{
|
||||
const char *name = netdev_dev_get_name(&netdev_dev->netdev_dev);
|
||||
struct patch_state *state = &netdev_dev->state.patch;
|
||||
|
||||
/* Only destroy veth if 'peer' doesn't exist as an existing netdev. */
|
||||
if (!netdev_dev_from_name(state->peer)) {
|
||||
modify_veth("-%s", name);
|
||||
}
|
||||
free(state->peer);
|
||||
}
|
||||
|
||||
/* Destroys the netdev device 'netdev_dev_'. */
|
||||
static void
|
||||
netdev_linux_destroy(struct netdev_dev *netdev_dev_)
|
||||
@@ -504,8 +347,6 @@ netdev_linux_destroy(struct netdev_dev *netdev_dev_)
|
||||
}
|
||||
} else if (!strcmp(type, "tap")) {
|
||||
destroy_tap(netdev_dev);
|
||||
} else if (!strcmp(type, "patch")) {
|
||||
destroy_patch(netdev_dev);
|
||||
}
|
||||
|
||||
free(netdev_dev);
|
||||
@@ -1844,55 +1685,6 @@ const struct netdev_class netdev_tap_class = {
|
||||
netdev_linux_poll_remove,
|
||||
};
|
||||
|
||||
const struct netdev_class netdev_patch_class = {
|
||||
"patch",
|
||||
|
||||
netdev_linux_init,
|
||||
netdev_linux_run,
|
||||
netdev_linux_wait,
|
||||
|
||||
netdev_linux_create_patch,
|
||||
netdev_linux_destroy,
|
||||
NULL, /* reconfigure */
|
||||
|
||||
netdev_linux_open,
|
||||
netdev_linux_close,
|
||||
|
||||
NULL, /* enumerate */
|
||||
|
||||
netdev_linux_recv,
|
||||
netdev_linux_recv_wait,
|
||||
netdev_linux_drain,
|
||||
|
||||
netdev_linux_send,
|
||||
netdev_linux_send_wait,
|
||||
|
||||
netdev_linux_set_etheraddr,
|
||||
netdev_linux_get_etheraddr,
|
||||
netdev_linux_get_mtu,
|
||||
netdev_linux_get_ifindex,
|
||||
netdev_linux_get_carrier,
|
||||
netdev_linux_get_stats,
|
||||
NULL, /* set_stats */
|
||||
|
||||
netdev_linux_get_features,
|
||||
netdev_linux_set_advertisements,
|
||||
netdev_linux_get_vlan_vid,
|
||||
netdev_linux_set_policing,
|
||||
|
||||
netdev_linux_get_in4,
|
||||
netdev_linux_set_in4,
|
||||
netdev_linux_get_in6,
|
||||
netdev_linux_add_router,
|
||||
netdev_linux_get_next_hop,
|
||||
netdev_linux_arp_lookup,
|
||||
|
||||
netdev_linux_update_flags,
|
||||
|
||||
netdev_linux_poll_add,
|
||||
netdev_linux_poll_remove,
|
||||
};
|
||||
|
||||
|
||||
static int
|
||||
get_stats_via_netlink(int ifindex, struct netdev_stats *stats)
|
||||
|
||||
Reference in New Issue
Block a user