Blame view

include/linux/inet_lro.h 3.58 KB
71c87e0ce   Jan-Bernd Themann   [NET]: Generic La...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  /*
   *  linux/include/linux/inet_lro.h
   *
   *  Large Receive Offload (ipv4 / tcp)
   *
   *  (C) Copyright IBM Corp. 2007
   *
   *  Authors:
   *       Jan-Bernd Themann <themann@de.ibm.com>
   *       Christoph Raisch <raisch@de.ibm.com>
   *
   *
   * 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, or (at your option)
   * any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
  #ifndef __INET_LRO_H_
  #define __INET_LRO_H_
  
  #include <net/ip.h>
  #include <net/tcp.h>
  
  /*
   * LRO statistics
   */
  
  struct net_lro_stats {
  	unsigned long aggregated;
  	unsigned long flushed;
  	unsigned long no_desc;
  };
  
  /*
   * LRO descriptor for a tcp session
   */
  struct net_lro_desc {
  	struct sk_buff *parent;
  	struct sk_buff *last_skb;
  	struct skb_frag_struct *next_frag;
  	struct iphdr *iph;
  	struct tcphdr *tcph;
71c87e0ce   Jan-Bernd Themann   [NET]: Generic La...
53
  	__wsum  data_csum;
9df7c98a0   Al Viro   inet_lro: trivial...
54
55
  	__be32 tcp_rcv_tsecr;
  	__be32 tcp_rcv_tsval;
f53f4137b   Al Viro   fix endianness bu...
56
  	__be32 tcp_ack;
71c87e0ce   Jan-Bernd Themann   [NET]: Generic La...
57
58
59
60
  	u32 tcp_next_seq;
  	u32 skb_tot_frags_len;
  	u16 ip_tot_len;
  	u16 tcp_saw_tstamp; 		/* timestamps enabled */
9df7c98a0   Al Viro   inet_lro: trivial...
61
  	__be16 tcp_window;
71c87e0ce   Jan-Bernd Themann   [NET]: Generic La...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  	int pkt_aggr_cnt;		/* counts aggregated packets */
  	int vlan_packet;
  	int mss;
  	int active;
  };
  
  /*
   * Large Receive Offload (LRO) Manager
   *
   * Fields must be set by driver
   */
  
  struct net_lro_mgr {
  	struct net_device *dev;
  	struct net_lro_stats stats;
  
  	/* LRO features */
  	unsigned long features;
  #define LRO_F_NAPI            1  /* Pass packets to stack via NAPI */
  #define LRO_F_EXTRACT_VLAN_ID 2  /* Set flag if VLAN IDs are extracted
  				    from received packets and eth protocol
  				    is still ETH_P_8021Q */
251a4b320   Eli Cohen   net/inet_lro: rem...
84
85
86
87
88
  	/*
  	 * Set for generated SKBs that are not added to
  	 * the frag list in fragmented mode
  	 */
  	u32 ip_summed;
71c87e0ce   Jan-Bernd Themann   [NET]: Generic La...
89
90
91
92
93
  	u32 ip_summed_aggr; /* Set in aggregated SKBs: CHECKSUM_UNNECESSARY
  			     * or CHECKSUM_NONE */
  
  	int max_desc; /* Max number of LRO descriptors  */
  	int max_aggr; /* Max number of LRO packets to be aggregated */
621544eb8   Andrew Gallatin   [LRO]: fix lro_ge...
94
95
  	int frag_align_pad; /* Padding required to properly align layer 3
  			     * headers in generated skb when using frags */
71c87e0ce   Jan-Bernd Themann   [NET]: Generic La...
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  	struct net_lro_desc *lro_arr; /* Array of LRO descriptors */
  
  	/*
  	 * Optimized driver functions
  	 *
  	 * get_skb_header: returns tcp and ip header for packet in SKB
  	 */
  	int (*get_skb_header)(struct sk_buff *skb, void **ip_hdr,
  			      void **tcpudp_hdr, u64 *hdr_flags, void *priv);
  
  	/* hdr_flags: */
  #define LRO_IPV4 1 /* ip_hdr is IPv4 header */
  #define LRO_TCP  2 /* tcpudp_hdr is TCP header */
  
  	/*
  	 * get_frag_header: returns mac, tcp and ip header for packet in SKB
  	 *
  	 * @hdr_flags: Indicate what kind of LRO has to be done
  	 *             (IPv4/IPv6/TCP/UDP)
  	 */
  	int (*get_frag_header)(struct skb_frag_struct *frag, void **mac_hdr,
  			       void **ip_hdr, void **tcpudp_hdr, u64 *hdr_flags,
  			       void *priv);
  };
  
  /*
   * Processes a SKB
   *
   * @lro_mgr: LRO manager to use
   * @skb: SKB to aggregate
   * @priv: Private data that may be used by driver functions
   *        (for example get_tcp_ip_hdr)
   */
  
  void lro_receive_skb(struct net_lro_mgr *lro_mgr,
  		     struct sk_buff *skb,
  		     void *priv);
71c87e0ce   Jan-Bernd Themann   [NET]: Generic La...
133
134
135
136
137
  /*
   * Forward all aggregated SKBs held by lro_mgr to network stack
   */
  
  void lro_flush_all(struct net_lro_mgr *lro_mgr);
71c87e0ce   Jan-Bernd Themann   [NET]: Generic La...
138
  #endif