#include "stc-plugin-pcap.h"
+#define PCAP_IFNAME "ifname"
+#define PCAP_NFLOG_GROUP "nflog_group"
+
//LCOV_EXCL_START
static GHashTable *g_pcap_tables = NULL;
static bool g_pcap_start_fm = false;
g_thread_unref(data->thread);
- FREE(data->name);
+ FREE(data->ifname);
FREE(data);
}
return false;
snprintf(buf, sizeof(buf), "%s_%d",
- pcap_data->name, pcap_data->group);
+ pcap_data->ifname, pcap_data->nflog_group);
lookup = g_hash_table_lookup(g_pcap_tables, buf);
if (!lookup) {
}
for (dev = alldevs; dev; dev = dev->next) {
- if (g_strcmp0(dev->name, pcap_data->name) == 0) {
+ if (g_strcmp0(dev->name, pcap_data->ifname) == 0) {
name = g_strdup(dev->name);
break;
}
pcap_freealldevs(alldevs);
if (name == NULL) {
- STC_LOGE("Failed to find dev [%s]", pcap_data->name);
+ STC_LOGE("Failed to find dev [%s]", pcap_data->ifname);
goto thread_exit;
}
goto thread_exit;
}
+ STC_LOGD("Pcap loop start [%s]", name);
pcap_loop(pcap_data->handle, 0, __pcap_handler, NULL);
+ STC_LOGD("Pcap loop end [%s]", name);
pcap_close(pcap_data->handle);
+ STC_LOGD("Pcap closed [%s]", name);
thread_exit:
FREE(name);
return NULL;
}
+static void __pcap_make_params(gpointer key, gpointer value,
+ gpointer user_data)
+{
+ stc_pcap_data_s *data = (stc_pcap_data_s *)value;
+ GVariantBuilder *builder = (GVariantBuilder *)user_data;
+ GVariantBuilder sub_builder;
+
+ g_variant_builder_init(&sub_builder, G_VARIANT_TYPE("a{sv}"));
+
+ g_variant_builder_add(&sub_builder, "{sv}", PCAP_IFNAME,
+ g_variant_new_string(data->ifname));
+
+ g_variant_builder_add(&sub_builder, "{sv}", PCAP_NFLOG_GROUP,
+ g_variant_new_uint32(data->nflog_group));
+
+ g_variant_builder_add_value(builder, g_variant_builder_end(&sub_builder));
+}
+
int stc_plugin_pcap_initialize(void)
{
__STC_LOG_FUNC_ENTER__;
return STC_ERROR_NONE;
}
-int stc_plugin_pcap_register_loop_pcap(const char *ifname,
- int group)
+int stc_plugin_pcap_register_loop(const char *ifname,
+ int nflog_group)
{
stc_pcap_data_s *data;
stc_pcap_data_s *lookup;
STC_ERROR_FAIL,
"Invalid parameter [ifname]");
- snprintf(buf, sizeof(buf), "%s_%d", ifname, group);
+ snprintf(buf, sizeof(buf), "%s_%d", ifname, nflog_group);
lookup = g_hash_table_lookup(g_pcap_tables, buf);
if (lookup) {
return STC_ERROR_OUT_OF_MEMORY;
}
- data->name = g_strdup(ifname);
- data->group = group;
+ data->ifname = g_strdup(ifname);
+ data->nflog_group = nflog_group;
data->thread = g_thread_new(buf, __pcap_thread_func, data);
g_hash_table_insert(g_pcap_tables, g_strdup(buf), data);
return STC_ERROR_NONE;
}
-int stc_plugin_pcap_unregister_loop_pcap(const char *ifname,
- int group)
+int stc_plugin_pcap_unregister_loop(const char *ifname,
+ int nflog_group)
{
stc_pcap_data_s *lookup;
char buf[MAX_IFACE_LENGTH];
STC_ERROR_FAIL,
"Invalid parameter [ifname]");
- snprintf(buf, sizeof(buf), "%s_%d", ifname, group);
+ snprintf(buf, sizeof(buf), "%s_%d", ifname, nflog_group);
lookup = g_hash_table_lookup(g_pcap_tables, buf);
if (!lookup) {
}
pcap_breakloop(lookup->handle);
+ STC_LOGD("Successfully removed pcap loop [%s]", buf);
+
+ return STC_ERROR_NONE;
+}
+
+int stc_plugin_pcap_get_all_loop(GVariantBuilder *builder)
+{
+ ret_value_msg_if(g_pcap_tables == NULL,
+ STC_ERROR_FAIL,
+ "pcap tables is not initialized!");
+
+ g_hash_table_foreach(g_pcap_tables, __pcap_make_params, builder);
return STC_ERROR_NONE;
}
stc_plugin_pcap_lookup_net,
.find_alldevs =
stc_plugin_pcap_find_alldevs,
- .register_loop_pcap =
- stc_plugin_pcap_register_loop_pcap,
- .unregister_loop_pcap =
- stc_plugin_pcap_unregister_loop_pcap
+ .register_loop =
+ stc_plugin_pcap_register_loop,
+ .unregister_loop =
+ stc_plugin_pcap_unregister_loop,
+ .get_all_loop =
+ stc_plugin_pcap_get_all_loop
};
//LCOV_EXCL_STOP
return stc_plugin->find_alldevs();
}
-int stc_plugin_pcap_register_loop_pcap(const char *ifname,
- int group)
+int stc_plugin_pcap_register_loop(const char *ifname,
+ int nflog_group)
{
if (!stc_plugin_enabled) {
if (STC_DEBUG_LOG)
return STC_ERROR_UNINITIALIZED;
}
- return stc_plugin->register_loop_pcap(ifname, group);
+ return stc_plugin->register_loop(ifname, nflog_group);
}
-int stc_plugin_pcap_unregister_loop_pcap(const char *ifname,
- int group)
+int stc_plugin_pcap_unregister_loop(const char *ifname,
+ int nflog_group)
{
if (!stc_plugin_enabled) {
if (STC_DEBUG_LOG)
return STC_ERROR_UNINITIALIZED;
}
- return stc_plugin->unregister_loop_pcap(ifname, group);
+ return stc_plugin->unregister_loop(ifname, nflog_group);
+}
+
+int stc_plugin_pcap_get_all_loop(GVariantBuilder *builder)
+{
+ if (!stc_plugin_enabled) {
+ if (STC_DEBUG_LOG)
+ STC_LOGE("Plugin wasn't enabled");
+ return STC_ERROR_UNINITIALIZED;
+ }
+
+ if (!stc_plugin) {
+ if (STC_DEBUG_LOG)
+ STC_LOGE("Plugin wasn't loaded");
+ return STC_ERROR_UNINITIALIZED;
+ }
+
+ return stc_plugin->get_all_loop(builder);
}
//LCOV_EXCL_STOP
return TRUE;
}
- ret = stc_plugin_pcap_register_loop_pcap(pcap.ifname, pcap.nflog_group);
+ ret = stc_plugin_pcap_register_loop(pcap.ifname, pcap.nflog_group);
if (ret != STC_ERROR_NONE) {
STC_PCAP_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
__STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
return TRUE;
}
- ret = stc_plugin_pcap_unregister_loop_pcap(pcap.ifname, pcap.nflog_group);
+ ret = stc_plugin_pcap_unregister_loop(pcap.ifname, pcap.nflog_group);
if (ret != STC_ERROR_NONE) {
STC_PCAP_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
__STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
__STC_LOG_FUNC_EXIT__;
return TRUE;
}
+
+gboolean handle_pcap_get_all(StcPcap *object,
+ GDBusMethodInvocation *invocation,
+ void *user_data)
+{
+ __STC_LOG_FUNC_ENTER__;
+ GVariantBuilder *builder = NULL;
+ GVariant *return_parameters = NULL;
+
+ builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
+
+ stc_plugin_pcap_get_all_loop(builder);
+
+ return_parameters = g_variant_new("(aa{sv})", builder);
+ g_variant_builder_unref(builder);
+
+ DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
+ STC_DBUS_REPLY(invocation, return_parameters);
+ __STC_LOG_FUNC_EXIT__;
+ return TRUE;
+}