static void checkCallback(cynara_check_id check_id, cynara_async_call_cause cause, int response, void *data);
private:
+ void parseBackendArgs();
+ void setCacheSize(const size_t newCacheSize);
cynara_async *cynaraContext;
NetherDescriptorStatus currentCynaraDescriptorStatus;
int currentCynaraDescriptor;
+ cynara_async_configuration *cynaraConfig;
std::vector<u_int32_t> responseQueue;
int cynaraLastResult;
};
*/
#include "nether_CynaraBackend.h"
+#include "nether_Utils.h"
+
+using namespace std;
#ifdef HAVE_CYNARA
NetherCynaraBackend::NetherCynaraBackend(const NetherConfig &netherConfig)
: NetherPolicyBackend(netherConfig), currentCynaraDescriptor(0),
- cynaraLastResult(CYNARA_API_UNKNOWN_ERROR)
+ cynaraLastResult(CYNARA_API_UNKNOWN_ERROR), cynaraConfig(nullptr)
{
responseQueue.reserve(1024);
+ if (netherConfig.primaryBackendArgs.length() != 0)
+ {
+ parseBackendArgs();
+ }
}
NetherCynaraBackend::~NetherCynaraBackend()
{
+ cynara_async_configuration_destroy(cynaraConfig);
}
bool NetherCynaraBackend::initialize()
{
- cynaraLastResult = cynara_async_initialize(&cynaraContext, NULL, &statusCallback, this);
+ cynaraLastResult = cynara_async_initialize(&cynaraContext, cynaraConfig, &statusCallback, this);
if(cynaraLastResult != CYNARA_API_SUCCESS)
{
LOGE("Failed to initialize cynara client " << cynaraErrorCodeToString(cynaraLastResult));
LOGW("cynara_async_process failed " << cynaraErrorCodeToString(ret));
return (false);
}
+
+void NetherCynaraBackend::setCacheSize(const size_t newCacheSize)
+{
+ int ret;
+
+ if ((ret = cynara_async_configuration_create (&cynaraConfig)) != CYNARA_API_SUCCESS)
+ {
+ LOGE("cynara_async_configuration_create failed: " << cynaraErrorCodeToString(ret));
+ }
+
+ if ((ret = cynara_async_configuration_set_cache_size(cynaraConfig, newCacheSize)) != CYNARA_API_SUCCESS)
+ {
+ LOGE("cynara_async_configuration_set_cache_size failed: " << cynaraErrorCodeToString(ret));
+ }
+
+ LOGD("new cache size: " << newCacheSize);
+}
+
+void NetherCynaraBackend::parseBackendArgs()
+{
+ vector<string> valueNamePairs = tokenize(netherConfig.primaryBackendArgs,";");
+
+ for (vector<string>::iterator it = valueNamePairs.begin(); it != valueNamePairs.end(); ++it)
+ {
+ vector<string> valueNamePair = tokenize(*it, "=");
+
+ if (valueNamePair[0] == "cache-size")
+ {
+ std::string::size_type sz;
+ setCacheSize (stoi (valueNamePair[1], &sz, 10));
+ }
+ }
+}
#endif
stream << packet.remotePort;
return (stream.str());
}
+
+// http://stackoverflow.com/questions/236129/split-a-string-in-c
+std::vector<std::string> tokenize(const std::string &str, const std::string &delimiters)
+{
+ std::vector<std::string> v;
+ typename std::string::size_type start = 0;
+ auto pos = str.find_first_of(delimiters, start);
+ while(pos != std::string::npos) {
+ if(pos != start) // ignore empty tokens
+ v.emplace_back(str, start, pos - start);
+ start = pos + 1;
+ pos = str.find_first_of(delimiters, start);
+ }
+ if(start < str.length()) // ignore trailing delimiter
+ v.emplace_back(str, start, str.length() - start); // add what's left of the string
+ return v;
+}