/** queue with spare tracker */
static DefragTrackerQueue defragtracker_spare_q;
+/**
+ * \brief Update memcap value
+ *
+ * \param size new memcap value
+ */
+int DefragTrackerSetMemcap(uint64_t size)
+{
+ if ((uint64_t)SC_ATOMIC_GET(defrag_memuse) < size) {
+ SC_ATOMIC_SET(defrag_config.memcap, size);
+ return 1;
+ }
+
+ return 0;
+}
+
+/**
+ * \brief Return memcap value
+ *
+ * \retval memcap value
+ */
+uint64_t DefragTrackerGetMemcap(void)
+{
+ uint64_t memcapcopy = SC_ATOMIC_GET(defrag_config.memcap);
+ return memcapcopy;
+}
+
+/**
+ * \brief Return memuse value
+ *
+ * \retval memuse value
+ */
+uint64_t DefragTrackerGetMemuse(void)
+{
+ uint64_t memusecopy = (uint64_t)SC_ATOMIC_GET(defrag_memuse);
+ return memusecopy;
+}
+
uint32_t DefragTrackerSpareQueueGetSize(void)
{
return DefragTrackerQueueLen(&defragtracker_spare_q);
SC_ATOMIC_INIT(defragtracker_counter);
SC_ATOMIC_INIT(defrag_memuse);
SC_ATOMIC_INIT(defragtracker_prune_idx);
+ SC_ATOMIC_INIT(defrag_config.memcap);
DefragTrackerQueueInit(&defragtracker_spare_q);
/* set defaults */
defrag_config.hash_rand = (uint32_t)RandomGet();
defrag_config.hash_size = DEFRAG_DEFAULT_HASHSIZE;
- defrag_config.memcap = DEFRAG_DEFAULT_MEMCAP;
defrag_config.prealloc = DEFRAG_DEFAULT_PREALLOC;
+ SC_ATOMIC_SET(defrag_config.memcap, DEFRAG_DEFAULT_MEMCAP);
/* Check if we have memcap and hash_size defined at config */
const char *conf_val;
uint32_t configval = 0;
+ uint64_t defrag_memcap;
/** set config values for memcap, prealloc and hash_size */
if ((ConfGet("defrag.memcap", &conf_val)) == 1)
{
- if (ParseSizeStringU64(conf_val, &defrag_config.memcap) < 0) {
+ if (ParseSizeStringU64(conf_val, &defrag_memcap) < 0) {
SCLogError(SC_ERR_SIZE_PARSE, "Error parsing defrag.memcap "
"from conf file - %s. Killing engine",
conf_val);
exit(EXIT_FAILURE);
+ } else {
+ SC_ATOMIC_SET(defrag_config.memcap, defrag_memcap);
}
}
if ((ConfGet("defrag.hash-size", &conf_val)) == 1)
}
}
SCLogDebug("DefragTracker config from suricata.yaml: memcap: %"PRIu64", hash-size: "
- "%"PRIu32", prealloc: %"PRIu32, defrag_config.memcap,
+ "%"PRIu32", prealloc: %"PRIu32, SC_ATOMIC_GET(defrag_config.memcap),
defrag_config.hash_size, defrag_config.prealloc);
/* alloc hash memory */
"max defrag memcap is smaller than projected hash size. "
"Memcap: %"PRIu64", Hash table size %"PRIu64". Calculate "
"total hash size by multiplying \"defrag.hash-size\" with %"PRIuMAX", "
- "which is the hash bucket size.", defrag_config.memcap, hash_size,
+ "which is the hash bucket size.", SC_ATOMIC_GET(defrag_config.memcap), hash_size,
(uintmax_t)sizeof(DefragTrackerHashRow));
exit(EXIT_FAILURE);
}
if (!(DEFRAG_CHECK_MEMCAP(sizeof(DefragTracker)))) {
SCLogError(SC_ERR_DEFRAG_INIT, "preallocating defrag trackers failed: "
"max defrag memcap reached. Memcap %"PRIu64", "
- "Memuse %"PRIu64".", defrag_config.memcap,
+ "Memuse %"PRIu64".", SC_ATOMIC_GET(defrag_config.memcap),
((uint64_t)SC_ATOMIC_GET(defrag_memuse) + (uint64_t)sizeof(DefragTracker)));
exit(EXIT_FAILURE);
}
if (quiet == FALSE) {
SCLogConfig("defrag memory usage: %"PRIu64" bytes, maximum: %"PRIu64,
- SC_ATOMIC_GET(defrag_memuse), defrag_config.memcap);
+ SC_ATOMIC_GET(defrag_memuse), SC_ATOMIC_GET(defrag_config.memcap));
}
return;
SC_ATOMIC_DESTROY(defragtracker_prune_idx);
SC_ATOMIC_DESTROY(defrag_memuse);
SC_ATOMIC_DESTROY(defragtracker_counter);
+ SC_ATOMIC_DESTROY(defrag_config.memcap);
//SC_ATOMIC_DESTROY(flow_flags);
return;
}