On Thu, Aug 11, 2016 at 03:32:20AM +0800, Binbin Xu wrote:
> If a kernel space vxlan port was added first, and then we try to
> add a user space vxlan port. But unfortunate, the user space
> vxlan port can't be created.
>
> This commit separates kernel space with user space tunnel port,
> for example:
> kernel_space user_space
> vxlan vxlan_sys_4789 vxlan_usr_4789
> gre gre_sys gre_usr
> ......
>
> Signed-off-by: Binbin Xu <[email protected]>
Hi, Binbin Xu.
As I asked before, can you explain how the issue happens?
Thanks.
Cascardo.
> ---
> lib/dpif-netdev.c | 3 ++-
> lib/dpif-netlink.c | 2 +-
> lib/netdev-vport.c | 26 +++++++++++++++-----------
> lib/netdev-vport.h | 2 +-
> lib/netdev.c | 13 ++++++++++---
> lib/netdev.h | 2 +-
> ofproto/ofproto-dpif.c | 15 ++++++++++-----
> vswitchd/bridge.c | 2 +-
> 8 files changed, 41 insertions(+), 24 deletions(-)
>
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index e39362e..3bdf204 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -1343,7 +1343,8 @@ dpif_netdev_port_add(struct dpif *dpif, struct netdev
> *netdev,
> int error;
>
> ovs_mutex_lock(&dp->port_mutex);
> - dpif_port = netdev_vport_get_dpif_port(netdev, namebuf, sizeof namebuf);
> + dpif_port = netdev_vport_get_dpif_port(netdev, "netdev",
> + namebuf, sizeof namebuf);
> if (*port_nop != ODPP_NONE) {
> port_no = *port_nop;
> error = dp_netdev_lookup_port(dp, *port_nop) ? EBUSY : 0;
> diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
> index a39faa2..1b0cd2c 100644
> --- a/lib/dpif-netlink.c
> +++ b/lib/dpif-netlink.c
> @@ -810,7 +810,7 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif, struct
> netdev *netdev,
> {
> const struct netdev_tunnel_config *tnl_cfg;
> char namebuf[NETDEV_VPORT_NAME_BUFSIZE];
> - const char *name = netdev_vport_get_dpif_port(netdev,
> + const char *name = netdev_vport_get_dpif_port(netdev, "netlink",
> namebuf, sizeof namebuf);
> const char *type = netdev_get_type(netdev);
> struct dpif_netlink_vport request, reply;
> diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
> index f5eb76f..e374f9d 100755
> --- a/lib/netdev-vport.c
> +++ b/lib/netdev-vport.c
> @@ -119,16 +119,19 @@ netdev_vport_class_get_dpif_port(const struct
> netdev_class *class)
> }
>
> const char *
> -netdev_vport_get_dpif_port(const struct netdev *netdev,
> +netdev_vport_get_dpif_port(const struct netdev *netdev, const char *dp_type,
> char namebuf[], size_t bufsize)
> {
> const struct netdev_class *class = netdev_get_class(netdev);
> const char *dpif_port = netdev_vport_class_get_dpif_port(class);
> + char *type;
>
> if (!dpif_port) {
> return netdev_get_name(netdev);
> }
>
> + type = !strcmp(dp_type, "netdev") ? "usr" : "sys";
> +
> if (netdev_vport_needs_dst_port(netdev)) {
> const struct netdev_vport *vport = netdev_vport_cast(netdev);
>
> @@ -138,13 +141,14 @@ netdev_vport_get_dpif_port(const struct netdev *netdev,
> * port numbers but assert just in case.
> */
> BUILD_ASSERT(NETDEV_VPORT_NAME_BUFSIZE >= IFNAMSIZ);
> - ovs_assert(strlen(dpif_port) + 6 < IFNAMSIZ);
> - snprintf(namebuf, bufsize, "%s_%d", dpif_port,
> + ovs_assert(strlen(dpif_port) + 10 < IFNAMSIZ);
> + snprintf(namebuf, bufsize, "%s_%s_%d", dpif_port, type,
> ntohs(vport->tnl_cfg.dst_port));
> - return namebuf;
> } else {
> - return dpif_port;
> + snprintf(namebuf, NETDEV_VPORT_NAME_BUFSIZE, "%s_%s",
> + dpif_port, type);
> }
> + return namebuf;
> }
>
> /* Whenever the route-table change number is incremented,
> @@ -890,18 +894,18 @@ netdev_vport_tunnel_register(void)
> /* The name of the dpif_port should be short enough to accomodate adding
> * a port number to the end if one is necessary. */
> static const struct vport_class vport_classes[] = {
> - TUNNEL_CLASS("geneve", "genev_sys", netdev_geneve_build_header,
> + TUNNEL_CLASS("geneve", "genev", netdev_geneve_build_header,
> netdev_tnl_push_udp_header,
> netdev_geneve_pop_header),
> - TUNNEL_CLASS("gre", "gre_sys", netdev_gre_build_header,
> + TUNNEL_CLASS("gre", "gre", netdev_gre_build_header,
> netdev_gre_push_header,
> netdev_gre_pop_header),
> - TUNNEL_CLASS("ipsec_gre", "gre_sys", NULL, NULL, NULL),
> - TUNNEL_CLASS("vxlan", "vxlan_sys", netdev_vxlan_build_header,
> + TUNNEL_CLASS("ipsec_gre", "gre", NULL, NULL, NULL),
> + TUNNEL_CLASS("vxlan", "vxlan", netdev_vxlan_build_header,
> netdev_tnl_push_udp_header,
> netdev_vxlan_pop_header),
> - TUNNEL_CLASS("lisp", "lisp_sys", NULL, NULL, NULL),
> - TUNNEL_CLASS("stt", "stt_sys", NULL, NULL, NULL),
> + TUNNEL_CLASS("lisp", "lisp", NULL, NULL, NULL),
> + TUNNEL_CLASS("stt", "stt", NULL, NULL, NULL),
> };
> static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
>
> diff --git a/lib/netdev-vport.h b/lib/netdev-vport.h
> index 048aa6e..d4c168e 100755
> --- a/lib/netdev-vport.h
> +++ b/lib/netdev-vport.h
> @@ -48,7 +48,7 @@ enum { NETDEV_VPORT_NAME_BUFSIZE = 16 };
> #else
> enum { NETDEV_VPORT_NAME_BUFSIZE = 256 };
> #endif
> -const char *netdev_vport_get_dpif_port(const struct netdev *,
> +const char *netdev_vport_get_dpif_port(const struct netdev *, const char *,
> char namebuf[], size_t bufsize)
> OVS_WARN_UNUSED_RESULT;
>
> diff --git a/lib/netdev.c b/lib/netdev.c
> index 75bf1cb..268185e 100644
> --- a/lib/netdev.c
> +++ b/lib/netdev.c
> @@ -287,16 +287,23 @@ netdev_enumerate_types(struct sset *types)
> *
> * Returns true if there is a name conflict, false otherwise. */
> bool
> -netdev_is_reserved_name(const char *name)
> +netdev_is_reserved_name(const char *name, const char *dp_type)
> OVS_EXCLUDED(netdev_mutex)
> {
> + char namebuf[NETDEV_VPORT_NAME_BUFSIZE];
> + char *type;
> +
> netdev_initialize();
>
> struct netdev_registered_class *rc;
> CMAP_FOR_EACH (rc, cmap_node, &netdev_classes) {
> const char *dpif_port = netdev_vport_class_get_dpif_port(rc->class);
> - if (dpif_port && !strncmp(name, dpif_port, strlen(dpif_port))) {
> - return true;
> + if (dpif_port) {
> + type = !strcmp(dp_type, "netdev") ? "usr" : "sys";
> + snprintf(namebuf, sizeof namebuf, "%s_%s", dpif_port, type);
> + if(!strncmp(name, namebuf, strlen(namebuf))) {
> + return true;
> + }
> }
> }
>
> diff --git a/lib/netdev.h b/lib/netdev.h
> index dc7ede8..26e9d1d 100644
> --- a/lib/netdev.h
> +++ b/lib/netdev.h
> @@ -105,7 +105,7 @@ void netdev_run(void);
> void netdev_wait(void);
>
> void netdev_enumerate_types(struct sset *types);
> -bool netdev_is_reserved_name(const char *name);
> +bool netdev_is_reserved_name(const char *name, const char *dp_type);
>
> int netdev_n_txq(const struct netdev *netdev);
> int netdev_n_rxq(const struct netdev *netdev);
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index fd2c2bd..9d2f2b1 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -552,6 +552,7 @@ type_run(const char *type)
> }
>
> dp_port = netdev_vport_get_dpif_port(iter->up.netdev,
> + ofproto->up.type,
> namebuf, sizeof
> namebuf);
> node = simap_find(&tmp_backers, dp_port);
> if (node) {
> @@ -1771,7 +1772,8 @@ port_construct(struct ofport *port_)
> return 0;
> }
>
> - dp_port_name = netdev_vport_get_dpif_port(netdev, namebuf, sizeof
> namebuf);
> + dp_port_name = netdev_vport_get_dpif_port(netdev, port_->ofproto->type,
> + namebuf, sizeof namebuf);
> error = dpif_port_query_by_name(ofproto->backer->dpif, dp_port_name,
> &dpif_port);
> if (error) {
> @@ -1832,8 +1834,9 @@ port_destruct(struct ofport *port_, bool del)
> xlate_ofport_remove(port);
> xlate_txn_commit();
>
> - dp_port_name = netdev_vport_get_dpif_port(port->up.netdev, namebuf,
> - sizeof namebuf);
> + dp_port_name = netdev_vport_get_dpif_port(port->up.netdev,
> + port_->ofproto->type,
> + namebuf, sizeof namebuf);
> if (del && dpif_port_exists(ofproto->backer->dpif, dp_port_name)) {
> /* The underlying device is still there, so delete it. This
> * happens when the ofproto is being destroyed, since the caller
> @@ -1904,7 +1907,8 @@ port_modified(struct ofport *port_)
> ofproto_dpif_monitor_port_update(port, port->bfd, port->cfm,
> port->lldp, &port->up.pp.hw_addr);
>
> - dp_port_name = netdev_vport_get_dpif_port(netdev, namebuf, sizeof
> namebuf);
> + dp_port_name = netdev_vport_get_dpif_port(netdev, port_->ofproto->type,
> + namebuf, sizeof namebuf);
>
> if (port->is_tunnel) {
> struct ofproto_dpif *ofproto = ofproto_dpif_cast(port->up.ofproto);
> @@ -3485,7 +3489,8 @@ port_add(struct ofproto *ofproto_, struct netdev
> *netdev)
> return 0;
> }
>
> - dp_port_name = netdev_vport_get_dpif_port(netdev, namebuf, sizeof
> namebuf);
> + dp_port_name = netdev_vport_get_dpif_port(netdev, ofproto_->type,
> + namebuf, sizeof namebuf);
> if (!dpif_port_exists(ofproto->backer->dpif, dp_port_name)) {
> odp_port_t port_no = ODPP_NONE;
> int error;
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index ddf1fe5..7961784 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -1744,7 +1744,7 @@ iface_do_create(const struct bridge *br,
> int error;
> const char *type;
>
> - if (netdev_is_reserved_name(iface_cfg->name)) {
> + if (netdev_is_reserved_name(iface_cfg->name, br->type)) {
> VLOG_WARN("could not create interface %s, name is reserved",
> iface_cfg->name);
> error = EINVAL;
> --
> 1.8.3.1
>
> _______________________________________________
> dev mailing list
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev