예제 #1
0
static void
_demuxDelivery(AthenaTransportLink *athenaTransportLink, CCNxMetaMessage *ccnxMetaMessage, struct sockaddr_in *peerAddress, socklen_t peerAddressLength)
{
    struct _UDPLinkData *linkData = athenaTransportLink_GetPrivateData(athenaTransportLink);

    AthenaTransportLink *demuxLink = parcHashCodeTable_Get(linkData->multiplexTable, (void *) _hashAddress(peerAddress));

    // If it's an unknown peer, try to create a new link
    if (demuxLink == NULL) {
        _UDPLinkData *newLinkData = _UDPLinkData_Create();

        // We use our parents fd to send, and receive demux'd messages from our parent on our queue
        newLinkData->fd = dup(linkData->fd);
        newLinkData->queue = parcDeque_Create();
        assertNotNull(newLinkData->queue, "Could not create data queue for new link");

        newLinkData->link.myAddressLength = linkData->link.myAddressLength;
        memcpy(&newLinkData->link.myAddress, &linkData->link.myAddress, linkData->link.myAddressLength);

        newLinkData->link.peerAddressLength = peerAddressLength;
        memcpy(&newLinkData->link.peerAddress, peerAddress, peerAddressLength);

        demuxLink = _newLink(athenaTransportLink, newLinkData);
        if (demuxLink) {
            parcHashCodeTable_Add(linkData->multiplexTable, (void *) _hashAddress(peerAddress), demuxLink);
        }
    }

    // If there's no existing link and a new one can't be created, drop the message
    if (demuxLink == NULL) {
        ccnxMetaMessage_Release(&ccnxMetaMessage);
        return;
    }

    _queueMessage(demuxLink, ccnxMetaMessage);
}
예제 #2
0
static bool
_metisLRUContentStore_PutContent(MetisContentStoreInterface *storeImpl, MetisMessage *content, uint64_t currentTimeTicks)

{
    bool result = false;
    _MetisLRUContentStore *store = (_MetisLRUContentStore *) metisContentStoreInterface_GetPrivateData(storeImpl);
    assertNotNull(store, "Parameter store must be non-null");
    assertNotNull(content, "Parameter objectMessage must be non-null");

    assertTrue(metisMessage_GetType(content) == MetisMessagePacketType_ContentObject,
               "Parameter objectMessage must be a Content Object");

    if (store->objectCapacity == 0) {
        return false;
    }

    uint64_t expiryTimeTicks = metisContentStoreEntry_MaxExpiryTime;
    uint64_t recommendedCacheTimeTicks = metisContentStoreEntry_MaxRecommendedCacheTime;

    if (metisMessage_HasExpiryTime(content)) {
        expiryTimeTicks = metisMessage_GetExpiryTimeTicks(content);
    }

    if (metisMessage_HasRecommendedCacheTime(content)) {
        recommendedCacheTimeTicks = metisMessage_GetRecommendedCacheTimeTicks(content);
    }

    // Don't add anything that's already expired or has exceeded RCT.
    if (currentTimeTicks >= expiryTimeTicks || currentTimeTicks >= recommendedCacheTimeTicks) {
        return false;
    }

    if (store->objectCount >= store->objectCapacity) {
        // Store is full. Need to make room.
        _evictByStorePolicy(store, currentTimeTicks);
    }

    // And now add a new entry to the head of the LRU.

    MetisContentStoreEntry *entry = metisContentStoreEntry_Create(content, store->lru);

    if (entry != NULL) {
        if (parcHashCodeTable_Add(store->storageByNameAndObjectHashHash, content, entry)) {
            parcHashCodeTable_Add(store->indexByNameHash, content, entry);

            if (metisMessage_HasKeyId(content)) {
                parcHashCodeTable_Add(store->indexByNameAndKeyIdHash, content, entry);
            }

            if (metisContentStoreEntry_HasExpiryTimeTicks(entry)) {
                metisTimeOrderedList_Add(store->indexByExpirationTime, entry);
            }

            if (metisContentStoreEntry_HasRecommendedCacheTimeTicks(entry)) {
                metisTimeOrderedList_Add(store->indexByRecommendedCacheTime, entry);
            }

            store->objectCount++;
            store->stats.countAdds++;

            if (metisLogger_IsLoggable(store->logger, MetisLoggerFacility_Processor, PARCLogLevel_Debug)) {
                metisLogger_Log(store->logger, MetisLoggerFacility_Processor, PARCLogLevel_Debug, __func__,
                                "LRUContentStore %p saved message %p (object count %" PRIu64 ")",
                                (void *) store, (void *) content, store->objectCount);
            }

            result = true;
        } else {
            // Free what we just created, but did not add. 'entry' has ownership of 'copy', and so will
            // call _Release() on it
            metisContentStoreEntry_Release(&entry);

            if (metisLogger_IsLoggable(store->logger, MetisLoggerFacility_Processor, PARCLogLevel_Warning)) {
                metisLogger_Log(store->logger, MetisLoggerFacility_Processor, PARCLogLevel_Warning, __func__,
                                "LRUContentStore %p failed to add message %p to hash table",
                                (void *) store, (void *) content);
            }
        }
    }

    return result;
}