aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2011-05-31 18:39:33 +0200
committerHolger Hans Peter Freyther <zecke@selfish.org>2011-05-31 21:19:51 +0200
commitcd2d3db3b765fdaab245196ae34930180c4edb03 (patch)
treecd53bcbe4c3959266f31b195609808a7e8f99335 /src
parentbac0c98d22b9db20b4def3976c06618e190218de (diff)
osmo-pcap-client: Set the filter string on the pcap device..
Diffstat (limited to 'src')
-rw-r--r--src/osmo_client_core.c80
-rw-r--r--src/osmo_client_main.c7
-rw-r--r--src/osmo_client_vty.c13
3 files changed, 93 insertions, 7 deletions
diff --git a/src/osmo_client_core.c b/src/osmo_client_core.c
index af6cd0e..eb9ebcf 100644
--- a/src/osmo_client_core.c
+++ b/src/osmo_client_core.c
@@ -28,15 +28,57 @@
#include <limits.h>
+static int pcap_read_cb(struct osmo_fd *fd, unsigned int what)
+{
+ struct osmo_pcap_client *client = fd->data;
+ struct pcap_pkthdr hdr;
+ const u_char *data;
+
+ data = pcap_next(client->handle, &hdr);
+ if (!data)
+ return -1;
+ printf("GOT a packet: %d %d\n", hdr.caplen, hdr.len);
+ return 0;
+}
+
+static int osmo_install_filter(struct osmo_pcap_client *client)
+{
+ int rc;
+ pcap_freecode(&client->bpf);
+
+ if (!client->handle) {
+ LOGP(DCLIENT, LOGL_NOTICE,
+ "Filter will only be applied later.\n");
+ return 1;
+ }
+
+ rc = pcap_compile(client->handle, &client->bpf,
+ client->filter_string, 1, PCAP_NETMASK_UNKNOWN);
+ if (rc != 0) {
+ LOGP(DCLIENT, LOGL_ERROR,
+ "Failed to compile the filter: %s\n",
+ pcap_geterr(client->handle));
+ return rc;
+ }
+
+ rc = pcap_setfilter(client->handle, &client->bpf);
+ if (rc != 0) {
+ LOGP(DCLIENT, LOGL_ERROR,
+ "Failed to set the filter on the interface: %s\n",
+ pcap_geterr(client->handle));
+ pcap_freecode(&client->bpf);
+ return rc;
+ }
+
+ return rc;
+}
+
static void free_all(struct osmo_pcap_client *client)
{
if (!client->handle)
return;
- if (client->bpf) {
- pcap_freecode(client->bpf);
- client->bpf = NULL;
- }
+ pcap_freecode(&client->bpf);
if (client->fd.fd != -1) {
osmo_fd_unregister(&client->fd);
@@ -49,6 +91,8 @@ static void free_all(struct osmo_pcap_client *client)
int osmo_client_capture(struct osmo_pcap_client *client, const char *device)
{
+ int fd;
+
talloc_free(client->device);
free_all(client);
@@ -66,10 +110,36 @@ int osmo_client_capture(struct osmo_pcap_client *client, const char *device)
return 2;
}
+ fd = pcap_fileno(client->handle);
+ if (fd == -1) {
+ LOGP(DCLIENT, LOGL_ERROR,
+ "No file descriptor provided.\n");
+ free_all(client);
+ return 3;
+ }
+
+ client->fd.fd = fd;
+ client->fd.when = BSC_FD_READ;
+ client->fd.cb = pcap_read_cb;
+ client->fd.data = client;
+ if (osmo_fd_register(&client->fd) != 0) {
+ LOGP(DCLIENT, LOGL_ERROR,
+ "Failed to register the fd.\n");
+ client->fd.fd = -1;
+ free_all(client);
+ return 4;
+ }
+
+ if (client->filter_string) {
+ osmo_install_filter(client);
+ }
+
return 0;
}
int osmo_client_filter(struct osmo_pcap_client *client, const char *filter)
{
- return 0;
+ talloc_free(client->filter_string);
+ client->filter_string = talloc_strdup(client, filter);
+ return osmo_install_filter(client);
}
diff --git a/src/osmo_client_main.c b/src/osmo_client_main.c
index 96f01ee..9c889ee 100644
--- a/src/osmo_client_main.c
+++ b/src/osmo_client_main.c
@@ -187,6 +187,13 @@ int main(int argc, char **argv)
pcap_client->fd.fd = -1;
vty_client_init(pcap_client);
+
+ if (vty_read_config_file(config_file, NULL) < 0) {
+ LOGP(DCLIENT, LOGL_ERROR,
+ "Failed to parse the config file: %s\n", config_file);
+ exit(1);
+ }
+
if (daemonize) {
rc = osmo_daemonize();
if (rc < 0) {
diff --git a/src/osmo_client_vty.c b/src/osmo_client_vty.c
index 056ab18..0b30eb7 100644
--- a/src/osmo_client_vty.c
+++ b/src/osmo_client_vty.c
@@ -82,14 +82,23 @@ DEFUN(cfg_client_device,
DEFUN(cfg_client_filter,
cfg_client_filter_cmd,
- "pcap filter NAME",
+ "pcap filter .NAME",
PCAP_STRING "filter string in pcap syntax\n" "filter\n")
{
- if (osmo_client_filter(pcap_client, argv[0]) != 0) {
+ char *filter = argv_concat(argv, argc, 0);
+ if (!filter) {
+ vty_out(vty, "Failed to allocate buffer.%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+
+ if (osmo_client_filter(pcap_client, filter) != 0) {
vty_out(vty, "Failed to set the device.%s", VTY_NEWLINE);
+ talloc_free(filter);
return CMD_WARNING;
}
+ talloc_free(filter);
return CMD_SUCCESS;
}