summaryrefslogtreecommitdiffstats
path: root/hicn-light/src/io/udpConnection.c
diff options
context:
space:
mode:
authorMauro Sardara <msardara@cisco.com>2019-02-11 10:44:29 +0100
committerMauro Sardara <msardara@cisco.com>2019-02-18 10:48:38 +0000
commit79e0d4f89c4d532189aae06cc5dfbc14e3269703 (patch)
treeadc83eccb824c019c3c43cc48bcd4de6656eea8d /hicn-light/src/io/udpConnection.c
parent7d2b217bd01a8da1a2ac57aaad59b3179c7af916 (diff)
[HICN-50] Added udp application connector.
Change-Id: I0c5afad4b404ec485f50b1342b81e70ef85a5163 Signed-off-by: Mauro Sardara <msardara@cisco.com> Signed-off-by: michele papalini <micpapal@cisco.com>
Diffstat (limited to 'hicn-light/src/io/udpConnection.c')
-rw-r--r--hicn-light/src/io/udpConnection.c94
1 files changed, 30 insertions, 64 deletions
diff --git a/hicn-light/src/io/udpConnection.c b/hicn-light/src/io/udpConnection.c
index 6c2e35392..3faf2bfac 100644
--- a/hicn-light/src/io/udpConnection.c
+++ b/hicn-light/src/io/udpConnection.c
@@ -19,6 +19,7 @@
* NB The Send() function may overflow the output buffer
*
*/
+#include <sys/uio.h>
#include <errno.h>
#include <src/config.h>
@@ -58,6 +59,7 @@ typedef struct udp_state {
// Prototypes
static bool _send(IoOperations *ops, const Address *nexthop, Message *message);
+static bool _sendCommandResponse(IoOperations *ops, struct iovec *message);
static const Address *_getRemoteAddress(const IoOperations *ops);
static const AddressPair *_getAddressPair(const IoOperations *ops);
static unsigned _getConnectionId(const IoOperations *ops);
@@ -82,6 +84,7 @@ static const void *_streamConnection_Class(const IoOperations *ops) {
static IoOperations _template = {.closure = NULL,
.send = &_send,
+ .sendCommandResponse = &_sendCommandResponse,
.getRemoteAddress = &_getRemoteAddress,
.getAddressPair = &_getAddressPair,
.getConnectionId = &_getConnectionId,
@@ -239,38 +242,6 @@ static bool _send(IoOperations *ops, const Address *dummy, Message *message) {
// in this particular connection we don't need natting beacause we send the
// packet to the next hop using upd connection
-#if 0
- if((hicnConnState->peerAddressLength == sizeof(struct sockaddr_in)) || (hicnConnState->localAddressLength == sizeof(struct sockaddr_in)))
- return false;
-
- if(message_GetType(message) = MessagePacketType_ContentObject){
- //this is a data packet. We need to put the remote address in the destination field
- messageHandler_SetDestination_IPv6((uint8_t *) message_FixedHeader(message),
- &((struct sockaddr_in6 *) hicnConnState->peerAddress)->sin6_addr);
-
- } else if (message_GetType(message) == MessagePacketType_Interest) {
- //this si an interest packet. We need to put the local address in the source field
- messageHandler_SetSource_IPv6((uint8_t *) message_FixedHeader(message),
- &((struct sockaddr_in6 *) hicnConnState->localAddress)->sin6_addr);
-
- //only in this case we may need to set the probeDestAddress
- if(hicnConnState->refreshProbeDestAddress){
- _refreshProbeDestAddress(hicnConnState, message_FixedHeader(message));
- }
-
- } else if (message_GetType(message) == MessagePacketType_WldrNotification) {
- //here we don't need to do anything for now
- }else{
- //unkown packet
- if (logger_IsLoggable(hicnConnState->logger, LoggerFacility_IO, PARCLogLevel_Debug)) {
- logger_Log(hicnConnState->logger, LoggerFacility_IO, PARCLogLevel_Debug, __func__,
- "connid %u can't parse the message",
- hicnConnState->id);
- }
- return false;
- }
-#endif
-
ssize_t writeLength =
sendto(udpConnState->udpListenerSocket, message_FixedHeader(message),
(int)message_Length(message), 0, udpConnState->peerAddress,
@@ -290,44 +261,39 @@ static bool _send(IoOperations *ops, const Address *dummy, Message *message) {
return true;
}
+static bool _sendCommandResponse(IoOperations *ops, struct iovec *message){
+ parcAssertNotNull(ops, "Parameter ops must be non-null");
+ parcAssertNotNull(message, "Parameter message must be non-null");
+ _UdpState *udpConnState = (_UdpState *)ioOperations_GetClosure(ops);
+
+ // Perform connect before to establish association between this peer and
+ // the remote peer. This is required to use writev.
+ // Connection association can be changed at any time.
+ connect(udpConnState->udpListenerSocket,
+ udpConnState->peerAddress,
+ udpConnState->peerAddressLength);
+
+ ssize_t writeLength = writev(udpConnState->udpListenerSocket, message, 2);
+
+ struct sockaddr any_address = {0};
+ any_address.sa_family = AF_UNSPEC;
+ connect(udpConnState->udpListenerSocket,
+ &any_address, (socklen_t)sizeof(any_address));
+
+ if (writeLength < 0) {
+ return false;
+ }
+
+ return true;
+}
+
static list_connections_type _getConnectionType(const IoOperations *ops) {
return CONN_UDP;
}
static Ticks _sendProbe(IoOperations *ops, unsigned probeType,
uint8_t *message) {
-#if 0
- parcAssertNotNull(ops, "Parameter ops must be non-null");
- _MetisUdpState *udpConnState = (_MetisUdpState *) metisIoOperations_GetClosure(ops);
-
-
- uint8_t *pkt;
- size_t pkt_size = 8;
- pkt = (uint8_t *) malloc(sizeof(uint8_t) * pkt_size);
- for (unsigned i = 0; i < pkt_size; i++) {
- pkt[i] = 0;
- }
- pkt[0] = 1; //type
- pkt[1] = probeType; //packet type
- pkt[6] = 8; //header len (16bit, network order)
-
- ssize_t writeLen = sendto(udpConnState->udpListenerSocket, pkt, pkt_size, 0, udpConnState->peerAddress, udpConnState->peerAddressLength);
-
- if (writeLen < 0) {
- if (errno == EAGAIN || errno == EWOULDBLOCK) {
- free(pkt);
- return 0;
- } else {
- //this print is for debugging
- printf("Incorrect write length %zd, expected %zd: (%d) %s\n", writeLen, pkt_size, errno, strerror(errno));
- free(pkt);
- return 0;
- }
- }
-
- free(pkt);
- return metisForwarder_GetTicks(udpConnState->metis);
-#endif
+ //TODO
return 0;
}