aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-light/src/hicn/io
diff options
context:
space:
mode:
authorAngelo Mantellini <manangel@cisco.com>2019-07-18 18:31:46 +0200
committerAngelo Mantellini <manangel@cisco.com>2019-10-12 13:27:54 +0000
commiteefc7ae95bbd680416163e5617bada1949b32afc (patch)
tree336a4100832001b2991be007749d12ec5c28c1a0 /hicn-light/src/hicn/io
parent91304b8cb75df7cb516518b53e3c1156d0f27ba5 (diff)
[HICN-247] remove listener and bug fixing
Change-Id: I4e5419a837131680fe0e21eb295462ccb2be8613 Signed-off-by: Angelo Mantellini <manangel@cisco.com>
Diffstat (limited to 'hicn-light/src/hicn/io')
-rw-r--r--hicn-light/src/hicn/io/hicnListener.c198
-rw-r--r--hicn-light/src/hicn/io/ioOperations.c2
-rw-r--r--hicn-light/src/hicn/io/listenerSet.c14
-rw-r--r--hicn-light/src/hicn/io/listenerSet.h16
-rw-r--r--hicn-light/src/hicn/io/streamConnection.c1
-rw-r--r--hicn-light/src/hicn/io/tcpListener.c11
-rw-r--r--hicn-light/src/hicn/io/udpListener.c3
7 files changed, 144 insertions, 101 deletions
diff --git a/hicn-light/src/hicn/io/hicnListener.c b/hicn-light/src/hicn/io/hicnListener.c
index 995347d6a..8409db027 100644
--- a/hicn-light/src/hicn/io/hicnListener.c
+++ b/hicn-light/src/hicn/io/hicnListener.c
@@ -82,6 +82,12 @@ static EncapType _getEncapType(const ListenerOps *ops);
static int _getSocket(const ListenerOps *ops);
static unsigned _createNewConnection(ListenerOps *listener, int fd, const AddressPair *pair);
static const Connection * _lookupConnection(ListenerOps * listener, const AddressPair *pair);
+static Message *_readMessage(ListenerOps * listener, int fd, uint8_t *msgBuffer);
+static void _hicnListener_readcb(int fd, PARCEventType what, void *listener_void);
+static Address *_createAddressFromPacket(uint8_t *msgBuffer);
+static void _handleProbeMessage(ListenerOps * listener, uint8_t *msgBuffer);
+static void _handleWldrNotification(ListenerOps *listener, uint8_t *msgBuffer);
+static void _readFrameToDiscard(HicnListener *hicn, int fd);
static ListenerOps _hicnTemplate = {
.context = NULL,
@@ -96,8 +102,6 @@ static ListenerOps _hicnTemplate = {
.lookupConnection = &_lookupConnection,
};
-static void _hicnListener_readcb(int fd, PARCEventType what, void *hicnVoid);
-
static bool _isEmptyAddressIPv6(Address *address) {
struct sockaddr_in6 *addr6 =
parcMemory_AllocateAndClear(sizeof(struct sockaddr_in6));
@@ -118,6 +122,100 @@ static bool _isEmptyAddressIPv6(Address *address) {
return res;
}
+static Message *_readMessage(ListenerOps * listener, int fd, uint8_t *msgBuffer) {
+ HicnListener * hicn = (HicnListener*)listener->context;
+ Message *message = NULL;
+
+ ssize_t readLength = read(fd, msgBuffer, MTU_SIZE);
+
+ if (readLength < 0) {
+ printf("read failed %d: (%d) %s\n", fd, errno, strerror(errno));
+ return message;
+ }
+
+ size_t packetLength = messageHandler_GetTotalPacketLength(msgBuffer);
+
+ if (readLength != packetLength) {
+ parcMemory_Deallocate((void **)&msgBuffer);
+ return message;
+ }
+
+ if (messageHandler_IsTCP(msgBuffer)) {
+ MessagePacketType pktType;
+ unsigned connid = 0;
+ if (messageHandler_IsData(msgBuffer)) {
+ pktType = MessagePacketType_ContentObject;
+ if (hicn->connection_id == -1) {
+ parcMemory_Deallocate((void **)&msgBuffer);
+ return message;
+ } else {
+ connid = hicn->connection_id;
+ }
+ } else if (messageHandler_IsInterest(msgBuffer)) {
+ // notice that the connections for the interest (the one that we create at
+ // run time) uses as a local address 0::0, so the main tun
+ pktType = MessagePacketType_Interest;
+ Address *packetAddr = _createAddressFromPacket(msgBuffer);
+
+ AddressPair *pair_find = addressPair_Create(packetAddr, /* dummy */ hicn->localAddress);
+ const Connection *conn = _lookupConnection(listener, pair_find);
+ addressPair_Release(&pair_find);
+ if (conn == NULL) {
+ AddressPair *pair = addressPair_Create(hicn->localAddress, packetAddr);
+ connid = _createNewConnection(listener, fd, pair);
+ addressPair_Release(&pair);
+ } else {
+ connid = connection_GetConnectionId(conn);
+ }
+ addressDestroy(&packetAddr);
+ } else {
+ printf("Got a packet that is not a data nor an interest, drop it!\n");
+ parcMemory_Deallocate((void **)&msgBuffer);
+ return message;
+ }
+
+ message = message_CreateFromByteArray(connid, msgBuffer, pktType,
+ forwarder_GetTicks(hicn->forwarder),
+ forwarder_GetLogger(hicn->forwarder));
+ if (message == NULL) {
+ parcMemory_Deallocate((void **)&msgBuffer);
+ }
+ } else if (messageHandler_IsWldrNotification(msgBuffer)) {
+ _handleWldrNotification(listener, msgBuffer);
+ } else if (messageHandler_IsLoadBalancerProbe(msgBuffer)) {
+ _handleProbeMessage(listener, msgBuffer);
+ } else {
+ messageHandler_handleHooks(hicn->forwarder, msgBuffer, listener, fd, NULL);
+ parcMemory_Deallocate((void **)&msgBuffer);
+ }
+
+ return message;
+}
+
+static void _receivePacket(ListenerOps * listener, int fd) {
+ HicnListener * hicn = (HicnListener*)listener->context;
+ Message *msg = NULL;
+ uint8_t *msgBuffer = parcMemory_AllocateAndClear(MTU_SIZE);
+ msg = _readMessage(listener, fd, msgBuffer);
+
+ if (msg) {
+ forwarder_Receive(hicn->forwarder, msg);
+ }
+}
+
+static void _hicnListener_readcb(int fd, PARCEventType what, void *listener_void) {
+ ListenerOps * listener = (ListenerOps *)listener_void;
+ HicnListener *hicn = (HicnListener *)listener->context;
+
+ if (hicn->inetFamily == IPv4 || hicn->inetFamily == IPv6) {
+ if (what & PARCEventType_Read) {
+ _receivePacket(listener, fd);
+ }
+ } else {
+ _readFrameToDiscard(hicn, fd);
+ }
+}
+
static bool _isEmptyAddressIPv4(Address *address) {
bool res = false;
@@ -133,13 +231,8 @@ ListenerOps *hicnListener_CreateInet(Forwarder *forwarder, char *symbolic,
hicn->forwarder = forwarder;
hicn->listenerName = parcMemory_StringDuplicate(symbolic, strlen(symbolic));
- hicn->logger = logger_Acquire(forwarder_GetLogger(forwarder));
-
- hicn->logger = logger_Acquire(forwarder_GetLogger(forwarder));
hicn->conn_id = forwarder_GetNextConnectionId(forwarder);
- hicn->localAddress = addressCopy(address);
-
hicn->inetFamily = IPv4;
hicn->connection_id = -1;
@@ -438,6 +531,7 @@ static const char *_getListenerName(const ListenerOps *ops) {
HicnListener *hicn = (HicnListener *)ops->context;
return hicn->listenerName;
}
+
static const char *_getInterfaceName(const ListenerOps *ops) {
const char *interfaceName = "";
return interfaceName;
@@ -601,96 +695,6 @@ static void _handleWldrNotification(ListenerOps *listener, uint8_t *msgBuffer) {
}
-static Message *_readMessage(ListenerOps * listener, int fd, uint8_t *msgBuffer) {
- HicnListener * hicn = (HicnListener*)listener->context;
- Message *message = NULL;
-
- ssize_t readLength = read(fd, msgBuffer, MTU_SIZE);
-
- if (readLength < 0) {
- printf("read failed %d: (%d) %s\n", fd, errno, strerror(errno));
- return message;
- }
-
- size_t packetLength = messageHandler_GetTotalPacketLength(msgBuffer);
- if (readLength != packetLength) {
- parcMemory_Deallocate((void **)&msgBuffer);
- return message;
- }
- if (messageHandler_IsTCP(msgBuffer)) {
- MessagePacketType pktType;
- unsigned connid = 0;
- if (messageHandler_IsData(msgBuffer)) {
- pktType = MessagePacketType_ContentObject;
- if (hicn->connection_id == -1) {
- parcMemory_Deallocate((void **)&msgBuffer);
- return message;
- } else {
- connid = hicn->connection_id;
- }
- } else if (messageHandler_IsInterest(msgBuffer)) {
- // notice that the connections for the interest (the one that we create at
- // run time) uses as a local address 0::0, so the main tun
- pktType = MessagePacketType_Interest;
- Address *packetAddr = _createAddressFromPacket(msgBuffer);
- AddressPair *pair_find = addressPair_Create(packetAddr, /* dummy */ hicn->localAddress);
- const Connection *conn = _lookupConnection(listener, pair_find);
- addressPair_Release(&pair_find);
- if (conn == NULL) {
- AddressPair *pair = addressPair_Create(hicn->localAddress, packetAddr);
- connid = _createNewConnection(listener, fd, pair);
- addressPair_Release(&pair);
- } else {
- connid = connection_GetConnectionId(conn);
- }
- addressDestroy(&packetAddr);
- } else {
- printf("Got a packet that is not a data nor an interest, drop it!\n");
- parcMemory_Deallocate((void **)&msgBuffer);
- return message;
- }
-
- message = message_CreateFromByteArray(connid, msgBuffer, pktType,
- forwarder_GetTicks(hicn->forwarder),
- forwarder_GetLogger(hicn->forwarder));
- if (message == NULL) {
- parcMemory_Deallocate((void **)&msgBuffer);
- }
- } else if (messageHandler_IsWldrNotification(msgBuffer)) {
- _handleWldrNotification(listener, msgBuffer);
- } else if (messageHandler_IsLoadBalancerProbe(msgBuffer)) {
- _handleProbeMessage(listener, msgBuffer);
- } else {
- messageHandler_handleHooks(hicn->forwarder, msgBuffer, listener, fd, NULL);
- parcMemory_Deallocate((void **)&msgBuffer);
- }
-
- return message;
-}
-
-static void _receivePacket(ListenerOps * listener, int fd) {
- HicnListener * hicn = (HicnListener*)listener->context;
- Message *msg = NULL;
- uint8_t *msgBuffer = parcMemory_AllocateAndClear(MTU_SIZE);
- msg = _readMessage(listener, fd, msgBuffer);
-
- if (msg) {
- forwarder_Receive(hicn->forwarder, msg);
- }
-}
-
-static void _hicnListener_readcb(int fd, PARCEventType what, void *listener_void) {
- ListenerOps * listener = (ListenerOps *)listener_void;
- HicnListener *hicn = (HicnListener *)listener->context;
-
- if (hicn->inetFamily == IPv4 || hicn->inetFamily == IPv6) {
- if (what & PARCEventType_Read) {
- _receivePacket(listener, fd);
- }
- } else {
- _readFrameToDiscard(hicn, fd);
- }
-}
diff --git a/hicn-light/src/hicn/io/ioOperations.c b/hicn-light/src/hicn/io/ioOperations.c
index 31e37a461..b2d346ed8 100644
--- a/hicn-light/src/hicn/io/ioOperations.c
+++ b/hicn-light/src/hicn/io/ioOperations.c
@@ -41,6 +41,8 @@ const AddressPair *ioOperations_GetAddressPair(const IoOperations *ops) {
return ops->getAddressPair(ops);
}
+
+
bool ioOperations_IsUp(const IoOperations *ops) { return ops->isUp(ops); }
bool ioOperations_IsLocal(const IoOperations *ops) { return ops->isLocal(ops); }
diff --git a/hicn-light/src/hicn/io/listenerSet.c b/hicn-light/src/hicn/io/listenerSet.c
index 3e44973d7..45dbe887a 100644
--- a/hicn-light/src/hicn/io/listenerSet.c
+++ b/hicn-light/src/hicn/io/listenerSet.c
@@ -166,3 +166,17 @@ int listenerSet_FindIdByListenerName(const ListenerSet *set, const char *listene
return index;
}
+
+void listenerSet_RemoveById(const ListenerSet *set, unsigned id) {
+ parcAssertNotNull(set, "Parameter set must be non-null");
+
+ for (size_t i = 0; i < parcArrayList_Size(set->listOfListeners);
+ i++) {
+ ListenerOps *ops = parcArrayList_Get(set->listOfListeners, i);
+ parcAssertNotNull(ops, "Got null listener ops at index %zu", i);
+ if (ops->getInterfaceIndex(ops) == id) {
+ parcArrayList_RemoveAtIndex(set->listOfListeners, i);
+ break;
+ }
+ }
+}
diff --git a/hicn-light/src/hicn/io/listenerSet.h b/hicn-light/src/hicn/io/listenerSet.h
index c8937fa02..5779d2af4 100644
--- a/hicn-light/src/hicn/io/listenerSet.h
+++ b/hicn-light/src/hicn/io/listenerSet.h
@@ -135,7 +135,6 @@ ListenerOps *listenerSet_Get(const ListenerSet *set, size_t index);
ListenerOps *listenerSet_Find(const ListenerSet *set, EncapType encapType,
const Address *localAddress);
-
/**
* Looks up a listener by its id
*
@@ -153,6 +152,7 @@ ListenerOps *listenerSet_Find(const ListenerSet *set, EncapType encapType,
* @endcode
*/
ListenerOps *listenerSet_FindById(const ListenerSet *set, unsigned id);
+
/**
* Looks up a listener by its id
*
@@ -171,4 +171,18 @@ ListenerOps *listenerSet_FindById(const ListenerSet *set, unsigned id);
*/
int listenerSet_FindIdByListenerName(const ListenerSet *set, const char *listenerName);
+/**
+ * Remove up a listener by its id
+ *
+ * <#Paragraphs Of Explanation#>
+ *
+ * @param [in] set An allocated listener set
+ * @param [in] id of the listener
+ *
+ * Example:
+ * @code
+ *
+ * @endcode
+ */
+void listenerSet_RemoveById(const ListenerSet *set, unsigned id);
#endif
diff --git a/hicn-light/src/hicn/io/streamConnection.c b/hicn-light/src/hicn/io/streamConnection.c
index 224f129f7..08ff728d6 100644
--- a/hicn-light/src/hicn/io/streamConnection.c
+++ b/hicn-light/src/hicn/io/streamConnection.c
@@ -589,6 +589,7 @@ static void _conn_readcb(PARCEventQueue *event, PARCEventType type,
// kind of packets
while (parcEventBuffer_GetLength(input) >= sizeof(header_control_message) &&
parcEventBuffer_GetLength(input) >= stream->nextMessageLength) {
+
if ((command = _isACommand(input)) != LAST_COMMAND_VALUE) {
struct iovec *rx;
// Get message from the stream and set the stream->nextMessageLength
diff --git a/hicn-light/src/hicn/io/tcpListener.c b/hicn-light/src/hicn/io/tcpListener.c
index 4464edf28..e2b80c215 100644
--- a/hicn-light/src/hicn/io/tcpListener.c
+++ b/hicn-light/src/hicn/io/tcpListener.c
@@ -31,7 +31,6 @@
typedef struct tcp_listener {
char *listenerName;
-
Forwarder *forwarder;
Logger *logger;
@@ -49,10 +48,15 @@ typedef struct tcp_listener {
static void _tcpListener_Destroy(_TcpListener **listenerPtr);
static void _tcpListener_OpsDestroy(ListenerOps **listenerOpsPtr);
+
static const char *_tcpListener_ListenerName(const ListenerOps *ops);
+
static unsigned _tcpListener_OpsGetInterfaceIndex(const ListenerOps *ops);
+
static const Address *_tcpListener_OpsGetListenAddress(const ListenerOps *ops);
+
static const char *_tcpListener_InterfaceName(const ListenerOps *ops);
+
static EncapType _tcpListener_OpsGetEncapType(const ListenerOps *ops);
static ListenerOps _tcpTemplate = {
@@ -71,6 +75,7 @@ static void _tcpListener_Listen(int, struct sockaddr *, int socklen,
ListenerOps *tcpListener_CreateInet6(Forwarder *forwarder, char *listenerName,
struct sockaddr_in6 sin6, char *interfaceName) {
+
_TcpListener *tcp = parcMemory_AllocateAndClear(sizeof(_TcpListener));
parcAssertNotNull(tcp, "parcMemory_AllocateAndClear(%zu) returned NULL",
sizeof(_TcpListener));
@@ -123,7 +128,10 @@ ListenerOps *tcpListener_CreateInet(Forwarder *forwarder, char *listenerName,
sizeof(_TcpListener));
tcp->forwarder = forwarder;
+ tcp->listenerName = parcMemory_StringDuplicate(listenerName, strlen(listenerName));
tcp->logger = logger_Acquire(forwarder_GetLogger(forwarder));
+ tcp->interfaceName = parcMemory_StringDuplicate(interfaceName, strlen(interfaceName));
+
tcp->listener = dispatcher_CreateListener(
forwarder_GetDispatcher(forwarder), _tcpListener_Listen, (void *)tcp, -1,
(struct sockaddr *)&sin, sizeof(sin));
@@ -175,7 +183,6 @@ static void _tcpListener_Destroy(_TcpListener **listenerPtr) {
parcMemory_Deallocate((void **)&tcp->listenerName);
parcMemory_Deallocate((void **)&tcp->interfaceName);
-
logger_Release(&tcp->logger);
dispatcher_DestroyListener(forwarder_GetDispatcher(tcp->forwarder),
&tcp->listener);
diff --git a/hicn-light/src/hicn/io/udpListener.c b/hicn-light/src/hicn/io/udpListener.c
index 050ca104c..f43756a11 100644
--- a/hicn-light/src/hicn/io/udpListener.c
+++ b/hicn-light/src/hicn/io/udpListener.c
@@ -40,8 +40,8 @@
#define IPv6 6
struct udp_listener {
- Forwarder *forwarder;
char *listenerName;
+ Forwarder *forwarder;
Logger *logger;
PARCEvent *udp_event;
@@ -76,6 +76,7 @@ static ListenerOps udpTemplate = {
.getInterfaceName = &_getInterfaceName,
};
+
static void _readcb(int fd, PARCEventType what, void * listener_void);
#ifdef __ANDROID__