From cd2d3db3b765fdaab245196ae34930180c4edb03 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 31 May 2011 18:39:33 +0200 Subject: osmo-pcap-client: Set the filter string on the pcap device.. --- src/osmo_client_core.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++---- src/osmo_client_main.c | 7 +++++ src/osmo_client_vty.c | 13 ++++++-- 3 files changed, 93 insertions(+), 7 deletions(-) (limited to 'src') 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 +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; } -- cgit v1.2.3