Re: [PATCH v3 1/4] geneve: Add geneve udp port offload for ethernet devices
On 12/11/2015 7:11 PM, Tom Herbert wrote: On Tue, Dec 8, 2015 at 10:12 AM, Anjali Singhai Jain wrote: Add ndo_ops to add/del UDP ports to a device that supports geneve offload. v3: Add some more comments about the use of the new ndo ops. Signed-off-by: Anjali Singhai Jain Signed-off-by: Kiran Patil --- drivers/net/geneve.c | 23 +++ include/linux/netdevice.h | 21 - 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index de5c30c..b43fd56 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -371,8 +371,11 @@ static struct socket *geneve_create_sock(struct net *net, bool ipv6, static void geneve_notify_add_rx_port(struct geneve_sock *gs) { + struct net_device *dev; struct sock *sk = gs->sock->sk; + struct net *net = sock_net(sk); sa_family_t sa_family = sk->sk_family; + __be16 port = inet_sk(sk)->inet_sport; int err; if (sa_family == AF_INET) { @@ -381,6 +384,14 @@ static void geneve_notify_add_rx_port(struct geneve_sock *gs) pr_warn("geneve: udp_add_offload failed with status %d\n", err); } + + rcu_read_lock(); + for_each_netdev_rcu(net, dev) { + if (dev->netdev_ops->ndo_add_geneve_port) + dev->netdev_ops->ndo_add_geneve_port(dev, sa_family, +port); + } + rcu_read_unlock(); What about IPv6 case? The driver still gets add port calls for IPv6 and can decide to offload L4 RX checksum if the HW is capable. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 1/4] geneve: Add geneve udp port offload for ethernet devices
On Tue, Dec 8, 2015 at 10:12 AM, Anjali Singhai Jain wrote: > Add ndo_ops to add/del UDP ports to a device that supports geneve > offload. > > v3: Add some more comments about the use of the new ndo ops. > > Signed-off-by: Anjali Singhai Jain > Signed-off-by: Kiran Patil > --- > drivers/net/geneve.c | 23 +++ > include/linux/netdevice.h | 21 - > 2 files changed, 43 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c > index de5c30c..b43fd56 100644 > --- a/drivers/net/geneve.c > +++ b/drivers/net/geneve.c > @@ -371,8 +371,11 @@ static struct socket *geneve_create_sock(struct net > *net, bool ipv6, > > static void geneve_notify_add_rx_port(struct geneve_sock *gs) > { > + struct net_device *dev; > struct sock *sk = gs->sock->sk; > + struct net *net = sock_net(sk); > sa_family_t sa_family = sk->sk_family; > + __be16 port = inet_sk(sk)->inet_sport; > int err; > > if (sa_family == AF_INET) { > @@ -381,6 +384,14 @@ static void geneve_notify_add_rx_port(struct geneve_sock > *gs) > pr_warn("geneve: udp_add_offload failed with status > %d\n", > err); > } > + > + rcu_read_lock(); > + for_each_netdev_rcu(net, dev) { > + if (dev->netdev_ops->ndo_add_geneve_port) > + dev->netdev_ops->ndo_add_geneve_port(dev, sa_family, > +port); > + } > + rcu_read_unlock(); What about IPv6 case? > } > > static int geneve_hlen(struct genevehdr *gh) > @@ -521,8 +532,20 @@ static struct geneve_sock *geneve_socket_create(struct > net *net, __be16 port, > > static void geneve_notify_del_rx_port(struct geneve_sock *gs) > { > + struct net_device *dev; > struct sock *sk = gs->sock->sk; > + struct net *net = sock_net(sk); > sa_family_t sa_family = sk->sk_family; > + __be16 port = inet_sk(sk)->inet_sport; > + > + rcu_read_lock(); > + for_each_netdev_rcu(net, dev) { > + if (dev->netdev_ops->ndo_del_geneve_port) > + dev->netdev_ops->ndo_del_geneve_port(dev, sa_family, > +port); > + } > + > + rcu_read_unlock(); > > if (sa_family == AF_INET) > udp_del_offload(&gs->udp_offloads); > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > index 1bb21ff..ff91007 100644 > --- a/include/linux/netdevice.h > +++ b/include/linux/netdevice.h > @@ -1013,6 +1013,20 @@ typedef u16 (*select_queue_fallback_t)(struct > net_device *dev, > * a new port starts listening. The operation is protected by the > * vxlan_net->sock_lock. > * > + * void (*ndo_add_geneve_port)(struct net_device *dev, > + * sa_family_t sa_family, __be16 port); > + * Called by geneve to notiy a driver about the UDP port and socket > + * address family that geneve is listnening to. It is called only when > + * a new port starts listening. The operation is protected by the > + * geneve_net->sock_lock. This should be strictly used by the driver > + * when setting up the device for RX side offloads only. > + * > + * void (*ndo_del_geneve_port)(struct net_device *dev, > + * sa_family_t sa_family, __be16 port); > + * Called by geneve to notify the driver about a UDP port and socket > + * address family that geneve is not listening to anymore. The operation > + * is protected by the geneve_net->sock_lock. > + * > * void (*ndo_del_vxlan_port)(struct net_device *dev, > * sa_family_t sa_family, __be16 port); > * Called by vxlan to notify the driver about a UDP port and socket > @@ -1217,7 +1231,12 @@ struct net_device_ops { > void(*ndo_del_vxlan_port)(struct net_device *dev, > sa_family_t sa_family, > __be16 port); > - > + void(*ndo_add_geneve_port)(struct net_device > *dev, > + sa_family_t sa_family, > + __be16 port); > + void(*ndo_del_geneve_port)(struct net_device > *dev, > + sa_family_t sa_family, > + __be16 port); > void* (*ndo_dfwd_add_station)(struct net_device > *pdev, > struct net_device > *dev); > void(*ndo_dfwd_del_station)(struct net_device > *pdev, > -- > 1.8.1.4 > > -- > To unsubscribe from this list: send the line "unsubscribe netdev" i
Re: [PATCH v3 1/4] geneve: Add geneve udp port offload for ethernet devices
From: Anjali Singhai Jain Date: Tue, 8 Dec 2015 10:12:11 -0800 > @@ -1013,6 +1013,20 @@ typedef u16 (*select_queue_fallback_t)(struct > net_device *dev, > * a new port starts listening. The operation is protected by the > * vxlan_net->sock_lock. > * > + * void (*ndo_add_geneve_port)(struct net_device *dev, > + * sa_family_t sa_family, __be16 port); > + * Called by geneve to notiy a driver about the UDP port and socket "notify" -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v3 1/4] geneve: Add geneve udp port offload for ethernet devices
Add ndo_ops to add/del UDP ports to a device that supports geneve offload. v3: Add some more comments about the use of the new ndo ops. Signed-off-by: Anjali Singhai Jain Signed-off-by: Kiran Patil --- drivers/net/geneve.c | 23 +++ include/linux/netdevice.h | 21 - 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index de5c30c..b43fd56 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -371,8 +371,11 @@ static struct socket *geneve_create_sock(struct net *net, bool ipv6, static void geneve_notify_add_rx_port(struct geneve_sock *gs) { + struct net_device *dev; struct sock *sk = gs->sock->sk; + struct net *net = sock_net(sk); sa_family_t sa_family = sk->sk_family; + __be16 port = inet_sk(sk)->inet_sport; int err; if (sa_family == AF_INET) { @@ -381,6 +384,14 @@ static void geneve_notify_add_rx_port(struct geneve_sock *gs) pr_warn("geneve: udp_add_offload failed with status %d\n", err); } + + rcu_read_lock(); + for_each_netdev_rcu(net, dev) { + if (dev->netdev_ops->ndo_add_geneve_port) + dev->netdev_ops->ndo_add_geneve_port(dev, sa_family, +port); + } + rcu_read_unlock(); } static int geneve_hlen(struct genevehdr *gh) @@ -521,8 +532,20 @@ static struct geneve_sock *geneve_socket_create(struct net *net, __be16 port, static void geneve_notify_del_rx_port(struct geneve_sock *gs) { + struct net_device *dev; struct sock *sk = gs->sock->sk; + struct net *net = sock_net(sk); sa_family_t sa_family = sk->sk_family; + __be16 port = inet_sk(sk)->inet_sport; + + rcu_read_lock(); + for_each_netdev_rcu(net, dev) { + if (dev->netdev_ops->ndo_del_geneve_port) + dev->netdev_ops->ndo_del_geneve_port(dev, sa_family, +port); + } + + rcu_read_unlock(); if (sa_family == AF_INET) udp_del_offload(&gs->udp_offloads); diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 1bb21ff..ff91007 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1013,6 +1013,20 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev, * a new port starts listening. The operation is protected by the * vxlan_net->sock_lock. * + * void (*ndo_add_geneve_port)(struct net_device *dev, + * sa_family_t sa_family, __be16 port); + * Called by geneve to notiy a driver about the UDP port and socket + * address family that geneve is listnening to. It is called only when + * a new port starts listening. The operation is protected by the + * geneve_net->sock_lock. This should be strictly used by the driver + * when setting up the device for RX side offloads only. + * + * void (*ndo_del_geneve_port)(struct net_device *dev, + * sa_family_t sa_family, __be16 port); + * Called by geneve to notify the driver about a UDP port and socket + * address family that geneve is not listening to anymore. The operation + * is protected by the geneve_net->sock_lock. + * * void (*ndo_del_vxlan_port)(struct net_device *dev, * sa_family_t sa_family, __be16 port); * Called by vxlan to notify the driver about a UDP port and socket @@ -1217,7 +1231,12 @@ struct net_device_ops { void(*ndo_del_vxlan_port)(struct net_device *dev, sa_family_t sa_family, __be16 port); - + void(*ndo_add_geneve_port)(struct net_device *dev, + sa_family_t sa_family, + __be16 port); + void(*ndo_del_geneve_port)(struct net_device *dev, + sa_family_t sa_family, + __be16 port); void* (*ndo_dfwd_add_station)(struct net_device *pdev, struct net_device *dev); void(*ndo_dfwd_del_station)(struct net_device *pdev, -- 1.8.1.4 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html