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