/* SPDX-License-Identifier: BSD-3-Clause
* Copyright 2016 6WIND S.A.
+ * Copyright 2016 Mellanox Technologies, Ltd
*/
#define _GNU_SOURCE
};
int ret;
int flags;
- struct stat file_stat;
+ /*
+ * Close the last socket that was used to communicate
+ * with the secondary process
+ */
+ if (priv->primary_socket)
+ mlx5_socket_uninit(dev);
/*
* Initialise the socket to communicate with the secondary
* process.
ret = socket(AF_UNIX, SOCK_STREAM, 0);
if (ret < 0) {
rte_errno = errno;
- WARN("port %u secondary process not supported: %s",
- dev->data->port_id, strerror(errno));
+ DRV_LOG(WARNING, "port %u secondary process not supported: %s",
+ dev->data->port_id, strerror(errno));
goto error;
}
priv->primary_socket = ret;
}
snprintf(sun.sun_path, sizeof(sun.sun_path), "/var/tmp/%s_%d",
MLX5_DRIVER_NAME, priv->primary_socket);
- ret = stat(sun.sun_path, &file_stat);
- if (!ret)
- claim_zero(remove(sun.sun_path));
+ remove(sun.sun_path);
ret = bind(priv->primary_socket, (const struct sockaddr *)&sun,
sizeof(sun));
if (ret < 0) {
rte_errno = errno;
- WARN("port %u cannot bind socket, secondary process not"
- " supported: %s", dev->data->port_id, strerror(errno));
+ DRV_LOG(WARNING,
+ "port %u cannot bind socket, secondary process not"
+ " supported: %s",
+ dev->data->port_id, strerror(errno));
goto close;
}
ret = listen(priv->primary_socket, 0);
if (ret < 0) {
rte_errno = errno;
- WARN("port %u secondary process not supported: %s",
- dev->data->port_id, strerror(errno));
+ DRV_LOG(WARNING, "port %u secondary process not supported: %s",
+ dev->data->port_id, strerror(errno));
goto close;
}
return 0;
/* Accept the connection from the client. */
conn_sock = accept(priv->primary_socket, NULL, NULL);
if (conn_sock < 0) {
- WARN("port %u connection failed: %s", dev->data->port_id,
- strerror(errno));
+ DRV_LOG(WARNING, "port %u connection failed: %s",
+ dev->data->port_id, strerror(errno));
return;
}
ret = setsockopt(conn_sock, SOL_SOCKET, SO_PASSCRED, &(int){1},
sizeof(int));
if (ret < 0) {
ret = errno;
- WARN("port %u cannot change socket options: %s",
- dev->data->port_id, strerror(rte_errno));
+ DRV_LOG(WARNING, "port %u cannot change socket options: %s",
+ dev->data->port_id, strerror(rte_errno));
goto error;
}
ret = recvmsg(conn_sock, &msg, MSG_WAITALL);
if (ret < 0) {
ret = errno;
- WARN("port %u received an empty message: %s",
- dev->data->port_id, strerror(rte_errno));
+ DRV_LOG(WARNING, "port %u received an empty message: %s",
+ dev->data->port_id, strerror(rte_errno));
goto error;
}
/* Expect to receive credentials only. */
cmsg = CMSG_FIRSTHDR(&msg);
if (cmsg == NULL) {
- WARN("port %u no message", dev->data->port_id);
+ DRV_LOG(WARNING, "port %u no message", dev->data->port_id);
goto error;
}
if ((cmsg->cmsg_type == SCM_CREDENTIALS) &&
}
cmsg = CMSG_NXTHDR(&msg, cmsg);
if (cmsg != NULL) {
- WARN("port %u message wrongly formatted", dev->data->port_id);
+ DRV_LOG(WARNING, "port %u message wrongly formatted",
+ dev->data->port_id);
goto error;
}
/* Make sure all the ancillary data was received and valid. */
if ((cred == NULL) || (cred->uid != getuid()) ||
(cred->gid != getgid())) {
- WARN("port %u wrong credentials", dev->data->port_id);
+ DRV_LOG(WARNING, "port %u wrong credentials",
+ dev->data->port_id);
goto error;
}
/* Set-up the ancillary data. */
*fd = priv->ctx->cmd_fd;
ret = sendmsg(conn_sock, &msg, 0);
if (ret < 0)
- WARN("port %u cannot send response", dev->data->port_id);
+ DRV_LOG(WARNING, "port %u cannot send response",
+ dev->data->port_id);
error:
close(conn_sock);
}
ret = socket(AF_UNIX, SOCK_STREAM, 0);
if (ret < 0) {
rte_errno = errno;
- WARN("port %u cannot connect to primary", dev->data->port_id);
+ DRV_LOG(WARNING, "port %u cannot connect to primary",
+ dev->data->port_id);
goto error;
}
socket_fd = ret;
ret = connect(socket_fd, (const struct sockaddr *)&sun, sizeof(sun));
if (ret < 0) {
rte_errno = errno;
- WARN("port %u cannot connect to primary", dev->data->port_id);
+ DRV_LOG(WARNING, "port %u cannot connect to primary",
+ dev->data->port_id);
goto error;
}
cmsg = CMSG_FIRSTHDR(&msg);
if (cmsg == NULL) {
rte_errno = EINVAL;
- DEBUG("port %u cannot get first message", dev->data->port_id);
+ DRV_LOG(DEBUG, "port %u cannot get first message",
+ dev->data->port_id);
goto error;
}
cmsg->cmsg_level = SOL_SOCKET;
cred = (struct ucred *)CMSG_DATA(cmsg);
if (cred == NULL) {
rte_errno = EINVAL;
- DEBUG("port %u no credentials received", dev->data->port_id);
+ DRV_LOG(DEBUG, "port %u no credentials received",
+ dev->data->port_id);
goto error;
}
cred->pid = getpid();
ret = sendmsg(socket_fd, &msg, MSG_DONTWAIT);
if (ret < 0) {
rte_errno = errno;
- WARN("port %u cannot send credentials to primary: %s",
- dev->data->port_id, strerror(errno));
+ DRV_LOG(WARNING,
+ "port %u cannot send credentials to primary: %s",
+ dev->data->port_id, strerror(errno));
goto error;
}
ret = recvmsg(socket_fd, &msg, MSG_WAITALL);
if (ret <= 0) {
rte_errno = errno;
- WARN("port %u no message from primary: %s",
- dev->data->port_id, strerror(errno));
+ DRV_LOG(WARNING, "port %u no message from primary: %s",
+ dev->data->port_id, strerror(errno));
goto error;
}
cmsg = CMSG_FIRSTHDR(&msg);
if (cmsg == NULL) {
rte_errno = EINVAL;
- WARN("port %u no file descriptor received", dev->data->port_id);
+ DRV_LOG(WARNING, "port %u no file descriptor received",
+ dev->data->port_id);
goto error;
}
fd = (int *)CMSG_DATA(cmsg);
if (*fd < 0) {
- WARN("port %u no file descriptor received: %s",
- dev->data->port_id, strerror(errno));
+ DRV_LOG(WARNING, "port %u no file descriptor received: %s",
+ dev->data->port_id, strerror(errno));
rte_errno = *fd;
goto error;
}
ret = *fd;
close(socket_fd);
- return 0;
+ return ret;
error:
if (socket_fd != -1)
close(socket_fd);