[ovs-dev] [PATCHv3.1] Add support for LISP tunneling

Jesse Gross jesse at nicira.com
Wed Feb 20 22:50:06 UTC 2013


On Wed, Feb 20, 2013 at 2:33 AM, Lorand Jakab <lojakab at cisco.com> wrote:
> LISP is an experimental layer 3 tunneling protocol, described in RFC
> 6830.  This patch adds support for LISP tunneling.  Since LISP
> encapsulated packets do not carry an Ethernet header, it is removed
> before encapsulation, and added with hardcoded source and destination
> MAC addresses after decapsulation.  The harcoded MAC chosen for this
> purpose is the locally administered address 02:00:00:00:00:00.  Flow
> actions can be used to rewrite this MAC for correct reception.  As such,
> this patch is intended to be used for static network configurations, or
> with a LISP capable controller.
>
> Signed-off-by: Lorand Jakab <lojakab at cisco.com>
> Signed-off-by: Kyle Mestery <kmestery at cisco.com>

I'm still getting some sparse warnings, can you take a look?:

  CHECK   /home/jgross/openvswitch/datapath/linux/vport-lisp.c
/home/jgross/openvswitch/datapath/linux/vport-lisp.c:177:18: warning:
restricted __be64 degrades to integer
/home/jgross/openvswitch/datapath/linux/vport-lisp.c:177:51: warning:
restricted __be64 degrades to integer
/home/jgross/openvswitch/datapath/linux/vport-lisp.c:178:18: warning:
restricted __be64 degrades to integer
/home/jgross/openvswitch/datapath/linux/vport-lisp.c:177:80: warning:
incorrect type in return expression (different base types)
/home/jgross/openvswitch/datapath/linux/vport-lisp.c:177:80:
expected restricted __be64
/home/jgross/openvswitch/datapath/linux/vport-lisp.c:177:80:    got
unsigned long long

> diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c
> new file mode 100644
> index 0000000..14060f1
> --- /dev/null
> +++ b/datapath/vport-lisp.c
> +/* Called with rcu_read_lock and BH disabled. */
> +static int lisp_rcv(struct sock *sk, struct sk_buff *skb)
[...]
> +       /* Add Ethernet header */
> +       skb_push(skb, ETH_HLEN);
> +
> +       ethh = (struct ethhdr *)skb->data;

Did you mention that you were going to combine these lines?

> diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
> index 88817ac..ddb9094 100644
> --- a/lib/netdev-vport.c
> +++ b/lib/netdev-vport.c
> +static bool
> +netdev_vport_is_lisp(const struct netdev *netdev)
> +{
> +    const struct netdev_dev *dev = netdev_get_dev(netdev);
> +    const struct netdev_class *class = netdev_dev_get_class(dev);
> +    const char *type = netdev_dev_get_type(dev);
> +
> +    return (class->get_config == get_tunnel_config
> +            && !strcmp("lisp", type));
> +}
> +
> +static bool
> +netdev_vport_needs_port_number(const struct netdev *netdev)
> +{
> +    return (netdev_vport_is_vxlan(netdev) ||
> +            netdev_vport_is_lisp(netdev));
> +}

It might make sense to combine these into a single function.
Hopefully, we don't need a lot of special casing for different types
otherwise.

> @@ -318,7 +339,7 @@ set_tunnel_config(struct netdev_dev *dev_, const struct smap *args)
>      ipsec_mech_set = false;
>      memset(&tnl_cfg, 0, sizeof tnl_cfg);
>
> -    needs_dst_port = !strcmp(type, "vxlan");
> +    needs_dst_port = !strcmp(type, "vxlan") || !strcmp(type, "lisp");

Can we use the new netdev_vport_needs_port_number() here?



More information about the dev mailing list