static MetisMessage * _metisLRUContentStore_MatchInterest(MetisContentStoreInterface *storeImpl, MetisMessage *interest) { MetisMessage *result = NULL; _MetisLRUContentStore *store = (_MetisLRUContentStore *) metisContentStoreInterface_GetPrivateData(storeImpl); assertNotNull(store, "Parameter store must be non-null"); assertNotNull(interest, "Parameter interestMessage must be non-null"); assertTrue(metisMessage_GetType(interest) == MetisMessagePacketType_Interest, "Parameter interestMessage must be an Interest"); // This will do the most restrictive lookup. // a) If the interest has a ContentObjectHash restriction, it will look only in the ByNameAndObjectHash table. // b) If it has a KeyId, it will look only in the ByNameAndKeyId table. // c) otherwise, it looks only in the ByName table. PARCHashCodeTable *table; if (metisMessage_HasContentObjectHash(interest)) { table = store->storageByNameAndObjectHashHash; } else if (metisMessage_HasKeyId(interest)) { table = store->indexByNameAndKeyIdHash; } else { table = store->indexByNameHash; } MetisContentStoreEntry *storeEntry = parcHashCodeTable_Get(table, interest); if (storeEntry) { metisContentStoreEntry_MoveToHead(storeEntry); result = metisContentStoreEntry_GetMessage(storeEntry); store->stats.countHits++; if (metisLogger_IsLoggable(store->logger, MetisLoggerFacility_Processor, PARCLogLevel_Debug)) { metisLogger_Log(store->logger, MetisLoggerFacility_Processor, PARCLogLevel_Debug, __func__, "LRUContentStore %p matched interest %p (hits %" PRIu64 ", misses %" PRIu64 ")", (void *) store, (void *) interest, store->stats.countHits, store->stats.countMisses); } } else { store->stats.countMisses++; if (metisLogger_IsLoggable(store->logger, MetisLoggerFacility_Processor, PARCLogLevel_Debug)) { metisLogger_Log(store->logger, MetisLoggerFacility_Processor, PARCLogLevel_Debug, __func__, "LRUContentStore %p missed interest %p (hits %" PRIu64 ", misses %" PRIu64 ")", (void *) store, (void *) interest, store->stats.countHits, store->stats.countMisses); } } return result; }
static bool _metisLRUContentStore_RemoveContent(MetisContentStoreInterface *storeImpl, MetisMessage *content) { bool result = false; _MetisLRUContentStore *store = (_MetisLRUContentStore *) metisContentStoreInterface_GetPrivateData(storeImpl); MetisContentStoreEntry *storeEntry = parcHashCodeTable_Get(store->storageByNameAndObjectHashHash, content); if (storeEntry != NULL) { _metisLRUContentStore_PurgeStoreEntry(store, storeEntry); result = true; } return result; }
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); }