On 16 February 2017 at 14:25, Eric Garver <[email protected]> wrote:
> For out-of-tree datapath, only try genetlink/compat.
> For in-tree kernel datapath, try rtnetlink then genetlink.
>
> Signed-off-by: Eric Garver <[email protected]>
> ---
>  lib/dpif-netlink.c   | 16 +++++++++++++---
>  lib/dpif-rtnetlink.c | 39 +++++++++++++++++++++++++++++++++++++++
>  lib/dpif-rtnetlink.h |  7 +++++++
>  3 files changed, 59 insertions(+), 3 deletions(-)
>
> diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
> index ae8204ffe6e1..991004491ec2 100644
> --- a/lib/dpif-netlink.c
> +++ b/lib/dpif-netlink.c
> @@ -211,6 +211,12 @@ static int ovs_packet_family;
>   * Initialized by dpif_netlink_init(). */
>  static unsigned int ovs_vport_mcgroup;
>
> +/* If true, tunnel devices are created using OVS compat/genetlink.
> + * If false, tunnel devices are created with rtnetlink and using light weight
> + * tunnels. If we fail to create the tunnel the rtnetlink+LWT, then we 
> fallback
> + * to using the compat interface. */
> +static bool ovs_tunnels_out_of_tree = true;
> +
>  static int dpif_netlink_init(void);
>  static int open_dpif(const struct dpif_netlink_dp *, struct dpif **);
>  static uint32_t dpif_netlink_port_get_pid(const struct dpif *,
> @@ -979,11 +985,13 @@ dpif_netlink_port_add(struct dpif *dpif_, struct netdev 
> *netdev,
>                        odp_port_t *port_nop)
>  {
>      struct dpif_netlink *dpif = dpif_netlink_cast(dpif_);
> -    int error;
> +    int error = EOPNOTSUPP;
>
>      fat_rwlock_wrlock(&dpif->upcall_lock);
> -    error = dpif_rtnetlink_port_create_and_add(dpif, netdev, port_nop);
> -    if (error == EOPNOTSUPP) {
> +    if (!ovs_tunnels_out_of_tree) {
> +        error = dpif_rtnetlink_port_create_and_add(dpif, netdev, port_nop);
> +    }
> +    if (error) {
>          error = dpif_netlink_port_add_compat(dpif, netdev, port_nop);
>      }
>      fat_rwlock_unlock(&dpif->upcall_lock);
> @@ -2495,6 +2503,8 @@ dpif_netlink_init(void)
>                                             &ovs_vport_mcgroup);
>          }
>
> +        ovs_tunnels_out_of_tree = dpif_rtnetlink_probe_oot_tunnels();
> +
>          ovsthread_once_done(&once);
>      }
>
> diff --git a/lib/dpif-rtnetlink.c b/lib/dpif-rtnetlink.c
> index 60a5003b88ca..853de6b764e8 100644
> --- a/lib/dpif-rtnetlink.c
> +++ b/lib/dpif-rtnetlink.c
> @@ -474,3 +474,42 @@ dpif_rtnetlink_port_destroy(const char *name, const char 
> *type)
>      }
>      return 0;
>  }
> +
> +/**
> + * This is to probe for whether the modules are out-of-tree (openvswitch) or
> + * in-tree (upstream kernel).

Minor style thing, "this is to" provides no additional information,
it's just language overhead:

/* Probe for whether the modules are out-of-tree (openvswitch) or
in-tree (upstream kernel). */

> + *
> + * We probe for "ovs_geneve" via rtnetlink. As long as this returns something
> + * other than EOPNOTSUPP we know that the module in use is the out-of-tree 
> one.
> + * This will be used to determine what netlink interface to use when creating

...determine *which* netlink interface...

> + * ports; rtnetlink or compat/genetlink.
> + *
> + * See ovs_tunnels_out_of_tree
> + */
> +bool
> +dpif_rtnetlink_probe_oot_tunnels(void)
> +{
> +    struct netdev *netdev = NULL;
> +    bool out_of_tree = false;
> +    int error;
> +
> +    error = netdev_open("ovs-system-probe", "geneve", &netdev);
> +    if (!error) {
> +        error = dpif_rtnetlink_geneve_create_kind(netdev, "ovs_geneve");
> +        if (error != EOPNOTSUPP) {
> +            if (!error) {
> +                char namebuf[NETDEV_VPORT_NAME_BUFSIZE];
> +                const char *dp_port;
> +
> +                dp_port = netdev_vport_get_dpif_port(netdev, namebuf,
> +                                                     sizeof namebuf);
> +                dpif_rtnetlink_geneve_destroy(dp_port);
> +            }
> +            out_of_tree = true;
> +        }
> +        netdev_close(netdev);
> +        error = 0;

I don't think this line is ever used?

> +    }
> +
> +    return out_of_tree;
> +}
> diff --git a/lib/dpif-rtnetlink.h b/lib/dpif-rtnetlink.h
> index 515820f02e66..5bb578c4ac65 100644
> --- a/lib/dpif-rtnetlink.h
> +++ b/lib/dpif-rtnetlink.h
> @@ -24,6 +24,8 @@
>  int dpif_rtnetlink_port_create(struct netdev *netdev);
>  int dpif_rtnetlink_port_destroy(const char *name, const char *type);
>
> +bool dpif_rtnetlink_probe_oot_tunnels(void);
> +
>  #ifndef __linux__
>  /* Dummy implementations for non Linux builds.
>   *
> @@ -41,6 +43,11 @@ static inline int dpif_rtnetlink_port_destroy(const char 
> *name OVS_UNUSED,
>      return EOPNOTSUPP;
>  }
>
> +static inline bool dpif_rtnetlink_probe_oot_tunnels(void)
> +{
> +    return true;
> +}
> +
>  #endif
>
>  #endif /* DPIF_RTNETLINK_H */
> --
> 2.10.0
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to