nuttx/net/pkt/pkt.h
Zhe Weng 9a23ebdbc0 net/pkt: Support binding to devices other than ETH
We're using the `sll_ifindex` inside `struct sockaddr_ll` to bind
device, so we don't need to translate it into mac address, we can just
match the index, which also let us bind to different type of devices
other than Ethernet.

Ref: Linux also uses `ifindex` to find related device and note it down without mac addresses.
https://man7.org/linux/man-pages/man7/packet.7.html
https://github.com/torvalds/linux/blob/v6.7/net/packet/af_packet.c#L3328
https://github.com/torvalds/linux/blob/v6.7/net/packet/af_packet.c#L3264-L3265

Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
2024-02-22 21:21:48 -08:00

300 lines
9.8 KiB
C

/****************************************************************************
* net/pkt/pkt.h
*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*
****************************************************************************/
#ifndef __NET_PKT_PKT_H
#define __NET_PKT_PKT_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/types.h>
#include <nuttx/net/net.h>
#ifdef CONFIG_NET_PKT
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Allocate a new packet socket data callback */
#define pkt_callback_alloc(dev,conn) \
devif_callback_alloc(dev, &conn->sconn.list, &conn->sconn.list_tail)
#define pkt_callback_free(dev,conn,cb) \
devif_conn_callback_free(dev, cb, &conn->sconn.list, &conn->sconn.list_tail)
/****************************************************************************
* Public Type Definitions
****************************************************************************/
/* Representation of a packet socket connection */
struct devif_callback_s; /* Forward reference */
struct pkt_conn_s
{
/* Common prologue of all connection structures. */
struct socket_conn_s sconn;
/* Pkt socket-specific content follows */
uint8_t ifindex;
uint8_t crefs; /* Reference counts on this instance */
/* Read-ahead buffering.
*
* readahead - A singly linked list of type struct iob_qentry_s
* where the PKT read-ahead data is retained.
*
* TODO: Maybe support PACKET_MMAP for further optimize.
*/
struct iob_queue_s readahead; /* Read-ahead buffering */
};
/****************************************************************************
* Public Data
****************************************************************************/
#ifdef __cplusplus
# define EXTERN extern "C"
extern "C"
{
#else
# define EXTERN extern
#endif
/* The packet socket interface */
EXTERN const struct sock_intf_s g_pkt_sockif;
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
struct net_driver_s; /* Forward reference */
struct socket; /* Forward reference */
/****************************************************************************
* Name: pkt_initialize()
*
* Description:
* Initialize the packet socket connection structures. Called once and
* only from the network initialization logic.
*
****************************************************************************/
void pkt_initialize(void);
/****************************************************************************
* Name: pkt_alloc()
*
* Description:
* Allocate a new, uninitialized packet socket connection structure. This
* is normally something done by the implementation of the socket() API
*
****************************************************************************/
FAR struct pkt_conn_s *pkt_alloc(void);
/****************************************************************************
* 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().
*
****************************************************************************/
void pkt_free(FAR struct pkt_conn_s *conn);
/****************************************************************************
* Name: pkt_active()
*
* Description:
* Find a connection structure that is the appropriate connection to be
* used with the provided network device
*
* Assumptions:
* This function is called from network logic at with the network locked.
*
****************************************************************************/
FAR struct pkt_conn_s *pkt_active(FAR struct net_driver_s *dev);
/****************************************************************************
* Name: pkt_nextconn()
*
* Description:
* Traverse the list of allocated packet connections
*
* Assumptions:
* This function is called from network logic at with the network locked.
*
****************************************************************************/
FAR struct pkt_conn_s *pkt_nextconn(FAR struct pkt_conn_s *conn);
/****************************************************************************
* Name: pkt_callback
*
* Description:
* Inform the application holding the packet socket of a change in state.
*
* Returned Value:
* OK if packet has been processed, otherwise ERROR.
*
* Assumptions:
* This function is called from network logic at with the network locked.
*
****************************************************************************/
uint16_t pkt_callback(FAR struct net_driver_s *dev,
FAR struct pkt_conn_s *conn, uint16_t flags);
/****************************************************************************
* Name: pkt_input
*
* Description:
* Handle incoming packet input
*
* 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.
*
* Input Parameters:
* dev - The device driver structure containing the received packet
*
* Returned Value:
* 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.
*
* Assumptions:
* Called from the network diver with the network locked.
*
****************************************************************************/
/* pkt_input() is prototyped in include/nuttx/net/pkt.h */
/****************************************************************************
* Name: pkt_recvmsg
*
* Description:
* Implements the socket recvmsg interface for the case of the AF_INET
* and AF_INET6 address families. pkt_recvmsg() receives messages from
* a socket, and may be used to receive data on a socket whether or not it
* is connection-oriented.
*
* 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.
*
* Input Parameters:
* psock A pointer to a NuttX-specific, internal socket structure
* msg Buffer to receive the message
* flags Receive flags
*
* Returned Value:
* On success, returns the number of characters received. If no data is
* available to be received and the peer has performed an orderly shutdown,
* recvmsg() will return 0. Otherwise, on errors, a negated errno value is
* returned (see recvmsg() for the list of appropriate error values).
*
****************************************************************************/
ssize_t pkt_recvmsg(FAR struct socket *psock, FAR struct msghdr *msg,
int flags);
/****************************************************************************
* Name: pkt_find_device
*
* Description:
* Select the network driver to use with the PKT transaction.
*
* Input Parameters:
* conn - PKT connection structure.
*
* Returned Value:
* A pointer to the network driver to use.
*
****************************************************************************/
FAR struct net_driver_s *pkt_find_device(FAR struct pkt_conn_s *conn);
/****************************************************************************
* Name: pkt_poll
*
* Description:
* Poll a packet "connection" structure for availability of TX data
*
* Input Parameters:
* dev - The device driver structure to use in the send operation
* conn - The packet "connection" to poll for TX data
*
* Returned Value:
* None
*
* Assumptions:
* Called from the network device interface (devif) with the network
* locked.
*
****************************************************************************/
void pkt_poll(FAR struct net_driver_s *dev, FAR struct pkt_conn_s *conn);
/****************************************************************************
* Name: pkt_sendmsg
*
* Description:
* The pkt_sendmsg() call may be used only when the packet socket is in
* a connected state (so that the intended recipient is known).
*
* Input Parameters:
* psock An instance of the internal socket structure.
* msg Message to send
* flags Send flags
*
* Returned Value:
* 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.
*
****************************************************************************/
ssize_t pkt_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg,
int flags);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* CONFIG_NET_PKT */
#endif /* __NET_PKT_PKT_H */