On Tue, Mar 14, 2017 at 01:09:20PM -0700, Joe Stringer wrote:
> On 16 February 2017 at 14:25, Eric Garver <[email protected]> wrote:
> > In order to be able to add those tunnels, we need to add code to create
> > the tunnels and add them as NETDEV vports. And when there is no support
> > to create them, we need to fallback to compatibility code and add them
> > as tunnel vports.
> >
> > When removing those tunnels, we need to remove the interfaces as well,
> > and detecting the right type might be important, at least to distinguish
> > the tunnel vports that we should remove and the interfaces that we
> > shouldn't.
> >
> > Co-authored-by: Thadeu Lima de Souza Cascardo <[email protected]>
> > Signed-off-by: Thadeu Lima de Souza Cascardo <[email protected]>
> > Signed-off-by: Eric Garver <[email protected]>
> > ---
> > lib/automake.mk | 3 +++
> > lib/dpif-netlink.c | 58
> > ++++++++++++++++++++++++++++++++++++++++++++------
> > lib/dpif-netlink.h | 2 ++
> > lib/dpif-rtnetlink.c | 60
> > ++++++++++++++++++++++++++++++++++++++++++++++++++++
> > lib/dpif-rtnetlink.h | 46 ++++++++++++++++++++++++++++++++++++++++
> > 5 files changed, 162 insertions(+), 7 deletions(-)
> > create mode 100644 lib/dpif-rtnetlink.c
> > create mode 100644 lib/dpif-rtnetlink.h
> >
> > diff --git a/lib/automake.mk b/lib/automake.mk
> > index abc9d0d5cc4e..288a828d9007 100644
> > --- a/lib/automake.mk
> > +++ b/lib/automake.mk
> > @@ -351,6 +351,8 @@ if LINUX
> > lib_libopenvswitch_la_SOURCES += \
> > lib/dpif-netlink.c \
> > lib/dpif-netlink.h \
> > + lib/dpif-rtnetlink.c \
> > + lib/dpif-rtnetlink.h \
> > lib/if-notifier.c \
> > lib/if-notifier.h \
> > lib/netdev-linux.c \
> > @@ -381,6 +383,7 @@ if WIN32
> > lib_libopenvswitch_la_SOURCES += \
> > lib/dpif-netlink.c \
> > lib/dpif-netlink.h \
> > + lib/dpif-rtnetlink.h \
> > lib/netdev-windows.c \
> > lib/netlink-conntrack.c \
> > lib/netlink-conntrack.h \
> > diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
> > index a882ea683114..ae8204ffe6e1 100644
> > --- a/lib/dpif-netlink.c
> > +++ b/lib/dpif-netlink.c
> > @@ -34,6 +34,7 @@
> >
> > #include "bitmap.h"
> > #include "dpif-provider.h"
> > +#include "dpif-rtnetlink.h"
> > #include "openvswitch/dynamic-string.h"
> > #include "flow.h"
> > #include "fat-rwlock.h"
> > @@ -221,6 +222,9 @@ static void dpif_netlink_vport_to_ofpbuf(const struct
> > dpif_netlink_vport *,
> > struct ofpbuf *);
> > static int dpif_netlink_vport_from_ofpbuf(struct dpif_netlink_vport *,
> > const struct ofpbuf *);
> > +static int
> > +dpif_netlink_port_query__(const struct dpif_netlink *dpif, odp_port_t
> > port_no,
> > + const char *port_name, struct dpif_port
> > *dpif_port);
> >
> > static struct dpif_netlink *
> > dpif_netlink_cast(const struct dpif *dpif)
> > @@ -780,7 +784,7 @@ get_vport_type(const struct dpif_netlink_vport *vport)
> > return "unknown";
> > }
> >
> > -static enum ovs_vport_type
> > +enum ovs_vport_type
> > netdev_to_ovs_vport_type(const char *type)
> > {
> > if (!strcmp(type, "tap") || !strcmp(type, "system")) {
> > @@ -942,8 +946,33 @@ dpif_netlink_port_add_compat(struct dpif_netlink
> > *dpif, struct netdev *netdev,
> >
> > }
> >
> > +static int
> > +dpif_rtnetlink_port_create_and_add(struct dpif_netlink *dpif,
> > + struct netdev *netdev, odp_port_t
> > *port_nop)
> > + OVS_REQ_WRLOCK(dpif->upcall_lock)
> > +{
> > + int error;
> > + char namebuf[NETDEV_VPORT_NAME_BUFSIZE];
> > + const char *name = netdev_vport_get_dpif_port(netdev,
> > + namebuf, sizeof namebuf);
> >
> > + error = dpif_rtnetlink_port_create(netdev);
> > + if (error) {
> > + if (error != EOPNOTSUPP) {
> > + VLOG_DBG("Failed to create %s with rtnetlink. error = %d",
> > + netdev_get_name(netdev), error);
> > + }
> > + return error;
> > + }
> >
> > + error = dpif_netlink_port_add__(dpif, name, OVS_VPORT_TYPE_NETDEV,
> > NULL,
> > + port_nop);
> > + if (error) {
> > + VLOG_DBG("failed to add port, destroying: %d", error);
> > + dpif_rtnetlink_port_destroy(name, netdev_get_type(netdev));
> > + }
> > + return error;
> > +}
>
> If these non-EOPNOTSUPP errors could show up in real environments, it
> might be nice to have them at a higher level than debug to highlight
> that something went wrong. If so, they should also be ratelimited by
> using VLOG_FOO_RL(&rl, ...)
True. An example would be a tunnel parameter that an older kernel
doesn't support, e.g. VXLAN GBP. I'll change them to VLOG_INFO_RL().
> >
> > static int
> > dpif_netlink_port_add(struct dpif *dpif_, struct netdev *netdev,
> > @@ -953,7 +982,10 @@ dpif_netlink_port_add(struct dpif *dpif_, struct
> > netdev *netdev,
> > int error;
> >
> > fat_rwlock_wrlock(&dpif->upcall_lock);
> > - error = dpif_netlink_port_add_compat(dpif, netdev, port_nop);
> > + error = dpif_rtnetlink_port_create_and_add(dpif, netdev, port_nop);
> > + if (error == EOPNOTSUPP) {
> > + error = dpif_netlink_port_add_compat(dpif, netdev, port_nop);
> > + }
> > fat_rwlock_unlock(&dpif->upcall_lock);
> >
> > return error;
> > @@ -964,19 +996,23 @@ dpif_netlink_port_del__(struct dpif_netlink *dpif,
> > odp_port_t port_no)
> > OVS_REQ_WRLOCK(dpif->upcall_lock)
> > {
> > struct dpif_netlink_vport vport;
> > + struct dpif_port dpif_port;
> > int error;
> >
> > + error = dpif_netlink_port_query__(dpif, port_no, NULL, &dpif_port);
> > + if (error) {
> > + return error;
> > + }
> > +
> > dpif_netlink_vport_init(&vport);
> > vport.cmd = OVS_VPORT_CMD_DEL;
> > vport.dp_ifindex = dpif->dp_ifindex;
> > vport.port_no = port_no;
> > #ifdef _WIN32
> > - struct dpif_port temp_dpif_port;
> > - dpif_netlink_port_query__(dpif, port_no, NULL, &temp_dpif_port);
> > - if (!strcmp(temp_dpif_port.type, "internal")) {
> > - if (!delete_wmi_port(temp_dpif_port.name)){
> > + if (!strcmp(dpif_port.type, "internal")) {
> > + if (!delete_wmi_port(dpif_port.name)) {
> > VLOG_ERR("Could not delete wmi port with name: %s",
> > - temp_dpif_port.name);
> > + dpif_port.name);
> > };
> > }
> > #endif
> > @@ -984,6 +1020,14 @@ dpif_netlink_port_del__(struct dpif_netlink *dpif,
> > odp_port_t port_no)
> >
> > vport_del_channels(dpif, port_no);
> >
> > + if (!error) {
> > + error = dpif_rtnetlink_port_destroy(dpif_port.name,
> > dpif_port.type);
> > + if (error == EOPNOTSUPP) {
> > + error = 0;
> > + }
> > + }
> > + dpif_port_destroy(&dpif_port);
> > +
> > return error;
> > }
> >
> > diff --git a/lib/dpif-netlink.h b/lib/dpif-netlink.h
> > index 6d1505713a72..568b81441ddc 100644
> > --- a/lib/dpif-netlink.h
> > +++ b/lib/dpif-netlink.h
> > @@ -58,4 +58,6 @@ int dpif_netlink_vport_get(const char *name, struct
> > dpif_netlink_vport *reply,
> >
> > bool dpif_netlink_is_internal_device(const char *name);
> >
> > +enum ovs_vport_type netdev_to_ovs_vport_type(const char *type);
> > +
> > #endif /* dpif-netlink.h */
> > diff --git a/lib/dpif-rtnetlink.c b/lib/dpif-rtnetlink.c
> > new file mode 100644
> > index 000000000000..b309c88d187a
> > --- /dev/null
> > +++ b/lib/dpif-rtnetlink.c
> > @@ -0,0 +1,60 @@
> > +/*
> > + * Copyright (c) 2017 Red Hat, Inc.
> > + *
> > + * Licensed under the Apache License, Version 2.0 (the "License");
> > + * you may not use this file except in compliance with the License.
> > + * You may obtain a copy of the License at:
> > + *
> > + * http://www.apache.org/licenses/LICENSE-2.0
> > + *
> > + * Unless required by applicable law or agreed to in writing, software
> > + * distributed under the License is distributed on an "AS IS" BASIS,
> > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> > + * See the License for the specific language governing permissions and
> > + * limitations under the License.
> > + */
> > +
> > +#include <config.h>
> > +
> > +#include "dpif-rtnetlink.h"
> > +
> > +#include "dpif-netlink.h"
>
> Usually, #includes within the lib/ directory will be consecutive
> without whitespace separation.
Many files separate the header file of the same name.
e.g.
#include <config.h>
#include <thisfilesheader.h>
#include ... OS HEADERS ...
#include ... OVS HEADERS ...
>
> > +
> > +
> > +int
> > +dpif_rtnetlink_port_create(struct netdev *netdev)
> > +{
> > + switch (netdev_to_ovs_vport_type(netdev_get_type(netdev))) {
> > + case OVS_VPORT_TYPE_VXLAN:
> > + case OVS_VPORT_TYPE_GRE:
> > + case OVS_VPORT_TYPE_GENEVE:
> > + case OVS_VPORT_TYPE_NETDEV:
> > + case OVS_VPORT_TYPE_INTERNAL:
> > + case OVS_VPORT_TYPE_LISP:
> > + case OVS_VPORT_TYPE_STT:
> > + case OVS_VPORT_TYPE_UNSPEC:
> > + case __OVS_VPORT_TYPE_MAX:
> > + default:
> > + return EOPNOTSUPP;
> > + }
> > + return 0;
> > +}
> > +
> > +int
> > +dpif_rtnetlink_port_destroy(const char *name OVS_UNUSED, const char *type)
> > +{
> > + switch (netdev_to_ovs_vport_type(type)) {
> > + case OVS_VPORT_TYPE_VXLAN:
> > + case OVS_VPORT_TYPE_GRE:
> > + case OVS_VPORT_TYPE_GENEVE:
> > + case OVS_VPORT_TYPE_NETDEV:
> > + case OVS_VPORT_TYPE_INTERNAL:
> > + case OVS_VPORT_TYPE_LISP:
> > + case OVS_VPORT_TYPE_STT:
> > + case OVS_VPORT_TYPE_UNSPEC:
> > + case __OVS_VPORT_TYPE_MAX:
> > + default:
> > + return EOPNOTSUPP;
> > + }
> > + return 0;
> > +}
> > diff --git a/lib/dpif-rtnetlink.h b/lib/dpif-rtnetlink.h
> > new file mode 100644
> > index 000000000000..56ab63532829
> > --- /dev/null
> > +++ b/lib/dpif-rtnetlink.h
> > @@ -0,0 +1,46 @@
> > +/*
> > + * Copyright (c) 2017 Red Hat, Inc.
> > + *
> > + * Licensed under the Apache License, Version 2.0 (the "License");
> > + * you may not use this file except in compliance with the License.
> > + * You may obtain a copy of the License at:
> > + *
> > + * http://www.apache.org/licenses/LICENSE-2.0
> > + *
> > + * Unless required by applicable law or agreed to in writing, software
> > + * distributed under the License is distributed on an "AS IS" BASIS,
> > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> > + * See the License for the specific language governing permissions and
> > + * limitations under the License.
> > + */
> > +
> > +#ifndef DPIF_RTNETLINK_H
> > +#define DPIF_RTNETLINK_H 1
> > +
> > +#include <errno.h>
> > +
> > +#include "netdev.h"
> > +
>
> Perhaps here, you could put the comment from below, eg
>
> /* Declare these functions to keep sparse happy. */
> > +int dpif_rtnetlink_port_create(struct netdev *netdev);
> > +int dpif_rtnetlink_port_destroy(const char *name OVS_UNUSED, const char
> > *type);
> > +
> > +#ifndef __linux__
> > +/* Dummy implementations for non Linux builds.
> > + *
> > + * NOTE: declaration above are for all platforms to keep sparse happy.
>
> Then, this can reduce to a regular one-line comment (and it's clearer
> what the comments refer to).
Will do.
> > + */
> > +
> > +static inline int dpif_rtnetlink_port_create(struct netdev *netdev
> > OVS_UNUSED)
> > +{
> > + return EOPNOTSUPP;
> > +}
> > +
> > +static inline int dpif_rtnetlink_port_destroy(const char *name OVS_UNUSED,
> > + const char *type OVS_UNUSED)
> > +{
> > + return EOPNOTSUPP;
> > +}
> > +
> > +#endif
> > +
> > +#endif /* DPIF_RTNETLINK_H */
> > --
> > 2.10.0
> >
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev