mirror of
https://github.com/openappsec/attachment.git
synced 2026-01-17 16:00:26 +03:00
Added bucket functionality
This commit is contained in:
@@ -278,31 +278,28 @@ isNanoQueueEmpty(NanoAttachment *attachment)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Implement
|
|
||||||
// [hash on session id] -> [verdict+modification]
|
|
||||||
// Updating the table, and then return the session ID to the caller
|
|
||||||
SessionID
|
SessionID
|
||||||
PopFromNanoQueue(NanoAttachment *attachment)
|
PopFromNanoQueue(NanoAttachment *attachment)
|
||||||
{
|
{
|
||||||
// Pop from queue
|
AttachmentVerdictResponse response;
|
||||||
// Put into hash table.
|
|
||||||
|
|
||||||
SessionID session_id = 0;
|
SessionID session_id = 0;
|
||||||
|
NanoCommunicationResult res;
|
||||||
|
// Pop from queue
|
||||||
|
|
||||||
|
res = NanoAsyncAddResponse(attachment, session_id, &response);
|
||||||
|
if (res != NANO_OK) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return session_id;
|
return session_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Implement
|
|
||||||
// given a sessionID return a verdict from the table.
|
|
||||||
AttachmentVerdictResponse
|
AttachmentVerdictResponse
|
||||||
getAttachmentVerdictResponse(NanoAttachment *attachment, SessionID session_id)
|
getAttachmentVerdictResponse(NanoAttachment *attachment, SessionID session_id)
|
||||||
{
|
{
|
||||||
(void)attachment;
|
AttachmentVerdictResponse response = NanoAsyncFindResponse(attachment, session_id);
|
||||||
(void)session_id;
|
NanoAsyncRemoveResponse(attachment, session_id);
|
||||||
return (AttachmentVerdictResponse) {
|
return response;
|
||||||
.verdict = ATTACHMENT_VERDICT_INSPECT,
|
|
||||||
.session_id = session_id,
|
|
||||||
.modifications = NULL
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1,57 @@
|
|||||||
#include "nano_attachment_bucket.h"
|
#include "nano_attachment_bucket.h"
|
||||||
|
|
||||||
|
#define CP_ASYNC_CTX_BUCKETS 2048 ///< Hash table buckets for better distribution
|
||||||
|
|
||||||
|
///
|
||||||
|
/// @brief Hash function for session IDs using Knuth's multiplicative method
|
||||||
|
/// @param[in] session_id Session ID to hash
|
||||||
|
/// @return Hash bucket index
|
||||||
|
///
|
||||||
|
static uint
|
||||||
|
nano_attachment_async_ctx_hash(SessionID session_id)
|
||||||
|
{
|
||||||
|
// Knuth's multiplicative hash with golden ratio constant
|
||||||
|
static const uint32_t KNUTH_CONSTANT = 2654435761U; // (sqrt(5) - 1) / 2 * 2^32
|
||||||
|
return (session_id * KNUTH_CONSTANT) % CP_ASYNC_CTX_BUCKETS;
|
||||||
|
}
|
||||||
|
|
||||||
|
AttachmentVerdictResponse
|
||||||
|
NanoAsyncFindResponse(NanoAttachment *attachment, SessionID session_id)
|
||||||
|
{
|
||||||
|
AttachmentVerdictResponse response;
|
||||||
|
uint bucket = nano_attachment_async_ctx_hash(session_id);
|
||||||
|
|
||||||
|
response.verdict = attachment->async_buckets[bucket]->verdict;
|
||||||
|
response.session_id = attachment->async_buckets[bucket]->session_id;
|
||||||
|
response.modifications = attachment->async_buckets[bucket]->modifications;
|
||||||
|
response.web_response_data = attachment->async_buckets[bucket]->web_response_data;
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
NanoCommunicationResult
|
||||||
|
NanoAsyncAddResponse(NanoAttachment *attachment, SessionID session_id, AttachmentVerdictResponse *response)
|
||||||
|
{
|
||||||
|
uint bucket;
|
||||||
|
|
||||||
|
if (response == NULL) {
|
||||||
|
return NANO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
bucket = nano_attachment_async_ctx_hash(session_id);
|
||||||
|
attachment->async_buckets[bucket]->session_id = response->session_id;
|
||||||
|
attachment->async_buckets[bucket]->verdict = response->verdict;
|
||||||
|
attachment->async_buckets[bucket]->modifications = response->modifications;
|
||||||
|
attachment->async_buckets[bucket]->web_response_data = response->web_response_data;
|
||||||
|
return NANO_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
NanoAsyncRemoveResponse(NanoAttachment *attachment, SessionID session_id)
|
||||||
|
{
|
||||||
|
uint bucket = nano_attachment_async_ctx_hash(ctx->session_id);
|
||||||
|
attachment->async_buckets[bucket]->session_id = 0;
|
||||||
|
attachment->async_buckets[bucket]->verdict = ATTACHMENT_VERDICT_INSPECT;
|
||||||
|
attachment->async_buckets[bucket]->modifications = NULL;
|
||||||
|
attachment->async_buckets[bucket]->web_response_data = NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,4 +5,9 @@
|
|||||||
#include "nano_attachment_common.h"
|
#include "nano_attachment_common.h"
|
||||||
#include "nano_initializer.h"
|
#include "nano_initializer.h"
|
||||||
|
|
||||||
|
AttachmentVerdictResponse NanoAsyncFindResponse(NanoAttachment *attachment, SessionID session_id);
|
||||||
|
|
||||||
|
NanoCommunicationResult NanoAsyncAddResponse(NanoAttachment *attachment, SessionID session_id, AttachmentVerdictResponse *response);
|
||||||
|
|
||||||
|
void NanoAsyncRemoveResponse(NanoAttachment *attachment, SessionID session_id);
|
||||||
#endif // __NANO_ATTACHMENT_BUCKET_H__
|
#endif // __NANO_ATTACHMENT_BUCKET_H__
|
||||||
|
|||||||
@@ -86,6 +86,8 @@ typedef struct NanoAttachment {
|
|||||||
uint64_t metric_data[METRIC_TYPES_COUNT];
|
uint64_t metric_data[METRIC_TYPES_COUNT];
|
||||||
uint64_t metric_average_data_divisor[METRIC_TYPES_COUNT];
|
uint64_t metric_average_data_divisor[METRIC_TYPES_COUNT];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
AttachmentVerdictResponse async_buckets[CP_ASYNC_CTX_BUCKETS]; ///< Buckets for storing verdict responses.
|
||||||
} NanoAttachment;
|
} NanoAttachment;
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|||||||
Reference in New Issue
Block a user