mk: build with _GNU_SOURCE defined by default
[dpdk.git] / drivers / net / mlx5 / mlx5_socket.c
index 18563ee..0010617 100644 (file)
@@ -1,9 +1,8 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright 2016 6WIND S.A.
+ * Copyright 2016 Mellanox Technologies, Ltd
  */
 
-#define _GNU_SOURCE
-
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/un.h>
@@ -33,8 +32,13 @@ mlx5_socket_init(struct rte_eth_dev *dev)
        };
        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.
@@ -42,8 +46,8 @@ mlx5_socket_init(struct rte_eth_dev *dev)
        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;
@@ -59,22 +63,22 @@ mlx5_socket_init(struct rte_eth_dev *dev)
        }
        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;
@@ -133,29 +137,29 @@ mlx5_socket_handle(struct rte_eth_dev *dev)
        /* 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) &&
@@ -165,13 +169,15 @@ mlx5_socket_handle(struct rte_eth_dev *dev)
        }
        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. */
@@ -184,7 +190,8 @@ mlx5_socket_handle(struct rte_eth_dev *dev)
        *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);
 }
@@ -226,7 +233,8 @@ mlx5_socket_connect(struct rte_eth_dev *dev)
        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;
@@ -235,13 +243,15 @@ mlx5_socket_connect(struct rte_eth_dev *dev)
        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;
@@ -250,7 +260,8 @@ mlx5_socket_connect(struct rte_eth_dev *dev)
        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();
@@ -259,33 +270,35 @@ mlx5_socket_connect(struct rte_eth_dev *dev)
        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);