X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fmemif%2Fmemif_socket.c;h=5b373738e6651eb97dd0cbe99bee1d154148c883;hb=b59d4d5502dcb1b57be81eb21b5e8bcb80de49e7;hp=67794cb6fa8c9d50e183d8daebb542044785bb35;hpb=06123fdd6063e411ea78ed353f0d6114e500b1b3;p=dpdk.git diff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c index 67794cb6fa..5b373738e6 100644 --- a/drivers/net/memif/memif_socket.c +++ b/drivers/net/memif/memif_socket.c @@ -13,8 +13,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -143,8 +143,8 @@ memif_msg_enq_hello(struct memif_control_channel *cc) e->msg.type = MEMIF_MSG_TYPE_HELLO; h->min_version = MEMIF_VERSION; h->max_version = MEMIF_VERSION; - h->max_s2m_ring = ETH_MEMIF_MAX_NUM_Q_PAIRS; - h->max_m2s_ring = ETH_MEMIF_MAX_NUM_Q_PAIRS; + h->max_c2s_ring = ETH_MEMIF_MAX_NUM_Q_PAIRS; + h->max_s2c_ring = ETH_MEMIF_MAX_NUM_Q_PAIRS; h->max_region = ETH_MEMIF_MAX_REGION_NUM - 1; h->max_log2_ring_size = ETH_MEMIF_MAX_LOG2_RING_SIZE; @@ -165,10 +165,10 @@ memif_msg_receive_hello(struct rte_eth_dev *dev, memif_msg_t *msg) } /* Set parameters for active connection */ - pmd->run.num_s2m_rings = RTE_MIN(h->max_s2m_ring + 1, - pmd->cfg.num_s2m_rings); - pmd->run.num_m2s_rings = RTE_MIN(h->max_m2s_ring + 1, - pmd->cfg.num_m2s_rings); + pmd->run.num_c2s_rings = RTE_MIN(h->max_c2s_ring + 1, + pmd->cfg.num_c2s_rings); + pmd->run.num_s2c_rings = RTE_MIN(h->max_s2c_ring + 1, + pmd->cfg.num_s2c_rings); pmd->run.log2_ring_size = RTE_MIN(h->max_log2_ring_size, pmd->cfg.log2_ring_size); pmd->run.pkt_buffer_size = pmd->cfg.pkt_buffer_size; @@ -203,7 +203,7 @@ memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg) dev = elt->dev; pmd = dev->data->dev_private; if (((pmd->flags & ETH_MEMIF_FLAG_DISABLED) == 0) && - (pmd->id == i->id) && (pmd->role == MEMIF_ROLE_MASTER)) { + (pmd->id == i->id) && (pmd->role == MEMIF_ROLE_SERVER)) { if (pmd->flags & (ETH_MEMIF_FLAG_CONNECTING | ETH_MEMIF_FLAG_CONNECTED)) { memif_msg_enq_disconnect(cc, @@ -300,21 +300,21 @@ memif_msg_receive_add_ring(struct rte_eth_dev *dev, memif_msg_t *msg, int fd) } /* check if we have enough queues */ - if (ar->flags & MEMIF_MSG_ADD_RING_FLAG_S2M) { - if (ar->index >= pmd->cfg.num_s2m_rings) { + if (ar->flags & MEMIF_MSG_ADD_RING_FLAG_C2S) { + if (ar->index >= pmd->cfg.num_c2s_rings) { memif_msg_enq_disconnect(pmd->cc, "Invalid ring index", 0); return -1; } - pmd->run.num_s2m_rings++; + pmd->run.num_c2s_rings++; } else { - if (ar->index >= pmd->cfg.num_m2s_rings) { + if (ar->index >= pmd->cfg.num_s2c_rings) { memif_msg_enq_disconnect(pmd->cc, "Invalid ring index", 0); return -1; } - pmd->run.num_m2s_rings++; + pmd->run.num_s2c_rings++; } - mq = (ar->flags & MEMIF_MSG_ADD_RING_FLAG_S2M) ? + mq = (ar->flags & MEMIF_MSG_ADD_RING_FLAG_C2S) ? dev->data->rx_queues[ar->index] : dev->data->tx_queues[ar->index]; mq->intr_handle.fd = fd; @@ -449,7 +449,7 @@ memif_msg_enq_add_ring(struct rte_eth_dev *dev, uint8_t idx, return -1; ar = &e->msg.add_ring; - mq = (type == MEMIF_RING_S2M) ? dev->data->tx_queues[idx] : + mq = (type == MEMIF_RING_C2S) ? dev->data->tx_queues[idx] : dev->data->rx_queues[idx]; e->msg.type = MEMIF_MSG_TYPE_ADD_RING; @@ -458,7 +458,7 @@ memif_msg_enq_add_ring(struct rte_eth_dev *dev, uint8_t idx, ar->offset = mq->ring_offset; ar->region = mq->region; ar->log2_ring_size = mq->log2_ring_size; - ar->flags = (type == MEMIF_RING_S2M) ? MEMIF_MSG_ADD_RING_FLAG_S2M : 0; + ar->flags = (type == MEMIF_RING_C2S) ? MEMIF_MSG_ADD_RING_FLAG_C2S : 0; ar->private_hdr_size = 0; return 0; @@ -575,8 +575,8 @@ memif_disconnect(struct rte_eth_dev *dev) rte_spinlock_unlock(&pmd->cc_lock); /* unconfig interrupts */ - for (i = 0; i < pmd->cfg.num_s2m_rings; i++) { - if (pmd->role == MEMIF_ROLE_SLAVE) { + for (i = 0; i < pmd->cfg.num_c2s_rings; i++) { + if (pmd->role == MEMIF_ROLE_CLIENT) { if (dev->data->tx_queues != NULL) mq = dev->data->tx_queues[i]; else @@ -592,8 +592,8 @@ memif_disconnect(struct rte_eth_dev *dev) mq->intr_handle.fd = -1; } } - for (i = 0; i < pmd->cfg.num_m2s_rings; i++) { - if (pmd->role == MEMIF_ROLE_MASTER) { + for (i = 0; i < pmd->cfg.num_s2c_rings; i++) { + if (pmd->role == MEMIF_ROLE_SERVER) { if (dev->data->tx_queues != NULL) mq = dev->data->tx_queues[i]; else @@ -616,7 +616,7 @@ memif_disconnect(struct rte_eth_dev *dev) memset(&pmd->run, 0, sizeof(pmd->run)); MIF_LOG(DEBUG, "Disconnected, id: %d, role: %s.", pmd->id, - (pmd->role == MEMIF_ROLE_MASTER) ? "master" : "slave"); + (pmd->role == MEMIF_ROLE_SERVER) ? "server" : "client"); } static int @@ -694,15 +694,15 @@ memif_msg_receive(struct memif_control_channel *cc) if (ret < 0) goto exit; } - for (i = 0; i < pmd->run.num_s2m_rings; i++) { + for (i = 0; i < pmd->run.num_c2s_rings; i++) { ret = memif_msg_enq_add_ring(cc->dev, i, - MEMIF_RING_S2M); + MEMIF_RING_C2S); if (ret < 0) goto exit; } - for (i = 0; i < pmd->run.num_m2s_rings; i++) { + for (i = 0; i < pmd->run.num_s2c_rings; i++) { ret = memif_msg_enq_add_ring(cc->dev, i, - MEMIF_RING_M2S); + MEMIF_RING_S2C); if (ret < 0) goto exit; } @@ -862,10 +862,10 @@ memif_listener_handler(void *arg) } static struct memif_socket * -memif_socket_create(char *key, uint8_t listener) +memif_socket_create(char *key, uint8_t listener, bool is_abstract) { struct memif_socket *sock; - struct sockaddr_un un; + struct sockaddr_un un = { 0 }; int sockfd; int ret; int on = 1; @@ -886,7 +886,13 @@ memif_socket_create(char *key, uint8_t listener) goto error; un.sun_family = AF_UNIX; - strlcpy(un.sun_path, sock->filename, MEMIF_SOCKET_UN_SIZE); + if (is_abstract) { + /* abstract address */ + un.sun_path[0] = '\0'; + strlcpy(un.sun_path + 1, sock->filename, MEMIF_SOCKET_UN_SIZE - 1); + } else { + strlcpy(un.sun_path, sock->filename, MEMIF_SOCKET_UN_SIZE); + } ret = setsockopt(sockfd, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); @@ -963,7 +969,8 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) ret = rte_hash_lookup_data(hash, key, (void **)&socket); if (ret < 0) { socket = memif_socket_create(key, - (pmd->role == MEMIF_ROLE_SLAVE) ? 0 : 1); + (pmd->role == MEMIF_ROLE_CLIENT) ? 0 : 1, + pmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT); if (socket == NULL) return -1; ret = rte_hash_add_key_data(hash, key, socket); @@ -1025,7 +1032,7 @@ memif_socket_remove_device(struct rte_eth_dev *dev) /* remove socket, if this was the last device using it */ if (TAILQ_EMPTY(&socket->dev_queue)) { rte_hash_del_key(hash, socket->filename); - if (socket->listener) { + if (socket->listener && !(pmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT)) { /* remove listener socket file, * so we can create new one later. */ @@ -1039,7 +1046,7 @@ memif_socket_remove_device(struct rte_eth_dev *dev) } int -memif_connect_master(struct rte_eth_dev *dev) +memif_connect_server(struct rte_eth_dev *dev) { struct pmd_internals *pmd = dev->data->dev_private; @@ -1050,11 +1057,11 @@ memif_connect_master(struct rte_eth_dev *dev) } int -memif_connect_slave(struct rte_eth_dev *dev) +memif_connect_client(struct rte_eth_dev *dev) { int sockfd; int ret; - struct sockaddr_un sun; + struct sockaddr_un sun = { 0 }; struct pmd_internals *pmd = dev->data->dev_private; memset(pmd->local_disc_string, 0, ETH_MEMIF_DISC_STRING_SIZE); @@ -1068,8 +1075,13 @@ memif_connect_slave(struct rte_eth_dev *dev) } sun.sun_family = AF_UNIX; - - memcpy(sun.sun_path, pmd->socket_filename, sizeof(sun.sun_path) - 1); + if (pmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT) { + /* abstract address */ + sun.sun_path[0] = '\0'; + strlcpy(sun.sun_path + 1, pmd->socket_filename, MEMIF_SOCKET_UN_SIZE - 1); + } else { + strlcpy(sun.sun_path, pmd->socket_filename, MEMIF_SOCKET_UN_SIZE); + } ret = connect(sockfd, (struct sockaddr *)&sun, sizeof(struct sockaddr_un));