All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nicolas Dichtel <nicolas.dichtel@6wind.com>
To: Vlad Yasevich <vyasevic@redhat.com>
Cc: netdev@vger.kernel.org, eric.dumazet@gmail.com, davem@davemloft.com
Subject: Re: [RFC PATCH 03/13] net: Add net protocol offload registration infrustructure
Date: Wed, 14 Nov 2012 09:22:30 +0100	[thread overview]
Message-ID: <50A354C6.20805@6wind.com> (raw)
In-Reply-To: <1352856254-29667-4-git-send-email-vyasevic@redhat.com>

Le 14/11/2012 02:24, Vlad Yasevich a écrit :
> Create a new data structure for IPv4 protocols that holds GRO/GSO
> callbacks and a new array to track the protocols that register GRO/GSO.
>
> Signed-off-by: Vlad Yasevich <vyasevic@redhat.com>
> ---
>   include/net/protocol.h |   12 ++++++++++++
>   net/ipv4/af_inet.c     |   12 ++++++++++++
>   net/ipv4/protocol.c    |   22 +++++++++++++++++++++-
>   3 files changed, 45 insertions(+), 1 deletions(-)
>
> diff --git a/include/net/protocol.h b/include/net/protocol.h
> index 929528c..d8ecb17 100644
> --- a/include/net/protocol.h
> +++ b/include/net/protocol.h
> @@ -77,6 +77,15 @@ struct inet6_protocol {
>   #define INET6_PROTO_GSO_EXTHDR	0x4
>   #endif
>
> +struct net_offload {
> +	int			(*gso_send_check)(struct sk_buff *skb);
> +	struct sk_buff	       *(*gso_segment)(struct sk_buff *skb,
> +					       netdev_features_t features);
> +	struct sk_buff	      **(*gro_receive)(struct sk_buff **head,
> +					       struct sk_buff *skb);
> +	int			(*gro_complete)(struct sk_buff *skb);
> +};
> +
>   /* This is used to register socket interfaces for IP protocols.  */
>   struct inet_protosw {
>   	struct list_head list;
> @@ -96,6 +105,7 @@ struct inet_protosw {
>   #define INET_PROTOSW_ICSK      0x04  /* Is this an inet_connection_sock? */
>
>   extern const struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS];
> +extern const struct net_offload __rcu *inet_offloads[MAX_INET_PROTOS];
>
>   #if IS_ENABLED(CONFIG_IPV6)
>   extern const struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS];
> @@ -103,6 +113,8 @@ extern const struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS];
>
>   extern int	inet_add_protocol(const struct net_protocol *prot, unsigned char num);
>   extern int	inet_del_protocol(const struct net_protocol *prot, unsigned char num);
> +extern int	inet_add_offload(const struct net_offload *prot, unsigned char num);
> +extern int	inet_del_offload(const struct net_offload *prot, unsigned char num);
>   extern void	inet_register_protosw(struct inet_protosw *p);
>   extern void	inet_unregister_protosw(struct inet_protosw *p);
>
> diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
> index 4c99c5f..3918d86 100644
> --- a/net/ipv4/af_inet.c
> +++ b/net/ipv4/af_inet.c
> @@ -1566,6 +1566,13 @@ static const struct net_protocol tcp_protocol = {
>   	.netns_ok	=	1,
>   };
>
> +static const struct net_offload tcp_offload = {
> +	.gso_send_check	=	tcp_v4_gso_send_check,
> +	.gso_segment	=	tcp_tso_segment,
> +	.gro_receive	=	tcp4_gro_receive,
> +	.gro_complete	=	tcp4_gro_complete,
> +};
> +
>   static const struct net_protocol udp_protocol = {
>   	.handler =	udp_rcv,
>   	.err_handler =	udp_err,
> @@ -1575,6 +1582,11 @@ static const struct net_protocol udp_protocol = {
>   	.netns_ok =	1,
>   };
>
> +static const struct net_offload udp_offload = {
> +	.gso_send_check = udp4_ufo_send_check,
> +	.gso_segment = udp4_ufo_fragment,
> +};
> +
>   static const struct net_protocol icmp_protocol = {
>   	.handler =	icmp_rcv,
>   	.err_handler =	ping_err,
> diff --git a/net/ipv4/protocol.c b/net/ipv4/protocol.c
> index 8918eff..1278db8 100644
> --- a/net/ipv4/protocol.c
> +++ b/net/ipv4/protocol.c
> @@ -29,6 +29,7 @@
>   #include <net/protocol.h>
>
>   const struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS] __read_mostly;
> +const struct net_offload __rcu *inet_offloads[MAX_INET_PROTOS] __read_mostly;
>
>   /*
>    *	Add a protocol handler to the hash tables
> @@ -41,6 +42,13 @@ int inet_add_protocol(const struct net_protocol *prot, unsigned char protocol)
>   }
>   EXPORT_SYMBOL(inet_add_protocol);
>
> +int inet_add_offload(const struct net_offload *prot, unsigned char protocol)
> +{
> +	return !cmpxchg((const struct net_offload **)&inet_offloads[protocol],
> +			NULL, prot) ? 0 : -1;
> +}
> +EXPORT_SYMBOL(inet_add_offload);
> +
>   /*
>    *	Remove a protocol from the hash tables.
>    */
> @@ -56,4 +64,16 @@ int inet_del_protocol(const struct net_protocol *prot, unsigned char protocol)
>
>   	return ret;
>   }
> -EXPORT_SYMBOL(inet_del_protocol);
This line should probably not be removed ;-)

  reply	other threads:[~2012-11-14  8:22 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-14  1:24 [RFC PATCH 00/13] Always build GSO/GRO functionality into the kernel Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 01/13] net: Add generic packet offload infrastructure Vlad Yasevich
2012-11-14  2:24   ` Eric Dumazet
2012-11-14 13:03     ` Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 02/13] core: Switch to using the new packet offload infrustructure Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 03/13] net: Add net protocol offload registration infrustructure Vlad Yasevich
2012-11-14  8:22   ` Nicolas Dichtel [this message]
2012-11-14 13:08     ` Vlad Yasevich
2012-11-14 23:14   ` Francois Romieu
2012-11-15  2:16     ` Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 04/13] ipv6: Add new offload registration infrastructure Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 05/13] ipv4: Switch to using the new offload infrastructure Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 06/13] ipv6: Switch to using " Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 07/13] ipv6: Separate ipv6 offload support Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 08/13] ipv6: Separate tcp offload functionality Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 09/13] ipv6: Separate out UDP " Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 10/13] ipv6: Move exthdr offload support into separate file Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 11/13] ipv6: Update ipv6 static library with newly needed functions Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 12/13] ipv4: Pull GSO registration out of inet_init() Vlad Yasevich
2012-11-14  1:24 ` [RFC PATCH 13/13] ipv6: Pull IPv6 GSO registration out of the module Vlad Yasevich
2012-11-16 22:04   ` Ben Hutchings
2012-11-14  2:25 ` [RFC PATCH 00/13] Always build GSO/GRO functionality into the kernel Eric Dumazet
2012-11-14 13:10   ` Vlad Yasevich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50A354C6.20805@6wind.com \
    --to=nicolas.dichtel@6wind.com \
    --cc=davem@davemloft.com \
    --cc=eric.dumazet@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=vyasevic@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.