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); }
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; }