#include <ccnx/forwarder/metis/core/metis_Forwarder.h>
#include <ccnx/forwarder/metis/core/metis_System.h>
+#include <ccnx/forwarder/metis/io/metis_AddressPair.h>
#include <ccnx/forwarder/metis/core/metis_ConnectionTable.h>
#include <ccnx/forwarder/metis/core/metis_Connection.h>
metisConfiguration_ProcessCreateTunnel(MetisConfiguration *config, CCNxControl *control, unsigned ingressId)
{
bool success = false;
+ bool exists = true;
CPIInterfaceIPTunnel *iptun = cpiLinks_CreateIPTunnelFromControlMessage(control);
const char *symbolicName = cpiInterfaceIPTunnel_GetSymbolicName(iptun);
+ const CPIAddress *source;
+ const CPIAddress *destination;
+
if (!metisSymbolicNameTable_Exists(config->symbolicNameTable, symbolicName)) {
- const CPIAddress *source = cpiInterfaceIPTunnel_GetSourceAddress(iptun);
- const CPIAddress *destination = cpiInterfaceIPTunnel_GetDestinationAddress(iptun);
+ source = cpiInterfaceIPTunnel_GetSourceAddress(iptun);
+ destination = cpiInterfaceIPTunnel_GetDestinationAddress(iptun);
+
+ MetisAddressPair *pair = metisAddressPair_Create(source, destination);
+ const MetisConnection *conn =
+ metisConnectionTable_FindByAddressPair(metisForwarder_GetConnectionTable(config->metis), pair);
+
+ metisAddressPair_Release(&pair);
+
+ if(conn == NULL){
+ //the connection does not exists (even without a name)
+ exists = false;
+ }
+ }
+
+ if(!exists){
+ source = cpiInterfaceIPTunnel_GetSourceAddress(iptun);
+ destination = cpiInterfaceIPTunnel_GetDestinationAddress(iptun);
MetisIoOperations *ops = NULL;
switch (cpiInterfaceIPTunnel_GetTunnelType(iptun)) {
#include <ccnx/forwarder/metis/io/metis_UdpListener.h>
#include <ccnx/forwarder/metis/io/metis_UdpConnection.h>
+#include <ccnx/forwarder/metis/io/metis_UdpTunnel.h>
#include <ccnx/forwarder/metis/core/metis_Forwarder.h>
#include <ccnx/forwarder/metis/core/metis_Connection.h>
* @return The connection id for the new connection
*/
-//for the moment this is not used anymore
-//we need to handle the connection tables in a better way in order to avoid multiple connections
-//with the same address pair.
-/*static unsigned
- * _createNewConnection(MetisUdpListener *udp, int fd, const MetisAddressPair *pair)
- * {
- * bool isLocal = false;
- *
- * // metisUdpConnection_Create takes ownership of the pair
- * MetisIoOperations *ops = metisUdpConnection_Create(udp->metis, fd, pair, isLocal);
- * MetisConnection *conn = metisConnection_Create(ops);
- *
- * metisConnectionTable_Add(metisForwarder_GetConnectionTable(udp->metis), conn);
- * unsigned connid = metisIoOperations_GetConnectionId(ops);
- *
- * return connid;
- * }*/
+static unsigned
+_createNewConnection(MetisUdpListener * udp, int fd, const MetisAddressPair * pair)
+{
+ bool isLocal = false;
+
+ // metisUdpConnection_Create takes ownership of the pair
+ MetisIoOperations * ops = metisUdpConnection_Create(udp->metis, fd, pair, isLocal);
+ MetisConnection * conn = metisConnection_Create(ops);
+
+ metisConnectionTable_Add(metisForwarder_GetConnectionTable(udp->metis), conn);
+ unsigned connid = metisIoOperations_GetConnectionId(ops);
+
+ return connid;
+}
static void
_receivePacket(MetisUdpListener *udp, int fd, size_t packetLength, struct sockaddr_storage *peerIpAddress, socklen_t peerIpAddressLength)
bool foundConnection = _lookupConnectionId(udp, pair, &connid);
if (!foundConnection) {
- PARCEventBuffer *readbuffer = parcEventBuffer_Create();
- parcEventBuffer_ReadFromFileDescriptor(readbuffer, fd, packetLength);
- parcEventBuffer_Destroy(&readbuffer);
- metisAddressPair_Release(&pair);
- return;
- //connid = _createNewConnection(udp, fd, pair);
+ //PARCEventBuffer *readbuffer = parcEventBuffer_Create();
+ //parcEventBuffer_ReadFromFileDescriptor(readbuffer, fd, packetLength);
+ //parcEventBuffer_Destroy(&readbuffer);
+ //metisAddressPair_Release(&pair);
+ //return;
+ connid = _createNewConnection(udp, fd, pair);
}
metisAddressPair_Release(&pair);