73cc19f155
This patch adds GRO support for IPv4. The criteria for merging is more stringent than LRO, in particular, we require all fields in the IP header to be identical except for the length, ID and checksum. In addition, the ID must form an arithmetic sequence with a difference of one. The ID requirement might seem overly strict, however, most hardware TSO solutions already obey this rule. Linux itself also obeys this whether GSO is in use or not. In future we could relax this rule by storing the IDs (or rather making sure that we don't drop them when pulling the aggregate skb's tail). Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
114 lines
3.8 KiB
C
114 lines
3.8 KiB
C
/*
|
|
* INET An implementation of the TCP/IP protocol suite for the LINUX
|
|
* operating system. INET is implemented using the BSD Socket
|
|
* interface as the means of communication with the user level.
|
|
*
|
|
* Definitions for the protocol dispatcher.
|
|
*
|
|
* Version: @(#)protocol.h 1.0.2 05/07/93
|
|
*
|
|
* Author: Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*
|
|
* Changes:
|
|
* Alan Cox : Added a name field and a frag handler
|
|
* field for later.
|
|
* Alan Cox : Cleaned up, and sorted types.
|
|
* Pedro Roque : inet6 protocols
|
|
*/
|
|
|
|
#ifndef _PROTOCOL_H
|
|
#define _PROTOCOL_H
|
|
|
|
#include <linux/in6.h>
|
|
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
|
|
#include <linux/ipv6.h>
|
|
#endif
|
|
|
|
#define MAX_INET_PROTOS 256 /* Must be a power of 2 */
|
|
|
|
|
|
/* This is used to register protocols. */
|
|
struct net_protocol {
|
|
int (*handler)(struct sk_buff *skb);
|
|
void (*err_handler)(struct sk_buff *skb, u32 info);
|
|
int (*gso_send_check)(struct sk_buff *skb);
|
|
struct sk_buff *(*gso_segment)(struct sk_buff *skb,
|
|
int features);
|
|
struct sk_buff **(*gro_receive)(struct sk_buff **head,
|
|
struct sk_buff *skb);
|
|
int (*gro_complete)(struct sk_buff *skb);
|
|
unsigned int no_policy:1,
|
|
netns_ok:1;
|
|
};
|
|
|
|
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
|
|
struct inet6_protocol
|
|
{
|
|
int (*handler)(struct sk_buff *skb);
|
|
|
|
void (*err_handler)(struct sk_buff *skb,
|
|
struct inet6_skb_parm *opt,
|
|
int type, int code, int offset,
|
|
__be32 info);
|
|
|
|
int (*gso_send_check)(struct sk_buff *skb);
|
|
struct sk_buff *(*gso_segment)(struct sk_buff *skb,
|
|
int features);
|
|
|
|
unsigned int flags; /* INET6_PROTO_xxx */
|
|
};
|
|
|
|
#define INET6_PROTO_NOPOLICY 0x1
|
|
#define INET6_PROTO_FINAL 0x2
|
|
/* This should be set for any extension header which is compatible with GSO. */
|
|
#define INET6_PROTO_GSO_EXTHDR 0x4
|
|
#endif
|
|
|
|
/* This is used to register socket interfaces for IP protocols. */
|
|
struct inet_protosw {
|
|
struct list_head list;
|
|
|
|
/* These two fields form the lookup key. */
|
|
unsigned short type; /* This is the 2nd argument to socket(2). */
|
|
unsigned short protocol; /* This is the L4 protocol number. */
|
|
|
|
struct proto *prot;
|
|
const struct proto_ops *ops;
|
|
|
|
int capability; /* Which (if any) capability do
|
|
* we need to use this socket
|
|
* interface?
|
|
*/
|
|
char no_check; /* checksum on rcv/xmit/none? */
|
|
unsigned char flags; /* See INET_PROTOSW_* below. */
|
|
};
|
|
#define INET_PROTOSW_REUSE 0x01 /* Are ports automatically reusable? */
|
|
#define INET_PROTOSW_PERMANENT 0x02 /* Permanent protocols are unremovable. */
|
|
#define INET_PROTOSW_ICSK 0x04 /* Is this an inet_connection_sock? */
|
|
|
|
extern struct net_protocol *inet_protocol_base;
|
|
extern struct net_protocol *inet_protos[MAX_INET_PROTOS];
|
|
|
|
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
|
|
extern struct inet6_protocol *inet6_protos[MAX_INET_PROTOS];
|
|
#endif
|
|
|
|
extern int inet_add_protocol(struct net_protocol *prot, unsigned char num);
|
|
extern int inet_del_protocol(struct net_protocol *prot, unsigned char num);
|
|
extern void inet_register_protosw(struct inet_protosw *p);
|
|
extern void inet_unregister_protosw(struct inet_protosw *p);
|
|
|
|
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
|
|
extern int inet6_add_protocol(struct inet6_protocol *prot, unsigned char num);
|
|
extern int inet6_del_protocol(struct inet6_protocol *prot, unsigned char num);
|
|
extern int inet6_register_protosw(struct inet_protosw *p);
|
|
extern void inet6_unregister_protosw(struct inet_protosw *p);
|
|
#endif
|
|
|
|
#endif /* _PROTOCOL_H */
|