2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "stc-manager-plugin-pcap.h"
21 #define PCAP_DBUS_ERROR_NAME "net.stc.pcap.Error.Failed"
23 #define STC_PCAP_DBUS_REPLY_ERROR(invocation, err_num) \
24 g_dbus_method_invocation_return_dbus_error((invocation), \
25 PCAP_DBUS_ERROR_NAME, \
26 stc_err_strs[-(err_num)])
28 static const gchar *stc_err_strs[] = {
41 gboolean __validate_pcap(stc_pcap_s *pcap)
43 __STC_LOG_FUNC_ENTER__;
46 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
47 return FALSE; //LCOV_EXCL_LINE
50 if (pcap->ifname == NULL ||
51 pcap->ifname[0] == '\0') {
52 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
53 return FALSE; //LCOV_EXCL_LINE
56 __STC_LOG_FUNC_EXIT__;
60 static void __stc_extract_pcap(const char *key, GVariant *value,
63 stc_pcap_s *pcap = (stc_pcap_s *) user_data;
65 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
66 return; //LCOV_EXCL_LINE
69 if (!g_strcmp0(key, STC_PCAP_IFNAME)) {
71 const gchar *str = g_variant_get_string(value, &str_length);
72 pcap->ifname = g_strdup(str);
73 STC_LOGD("ifname: [%s]", pcap->ifname);
75 } else if (!g_strcmp0(key, STC_PCAP_NFLOG_GROUP)) {
76 pcap->nflog_group = g_variant_get_uint32(value);
77 STC_LOGD("nflog group: [%d]", pcap->nflog_group);
80 STC_LOGD("Unknown select rule"); //LCOV_EXCL_LINE
84 gboolean handle_pcap_start(StcPcap *object,
85 GDBusMethodInvocation *invocation,
89 __STC_LOG_FUNC_ENTER__;
90 GVariantIter *iter = NULL;
92 int ret = STC_ERROR_NONE;
94 stc_set_keep_alive(TRUE);
96 memset(&pcap, 0, sizeof(stc_pcap_s));
98 g_variant_get(parameters, "a{sv}", &iter);
100 stc_manager_gdbus_dict_foreach(iter,
103 g_variant_iter_free(iter);
106 if (__validate_pcap(&pcap) == FALSE) {
107 STC_PCAP_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
108 STC_ERROR_INVALID_PARAMETER);
110 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
114 ret = stc_plugin_pcap_register_loop(pcap.ifname, pcap.nflog_group);
115 if (ret != STC_ERROR_NONE) {
116 STC_PCAP_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
118 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
122 STC_DBUS_REPLY_ERROR_NONE(invocation);
124 __STC_LOG_FUNC_EXIT__;
128 gboolean handle_pcap_stop(StcPcap *object,
129 GDBusMethodInvocation *invocation,
130 GVariant *parameters,
133 __STC_LOG_FUNC_ENTER__;
134 GVariantIter *iter = NULL;
136 int ret = STC_ERROR_NONE;
138 stc_set_keep_alive(TRUE);
140 memset(&pcap, 0, sizeof(stc_pcap_s));
142 g_variant_get(parameters, "a{sv}", &iter);
144 stc_manager_gdbus_dict_foreach(iter,
147 g_variant_iter_free(iter);
150 if (__validate_pcap(&pcap) == FALSE) {
151 STC_PCAP_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
152 STC_ERROR_INVALID_PARAMETER);
154 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
158 ret = stc_plugin_pcap_unregister_loop(pcap.ifname, pcap.nflog_group);
159 if (ret != STC_ERROR_NONE) {
160 STC_PCAP_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
162 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
166 STC_DBUS_REPLY_ERROR_NONE(invocation);
168 __STC_LOG_FUNC_EXIT__;
172 gboolean handle_pcap_get_all(StcPcap *object,
173 GDBusMethodInvocation *invocation,
176 __STC_LOG_FUNC_ENTER__;
177 GVariantBuilder *builder = NULL;
178 GVariant *return_parameters = NULL;
180 stc_set_keep_alive(TRUE);
182 builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
184 stc_plugin_pcap_get_all_loop(builder);
186 return_parameters = g_variant_new("(aa{sv})", builder);
187 g_variant_builder_unref(builder);
189 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
190 STC_DBUS_REPLY(invocation, return_parameters);
191 __STC_LOG_FUNC_EXIT__;
195 gboolean handle_pcap_find_all_devs(StcPcap *object,
196 GDBusMethodInvocation *invocation,
199 __STC_LOG_FUNC_ENTER__;
200 GVariantBuilder *builder = NULL;
201 GVariant *return_parameters = NULL;
203 stc_set_keep_alive(TRUE);
205 builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
207 stc_plugin_pcap_find_all_devs(builder);
209 return_parameters = g_variant_new("(aa{sv})", builder);
210 g_variant_builder_unref(builder);
212 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
213 STC_DBUS_REPLY(invocation, return_parameters);
214 __STC_LOG_FUNC_EXIT__;