2018-02-07 19:58:14 +00:00
|
|
|
/*-
|
|
|
|
* BSD LICENSE
|
|
|
|
*
|
|
|
|
* Copyright (c) Intel Corporation.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
*
|
|
|
|
* * Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in
|
|
|
|
* the documentation and/or other materials provided with the
|
|
|
|
* distribution.
|
|
|
|
* * Neither the name of Intel Corporation nor the names of its
|
|
|
|
* contributors may be used to endorse or promote products derived
|
|
|
|
* from this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** \file
|
|
|
|
* TCP socket abstraction layer
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SPDK_SOCK_H
|
|
|
|
#define SPDK_SOCK_H
|
|
|
|
|
|
|
|
#include "spdk/stdinc.h"
|
|
|
|
|
2019-08-26 22:03:07 +00:00
|
|
|
#include "spdk/queue.h"
|
|
|
|
|
2018-02-07 19:58:14 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2018-02-07 21:46:22 +00:00
|
|
|
struct spdk_sock;
|
2018-02-08 00:28:19 +00:00
|
|
|
struct spdk_sock_group;
|
2018-02-07 19:58:14 +00:00
|
|
|
|
2019-08-26 22:03:07 +00:00
|
|
|
/**
|
|
|
|
* Anywhere this struct is used, an iovec array is assumed to
|
|
|
|
* immediately follow the last member in memory, without any
|
|
|
|
* padding.
|
|
|
|
*
|
|
|
|
* A simpler implementation would be to place a 0-length array
|
|
|
|
* of struct iovec at the end of this request. However, embedding
|
|
|
|
* a structure that ends with a variable length array inside of
|
|
|
|
* another structure is a GNU C extension and not standard.
|
|
|
|
*/
|
|
|
|
struct spdk_sock_request {
|
|
|
|
/* When the request is completed, this callback will be called.
|
|
|
|
* err will be 0 on success or a negated errno value on failure. */
|
|
|
|
void (*cb_fn)(void *cb_arg, int err);
|
|
|
|
void *cb_arg;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* These fields are used by the socket layer and should not be modified
|
|
|
|
*/
|
|
|
|
struct __sock_request_internal {
|
|
|
|
TAILQ_ENTRY(spdk_sock_request) link;
|
2019-10-09 21:06:15 +00:00
|
|
|
uint32_t offset;
|
2019-08-26 22:03:07 +00:00
|
|
|
} internal;
|
|
|
|
|
|
|
|
int iovcnt;
|
|
|
|
/* struct iovec iov[]; */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define SPDK_SOCK_REQUEST_IOV(req, i) ((struct iovec *)(((uint8_t *)req + sizeof(struct spdk_sock_request)) + (sizeof(struct iovec) * i)))
|
|
|
|
|
2020-02-19 11:18:51 +00:00
|
|
|
/**
|
|
|
|
* Spdk socket initialization options.
|
|
|
|
*
|
|
|
|
* A pointer to this structure will be used by spdk_sock_listen_ext() or spdk_sock_connect_ext() to
|
|
|
|
* allow the user to request non-default options on the socket.
|
|
|
|
*/
|
|
|
|
struct spdk_sock_opts {
|
|
|
|
/**
|
|
|
|
* The size of spdk_sock_opts according to the caller of this library is used for ABI
|
|
|
|
* compatibility. The library uses this field to know how many fields in this
|
|
|
|
* structure are valid. And the library will populate any remaining fields with default values.
|
|
|
|
*/
|
|
|
|
size_t opts_size;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The priority on the socket and default value is zero.
|
|
|
|
*/
|
|
|
|
int priority;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize the default value of opts.
|
|
|
|
*
|
|
|
|
* \param opts Data structure where SPDK will initialize the default sock options.
|
|
|
|
* Users must set opts_size to sizeof(struct spdk_sock_opts). This will ensure that the
|
|
|
|
* libraryonly tries to fill as many fields as allocated by the caller. This allows ABI
|
|
|
|
* compatibility with future versions of this library that may extend the spdk_sock_opts
|
|
|
|
* structure.
|
|
|
|
*/
|
|
|
|
void spdk_sock_get_default_opts(struct spdk_sock_opts *opts);
|
|
|
|
|
2018-05-15 06:31:01 +00:00
|
|
|
/**
|
|
|
|
* Get client and server addresses of the given socket.
|
|
|
|
*
|
|
|
|
* \param sock Socket to get address.
|
|
|
|
* \param saddr A pointer to the buffer to hold the address of server.
|
|
|
|
* \param slen Length of the buffer 'saddr'.
|
2018-10-08 01:51:03 +00:00
|
|
|
* \param sport A pointer(May be NULL) to the buffer to hold the port info of server.
|
2018-05-15 06:31:01 +00:00
|
|
|
* \param caddr A pointer to the buffer to hold the address of client.
|
2018-06-19 10:56:11 +00:00
|
|
|
* \param clen Length of the buffer 'caddr'.
|
2018-10-08 01:51:03 +00:00
|
|
|
* \param cport A pointer(May be NULL) to the buffer to hold the port info of server.
|
2018-05-15 06:31:01 +00:00
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
2018-10-08 01:51:03 +00:00
|
|
|
int spdk_sock_getaddr(struct spdk_sock *sock, char *saddr, int slen, uint16_t *sport,
|
|
|
|
char *caddr, int clen, uint16_t *cport);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
sock: Add impl_name parameter in spdk_sock_listen/connect.
Purpose: With this patch,
(1)We can support using different sock implementations in
one application together.
(2)For one IP address managed by kernel, we can use different method
to listen/connect, e.g., posix, or uring. With this patch, we can
designate the specified sock implementation if impl_name is not NULL
and valid. Otherwise, spdk_sock_listen/connect will try to use the sock
implementations in the list by order if impl_name is NULL.
Without this patch, the app will always use the same type of sock implementation
if the order is fixed. For example, if we have posix and uring together,
the first one will always be uring.
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
Change-Id: Ic49563f5025085471d356798e522ff7ab748f586
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478140
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2019-12-17 13:57:10 +00:00
|
|
|
* Create a socket using the specific sock implementation, connect the socket
|
|
|
|
* to the specified address and port (of the server), and then return the socket.
|
|
|
|
* This function is used by client.
|
2018-05-15 06:31:01 +00:00
|
|
|
*
|
|
|
|
* \param ip IP address of the server.
|
|
|
|
* \param port Port number of the server.
|
sock: Add impl_name parameter in spdk_sock_listen/connect.
Purpose: With this patch,
(1)We can support using different sock implementations in
one application together.
(2)For one IP address managed by kernel, we can use different method
to listen/connect, e.g., posix, or uring. With this patch, we can
designate the specified sock implementation if impl_name is not NULL
and valid. Otherwise, spdk_sock_listen/connect will try to use the sock
implementations in the list by order if impl_name is NULL.
Without this patch, the app will always use the same type of sock implementation
if the order is fixed. For example, if we have posix and uring together,
the first one will always be uring.
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
Change-Id: Ic49563f5025085471d356798e522ff7ab748f586
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478140
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2019-12-17 13:57:10 +00:00
|
|
|
* \param impl_name The sock_implementation to use, such as "posix". If impl_name is
|
2020-02-19 11:18:51 +00:00
|
|
|
* specified, it will *only* try to connect on that impl. If it is NULL, it will try
|
sock: Add impl_name parameter in spdk_sock_listen/connect.
Purpose: With this patch,
(1)We can support using different sock implementations in
one application together.
(2)For one IP address managed by kernel, we can use different method
to listen/connect, e.g., posix, or uring. With this patch, we can
designate the specified sock implementation if impl_name is not NULL
and valid. Otherwise, spdk_sock_listen/connect will try to use the sock
implementations in the list by order if impl_name is NULL.
Without this patch, the app will always use the same type of sock implementation
if the order is fixed. For example, if we have posix and uring together,
the first one will always be uring.
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
Change-Id: Ic49563f5025085471d356798e522ff7ab748f586
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478140
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2019-12-17 13:57:10 +00:00
|
|
|
* all the sock implementations in order and uses the first sock implementation which
|
2020-02-19 11:18:51 +00:00
|
|
|
* can connect. For example, it may try vpp first, then fall back to posix.
|
2018-05-15 06:31:01 +00:00
|
|
|
*
|
|
|
|
* \return a pointer to the connected socket on success, or NULL on failure.
|
|
|
|
*/
|
sock: Add impl_name parameter in spdk_sock_listen/connect.
Purpose: With this patch,
(1)We can support using different sock implementations in
one application together.
(2)For one IP address managed by kernel, we can use different method
to listen/connect, e.g., posix, or uring. With this patch, we can
designate the specified sock implementation if impl_name is not NULL
and valid. Otherwise, spdk_sock_listen/connect will try to use the sock
implementations in the list by order if impl_name is NULL.
Without this patch, the app will always use the same type of sock implementation
if the order is fixed. For example, if we have posix and uring together,
the first one will always be uring.
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
Change-Id: Ic49563f5025085471d356798e522ff7ab748f586
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478140
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2019-12-17 13:57:10 +00:00
|
|
|
struct spdk_sock *spdk_sock_connect(const char *ip, int port, char *impl_name);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
2020-02-19 11:18:51 +00:00
|
|
|
/**
|
|
|
|
* Create a socket using the specific sock implementation, connect the socket
|
|
|
|
* to the specified address and port (of the server), and then return the socket.
|
|
|
|
* This function is used by client.
|
|
|
|
*
|
|
|
|
* \param ip IP address of the server.
|
|
|
|
* \param port Port number of the server.
|
|
|
|
* \param impl_name The sock_implementation to use, such as "posix". If impl_name is
|
|
|
|
* specified, it will *only* try to connect on that impl. If it is NULL, it will try
|
|
|
|
* all the sock implementations in order and uses the first sock implementation which
|
|
|
|
* can connect. For example, it may try vpp first, then fall back to posix.
|
|
|
|
* \param opts The sock option pointer provided by the user which should not be NULL pointer.
|
|
|
|
*
|
|
|
|
* \return a pointer to the connected socket on success, or NULL on failure.
|
|
|
|
*/
|
|
|
|
struct spdk_sock *spdk_sock_connect_ext(const char *ip, int port, char *impl_name,
|
|
|
|
struct spdk_sock_opts *opts);
|
|
|
|
|
2018-05-15 06:31:01 +00:00
|
|
|
/**
|
sock: Add impl_name parameter in spdk_sock_listen/connect.
Purpose: With this patch,
(1)We can support using different sock implementations in
one application together.
(2)For one IP address managed by kernel, we can use different method
to listen/connect, e.g., posix, or uring. With this patch, we can
designate the specified sock implementation if impl_name is not NULL
and valid. Otherwise, spdk_sock_listen/connect will try to use the sock
implementations in the list by order if impl_name is NULL.
Without this patch, the app will always use the same type of sock implementation
if the order is fixed. For example, if we have posix and uring together,
the first one will always be uring.
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
Change-Id: Ic49563f5025085471d356798e522ff7ab748f586
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478140
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2019-12-17 13:57:10 +00:00
|
|
|
* Create a socket using the specific sock implementation, bind the socket to
|
|
|
|
* the specified address and port and listen on the socket, and then return the socket.
|
|
|
|
* This function is used by server.
|
2018-05-15 06:31:01 +00:00
|
|
|
*
|
|
|
|
* \param ip IP address to listen on.
|
|
|
|
* \param port Port number.
|
sock: Add impl_name parameter in spdk_sock_listen/connect.
Purpose: With this patch,
(1)We can support using different sock implementations in
one application together.
(2)For one IP address managed by kernel, we can use different method
to listen/connect, e.g., posix, or uring. With this patch, we can
designate the specified sock implementation if impl_name is not NULL
and valid. Otherwise, spdk_sock_listen/connect will try to use the sock
implementations in the list by order if impl_name is NULL.
Without this patch, the app will always use the same type of sock implementation
if the order is fixed. For example, if we have posix and uring together,
the first one will always be uring.
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
Change-Id: Ic49563f5025085471d356798e522ff7ab748f586
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478140
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2019-12-17 13:57:10 +00:00
|
|
|
* \param impl_name The sock_implementation to use, such as "posix". If impl_name is
|
|
|
|
* specified, it will *only* try to listen on that impl. If it is NULL, it will try
|
|
|
|
* all the sock implementations in order and uses the first sock implementation which
|
2020-02-19 11:18:51 +00:00
|
|
|
* can listen. For example, it may try vpp first, then fall back to posix.
|
2018-05-15 06:31:01 +00:00
|
|
|
*
|
|
|
|
* \return a pointer to the listened socket on success, or NULL on failure.
|
|
|
|
*/
|
sock: Add impl_name parameter in spdk_sock_listen/connect.
Purpose: With this patch,
(1)We can support using different sock implementations in
one application together.
(2)For one IP address managed by kernel, we can use different method
to listen/connect, e.g., posix, or uring. With this patch, we can
designate the specified sock implementation if impl_name is not NULL
and valid. Otherwise, spdk_sock_listen/connect will try to use the sock
implementations in the list by order if impl_name is NULL.
Without this patch, the app will always use the same type of sock implementation
if the order is fixed. For example, if we have posix and uring together,
the first one will always be uring.
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
Change-Id: Ic49563f5025085471d356798e522ff7ab748f586
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478140
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2019-12-17 13:57:10 +00:00
|
|
|
struct spdk_sock *spdk_sock_listen(const char *ip, int port, char *impl_name);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
2020-02-19 11:18:51 +00:00
|
|
|
/**
|
|
|
|
* Create a socket using the specific sock implementation, bind the socket to
|
|
|
|
* the specified address and port and listen on the socket, and then return the socket.
|
|
|
|
* This function is used by server.
|
|
|
|
*
|
|
|
|
* \param ip IP address to listen on.
|
|
|
|
* \param port Port number.
|
|
|
|
* \param impl_name The sock_implementation to use, such as "posix". If impl_name is
|
|
|
|
* specified, it will *only* try to listen on that impl. If it is NULL, it will try
|
|
|
|
* all the sock implementations in order and uses the first sock implementation which
|
|
|
|
* can listen. For example, it may try vpp first, then fall back to posix.
|
|
|
|
* \param opts The sock option pointer provided by the user, which should not be NULL pointer.
|
|
|
|
*
|
|
|
|
* \return a pointer to the listened socket on success, or NULL on failure.
|
|
|
|
*/
|
|
|
|
struct spdk_sock *spdk_sock_listen_ext(const char *ip, int port, char *impl_name,
|
|
|
|
struct spdk_sock_opts *opts);
|
|
|
|
|
2018-05-15 06:31:01 +00:00
|
|
|
/**
|
|
|
|
* Accept a new connection from a client on the specified socket and return a
|
|
|
|
* socket structure which holds the connection.
|
|
|
|
*
|
|
|
|
* \param sock Listening socket.
|
|
|
|
*
|
|
|
|
* \return a pointer to the accepted socket on success, or NULL on failure.
|
|
|
|
*/
|
2018-02-07 21:46:22 +00:00
|
|
|
struct spdk_sock *spdk_sock_accept(struct spdk_sock *sock);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Close a socket.
|
|
|
|
*
|
|
|
|
* \param sock Socket to close.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
2018-02-07 21:46:22 +00:00
|
|
|
int spdk_sock_close(struct spdk_sock **sock);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
2019-11-21 15:16:18 +00:00
|
|
|
/**
|
|
|
|
* Flush a socket from data gathered in previous writev_async calls.
|
|
|
|
*
|
|
|
|
* \param sock Socket to flush.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
|
|
|
int spdk_sock_flush(struct spdk_sock *sock);
|
|
|
|
|
2018-05-15 06:31:01 +00:00
|
|
|
/**
|
|
|
|
* Receive a message from the given socket.
|
|
|
|
*
|
|
|
|
* \param sock Socket to receive message.
|
|
|
|
* \param buf Pointer to a buffer to hold the data.
|
|
|
|
* \param len Length of the buffer.
|
|
|
|
*
|
|
|
|
* \return the length of the received message on success, -1 on failure.
|
|
|
|
*/
|
2018-02-07 21:46:22 +00:00
|
|
|
ssize_t spdk_sock_recv(struct spdk_sock *sock, void *buf, size_t len);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Write message to the given socket from the I/O vector array.
|
|
|
|
*
|
|
|
|
* \param sock Socket to write to.
|
|
|
|
* \param iov I/O vector.
|
|
|
|
* \param iovcnt Number of I/O vectors in the array.
|
|
|
|
*
|
|
|
|
* \return the length of written message on success, -1 on failure.
|
|
|
|
*/
|
2018-02-07 21:46:22 +00:00
|
|
|
ssize_t spdk_sock_writev(struct spdk_sock *sock, struct iovec *iov, int iovcnt);
|
2019-02-26 23:58:24 +00:00
|
|
|
|
2019-08-26 22:03:07 +00:00
|
|
|
/**
|
|
|
|
* Write data to the given socket asynchronously, calling
|
|
|
|
* the provided callback when the data has been written.
|
|
|
|
*
|
|
|
|
* \param sock Socket to write to.
|
|
|
|
* \param req The write request to submit.
|
|
|
|
*/
|
|
|
|
void spdk_sock_writev_async(struct spdk_sock *sock, struct spdk_sock_request *req);
|
|
|
|
|
2019-02-26 23:58:24 +00:00
|
|
|
/**
|
|
|
|
* Read message from the given socket to the I/O vector array.
|
|
|
|
*
|
|
|
|
* \param sock Socket to receive message.
|
|
|
|
* \param iov I/O vector.
|
|
|
|
* \param iovcnt Number of I/O vectors in the array.
|
|
|
|
*
|
|
|
|
* \return the length of the received message on success, -1 on failure.
|
|
|
|
*/
|
|
|
|
ssize_t spdk_sock_readv(struct spdk_sock *sock, struct iovec *iov, int iovcnt);
|
2018-02-07 19:58:14 +00:00
|
|
|
|
2018-05-15 06:31:01 +00:00
|
|
|
/**
|
|
|
|
* Set the value used to specify the low water mark (in bytes) for this socket.
|
|
|
|
*
|
|
|
|
* \param sock Socket to set for.
|
|
|
|
* \param nbytes Value for recvlowat.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
2018-02-07 21:46:22 +00:00
|
|
|
int spdk_sock_set_recvlowat(struct spdk_sock *sock, int nbytes);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Set receive buffer size for the given socket.
|
|
|
|
*
|
|
|
|
* \param sock Socket to set buffer size for.
|
|
|
|
* \param sz Buffer size in bytes.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
2018-02-07 21:46:22 +00:00
|
|
|
int spdk_sock_set_recvbuf(struct spdk_sock *sock, int sz);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Set send buffer size for the given socket.
|
|
|
|
*
|
|
|
|
* \param sock Socket to set buffer size for.
|
|
|
|
* \param sz Buffer size in bytes.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
2018-02-07 21:46:22 +00:00
|
|
|
int spdk_sock_set_sendbuf(struct spdk_sock *sock, int sz);
|
|
|
|
|
2018-05-15 06:31:01 +00:00
|
|
|
/**
|
|
|
|
* Check whether the address of socket is ipv6.
|
|
|
|
*
|
|
|
|
* \param sock Socket to check.
|
|
|
|
*
|
|
|
|
* \return true if the address of socket is ipv6, or false otherwise.
|
|
|
|
*/
|
2018-02-07 21:46:22 +00:00
|
|
|
bool spdk_sock_is_ipv6(struct spdk_sock *sock);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Check whether the address of socket is ipv4.
|
|
|
|
*
|
|
|
|
* \param sock Socket to check.
|
|
|
|
*
|
|
|
|
* \return true if the address of socket is ipv4, or false otherwise.
|
|
|
|
*/
|
2018-02-07 21:46:22 +00:00
|
|
|
bool spdk_sock_is_ipv4(struct spdk_sock *sock);
|
2018-02-07 19:58:14 +00:00
|
|
|
|
2019-10-04 17:48:32 +00:00
|
|
|
/**
|
|
|
|
* Check whether the socket is currently connected.
|
|
|
|
*
|
|
|
|
* \param sock Socket to check
|
|
|
|
*
|
|
|
|
* \return true if the socket is connected or false otherwise.
|
|
|
|
*/
|
|
|
|
bool spdk_sock_is_connected(struct spdk_sock *sock);
|
|
|
|
|
2018-05-15 06:31:01 +00:00
|
|
|
/**
|
|
|
|
* Callback function for spdk_sock_group_add_sock().
|
|
|
|
*
|
|
|
|
* \param arg Argument for the callback function.
|
|
|
|
* \param group Socket group.
|
|
|
|
* \param sock Socket.
|
|
|
|
*/
|
2018-02-08 00:28:19 +00:00
|
|
|
typedef void (*spdk_sock_cb)(void *arg, struct spdk_sock_group *group, struct spdk_sock *sock);
|
|
|
|
|
2018-05-15 06:31:01 +00:00
|
|
|
/**
|
2019-05-14 18:40:20 +00:00
|
|
|
* Create a new socket group with user provided pointer
|
2018-05-15 06:31:01 +00:00
|
|
|
*
|
2019-05-14 18:40:20 +00:00
|
|
|
* \param ctx the context provided by user.
|
2018-05-15 06:31:01 +00:00
|
|
|
* \return a pointer to the created group on success, or NULL on failure.
|
|
|
|
*/
|
2019-05-14 18:40:20 +00:00
|
|
|
struct spdk_sock_group *spdk_sock_group_create(void *ctx);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the ctx of the sock group
|
|
|
|
*
|
|
|
|
* \param sock_group Socket group.
|
|
|
|
* \return a pointer which is ctx of the sock_group.
|
|
|
|
*/
|
|
|
|
void *spdk_sock_group_get_ctx(struct spdk_sock_group *sock_group);
|
|
|
|
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a socket to the group.
|
|
|
|
*
|
|
|
|
* \param group Socket group.
|
|
|
|
* \param sock Socket to add.
|
|
|
|
* \param cb_fn Called when the operation completes.
|
|
|
|
* \param cb_arg Argument passed to the callback function.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
2018-02-08 00:28:19 +00:00
|
|
|
int spdk_sock_group_add_sock(struct spdk_sock_group *group, struct spdk_sock *sock,
|
|
|
|
spdk_sock_cb cb_fn, void *cb_arg);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove a socket from the group.
|
|
|
|
*
|
|
|
|
* \param group Socket group.
|
|
|
|
* \param sock Socket to remove.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
2018-02-08 00:28:19 +00:00
|
|
|
int spdk_sock_group_remove_sock(struct spdk_sock_group *group, struct spdk_sock *sock);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Poll incoming events for each registered socket.
|
|
|
|
*
|
|
|
|
* \param group Group to poll.
|
|
|
|
*
|
2019-07-31 02:08:30 +00:00
|
|
|
* \return the number of events on success, -1 on failure.
|
2018-05-15 06:31:01 +00:00
|
|
|
*/
|
2018-02-08 00:28:19 +00:00
|
|
|
int spdk_sock_group_poll(struct spdk_sock_group *group);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Poll incoming events up to max_events for each registered socket.
|
|
|
|
*
|
|
|
|
* \param group Group to poll.
|
|
|
|
* \param max_events Number of maximum events to poll for each socket.
|
|
|
|
*
|
|
|
|
* \return the number of events on success, -1 on failure.
|
|
|
|
*/
|
2018-02-08 00:28:19 +00:00
|
|
|
int spdk_sock_group_poll_count(struct spdk_sock_group *group, int max_events);
|
2018-05-15 06:31:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Close all registered sockets of the group and then remove the group.
|
|
|
|
*
|
|
|
|
* \param group Group to close.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
2018-02-08 00:28:19 +00:00
|
|
|
int spdk_sock_group_close(struct spdk_sock_group **group);
|
|
|
|
|
2019-05-14 12:50:15 +00:00
|
|
|
/**
|
|
|
|
* Get the optimal sock group for this sock.
|
|
|
|
*
|
|
|
|
* \param sock The socket
|
|
|
|
* \param group Returns the optimal sock group. If there is no optimal sock group, returns NULL.
|
|
|
|
*
|
|
|
|
* \return 0 on success. Negated errno on failure.
|
|
|
|
*/
|
|
|
|
int spdk_sock_get_optimal_sock_group(struct spdk_sock *sock, struct spdk_sock_group **group);
|
|
|
|
|
2018-02-07 19:58:14 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* SPDK_SOCK_H */
|