<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0in;
font-size:10.0pt;
font-family:"Courier New";}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:"Consolas",serif;}
span.EmailStyle21
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-IE" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Hi Maryam,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">I have replied inline.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Shibin<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Maryam Tahhan <mtahhan@redhat.com>
<br>
<b>Sent:</b> Thursday, November 30, 2023 12:33 PM<br>
<b>To:</b> Koikkara Reeny, Shibin <shibin.koikkara.reeny@intel.com>; ferruh.yigit@amd.com; stephen@networkplumber.org; lihuisong@huawei.com; fengchengwen@huawei.com; liuyonglong@huawei.com<br>
<b>Cc:</b> dev@dpdk.org<br>
<b>Subject:</b> Re: [v1] net/af_xdp: enable a sock path alongside use_cni<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Hi Shibin<br>
<br>
Thanks for the review. Comments inline.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">BR<br>
Maryam<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">On 30/11/2023 12:14, Koikkara Reeny, Shibin wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>Hi Maryam,<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>I have added some suggestion below.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Regrads,<o:p></o:p></pre>
<pre>Shibin<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal">[snip]<br>
<br>
<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>NOTICE);<o:p></o:p></pre>
<pre> #define UDS_MAX_CMD_LEN 64<o:p></o:p></pre>
<pre> #define UDS_MAX_CMD_RESP 128<o:p></o:p></pre>
<pre> #define UDS_XSK_MAP_FD_MSG "/xsk_map_fd"<o:p></o:p></pre>
<pre>-#define UDS_SOCK "/tmp/afxdp.sock"<o:p></o:p></pre>
<pre> #define UDS_CONNECT_MSG "/connect"<o:p></o:p></pre>
<pre> #define UDS_HOST_OK_MSG "/host_ok"<o:p></o:p></pre>
<pre> #define UDS_HOST_NAK_MSG "/host_nak"<o:p></o:p></pre>
<pre>@@ -171,6 +170,7 @@ struct pmd_internals {<o:p></o:p></pre>
<pre> bool custom_prog_configured;<o:p></o:p></pre>
<pre> bool force_copy;<o:p></o:p></pre>
<pre> bool use_cni;<o:p></o:p></pre>
<pre>+ char sock_path[PATH_MAX];<o:p></o:p></pre>
<pre>I would recommend using variable name as "uds_path".<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>No issues in renaming<o:p></o:p></p>
<p><o:p> </o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre> struct bpf_map *map;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> struct rte_ether_addr eth_addr;<o:p></o:p></pre>
<pre>@@ -191,6 +191,7 @@ struct pmd_process_private {<o:p></o:p></pre>
<pre> #define ETH_AF_XDP_BUDGET_ARG "busy_budget"<o:p></o:p></pre>
<pre> #define ETH_AF_XDP_FORCE_COPY_ARG "force_copy"<o:p></o:p></pre>
<pre> #define ETH_AF_XDP_USE_CNI_ARG "use_cni"<o:p></o:p></pre>
<pre>+#define ETH_AF_XDP_SOCK_ARG "sock"<o:p></o:p></pre>
</blockquote>
<pre>To make it clear would recommend using "sock_path" and also ETH_AF_XDP_CNI_UDS_PATH_ARG or ETH_AF_XDP_SOCK_PATH_ARG<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>No issues in renaming<o:p></o:p></p>
<p><o:p> </o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre> static const char * const valid_arguments[] = {<o:p></o:p></pre>
<pre> ETH_AF_XDP_IFACE_ARG,<o:p></o:p></pre>
<pre>@@ -201,6 +202,7 @@ static const char * const valid_arguments[] = {<o:p></o:p></pre>
<pre> ETH_AF_XDP_BUDGET_ARG,<o:p></o:p></pre>
<pre> ETH_AF_XDP_FORCE_COPY_ARG,<o:p></o:p></pre>
<pre> ETH_AF_XDP_USE_CNI_ARG,<o:p></o:p></pre>
<pre>+ ETH_AF_XDP_SOCK_ARG,<o:p></o:p></pre>
<pre> NULL<o:p></o:p></pre>
<pre> };<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>@@ -1351,7 +1353,7 @@ configure_preferred_busy_poll(struct<o:p></o:p></pre>
<pre>pkt_rx_queue *rxq) }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> static int<o:p></o:p></pre>
<pre>-init_uds_sock(struct sockaddr_un *server)<o:p></o:p></pre>
<pre>+init_uds_sock(struct sockaddr_un *server, const char *sock_path)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> int sock;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>@@ -1362,7 +1364,7 @@ init_uds_sock(struct sockaddr_un *server)<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> server->sun_family = AF_UNIX;<o:p></o:p></pre>
<pre>- strlcpy(server->sun_path, UDS_SOCK, sizeof(server->sun_path));<o:p></o:p></pre>
<pre>+ strlcpy(server->sun_path, sock_path, sizeof(server->sun_path));<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> if (connect(sock, (struct sockaddr *)server, sizeof(struct<o:p></o:p></pre>
<pre>sockaddr_un)) < 0) {<o:p></o:p></pre>
<pre> close(sock);<o:p></o:p></pre>
<pre>@@ -1382,7 +1384,7 @@ struct msg_internal { };<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> static int<o:p></o:p></pre>
<pre>-send_msg(int sock, char *request, int *fd)<o:p></o:p></pre>
<pre>+send_msg(int sock, char *request, int *fd, const char *sock_path)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> int snd;<o:p></o:p></pre>
<pre> struct iovec iov;<o:p></o:p></pre>
<pre>@@ -1393,7 +1395,7 @@ send_msg(int sock, char *request, int *fd)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> memset(&dst, 0, sizeof(dst));<o:p></o:p></pre>
<pre> dst.sun_family = AF_UNIX;<o:p></o:p></pre>
<pre>- strlcpy(dst.sun_path, UDS_SOCK, sizeof(dst.sun_path));<o:p></o:p></pre>
<pre>+ strlcpy(dst.sun_path, sock_path, sizeof(dst.sun_path));<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> /* Initialize message header structure */<o:p></o:p></pre>
<pre> memset(&msgh, 0, sizeof(msgh));<o:p></o:p></pre>
<pre>@@ -1471,7 +1473,7 @@ read_msg(int sock, char *response, struct<o:p></o:p></pre>
<pre>sockaddr_un *s, int *fd)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> static int<o:p></o:p></pre>
<pre> make_request_cni(int sock, struct sockaddr_un *server, char *request,<o:p></o:p></pre>
<pre>- int *req_fd, char *response, int *out_fd)<o:p></o:p></pre>
<pre>+ int *req_fd, char *response, int *out_fd, const char<o:p></o:p></pre>
<pre>*sock_path)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> int rval;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>@@ -1483,7 +1485,7 @@ make_request_cni(int sock, struct sockaddr_un<o:p></o:p></pre>
<pre>*server, char *request,<o:p></o:p></pre>
<pre> if (req_fd == NULL)<o:p></o:p></pre>
<pre> rval = write(sock, request, strlen(request));<o:p></o:p></pre>
<pre> else<o:p></o:p></pre>
<pre>- rval = send_msg(sock, request, req_fd);<o:p></o:p></pre>
<pre>+ rval = send_msg(sock, request, req_fd, sock_path);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> if (rval < 0) {<o:p></o:p></pre>
<pre> AF_XDP_LOG(ERR, "Write error %s\n", strerror(errno)); @@<o:p></o:p></pre>
<pre>-1507,7 +1509,7 @@ check_response(char *response, char *exp_resp, long<o:p></o:p></pre>
<pre>size) }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> static int<o:p></o:p></pre>
<pre>-get_cni_fd(char *if_name)<o:p></o:p></pre>
<pre>+get_cni_fd(char *if_name, const char *sock_path)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> char request[UDS_MAX_CMD_LEN],<o:p></o:p></pre>
<pre>response[UDS_MAX_CMD_RESP];<o:p></o:p></pre>
<pre> char hostname[MAX_LONG_OPT_SZ],<o:p></o:p></pre>
<pre>exp_resp[UDS_MAX_CMD_RESP]; @@ -1520,14 +1522,14 @@<o:p></o:p></pre>
<pre>get_cni_fd(char *if_name)<o:p></o:p></pre>
<pre> return -1;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> memset(&server, 0, sizeof(server));<o:p></o:p></pre>
<pre>- sock = init_uds_sock(&server);<o:p></o:p></pre>
<pre>+ sock = init_uds_sock(&server, sock_path);<o:p></o:p></pre>
<pre> if (sock < 0)<o:p></o:p></pre>
<pre> return -1;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> /* Initiates handshake to CNI send: /connect,hostname */<o:p></o:p></pre>
<pre> snprintf(request, sizeof(request), "%s,%s", UDS_CONNECT_MSG,<o:p></o:p></pre>
<pre>hostname);<o:p></o:p></pre>
<pre> memset(response, 0, sizeof(response));<o:p></o:p></pre>
<pre>- if (make_request_cni(sock, &server, request, NULL, response,<o:p></o:p></pre>
<pre>&out_fd) < 0) {<o:p></o:p></pre>
<pre>+ if (make_request_cni(sock, &server, request, NULL, response,<o:p></o:p></pre>
<pre>&out_fd,<o:p></o:p></pre>
<pre>+sock_path) < 0) {<o:p></o:p></pre>
</blockquote>
<pre>Why do we need to pass "sock_path" here as we have already connected the sock with sock_path in init_uds_sock()?<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>it's used in the send_msg() function inside make_request_cni(). In the original implementation of send_msg used a #defined value which is why it wasn't needed before. so as far as I can tell send_msg still needs that path. but I'm open to suggestions.<o:p></o:p></p>
<p>Sorry my mistake. You will need to pass the argument.<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><o:p> </o:p></span></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre> AF_XDP_LOG(ERR, "Error in processing cmd [%s]\n",<o:p></o:p></pre>
<pre>request);<o:p></o:p></pre>
<pre> goto err_close;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre>@@ -1541,7 +1543,7 @@ get_cni_fd(char *if_name)<o:p></o:p></pre>
<pre> /* Request for "/version" */<o:p></o:p></pre>
<pre> strlcpy(request, UDS_VERSION_MSG, UDS_MAX_CMD_LEN);<o:p></o:p></pre>
<pre> memset(response, 0, sizeof(response));<o:p></o:p></pre>
<pre>- if (make_request_cni(sock, &server, request, NULL, response,<o:p></o:p></pre>
<pre>&out_fd) < 0) {<o:p></o:p></pre>
<pre>+ if (make_request_cni(sock, &server, request, NULL, response,<o:p></o:p></pre>
<pre>&out_fd,<o:p></o:p></pre>
<pre>+sock_path) < 0) {<o:p></o:p></pre>
</blockquote>
<pre>Same question as above.<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>Please see previous ans<o:p></o:p></p>
<p><o:p> </o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre> AF_XDP_LOG(ERR, "Error in processing cmd [%s]\n",<o:p></o:p></pre>
<pre>request);<o:p></o:p></pre>
<pre> goto err_close;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre>@@ -1549,7 +1551,7 @@ get_cni_fd(char *if_name)<o:p></o:p></pre>
<pre> /* Request for file descriptor for netdev name*/<o:p></o:p></pre>
<pre> snprintf(request, sizeof(request), "%s,%s",<o:p></o:p></pre>
<pre>UDS_XSK_MAP_FD_MSG, if_name);<o:p></o:p></pre>
<pre> memset(response, 0, sizeof(response));<o:p></o:p></pre>
<pre>- if (make_request_cni(sock, &server, request, NULL, response,<o:p></o:p></pre>
<pre>&out_fd) < 0) {<o:p></o:p></pre>
<pre>+ if (make_request_cni(sock, &server, request, NULL, response,<o:p></o:p></pre>
<pre>&out_fd,<o:p></o:p></pre>
<pre>+sock_path) < 0) {<o:p></o:p></pre>
</blockquote>
<pre><o:p> </o:p></pre>
<pre>Same question as above.<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>Please see previous ans<o:p></o:p></p>
<p><o:p> </o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre> AF_XDP_LOG(ERR, "Error in processing cmd [%s]\n",<o:p></o:p></pre>
<pre>request);<o:p></o:p></pre>
<pre> goto err_close;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre>@@ -1571,7 +1573,7 @@ get_cni_fd(char *if_name)<o:p></o:p></pre>
<pre> /* Initiate close connection */<o:p></o:p></pre>
<pre> strlcpy(request, UDS_FIN_MSG, UDS_MAX_CMD_LEN);<o:p></o:p></pre>
<pre> memset(response, 0, sizeof(response));<o:p></o:p></pre>
<pre>- if (make_request_cni(sock, &server, request, NULL, response,<o:p></o:p></pre>
<pre>&out_fd) < 0) {<o:p></o:p></pre>
<pre>+ if (make_request_cni(sock, &server, request, NULL, response,<o:p></o:p></pre>
<pre>&out_fd,<o:p></o:p></pre>
<pre>+sock_path) < 0) {<o:p></o:p></pre>
</blockquote>
<pre><o:p> </o:p></pre>
<pre>Same question as above.<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>Please see previous ans<o:p></o:p></p>
<p><o:p> </o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre> AF_XDP_LOG(ERR, "Error in processing cmd [%s]\n",<o:p></o:p></pre>
<pre>request);<o:p></o:p></pre>
<pre> goto err_close;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre>@@ -1698,7 +1700,7 @@ xsk_configure(struct pmd_internals *internals,<o:p></o:p></pre>
<pre>struct pkt_rx_queue *rxq,<o:p></o:p></pre>
<pre> int err, fd, map_fd;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> /* get socket fd from CNI plugin */<o:p></o:p></pre>
<pre>- map_fd = get_cni_fd(internals->if_name);<o:p></o:p></pre>
<pre>+ map_fd = get_cni_fd(internals->if_name, internals-<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>sock_path);<o:p></o:p></pre>
</blockquote>
<pre> if (map_fd < 0) {<o:p></o:p></pre>
<pre> AF_XDP_LOG(ERR, "Failed to receive CNI plugin<o:p></o:p></pre>
<pre>fd\n");<o:p></o:p></pre>
<pre> goto out_xsk;<o:p></o:p></pre>
<pre>@@ -2023,7 +2025,8 @@ xdp_get_channels_info(const char *if_name, int<o:p></o:p></pre>
<pre>*max_queues, static int parse_parameters(struct rte_kvargs *kvlist, char<o:p></o:p></pre>
<pre>*if_name, int *start_queue,<o:p></o:p></pre>
<pre> int *queue_cnt, int *shared_umem, char *prog_path,<o:p></o:p></pre>
<pre>- int *busy_budget, int *force_copy, int *use_cni)<o:p></o:p></pre>
<pre>+ int *busy_budget, int *force_copy, int *use_cni,<o:p></o:p></pre>
<pre>+ char *sock_path)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> int ret;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>@@ -2069,6 +2072,11 @@ parse_parameters(struct rte_kvargs *kvlist, char<o:p></o:p></pre>
<pre>*if_name, int *start_queue,<o:p></o:p></pre>
<pre> if (ret < 0)<o:p></o:p></pre>
<pre> goto free_kvlist;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>+ ret = rte_kvargs_process(kvlist, ETH_AF_XDP_SOCK_ARG,<o:p></o:p></pre>
<pre>+ &parse_prog_arg, sock_path);<o:p></o:p></pre>
</blockquote>
<pre><o:p> </o:p></pre>
<pre>Parse_prog_arg does 2 things copy the sock_arg value and also check the access to the socket.<o:p></o:p></pre>
<pre>Checking access here has a chance of causing raise condition so I would recommend to skip this check here as this will be taken care in the init_uds_sock().<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>If there's an issue here processing is abandoned. Is it not better to catch any issue early on? I'm not sure I understand the race condition?<o:p></o:p></p>
<p>Race condition if af_xdp application pod start by a bit of out of sync before the USD server thread start. So we can wait till the initialization process. It is a suggestion.<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>+ if (ret < 0)<o:p></o:p></pre>
<pre>+ goto free_kvlist;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> free_kvlist:<o:p></o:p></pre>
<pre> rte_kvargs_free(kvlist);<o:p></o:p></pre>
<pre> return ret;<o:p></o:p></pre>
<pre>@@ -2108,7 +2116,7 @@ static struct rte_eth_dev * init_internals(struct<o:p></o:p></pre>
<pre>rte_vdev_device *dev, const char *if_name,<o:p></o:p></pre>
<pre> int start_queue_idx, int queue_cnt, int shared_umem,<o:p></o:p></pre>
<pre> const char *prog_path, int busy_budget, int force_copy,<o:p></o:p></pre>
<pre>- int use_cni)<o:p></o:p></pre>
<pre>+ int use_cni, const char *sock_path)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> const char *name = rte_vdev_device_name(dev);<o:p></o:p></pre>
<pre> const unsigned int numa_node = dev->device.numa_node; @@ -<o:p></o:p></pre>
<pre>2138,6 +2146,7 @@ init_internals(struct rte_vdev_device *dev, const char<o:p></o:p></pre>
<pre>*if_name,<o:p></o:p></pre>
<pre> internals->shared_umem = shared_umem;<o:p></o:p></pre>
<pre> internals->force_copy = force_copy;<o:p></o:p></pre>
<pre> internals->use_cni = use_cni;<o:p></o:p></pre>
<pre>+ strlcpy(internals->sock_path, sock_path, PATH_MAX);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> if (xdp_get_channels_info(if_name, &internals->max_queue_cnt,<o:p></o:p></pre>
<pre> &internals->combined_queue_cnt)) { @@ -<o:p></o:p></pre>
<pre>2328,6 +2337,7 @@ rte_pmd_af_xdp_probe(struct rte_vdev_device *dev)<o:p></o:p></pre>
<pre> int busy_budget = -1, ret;<o:p></o:p></pre>
<pre> int force_copy = 0;<o:p></o:p></pre>
<pre> int use_cni = 0;<o:p></o:p></pre>
<pre>+ char sock_path[PATH_MAX] = {'\0'};<o:p></o:p></pre>
<pre> struct rte_eth_dev *eth_dev = NULL;<o:p></o:p></pre>
<pre> const char *name = rte_vdev_device_name(dev);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>@@ -2370,7 +2380,7 @@ rte_pmd_af_xdp_probe(struct rte_vdev_device<o:p></o:p></pre>
<pre>*dev)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> if (parse_parameters(kvlist, if_name, &xsk_start_queue_idx,<o:p></o:p></pre>
<pre> &xsk_queue_cnt, &shared_umem, prog_path,<o:p></o:p></pre>
<pre>- &busy_budget, &force_copy, &use_cni) < 0) {<o:p></o:p></pre>
<pre>+ &busy_budget, &force_copy, &use_cni,<o:p></o:p></pre>
<pre>sock_path) < 0) {<o:p></o:p></pre>
<pre> AF_XDP_LOG(ERR, "Invalid kvargs value\n");<o:p></o:p></pre>
<pre> return -EINVAL;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre>@@ -2387,6 +2397,13 @@ rte_pmd_af_xdp_probe(struct rte_vdev_device<o:p></o:p></pre>
<pre>*dev)<o:p></o:p></pre>
<pre> return -EINVAL;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>+ if (use_cni && !strnlen(sock_path, PATH_MAX)) {<o:p></o:p></pre>
<pre>+ AF_XDP_LOG(ERR, "When '%s' parameter is used, '%s' must<o:p></o:p></pre>
<pre>also be provided\n",<o:p></o:p></pre>
<pre>+ ETH_AF_XDP_USE_CNI_ARG,<o:p></o:p></pre>
<pre>ETH_AF_XDP_SOCK_ARG);<o:p></o:p></pre>
<pre>+ return -EINVAL;<o:p></o:p></pre>
<pre>+ }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> if (strlen(if_name) == 0) {<o:p></o:p></pre>
<pre> AF_XDP_LOG(ERR, "Network interface must be<o:p></o:p></pre>
<pre>specified\n");<o:p></o:p></pre>
<pre> return -EINVAL;<o:p></o:p></pre>
<pre>@@ -2410,7 +2427,7 @@ rte_pmd_af_xdp_probe(struct rte_vdev_device<o:p></o:p></pre>
<pre>*dev)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> eth_dev = init_internals(dev, if_name, xsk_start_queue_idx,<o:p></o:p></pre>
<pre> xsk_queue_cnt, shared_umem, prog_path,<o:p></o:p></pre>
<pre>- busy_budget, force_copy, use_cni);<o:p></o:p></pre>
<pre>+ busy_budget, force_copy, use_cni,<o:p></o:p></pre>
<pre>sock_path);<o:p></o:p></pre>
<pre> if (eth_dev == NULL) {<o:p></o:p></pre>
<pre> AF_XDP_LOG(ERR, "Failed to init internals\n");<o:p></o:p></pre>
<pre> return -1;<o:p></o:p></pre>
<pre>@@ -2471,4 +2488,5 @@<o:p></o:p></pre>
<pre>RTE_PMD_REGISTER_PARAM_STRING(net_af_xdp,<o:p></o:p></pre>
<pre> "xdp_prog=<string> "<o:p></o:p></pre>
<pre> "busy_budget=<int> "<o:p></o:p></pre>
<pre> "force_copy=<int> "<o:p></o:p></pre>
<pre>- "use_cni=<int> ");<o:p></o:p></pre>
<pre>+ "use_cni=<int> "<o:p></o:p></pre>
<pre>+ "sock=<string> ");<o:p></o:p></pre>
<pre>--<o:p></o:p></pre>
<pre>2.41.0<o:p></o:p></pre>
</blockquote>
<pre><o:p> </o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
</div>
</div>
</body>
</html>