2014-06-24 16:03:44 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* net/pkt/pkt.h
|
|
|
|
*
|
2021-02-19 12:45:37 +01:00
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
|
|
* this work for additional information regarding copyright ownership. The
|
|
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
|
|
* "License"); you may not use this file except in compliance with the
|
|
|
|
* License. You may obtain a copy of the License at
|
2014-06-24 16:03:44 +02:00
|
|
|
*
|
2021-02-19 12:45:37 +01:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2014-06-24 16:03:44 +02:00
|
|
|
*
|
2021-02-19 12:45:37 +01:00
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
* License for the specific language governing permissions and limitations
|
|
|
|
* under the License.
|
2014-06-24 16:03:44 +02:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
2022-01-15 03:44:35 +01:00
|
|
|
#ifndef __NET_PKT_PKT_H
|
|
|
|
#define __NET_PKT_PKT_H
|
2014-06-24 16:03:44 +02:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Included Files
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
2017-04-30 20:28:56 +02:00
|
|
|
#include <queue.h>
|
2014-06-24 16:03:44 +02:00
|
|
|
|
|
|
|
#ifdef CONFIG_NET_PKT
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Pre-processor Definitions
|
|
|
|
****************************************************************************/
|
|
|
|
|
2014-06-29 02:36:09 +02:00
|
|
|
/* Allocate a new packet socket data callback */
|
|
|
|
|
2015-06-03 16:11:57 +02:00
|
|
|
#define pkt_callback_alloc(dev,conn) \
|
net/devif/devif_callback.c: corrected the connection event list to work as FIFO instead of LIFO.
In case of enabled packet forwarding mode, packets were forwarded in a reverse order
because of LIFO behavior of the connection event list.
The issue exposed only during high network traffic. Thus the event list started to grow
that resulted in changing the order of packets inside of groups of several packets
like the following: 3, 2, 1, 6, 5, 4, 8, 7 etc.
Remarks concerning the connection event list implementation:
* Now the queue (list) is FIFO as it should be.
* The list is singly linked.
* The list has a head pointer (inside of outer net_driver_s structure),
and a tail pointer is added into outer net_driver_s structure.
* The list item is devif_callback_s structure.
It still has two pointers to two different list chains (*nxtconn and *nxtdev).
* As before the first argument (*dev) of the list functions can be NULL,
while the other argument (*list) is effective (not NULL).
* An extra (*tail) argument is added to devif_callback_alloc()
and devif_conn_callback_free() functions.
* devif_callback_alloc() time complexity is O(1) (i.e. O(n) to fill the whole list).
* devif_callback_free() time complexity is O(n) (i.e. O(n^2) to empty the whole list).
* devif_conn_event() time complexity is O(n).
2021-08-29 22:57:26 +02:00
|
|
|
devif_callback_alloc(dev, &conn->list, &conn->list_tail)
|
2015-06-03 16:11:57 +02:00
|
|
|
#define pkt_callback_free(dev,conn,cb) \
|
net/devif/devif_callback.c: corrected the connection event list to work as FIFO instead of LIFO.
In case of enabled packet forwarding mode, packets were forwarded in a reverse order
because of LIFO behavior of the connection event list.
The issue exposed only during high network traffic. Thus the event list started to grow
that resulted in changing the order of packets inside of groups of several packets
like the following: 3, 2, 1, 6, 5, 4, 8, 7 etc.
Remarks concerning the connection event list implementation:
* Now the queue (list) is FIFO as it should be.
* The list is singly linked.
* The list has a head pointer (inside of outer net_driver_s structure),
and a tail pointer is added into outer net_driver_s structure.
* The list item is devif_callback_s structure.
It still has two pointers to two different list chains (*nxtconn and *nxtdev).
* As before the first argument (*dev) of the list functions can be NULL,
while the other argument (*list) is effective (not NULL).
* An extra (*tail) argument is added to devif_callback_alloc()
and devif_conn_callback_free() functions.
* devif_callback_alloc() time complexity is O(1) (i.e. O(n) to fill the whole list).
* devif_callback_free() time complexity is O(n) (i.e. O(n^2) to empty the whole list).
* devif_conn_event() time complexity is O(n).
2021-08-29 22:57:26 +02:00
|
|
|
devif_conn_callback_free(dev, cb, &conn->list, &conn->list_tail)
|
2014-06-29 02:36:09 +02:00
|
|
|
|
2014-06-24 16:03:44 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* Public Type Definitions
|
|
|
|
****************************************************************************/
|
|
|
|
|
2016-02-25 17:43:51 +01:00
|
|
|
/* Representation of a packet socket connection */
|
2014-07-05 21:59:22 +02:00
|
|
|
|
|
|
|
struct devif_callback_s; /* Forward reference */
|
|
|
|
|
|
|
|
struct pkt_conn_s
|
|
|
|
{
|
2019-09-01 16:47:01 +02:00
|
|
|
/* Common prologue of all connection structures. */
|
|
|
|
|
2014-07-05 21:59:22 +02:00
|
|
|
dq_entry_t node; /* Supports a double linked list */
|
2019-09-01 16:47:01 +02:00
|
|
|
|
|
|
|
/* This is a list of Pkt connection callbacks. Each callback represents
|
|
|
|
* a thread that is stalled, waiting for a device-specific event.
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct devif_callback_s *list;
|
net/devif/devif_callback.c: corrected the connection event list to work as FIFO instead of LIFO.
In case of enabled packet forwarding mode, packets were forwarded in a reverse order
because of LIFO behavior of the connection event list.
The issue exposed only during high network traffic. Thus the event list started to grow
that resulted in changing the order of packets inside of groups of several packets
like the following: 3, 2, 1, 6, 5, 4, 8, 7 etc.
Remarks concerning the connection event list implementation:
* Now the queue (list) is FIFO as it should be.
* The list is singly linked.
* The list has a head pointer (inside of outer net_driver_s structure),
and a tail pointer is added into outer net_driver_s structure.
* The list item is devif_callback_s structure.
It still has two pointers to two different list chains (*nxtconn and *nxtdev).
* As before the first argument (*dev) of the list functions can be NULL,
while the other argument (*list) is effective (not NULL).
* An extra (*tail) argument is added to devif_callback_alloc()
and devif_conn_callback_free() functions.
* devif_callback_alloc() time complexity is O(1) (i.e. O(n) to fill the whole list).
* devif_callback_free() time complexity is O(n) (i.e. O(n^2) to empty the whole list).
* devif_conn_event() time complexity is O(n).
2021-08-29 22:57:26 +02:00
|
|
|
struct devif_callback_s *list_tail;
|
2019-09-01 16:47:01 +02:00
|
|
|
|
|
|
|
/* Pkt socket-specific content follows */
|
|
|
|
|
2014-07-05 21:59:22 +02:00
|
|
|
uint8_t lmac[6]; /* The local Ethernet address in network byte order */
|
|
|
|
uint8_t ifindex;
|
|
|
|
uint16_t proto;
|
|
|
|
uint8_t crefs; /* Reference counts on this instance */
|
|
|
|
};
|
|
|
|
|
2014-06-24 16:03:44 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* Public Data
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
# define EXTERN extern "C"
|
|
|
|
extern "C"
|
|
|
|
{
|
|
|
|
#else
|
|
|
|
# define EXTERN extern
|
|
|
|
#endif
|
|
|
|
|
2017-07-12 23:07:32 +02:00
|
|
|
/* The packet socket interface */
|
|
|
|
|
|
|
|
EXTERN const struct sock_intf_s g_pkt_sockif;
|
|
|
|
|
2014-06-24 16:03:44 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* Public Function Prototypes
|
|
|
|
****************************************************************************/
|
2014-06-26 17:32:39 +02:00
|
|
|
|
2017-05-02 18:07:31 +02:00
|
|
|
struct net_driver_s; /* Forward reference */
|
|
|
|
struct eth_hdr_s; /* Forward reference */
|
2017-07-13 01:36:05 +02:00
|
|
|
struct socket; /* Forward reference */
|
2014-06-25 18:34:52 +02:00
|
|
|
|
2014-07-05 21:59:22 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* Name: pkt_initialize()
|
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* Initialize the packet socket connection structures. Called once and
|
2015-01-25 14:36:16 +01:00
|
|
|
* only from the network initialization logic.
|
2014-07-05 21:59:22 +02:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
2014-06-25 18:34:52 +02:00
|
|
|
|
|
|
|
void pkt_initialize(void);
|
2014-07-05 21:59:22 +02:00
|
|
|
|
|
|
|
/****************************************************************************
|
2017-08-18 15:08:02 +02:00
|
|
|
* Name: pkt_alloc()
|
2014-07-05 21:59:22 +02:00
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* Allocate a new, uninitialized packet socket connection structure. This
|
|
|
|
* is normally something done by the implementation of the socket() API
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
2014-06-26 17:32:39 +02:00
|
|
|
FAR struct pkt_conn_s *pkt_alloc(void);
|
2014-07-05 21:59:22 +02:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: pkt_free()
|
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* Free a packet socket connection structure that is no longer in use.
|
|
|
|
* This should be done by the implementation of close().
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
2014-06-25 18:34:52 +02:00
|
|
|
void pkt_free(FAR struct pkt_conn_s *conn);
|
2014-07-05 21:59:22 +02:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: pkt_active()
|
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* Find a connection structure that is the appropriate
|
|
|
|
* connection to be used with the provided Ethernet header
|
|
|
|
*
|
|
|
|
* Assumptions:
|
2017-08-18 15:08:02 +02:00
|
|
|
* This function is called from network logic at with the network locked.
|
2014-07-05 21:59:22 +02:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
2017-08-18 15:08:02 +02:00
|
|
|
FAR struct pkt_conn_s *pkt_active(FAR struct eth_hdr_s *buf);
|
2014-07-05 21:59:22 +02:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: pkt_nextconn()
|
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* Traverse the list of allocated packet connections
|
|
|
|
*
|
|
|
|
* Assumptions:
|
2017-08-18 15:08:02 +02:00
|
|
|
* This function is called from network logic at with the network locked.
|
2014-07-05 21:59:22 +02:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
2017-08-18 15:08:02 +02:00
|
|
|
FAR struct pkt_conn_s *pkt_nextconn(FAR struct pkt_conn_s *conn);
|
2014-06-25 18:34:52 +02:00
|
|
|
|
2014-07-05 21:59:22 +02:00
|
|
|
/****************************************************************************
|
2017-04-22 00:33:14 +02:00
|
|
|
* Name: pkt_callback
|
2014-07-05 21:59:22 +02:00
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* Inform the application holding the packet socket of a change in state.
|
|
|
|
*
|
|
|
|
* Returned Value:
|
|
|
|
* OK if packet has been processed, otherwise ERROR.
|
|
|
|
*
|
|
|
|
* Assumptions:
|
2017-08-18 15:08:02 +02:00
|
|
|
* This function is called from network logic at with the network locked.
|
2014-07-05 21:59:22 +02:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
2014-06-25 18:34:52 +02:00
|
|
|
|
2014-06-28 00:48:12 +02:00
|
|
|
uint16_t pkt_callback(FAR struct net_driver_s *dev,
|
2014-06-25 18:34:52 +02:00
|
|
|
FAR struct pkt_conn_s *conn, uint16_t flags);
|
|
|
|
|
2014-07-05 21:59:22 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* Name: pkt_input
|
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* Handle incoming packet input
|
|
|
|
*
|
2017-08-18 15:08:02 +02:00
|
|
|
* This function provides the interface between Ethernet device drivers and
|
|
|
|
* packet socket logic. All frames that are received should be provided to
|
|
|
|
* pkt_input() prior to other routing.
|
|
|
|
*
|
2018-03-13 16:52:27 +01:00
|
|
|
* Input Parameters:
|
2014-07-05 21:59:22 +02:00
|
|
|
* dev - The device driver structure containing the received packet
|
|
|
|
*
|
2018-02-01 17:00:02 +01:00
|
|
|
* Returned Value:
|
2017-08-18 15:08:02 +02:00
|
|
|
* OK The packet has been processed and can be deleted
|
|
|
|
* ERROR There is a matching connection, but could not dispatch the packet
|
|
|
|
* yet. Useful when a packet arrives before a recv call is in
|
|
|
|
* place.
|
2014-07-05 21:59:22 +02:00
|
|
|
*
|
|
|
|
* Assumptions:
|
2017-08-18 15:08:02 +02:00
|
|
|
* Called from the network diver with the network locked.
|
2014-07-05 21:59:22 +02:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/* pkt_input() is prototyped in include/nuttx/net/pkt.h */
|
2014-06-25 18:34:52 +02:00
|
|
|
|
2017-07-13 01:36:05 +02:00
|
|
|
/****************************************************************************
|
2020-12-01 07:55:16 +01:00
|
|
|
* Name: pkt_recvmsg
|
2017-07-13 01:36:05 +02:00
|
|
|
*
|
|
|
|
* Description:
|
2020-12-01 07:55:16 +01:00
|
|
|
* Implements the socket recvmsg interface for the case of the AF_INET
|
|
|
|
* and AF_INET6 address families. pkt_recvmsg() receives messages from
|
2017-07-13 01:36:05 +02:00
|
|
|
* a socket, and may be used to receive data on a socket whether or not it
|
|
|
|
* is connection-oriented.
|
|
|
|
*
|
2020-12-01 07:55:16 +01:00
|
|
|
* If 'msg_name' is not NULL, and the underlying protocol provides the
|
|
|
|
* source address, this source address is filled in. The argument
|
|
|
|
* 'msg_namelen' is initialized to the size of the buffer associated with
|
|
|
|
* msg_name, and modified on return to indicate the actual size of the
|
|
|
|
* address stored there.
|
2017-07-13 01:36:05 +02:00
|
|
|
*
|
2018-03-13 16:52:27 +01:00
|
|
|
* Input Parameters:
|
2017-07-13 01:36:05 +02:00
|
|
|
* psock A pointer to a NuttX-specific, internal socket structure
|
2020-12-01 07:55:16 +01:00
|
|
|
* msg Buffer to receive the message
|
2017-07-13 01:36:05 +02:00
|
|
|
* flags Receive flags
|
|
|
|
*
|
|
|
|
* Returned Value:
|
2020-12-01 07:55:16 +01:00
|
|
|
* On success, returns the number of characters received. If no data is
|
2017-07-13 01:36:05 +02:00
|
|
|
* available to be received and the peer has performed an orderly shutdown,
|
2020-12-01 07:55:16 +01:00
|
|
|
* recvmsg() will return 0. Otherwise, on errors, a negated errno value is
|
|
|
|
* returned (see recvmsg() for the list of appropriate error values).
|
2017-07-13 01:36:05 +02:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
2020-12-01 07:55:16 +01:00
|
|
|
ssize_t pkt_recvmsg(FAR struct socket *psock, FAR struct msghdr *msg,
|
|
|
|
int flags);
|
2017-07-13 01:36:05 +02:00
|
|
|
|
2015-05-29 16:47:21 +02:00
|
|
|
/****************************************************************************
|
2017-04-22 00:33:14 +02:00
|
|
|
* Name: pkt_find_device
|
2015-05-29 16:47:21 +02:00
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* Select the network driver to use with the PKT transaction.
|
|
|
|
*
|
|
|
|
* Input Parameters:
|
|
|
|
* conn - PKT connection structure (not currently used).
|
|
|
|
*
|
|
|
|
* Returned Value:
|
|
|
|
* A pointer to the network driver to use.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
FAR struct net_driver_s *pkt_find_device(FAR struct pkt_conn_s *conn);
|
|
|
|
|
2014-07-05 21:59:22 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* Name: pkt_poll
|
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* Poll a packet "connection" structure for availability of TX data
|
|
|
|
*
|
2018-03-13 16:52:27 +01:00
|
|
|
* Input Parameters:
|
2014-07-05 21:59:22 +02:00
|
|
|
* dev - The device driver structure to use in the send operation
|
|
|
|
* conn - The packet "connection" to poll for TX data
|
|
|
|
*
|
2018-02-01 17:00:02 +01:00
|
|
|
* Returned Value:
|
2014-07-05 21:59:22 +02:00
|
|
|
* None
|
|
|
|
*
|
|
|
|
* Assumptions:
|
2017-08-18 15:08:02 +02:00
|
|
|
* Called from the network device interface (devif) with the network
|
|
|
|
* locked.
|
2014-07-05 21:59:22 +02:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
2014-06-25 18:34:52 +02:00
|
|
|
|
2014-06-28 00:48:12 +02:00
|
|
|
void pkt_poll(FAR struct net_driver_s *dev, FAR struct pkt_conn_s *conn);
|
2014-06-24 16:03:44 +02:00
|
|
|
|
|
|
|
/****************************************************************************
|
2020-12-01 07:55:16 +01:00
|
|
|
* Name: pkt_sendmsg
|
2014-06-24 16:03:44 +02:00
|
|
|
*
|
|
|
|
* Description:
|
2020-12-01 07:55:16 +01:00
|
|
|
* The pkt_sendmsg() call may be used only when the packet socket is in
|
2020-02-13 00:17:37 +01:00
|
|
|
* a connected state (so that the intended recipient is known).
|
2014-06-24 16:03:44 +02:00
|
|
|
*
|
2018-03-13 16:52:27 +01:00
|
|
|
* Input Parameters:
|
2014-06-24 16:03:44 +02:00
|
|
|
* psock An instance of the internal socket structure.
|
2020-12-01 07:55:16 +01:00
|
|
|
* msg Message to send
|
|
|
|
* flags Send flags
|
2014-06-24 16:03:44 +02:00
|
|
|
*
|
|
|
|
* Returned Value:
|
2020-12-01 07:55:16 +01:00
|
|
|
* On success, returns the number of characters sent. On error, a negated
|
|
|
|
* errno value is returned (see sendmsg() for the complete list of return
|
|
|
|
* values.
|
2014-06-24 16:03:44 +02:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
2020-12-01 07:55:16 +01:00
|
|
|
ssize_t pkt_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg,
|
|
|
|
int flags);
|
2014-06-24 16:03:44 +02:00
|
|
|
|
|
|
|
#undef EXTERN
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* CONFIG_NET_PKT */
|
2022-01-15 03:44:35 +01:00
|
|
|
#endif /* __NET_PKT_PKT_H */
|