xref: /dpdk/drivers/net/memif/memif_socket.h (revision d61138d4f0e2927cc1d0fef6d810fa7f5d1161a1)
109c7e63aSJakub Grajciar /* SPDX-License-Identifier: BSD-3-Clause
209c7e63aSJakub Grajciar  * Copyright 2018-2019 Cisco Systems, Inc.  All rights reserved.
309c7e63aSJakub Grajciar  */
409c7e63aSJakub Grajciar 
509c7e63aSJakub Grajciar #ifndef _MEMIF_SOCKET_H_
609c7e63aSJakub Grajciar #define _MEMIF_SOCKET_H_
709c7e63aSJakub Grajciar 
809c7e63aSJakub Grajciar #include <sys/queue.h>
9d803feecSJakub Grajciar #include <sys/un.h>
1009c7e63aSJakub Grajciar 
1109c7e63aSJakub Grajciar /**
1209c7e63aSJakub Grajciar  * Remove device from socket device list. If no device is left on the socket,
1309c7e63aSJakub Grajciar  * remove the socket as well.
1409c7e63aSJakub Grajciar  *
1509c7e63aSJakub Grajciar  * @param dev
1609c7e63aSJakub Grajciar  *   memif device
1709c7e63aSJakub Grajciar  */
1809c7e63aSJakub Grajciar void memif_socket_remove_device(struct rte_eth_dev *dev);
1909c7e63aSJakub Grajciar 
2009c7e63aSJakub Grajciar /**
2109c7e63aSJakub Grajciar  * Enqueue disconnect message to control channel message queue.
2209c7e63aSJakub Grajciar  *
2309c7e63aSJakub Grajciar  * @param cc
2409c7e63aSJakub Grajciar  *   control channel
2509c7e63aSJakub Grajciar  * @param reason
2609c7e63aSJakub Grajciar  *   const string stating disconnect reason (96 characters)
2709c7e63aSJakub Grajciar  * @param err_code
2809c7e63aSJakub Grajciar  *   error code
2909c7e63aSJakub Grajciar  */
3009c7e63aSJakub Grajciar void memif_msg_enq_disconnect(struct memif_control_channel *cc, const char *reason,
3109c7e63aSJakub Grajciar 			      int err_code);
3209c7e63aSJakub Grajciar 
3309c7e63aSJakub Grajciar /**
3409c7e63aSJakub Grajciar  * Initialize memif socket for specified device. If socket doesn't exist, create socket.
3509c7e63aSJakub Grajciar  *
3609c7e63aSJakub Grajciar  * @param dev
3709c7e63aSJakub Grajciar  *   memif device
3809c7e63aSJakub Grajciar  * @param socket_filename
3909c7e63aSJakub Grajciar  *   socket filename
4009c7e63aSJakub Grajciar  * @return
4109c7e63aSJakub Grajciar  *   - On success, zero.
4209c7e63aSJakub Grajciar  *   - On failure, a negative value.
4309c7e63aSJakub Grajciar  */
4409c7e63aSJakub Grajciar int memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename);
4509c7e63aSJakub Grajciar 
4609c7e63aSJakub Grajciar /**
4709c7e63aSJakub Grajciar  * Disconnect memif device. Close control channel and shared memory.
4809c7e63aSJakub Grajciar  *
4909c7e63aSJakub Grajciar  * @param dev
5009c7e63aSJakub Grajciar  *   memif device
5109c7e63aSJakub Grajciar  */
5209c7e63aSJakub Grajciar void memif_disconnect(struct rte_eth_dev *dev);
5309c7e63aSJakub Grajciar 
5409c7e63aSJakub Grajciar /**
5509c7e63aSJakub Grajciar  * If device is properly configured, enable connection establishment.
5609c7e63aSJakub Grajciar  *
5709c7e63aSJakub Grajciar  * @param dev
5809c7e63aSJakub Grajciar  *   memif device
5909c7e63aSJakub Grajciar  * @return
6009c7e63aSJakub Grajciar  *   - On success, zero.
6109c7e63aSJakub Grajciar  *   - On failure, a negative value.
6209c7e63aSJakub Grajciar  */
63d250589dSStephen Hemminger int memif_connect_server(struct rte_eth_dev *dev);
64d250589dSStephen Hemminger 
6509c7e63aSJakub Grajciar 
6609c7e63aSJakub Grajciar /**
6709c7e63aSJakub Grajciar  * If device is properly configured, send connection request.
6809c7e63aSJakub Grajciar  *
6909c7e63aSJakub Grajciar  * @param dev
7009c7e63aSJakub Grajciar  *   memif device
7109c7e63aSJakub Grajciar  * @return
7209c7e63aSJakub Grajciar  *   - On success, zero.
7309c7e63aSJakub Grajciar  *   - On failure, a negative value.
7409c7e63aSJakub Grajciar  */
75d250589dSStephen Hemminger int memif_connect_client(struct rte_eth_dev *dev);
7609c7e63aSJakub Grajciar 
7709c7e63aSJakub Grajciar struct memif_socket_dev_list_elt {
7809c7e63aSJakub Grajciar 	TAILQ_ENTRY(memif_socket_dev_list_elt) next;
7909c7e63aSJakub Grajciar 	struct rte_eth_dev *dev;		/**< pointer to device internals */
8009c7e63aSJakub Grajciar 	char dev_name[RTE_ETH_NAME_MAX_LEN];
8109c7e63aSJakub Grajciar };
8209c7e63aSJakub Grajciar 
8309c7e63aSJakub Grajciar #define MEMIF_SOCKET_HASH_NAME			"memif-sh"
84d803feecSJakub Grajciar #define MEMIF_SOCKET_UN_SIZE	\
85d803feecSJakub Grajciar 	(sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path))
86b923866cSStephen Hemminger 
8709c7e63aSJakub Grajciar struct memif_socket {
88*d61138d4SHarman Kalra 	struct rte_intr_handle *intr_handle;	/**< interrupt handle */
89d803feecSJakub Grajciar 	char filename[MEMIF_SOCKET_UN_SIZE];	/**< socket filename */
9009c7e63aSJakub Grajciar 
9109c7e63aSJakub Grajciar 	TAILQ_HEAD(, memif_socket_dev_list_elt) dev_queue;
9209c7e63aSJakub Grajciar 	/**< Queue of devices using this socket */
9309c7e63aSJakub Grajciar 	uint8_t listener;			/**< if not zero socket is listener */
9409c7e63aSJakub Grajciar };
9509c7e63aSJakub Grajciar 
9609c7e63aSJakub Grajciar /* Control message queue. */
9709c7e63aSJakub Grajciar struct memif_msg_queue_elt {
9809c7e63aSJakub Grajciar 	memif_msg_t msg;			/**< control message */
9909c7e63aSJakub Grajciar 	TAILQ_ENTRY(memif_msg_queue_elt) next;
10009c7e63aSJakub Grajciar 	int fd;					/**< fd to be sent to peer */
10109c7e63aSJakub Grajciar };
10209c7e63aSJakub Grajciar 
10309c7e63aSJakub Grajciar struct memif_control_channel {
104*d61138d4SHarman Kalra 	struct rte_intr_handle *intr_handle;	/**< interrupt handle */
10509c7e63aSJakub Grajciar 	TAILQ_HEAD(, memif_msg_queue_elt) msg_queue; /**< control message queue */
10609c7e63aSJakub Grajciar 	struct memif_socket *socket;		/**< pointer to socket */
10709c7e63aSJakub Grajciar 	struct rte_eth_dev *dev;		/**< pointer to device */
10809c7e63aSJakub Grajciar };
10909c7e63aSJakub Grajciar 
11009c7e63aSJakub Grajciar #endif				/* MEMIF_SOCKET_H */
111