On Mon, 4 Dec 2023 18:41:18 +0000
Maryam Tahhan <mtah...@redhat.com> wrote:

> Hi Shibin
> 
> I'm not really sure what you are suggesting, is to make an assumption on 
> the path part where the socket resides (aka hard code it) and then try 
> to build the full UDS path in DPDK?
> 
> Yes the plugin is using constants ATM for certain parts of the UDS path, 
> but that's not say that it's something that won't become configurable 
> later on. Someone may not want to use "/tmp/afxdp_dp/" as the base 
> directory. Then we'd have to change DPDK's implementation again. These 
> are not really things that are configured by hand and are generated by 
> initialization scripts (typically). I would rather build this with the 
> idea that things can change in the future without having to change the 
> DPDK implementation again.
> BR
> Maryam

In UNIX(7) man page:

       abstract
              an  abstract  socket  address  is distinguished (from a pathname
              socket) by the fact that sun_path[0] is a null byte ('\0').  The
              socket's address in this namespace is given  by  the  additional
              bytes  in  sun_path  that are covered by the specified length of
              the address structure.  (Null bytes in the name have no  special
              significance.)  The name has no connection with filesystem path‐
              names.   When the address of an abstract socket is returned, the
              returned addrlen  is  greater  than  sizeof(sa_family_t)  (i.e.,
              greater  than 2), and the name of the socket is contained in the
              first (addrlen - sizeof(sa_family_t)) bytes of sun_path.


Something like this:

diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c 
b/drivers/net/af_xdp/rte_eth_af_xdp.c
index 353c8688ec9c..f41632a9df5a 100644
--- a/drivers/net/af_xdp/rte_eth_af_xdp.c
+++ b/drivers/net/af_xdp/rte_eth_af_xdp.c
@@ -1362,7 +1362,10 @@ init_uds_sock(struct sockaddr_un *server)
        }
 
        server->sun_family = AF_UNIX;
-       strlcpy(server->sun_path, UDS_SOCK, sizeof(server->sun_path));
+
+       /* Use an abstract socket (not in filesystem) */
+       memset(server.sun_path, '\0', sizeof(server.sun_path));
+       strlcpy(server->sun_path + 1, UDS_SOCK, sizeof(server->sun_path) - 1);
 
        if (connect(sock, (struct sockaddr *)server, sizeof(struct 
sockaddr_un)) < 0) {
                close(sock);
@@ -1393,7 +1396,10 @@ send_msg(int sock, char *request, int *fd)
 
        memset(&dst, 0, sizeof(dst));
        dst.sun_family = AF_UNIX;
-       strlcpy(dst.sun_path, UDS_SOCK, sizeof(dst.sun_path));
+
+       /* Use an abstract socket (not in filesystem) */
+       memset(server.sun_path, '\0', sizeof(server.sun_path));
+       strlcpy(server->sun_path + 1, UDS_SOCK, sizeof(server->sun_path) - 1);
 
        /* Initialize message header structure */
        memset(&msgh, 0, sizeof(msgh));

Reply via email to