transports: Resize socket send buffer if needed
This was originally added in openbmc/pldm to make the socket send buffer
big enough to send a message if the message is longer than the current
send buffer size.
When you call set_sock_opt with buffer size X, given that X is within a
certain range, the send buffer is actually set to 2*X. get_sock_opt
returns the 2*X value, not X. So add in some helper functions.
Change-Id: I8ded9357db4268cd264cf0ecfb80479223106c09
Signed-off-by: Rashmica Gupta <rashmica@linux.ibm.com>
diff --git a/src/transport/af-mctp.c b/src/transport/af-mctp.c
index 5084f7d..2ba854e 100644
--- a/src/transport/af-mctp.c
+++ b/src/transport/af-mctp.c
@@ -4,9 +4,11 @@
#include "container-of.h"
#include "libpldm/pldm.h"
#include "libpldm/transport.h"
+#include "socket.h"
#include "transport.h"
#include <errno.h>
+#include <limits.h>
#include <linux/mctp.h>
#include <poll.h>
#include <stdlib.h>
@@ -21,6 +23,7 @@
struct pldm_transport transport;
int socket;
pldm_tid_t tid_eid_map[MCTP_MAX_NUM_EID];
+ struct pldm_socket_sndbuf socket_send_buf;
};
#define transport_to_af_mctp(ptr) \
@@ -119,6 +122,12 @@
addr.smctp_type = MCTP_MSG_TYPE_PLDM;
addr.smctp_tag = MCTP_TAG_OWNER;
+ if (req_msg_len > INT_MAX ||
+ pldm_socket_sndbuf_accomodate(&(af_mctp->socket_send_buf),
+ (int)req_msg_len)) {
+ return PLDM_REQUESTER_SEND_FAIL;
+ }
+
ssize_t rc = sendto(af_mctp->socket, pldm_req_msg, req_msg_len, 0,
(struct sockaddr *)&addr, sizeof(addr));
if (rc == -1) {
@@ -149,6 +158,14 @@
free(af_mctp);
return -1;
}
+
+ if (pldm_socket_sndbuf_init(&af_mctp->socket_send_buf,
+ af_mctp->socket)) {
+ close(af_mctp->socket);
+ free(af_mctp);
+ return -1;
+ }
+
*ctx = af_mctp;
return 0;
}