414 lines
14 KiB
C
414 lines
14 KiB
C
/****************************************************************************
|
|
* net/can/can.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_CAN_CAN_H
|
|
#define __NET_CAN_CAN_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <poll.h>
|
|
|
|
#include <netpacket/can.h>
|
|
#include <nuttx/semaphore.h>
|
|
#include <nuttx/can.h>
|
|
#include <nuttx/net/net.h>
|
|
#include <nuttx/net/netdev.h>
|
|
|
|
#include "devif/devif.h"
|
|
#include "socket/socket.h"
|
|
|
|
#ifdef CONFIG_NET_CAN_NOTIFIER
|
|
# include <nuttx/wqueue.h>
|
|
#endif
|
|
|
|
#ifdef CONFIG_NET_CAN
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
/* Allocate a new packet socket data callback */
|
|
|
|
#define can_callback_alloc(dev,conn) \
|
|
devif_callback_alloc(dev, &conn->sconn.list, &conn->sconn.list_tail)
|
|
#define can_callback_free(dev,conn,cb) \
|
|
devif_conn_callback_free(dev, cb, &conn->sconn.list, &conn->sconn.list_tail)
|
|
|
|
/****************************************************************************
|
|
* Public Type Definitions
|
|
****************************************************************************/
|
|
|
|
/* This is a container that holds the poll-related information */
|
|
|
|
struct can_poll_s
|
|
{
|
|
FAR struct socket *psock; /* Needed to handle loss of connection */
|
|
FAR struct net_driver_s *dev; /* Needed to free the callback structure */
|
|
struct pollfd *fds; /* Needed to handle poll events */
|
|
FAR struct devif_callback_s *cb; /* Needed to teardown the poll */
|
|
};
|
|
|
|
/* This "connection" structure describes the underlying state of the socket */
|
|
|
|
struct can_conn_s
|
|
{
|
|
/* Common prologue of all connection structures. */
|
|
|
|
struct socket_conn_s sconn;
|
|
|
|
FAR struct net_driver_s *dev; /* Reference to CAN device */
|
|
|
|
/* Read-ahead buffering.
|
|
*
|
|
* readahead - A singly linked list of type struct iob_qentry_s
|
|
* where the CAN/IP read-ahead data is retained.
|
|
*/
|
|
|
|
struct iob_queue_s readahead; /* remove Read-ahead buffering */
|
|
|
|
/* CAN-specific content follows */
|
|
|
|
int16_t crefs; /* Reference count */
|
|
|
|
/* The following is a list of poll structures of threads waiting for
|
|
* socket events.
|
|
*/
|
|
|
|
struct can_poll_s pollinfo[4]; /* FIXME make dynamic */
|
|
|
|
#ifdef CONFIG_NET_CANPROTO_OPTIONS
|
|
int32_t loopback;
|
|
int32_t recv_own_msgs;
|
|
#ifdef CONFIG_NET_CAN_CANFD
|
|
int32_t fd_frames;
|
|
#endif
|
|
struct can_filter filters[CONFIG_NET_CAN_RAW_FILTER_MAX];
|
|
int32_t filter_count;
|
|
# ifdef CONFIG_NET_CAN_RAW_TX_DEADLINE
|
|
int32_t tx_deadline;
|
|
# endif
|
|
#endif
|
|
#ifdef CONFIG_NET_TIMESTAMP
|
|
int32_t timestamp; /* Socket timestamp enabled/disabled */
|
|
#endif
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Public Data
|
|
****************************************************************************/
|
|
|
|
#ifdef __cplusplus
|
|
# define EXTERN extern "C"
|
|
extern "C"
|
|
{
|
|
#else
|
|
# define EXTERN extern
|
|
#endif
|
|
|
|
EXTERN const struct sock_intf_s g_can_sockif;
|
|
|
|
/****************************************************************************
|
|
* Public Function Prototypes
|
|
****************************************************************************/
|
|
|
|
struct sockaddr_can; /* Forward reference */
|
|
|
|
/****************************************************************************
|
|
* Name: can_initialize()
|
|
*
|
|
* Description:
|
|
* Initialize the NetLink connection structures. Called once and only
|
|
* from the networking layer.
|
|
*
|
|
****************************************************************************/
|
|
|
|
void can_initialize(void);
|
|
|
|
/****************************************************************************
|
|
* Name: can_alloc()
|
|
*
|
|
* Description:
|
|
* Allocate a new, uninitialized NetLink connection structure. This is
|
|
* normally something done by the implementation of the socket() API
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR struct can_conn_s *can_alloc(void);
|
|
|
|
/****************************************************************************
|
|
* Name: can_free()
|
|
*
|
|
* Description:
|
|
* Free a NetLink connection structure that is no longer in use. This
|
|
* should be done by the implementation of close().
|
|
*
|
|
****************************************************************************/
|
|
|
|
void can_free(FAR struct can_conn_s *conn);
|
|
|
|
/****************************************************************************
|
|
* Name: can_nextconn()
|
|
*
|
|
* Description:
|
|
* Traverse the list of allocated NetLink connections
|
|
*
|
|
* Assumptions:
|
|
* This function is called from NetLink device logic.
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR struct can_conn_s *can_nextconn(FAR struct can_conn_s *conn);
|
|
|
|
/****************************************************************************
|
|
* Name: can_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 can_callback(FAR struct net_driver_s *dev,
|
|
FAR struct can_conn_s *conn, uint16_t flags);
|
|
|
|
/****************************************************************************
|
|
* Name: can_datahandler
|
|
*
|
|
* Description:
|
|
* Handle data that is not accepted by the application. This may be called
|
|
* either (1) from the data receive logic if it cannot buffer the data, or
|
|
* (2) from the CAN event logic is there is no listener in place ready to
|
|
* receive the data.
|
|
*
|
|
* Input Parameters:
|
|
* dev - The device which as active when the event was detected.
|
|
* conn - A pointer to the CAN connection structure
|
|
*
|
|
* Returned Value:
|
|
* The number of bytes actually buffered is returned. This will be either
|
|
* zero or equal to buflen; partial packets are not buffered.
|
|
*
|
|
* Assumptions:
|
|
* - The caller has checked that CAN_NEWDATA is set in flags and that is no
|
|
* other handler available to process the incoming data.
|
|
* - Called from network stack logic with the network stack locked
|
|
*
|
|
****************************************************************************/
|
|
|
|
uint16_t can_datahandler(FAR struct net_driver_s *dev,
|
|
FAR struct can_conn_s *conn);
|
|
|
|
/****************************************************************************
|
|
* Name: can_recvmsg
|
|
*
|
|
* Description:
|
|
* recvmsg() receives messages from a socket, and may be used to receive
|
|
* data on a socket whether or not it is connection-oriented.
|
|
*
|
|
* If from is not NULL, and the underlying protocol provides the source
|
|
* address, this source address is filled in. The argument 'msg_namelen'
|
|
* initialized to the size of the buffer associated with from, 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 (ignored)
|
|
*
|
|
****************************************************************************/
|
|
|
|
ssize_t can_recvmsg(FAR struct socket *psock, FAR struct msghdr *msg,
|
|
int flags);
|
|
|
|
/****************************************************************************
|
|
* Name: can_poll
|
|
*
|
|
* Description:
|
|
* Poll a CAN connection structure for availability of TX data
|
|
*
|
|
* Input Parameters:
|
|
* dev - The device driver structure to use in the send operation
|
|
* conn - The CAN "connection" to poll for TX data
|
|
*
|
|
* Returned Value:
|
|
* None
|
|
*
|
|
* Assumptions:
|
|
* Called from network stack logic with the network stack locked
|
|
*
|
|
****************************************************************************/
|
|
|
|
void can_poll(FAR struct net_driver_s *dev, FAR struct can_conn_s *conn);
|
|
|
|
/****************************************************************************
|
|
* Name: psock_can_cansend
|
|
*
|
|
* Description:
|
|
* psock_can_cansend() returns a value indicating if a write to the socket
|
|
* would block. It is still possible that the write may block if another
|
|
* write occurs first.
|
|
*
|
|
* Input Parameters:
|
|
* psock An instance of the internal socket structure.
|
|
*
|
|
* Returned Value:
|
|
* OK
|
|
* At least one byte of data could be successfully written.
|
|
* -EWOULDBLOCK
|
|
* There is no room in the output buffer.
|
|
* -EBADF
|
|
* An invalid descriptor was specified.
|
|
*
|
|
* Assumptions:
|
|
* None
|
|
*
|
|
****************************************************************************/
|
|
|
|
int psock_can_cansend(FAR struct socket *psock);
|
|
|
|
/****************************************************************************
|
|
* Name: can_sendmsg
|
|
*
|
|
* Description:
|
|
* The can_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 CAN frame and optional CMSG
|
|
* flags Send flags (ignored)
|
|
*
|
|
* Returned Value:
|
|
* On success, returns the number of characters sent. On error,
|
|
* a negated errno value is retruend. See sendmsg() for the complete list
|
|
* of return values.
|
|
*
|
|
****************************************************************************/
|
|
|
|
ssize_t can_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg,
|
|
int flags);
|
|
|
|
/****************************************************************************
|
|
* Name: can_readahead_signal
|
|
*
|
|
* Description:
|
|
* Read-ahead data has been buffered. Signal all threads waiting for
|
|
* read-ahead data to become available.
|
|
*
|
|
* When read-ahead data becomes available, *all* of the workers waiting
|
|
* for read-ahead data will be executed. If there are multiple workers
|
|
* waiting for read-ahead data then only the first to execute will get the
|
|
* data. Others will need to call can_readahead_notifier_setup() once
|
|
* again.
|
|
*
|
|
* Input Parameters:
|
|
* conn - The CAN connection where read-ahead data was just buffered.
|
|
*
|
|
* Returned Value:
|
|
* None.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifdef CONFIG_NET_CAN_NOTIFIER
|
|
void can_readahead_signal(FAR struct can_conn_s *conn);
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: can_setsockopt
|
|
*
|
|
* Description:
|
|
* can_setsockopt() sets the CAN-protocol option specified by the
|
|
* 'option' argument to the value pointed to by the 'value' argument for
|
|
* the socket specified by the 'psock' argument.
|
|
*
|
|
* See <netinet/can.h> for the a complete list of values of CAN protocol
|
|
* options.
|
|
*
|
|
* Input Parameters:
|
|
* psock Socket structure of socket to operate on
|
|
* level Protocol level to set the option
|
|
* option identifies the option to set
|
|
* value Points to the argument value
|
|
* value_len The length of the argument value
|
|
*
|
|
* Returned Value:
|
|
* Returns zero (OK) on success. On failure, it returns a negated errno
|
|
* value to indicate the nature of the error. See psock_setcockopt() for
|
|
* the list of possible error values.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifdef CONFIG_NET_CANPROTO_OPTIONS
|
|
int can_setsockopt(FAR struct socket *psock, int level, int option,
|
|
FAR const void *value, socklen_t value_len);
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: can_getsockopt
|
|
*
|
|
* Description:
|
|
* can_getsockopt() retrieves the value for the option specified by the
|
|
* 'option' argument for the socket specified by the 'psock' argument. If
|
|
* the size of the option value is greater than 'value_len', the value
|
|
* stored in the object pointed to by the 'value' argument will be silently
|
|
* truncated. Otherwise, the length pointed to by the 'value_len' argument
|
|
* will be modified to indicate the actual length of the 'value'.
|
|
*
|
|
* See <sys/socket.h> a complete list of values for the socket-level
|
|
* 'option' argument. Protocol-specific options are are protocol specific
|
|
* header files (such as netpacket/can.h for the case of the CAN protocol).
|
|
*
|
|
* Input Parameters:
|
|
* psock Socket structure of the socket to query
|
|
* level Protocol level to set the option
|
|
* option identifies the option to get
|
|
* value Points to the argument value
|
|
* value_len The length of the argument value
|
|
*
|
|
* Returned Value:
|
|
* Returns zero (OK) on success. On failure, it returns a negated errno
|
|
* value to indicate the nature of the error. See psock_getsockopt() for
|
|
* the complete list of appropriate return error codes.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifdef CONFIG_NET_CANPROTO_OPTIONS
|
|
int can_getsockopt(FAR struct socket *psock, int level, int option,
|
|
FAR void *value, FAR socklen_t *value_len);
|
|
#endif
|
|
|
|
#undef EXTERN
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* CONFIG_NET_CAN */
|
|
#endif /* __NET_CAN_CAN_H */
|