xref: /wlan-driver/qca-wifi-host-cmn/qdf/inc/qdf_lro.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2015-2017 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: Large Receive Offload API
22*5113495bSYour Name  * This file defines the Large receive offload API.
23*5113495bSYour Name  */
24*5113495bSYour Name #ifndef _QDF_LRO_H
25*5113495bSYour Name #define _QDF_LRO_H
26*5113495bSYour Name 
27*5113495bSYour Name #include <qdf_nbuf.h>
28*5113495bSYour Name #include <i_qdf_lro.h>
29*5113495bSYour Name 
30*5113495bSYour Name /**
31*5113495bSYour Name  * typedef qdf_lro_ctx_t - Platform independent LRO context abstraction
32*5113495bSYour Name  */
33*5113495bSYour Name typedef __qdf_lro_ctx_t qdf_lro_ctx_t;
34*5113495bSYour Name 
35*5113495bSYour Name /**
36*5113495bSYour Name  * struct qdf_lro_info - LRO information
37*5113495bSYour Name  * @iph: IP header
38*5113495bSYour Name  * @tcph: TCP header
39*5113495bSYour Name  */
40*5113495bSYour Name struct qdf_lro_info {
41*5113495bSYour Name 	uint8_t *iph;
42*5113495bSYour Name 	uint8_t *tcph;
43*5113495bSYour Name };
44*5113495bSYour Name 
45*5113495bSYour Name #if defined(FEATURE_LRO)
46*5113495bSYour Name 
47*5113495bSYour Name /**
48*5113495bSYour Name  * qdf_lro_init() - LRO initialization function
49*5113495bSYour Name  *
50*5113495bSYour Name  * Return: LRO context
51*5113495bSYour Name  */
52*5113495bSYour Name qdf_lro_ctx_t qdf_lro_init(void);
53*5113495bSYour Name 
54*5113495bSYour Name /**
55*5113495bSYour Name  * qdf_lro_deinit() - LRO deinitialization function
56*5113495bSYour Name  * @lro_ctx: LRO context
57*5113495bSYour Name  *
58*5113495bSYour Name  * Return: nothing
59*5113495bSYour Name  */
60*5113495bSYour Name void qdf_lro_deinit(qdf_lro_ctx_t lro_ctx);
61*5113495bSYour Name 
62*5113495bSYour Name /**
63*5113495bSYour Name  *  qdf_lro_get_info() - Update the LRO information
64*5113495bSYour Name  *
65*5113495bSYour Name  * @lro_ctx: LRO context
66*5113495bSYour Name  * @nbuf: network buffer
67*5113495bSYour Name  * @info: LRO related information passed in by the caller
68*5113495bSYour Name  * @plro_desc: lro information returned as output
69*5113495bSYour Name  *
70*5113495bSYour Name  * Look-up the LRO descriptor based on the LRO information and
71*5113495bSYour Name  * the network buffer provided. Update the skb cb with the
72*5113495bSYour Name  * descriptor found
73*5113495bSYour Name  *
74*5113495bSYour Name  * Return: true: LRO eligible false: LRO ineligible
75*5113495bSYour Name  */
76*5113495bSYour Name bool qdf_lro_get_info(qdf_lro_ctx_t lro_ctx, qdf_nbuf_t nbuf,
77*5113495bSYour Name 						 struct qdf_lro_info *info,
78*5113495bSYour Name 						 void **plro_desc);
79*5113495bSYour Name 
80*5113495bSYour Name /**
81*5113495bSYour Name  * qdf_lro_flush_pkt() - function to flush the LRO flow
82*5113495bSYour Name  * @info: LRO related information passed by the caller
83*5113495bSYour Name  * @lro_ctx: LRO context
84*5113495bSYour Name  *
85*5113495bSYour Name  * Flush all the packets aggregated in the LRO manager for the
86*5113495bSYour Name  * flow indicated by the TCP and IP header
87*5113495bSYour Name  *
88*5113495bSYour Name  * Return: none
89*5113495bSYour Name  */
90*5113495bSYour Name void qdf_lro_flush_pkt(qdf_lro_ctx_t lro_ctx,
91*5113495bSYour Name 		       struct qdf_lro_info *info);
92*5113495bSYour Name 
93*5113495bSYour Name /**
94*5113495bSYour Name  * qdf_lro_flush() - LRO flush API
95*5113495bSYour Name  * @lro_ctx: LRO context
96*5113495bSYour Name  *
97*5113495bSYour Name  * Flush all the packets aggregated in the LRO manager for all
98*5113495bSYour Name  * the flows
99*5113495bSYour Name  *
100*5113495bSYour Name  * Return: none
101*5113495bSYour Name  */
102*5113495bSYour Name void qdf_lro_flush(qdf_lro_ctx_t lro_ctx);
103*5113495bSYour Name 
104*5113495bSYour Name /**
105*5113495bSYour Name  * qdf_lro_desc_free() - Free the LRO descriptor
106*5113495bSYour Name  * @lro_ctx: LRO context
107*5113495bSYour Name  * @data: LRO descriptor
108*5113495bSYour Name  *
109*5113495bSYour Name  * Return the LRO descriptor to the free pool
110*5113495bSYour Name  *
111*5113495bSYour Name  * Return: none
112*5113495bSYour Name  */
113*5113495bSYour Name void qdf_lro_desc_free(qdf_lro_ctx_t lro_ctx, void *data);
114*5113495bSYour Name 
115*5113495bSYour Name #else
116*5113495bSYour Name 
qdf_lro_init(void)117*5113495bSYour Name static inline qdf_lro_ctx_t qdf_lro_init(void)
118*5113495bSYour Name {
119*5113495bSYour Name 	return NULL;
120*5113495bSYour Name }
121*5113495bSYour Name 
qdf_lro_deinit(qdf_lro_ctx_t lro_ctx)122*5113495bSYour Name static inline void qdf_lro_deinit(qdf_lro_ctx_t lro_ctx)
123*5113495bSYour Name {
124*5113495bSYour Name }
125*5113495bSYour Name 
qdf_lro_flush(qdf_lro_ctx_t lro_ctx)126*5113495bSYour Name static inline void qdf_lro_flush(qdf_lro_ctx_t lro_ctx)
127*5113495bSYour Name {
128*5113495bSYour Name }
129*5113495bSYour Name #endif /* FEATURE_LRO */
130*5113495bSYour Name #endif
131