X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fnetdev-linux.c;h=b8d24ed999cad953785f8862d8aa544812221c43;hb=2158888d8d8f3b4c00dcf979390a19fa7fcf7942;hp=e9fabc5b8083b067a23ae94b7405fba5e8c4fe50;hpb=43694e2a8d950f62781ec6dc613b5dac32de35fd;p=sliver-openvswitch.git diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index e9fabc5b8..b8d24ed99 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -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' "+,". A veth may - * be destroyed by using the 'command' "-", where 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)