diff options
author | Jordan Augé <jordan.auge+fdio@cisco.com> | 2019-04-16 14:39:50 +0200 |
---|---|---|
committer | Jordan Augé <jordan.auge+fdio@cisco.com> | 2019-04-16 15:37:53 +0200 |
commit | 3ed2badca49b8c7e636d8f8c40f532a7d3a7ba29 (patch) | |
tree | f865fe39515b3a496bfeee7ad8ef73916104caf4 /hicn-light/src/hicn/io/hicnConnection.c | |
parent | c365689250216861fd7727203ee6ba1049ad5778 (diff) |
[HICN-177] Provide helpers to send, receive and process control messages
Change-Id: I5f7270568eaf24858346edebc638cf51e28cc5ad
Signed-off-by: Jordan Augé <jordan.auge+fdio@cisco.com>
Diffstat (limited to 'hicn-light/src/hicn/io/hicnConnection.c')
-rw-r--r-- | hicn-light/src/hicn/io/hicnConnection.c | 58 |
1 files changed, 41 insertions, 17 deletions
diff --git a/hicn-light/src/hicn/io/hicnConnection.c b/hicn-light/src/hicn/io/hicnConnection.c index d9797786a..3c6f0612c 100644 --- a/hicn-light/src/hicn/io/hicnConnection.c +++ b/hicn-light/src/hicn/io/hicnConnection.c @@ -24,6 +24,7 @@ #include <src/hicn/config.h> #include <stdio.h> #include <string.h> +#include <sys/uio.h> #include <unistd.h> #include <hicn/core/message.h> @@ -75,7 +76,8 @@ typedef struct hicn_state { // Prototypes static bool _send(IoOperations *ops, const Address *nexthop, Message *message); -static bool _sendCommandResponse(IoOperations *ops, struct iovec *message); +static bool _sendIOVBuffer(IoOperations *ops, struct iovec *message, + size_t size); static const Address *_getRemoteAddress(const IoOperations *ops); static const AddressPair *_getAddressPair(const IoOperations *ops); static unsigned _getConnectionId(const IoOperations *ops); @@ -99,18 +101,20 @@ static const void *_streamConnection_Class(const IoOperations *ops) { return _ioOperationsGuid; } -static IoOperations _template = {.closure = NULL, - .send = &_send, - .sendCommandResponse = &_sendCommandResponse, - .getRemoteAddress = &_getRemoteAddress, - .getAddressPair = &_getAddressPair, - .getConnectionId = &_getConnectionId, - .isUp = &_isUp, - .isLocal = &_isLocal, - .destroy = &_destroy, - .class = &_streamConnection_Class, - .getConnectionType = &_getConnectionType, - .sendProbe = &_sendProbe}; +static IoOperations _template = { + .closure = NULL, + .send = &_send, + .sendIOVBuffer = &_sendIOVBuffer, + .getRemoteAddress = &_getRemoteAddress, + .getAddressPair = &_getAddressPair, + .getConnectionId = &_getConnectionId, + .isUp = &_isUp, + .isLocal = &_isLocal, + .destroy = &_destroy, + .class = &_streamConnection_Class, + .getConnectionType = &_getConnectionType, + .sendProbe = &_sendProbe, +}; // ================================================================= @@ -329,10 +333,30 @@ static bool _send(IoOperations *ops, const Address *dummy, Message *message) { return true; } -static bool _sendCommandResponse(IoOperations *ops, struct iovec *message) { - //XXX this should be nerver called since we do not handle control messages - //with hicn connections, so nothing to do here! - return false; +static bool _sendIOVBuffer(IoOperations *ops, struct iovec *message, + size_t size) { + parcAssertNotNull(ops, "Parameter ops must be non-null"); + parcAssertNotNull(message, "Parameter message must be non-null"); + + _HicnState *hicnConnState = (_HicnState *)ioOperations_GetClosure(ops); + + + ssize_t n = writev(hicnConnState->hicnListenerSocket, message, size); + if (n < 0) { + if (errno != EAGAIN && errno != EWOULDBLOCK) { + if (logger_IsLoggable(hicnConnState->logger, LoggerFacility_IO, + PARCLogLevel_Error)) { + size_t length = 0; + for (int i = 0; i < size; i++) + length += message[i].iov_len; + logger_Log(hicnConnState->logger, LoggerFacility_IO, PARCLogLevel_Error, + __func__, "Incorrect write length %zd, expected %zd: (%d) %s\n", + n, length, errno, strerror(errno)); + } + } + return false; + } + return true; } static list_connections_type _getConnectionType(const IoOperations *ops) { |