1 /*
2  * Copyright 2022, Cypress Semiconductor Corporation (an Infineon company)
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 /** @file whd_network_types.h
19  *  Prototypes of functions corresponding to Buffer and Network Interface
20  *
21  *  This file provides prototypes for functions which allows different functionalities related to:
22  *      - Buffer Interface: Allocate and release a packet buffer, Retrieve the current pointer and size of a packet buffer, etc.
23  *      - Network Interface: Called by WHD to pass received data to the network stack, to send an ethernet frame to WHD, etc.
24  */
25 #include "whd.h"
26 
27 #ifndef INC_WHD_NETWORK_TYPES_H_
28 #define INC_WHD_NETWORK_TYPES_H_
29 
30 #ifdef __cplusplus
31 extern "C"
32 {
33 #endif
34 
35 /******************************************************
36 *                  Constants
37 ******************************************************/
38 /** @addtogroup buffif WHD Buffer Interface API
39  * Allows WHD to perform buffer related operations like, allocating, releasing, retrieving the current pointer of and size of a packet buffer.
40  *  @{
41  */
42 
43 /**
44  * Indicates transmit/receive direction that the packet buffer has
45  * been used for. This is needed if tx/rx pools are separate.
46  */
47 typedef enum
48 {
49     WHD_NETWORK_TX, /**< Transmit direction */
50     WHD_NETWORK_RX  /**< Recieve direction */
51 } whd_buffer_dir_t;
52 
53 /**
54  * Allows WHD to perform buffer related operations like, allocating, releasing, retrieving the current pointer of and size of a packet buffer.
55  */
56 struct whd_buffer_funcs
57 {
58     /** Allocates a packet buffer
59      *
60      *  Implemented in the port layer interface which is specific to the
61      *  buffering scheme in use.
62      *  Attempts to allocate a packet buffer of the size requested. It can do this
63      *  by allocating a pre-existing packet from a pool, using a static buffer,
64      *  or by dynamically allocating memory. The method of allocation does not
65      *  concern WHD, however it must match the way the network stack expects packet
66      *  buffers to be allocated. Usually WHD requires packet of size of WHD_LINK_MTU
67      *  which includes the MTU, other other various header. Refer to whd_types.h
68      *  to find the size of WHD_LINK_MTU
69      *
70      *  @param buffer      A pointer which receives the allocated packet buffer handle
71      *  @param direction   Indicates transmit/receive direction that the packet buffer is
72      *                     used for. This may be needed if tx/rx pools are separate.
73      *  @param size        The number of bytes to allocate.
74      *  @param timeout_ms  Maximum period to block for available buffer
75      *
76      *  @return            WHD_SUCCESS or error code
77      *
78      */
79     whd_result_t (*whd_host_buffer_get)(whd_buffer_t *buffer, whd_buffer_dir_t direction, uint16_t size,
80                                         uint32_t timeout_ms);
81 
82     /** Releases a packet buffer
83      *
84      *  Implemented in the port layer interface, which will be specific to the
85      *  buffering scheme in use.
86      *  This function is used by WHD to indicate that it no longer requires
87      *  a packet buffer. The buffer can then be released back into a pool for
88      *  reuse, or the dynamically allocated memory can be freed, according to
89      *  how the packet was allocated.
90      *  Returns void since WHD cannot do anything about failures
91      *
92      *  @param buffer     The handle of the packet buffer to be released
93      *  @param direction  Indicates transmit/receive direction that the packet buffer has
94      *                     been used for. This might be needed if tx/rx pools are separate.
95      *
96      */
97     void (*whd_buffer_release)(whd_buffer_t buffer, whd_buffer_dir_t direction);
98 
99     /** Retrieves the current pointer of a packet buffer
100      *
101      *  Implemented in the port layer interface which is specific to the
102      *  buffering scheme in use.
103      *  Since packet buffers usually need to be created with space at the
104      *  front for additional headers, this function allows WHD to get
105      *  the current 'front' location pointer.
106      *
107      *  @param buffer  The handle of the packet buffer whose pointer is to be retrieved
108      *
109      *  @return        The packet buffer's current pointer.
110      */
111     uint8_t *(*whd_buffer_get_current_piece_data_pointer)(whd_buffer_t buffer);
112 
113     /** Retrieves the size of a packet buffer
114      *
115      *  Implemented in the port layer interface which is specific to the
116      *  buffering scheme in use.
117      *  Since packet buffers usually need to be created with space at the
118      *  front for additional headers, the memory block use to contain a packet buffer
119      *  will often be larger than the current size of the packet buffer data.
120      *  This function allows WHD to retrieve the current size of a packet buffer's data.
121      *
122      *  @param buffer   The handle of the packet buffer whose size is to be retrieved
123      *
124      *  @return         The size of the packet buffer.
125      */
126     uint16_t (*whd_buffer_get_current_piece_size)(whd_buffer_t buffer);
127 
128     /** Sets the current size of a WHD packet
129      *
130      *  Implemented in the port layer interface which is specific to the
131      *  buffering scheme in use.
132      *  This function sets the current length of a WHD packet buffer
133      *
134      *  @param buffer  The packet to be modified
135      *  @param size    The new size of the packet buffer
136      *
137      *  @return        WHD_SUCCESS or error code
138      */
139     whd_result_t (*whd_buffer_set_size)(whd_buffer_t buffer, uint16_t size);
140 
141     /** Moves the current pointer of a packet buffer
142      *
143      *  Implemented in the port layer interface which is specific to the buffering scheme in use.
144      *
145      *  Since packet buffers usually need to be created with space at the front for additional headers,
146      *  this function allows WHD to move  the current 'front' location pointer so that it has space to
147      *  add headers to transmit packets, and so that the network stack does not see the internal WHD
148      *  headers on received packets.
149      *
150      *  @param buffer             A pointer to the handle of the current packet buffer for which the
151      *                            current pointer will be moved. On return this may contain a pointer
152      *                            to a newly allocated packet buffer which has been daisy chained to
153      *                            the front of the given packet buffer. This would be the case if the given packet
154      *                            buffer  didn't have enough space at the front.
155      *  @param add_remove_amount  This is the number of bytes to move the current pointer of the packet
156      *                            buffer - a negative value increases the space for headers at the front
157      *                            of the packet, a positive value decreases the space.
158      *
159      *  @return                   WHD_SUCCESS or error code
160      */
161     whd_result_t (*whd_buffer_add_remove_at_front)(whd_buffer_t *buffer, int32_t add_remove_amount);
162 };
163 /*  @} */
164 
165 /** @addtogroup netif WHD Network Interface API
166  *  Allows WHD to pass received data to the network stack, to send an ethernet frame to WHD, etc.
167  *  @{
168  */
169 
170 /**
171  * Contains functions which allows WHD to pass received data to the network stack, to send an ethernet frame to WHD, etc
172  */
173 struct whd_netif_funcs
174 {
175     /** Called by WHD to pass received data to the network stack
176      *
177      *
178      *  Packets received from the Wi-Fi network by WHD are forwarded to by calling function ptr which
179      *  must be implemented in the network interface. Ethernet headers
180      *  are present at the start of these packet buffers.
181      *
182      *  This function is called asynchronously in the context of the
183      *  WHD thread whenever new data has arrived.
184      *  Packet buffers are allocated within WHD, and ownership is transferred
185      *  to the network stack. The network stack or application is thus
186      *  responsible for releasing the packet buffers.
187      *  Most packet buffering systems have a pointer to the 'current point' within
188      *  the packet buffer. When this function is called, the pointer points
189      *  to the start of the Ethernet header. There is other inconsequential data
190      *  before the Ethernet header.
191      *
192      *  It is preferable that the (whd_network_process_ethernet_data)() function simply puts
193      *  the received packet on a queue for processing by another thread. This avoids the
194      *  WHD thread being unnecessarily tied up which would delay other packets
195      *  being transmitted or received.
196      *
197      *  @param interface  The interface on which the packet was received.
198      *  @param buffer     Handle of the packet which has just been received. Responsibility for
199      *                    releasing this buffer is transferred from WHD at this point.
200      *
201      */
202     void (*whd_network_process_ethernet_data)(whd_interface_t ifp, whd_buffer_t buffer);
203 };
204 
205 /** To send an ethernet frame to WHD (called by the Network Stack)
206  *
207  *  This function takes ethernet data from the network stack and queues it for transmission over the wireless network.
208  *  The function can be called from any thread context as it is thread safe, however
209  *  it must not be called from interrupt context since it might get blocked while waiting
210  *  for a lock on the transmit queue.
211  *
212  *  This function returns immediately after the packet has been queued for transmit,
213  *  NOT after it has been transmitted.  Packet buffers passed to the WHD
214  *  are released inside the WHD once they have been transmitted.
215  *
216  *  @param ifp           Pointer to handle instance of whd interface
217  *  @param buffer        Handle of the packet buffer to be sent.
218  *
219  *  @return WHD_SUCCESS or Error code
220  *
221  */
222 extern whd_result_t whd_network_send_ethernet_data(whd_interface_t ifp, whd_buffer_t buffer);
223 /*  @} */
224 
225 
226 #ifdef __cplusplus
227 } /*extern "C" */
228 #endif
229 #endif /* INC_WHD_NETWORK_TYPES_H_ */
230