2 * Routines for packet capture
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
40 #include <epan/packet.h>
41 #include <epan/dfilter/dfilter.h>
44 #include "capture_ifinfo.h"
45 #include "capture_sync.h"
46 #include "capture_info.h"
47 #include "capture_ui_utils.h"
49 #include "capture-pcap-util.h"
50 #include <epan/prefs.h>
53 #include "capture-wpcap.h"
56 #include "ui/simple_dialog.h"
57 #include "ui/ui_util.h"
59 #include "wsutil/file_util.h"
62 typedef struct if_stat_cache_item_s {
65 } if_stat_cache_item_t;
67 struct if_stat_cache_s {
70 GList *cache_list; /* List of if_stat_chache_entry_t */
73 /* this callback mechanism should possibly be replaced by the g_signal_...() stuff (if I only would know how :-) */
75 capture_callback_t cb_fct;
77 } capture_callback_data_t;
79 static GList *capture_callbacks = NULL;
82 capture_callback_invoke(int event, capture_options *capture_opts)
84 capture_callback_data_t *cb;
85 GList *cb_item = capture_callbacks;
87 /* there should be at least one interested */
88 g_assert(cb_item != NULL);
90 while(cb_item != NULL) {
92 cb->cb_fct(event, capture_opts, cb->user_data);
93 cb_item = g_list_next(cb_item);
99 capture_callback_add(capture_callback_t func, gpointer user_data)
101 capture_callback_data_t *cb;
103 cb = g_malloc(sizeof(capture_callback_data_t));
105 cb->user_data = user_data;
107 capture_callbacks = g_list_append(capture_callbacks, cb);
111 capture_callback_remove(capture_callback_t func)
113 capture_callback_data_t *cb;
114 GList *cb_item = capture_callbacks;
116 while(cb_item != NULL) {
118 if(cb->cb_fct == func) {
119 capture_callbacks = g_list_remove(capture_callbacks, cb);
123 cb_item = g_list_next(cb_item);
126 g_assert_not_reached();
132 * @return TRUE if the capture starts successfully, FALSE otherwise.
135 capture_start(capture_options *capture_opts)
139 GString *source = g_string_new("");
141 capture_opts->state = CAPTURE_PREPARING;
142 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture Start ...");
144 if (capture_opts->ifaces->len < 2) {
146 if (capture_opts->ifaces->len < 4) {
148 for (i = 0; i < capture_opts->ifaces->len; i++) {
149 interface_options interface_opts;
151 interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
153 if (capture_opts->ifaces->len > 2) {
154 g_string_append_printf(source, ",");
156 g_string_append_printf(source, " ");
157 if (i == capture_opts->ifaces->len - 1) {
158 g_string_append_printf(source, "and ");
161 g_string_append_printf(source, "%s", get_iface_description_for_interface(capture_opts, i));
162 if ((interface_opts.cfilter != NULL) &&
163 (strlen(interface_opts.cfilter) > 0)) {
164 g_string_append_printf(source, " (%s)", interface_opts.cfilter);
168 g_string_append_printf(source, "%u interfaces", capture_opts->ifaces->len);
170 cf_set_tempfile_source(capture_opts->cf, source->str);
171 g_string_free(source, TRUE);
172 /* try to start the capture child process */
173 ret = sync_pipe_start(capture_opts);
175 if(capture_opts->save_file != NULL) {
176 g_free(capture_opts->save_file);
177 capture_opts->save_file = NULL;
180 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture Start failed!");
181 capture_opts->state = CAPTURE_STOPPED;
183 /* the capture child might not respond shortly after bringing it up */
184 /* (for example: it will block if no input arrives from an input capture pipe (e.g. mkfifo)) */
186 /* to prevent problems, bring the main GUI into "capture mode" right after a successful */
187 /* spawn/exec of the capture child, without waiting for any response from it */
188 capture_callback_invoke(capture_cb_capture_prepared, capture_opts);
190 if(capture_opts->show_info)
191 capture_info_open(capture_opts);
199 capture_stop(capture_options *capture_opts)
201 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture Stop ...");
203 capture_callback_invoke(capture_cb_capture_stopping, capture_opts);
205 /* stop the capture child gracefully */
206 sync_pipe_stop(capture_opts);
211 capture_restart(capture_options *capture_opts)
213 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture Restart");
215 capture_opts->restart = TRUE;
216 capture_stop(capture_opts);
221 capture_kill_child(capture_options *capture_opts)
223 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_INFO, "Capture Kill");
225 /* kill the capture child */
226 sync_pipe_kill(capture_opts->fork_child);
231 /* We've succeeded in doing a (non real-time) capture; try to read it into a new capture file */
233 capture_input_read_all(capture_options *capture_opts, gboolean is_tempfile, gboolean drops_known,
238 /* Capture succeeded; attempt to open the capture file. */
239 if (cf_open(capture_opts->cf, capture_opts->save_file, is_tempfile, &err) != CF_OK) {
240 /* We're not doing a capture any more, so we don't have a save file. */
244 /* Set the read filter to NULL. */
245 /* XXX - this is odd here; try to put it somewhere where it fits better */
246 cf_set_rfcode(capture_opts->cf, NULL);
248 /* Get the packet-drop statistics.
250 XXX - there are currently no packet-drop statistics stored
251 in libpcap captures, and that's what we're reading.
253 At some point, we will add support in Wiretap to return
254 packet-drop statistics for capture file formats that store it,
255 and will make "cf_read()" get those statistics from Wiretap.
256 We clear the statistics (marking them as "not known") in
257 "cf_open()", and "cf_read()" will only fetch them and mark
258 them as known if Wiretap supplies them, so if we get the
259 statistics now, after calling "cf_open()" but before calling
260 "cf_read()", the values we store will be used by "cf_read()".
262 If a future libpcap capture file format stores the statistics,
263 we'll put them into the capture file that we write, and will
264 thus not have to set them here - "cf_read()" will get them from
265 the file and use them. */
267 cf_set_drops_known(capture_opts->cf, TRUE);
269 /* XXX - on some systems, libpcap doesn't bother filling in
270 "ps_ifdrop" - it doesn't even set it to zero - so we don't
271 bother looking at it.
273 Ideally, libpcap would have an interface that gave us
274 several statistics - perhaps including various interface
275 error statistics - and would tell us which of them it
276 supplies, allowing us to display only the ones it does. */
277 cf_set_drops(capture_opts->cf, drops);
280 /* read in the packet data */
281 switch (cf_read(capture_opts->cf, FALSE)) {
285 /* Just because we got an error, that doesn't mean we were unable
286 to read any of the file; we handle what we could get from the
290 case CF_READ_ABORTED:
291 /* User wants to quit program. Exit by leaving the main loop,
292 so that any quit functions we registered get called. */
293 main_window_nested_quit();
297 /* if we didn't capture even a single packet, close the file again */
298 if(cf_get_packet_count(capture_opts->cf) == 0 && !capture_opts->restart) {
299 simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
300 "%sNo packets captured!%s\n"
302 "As no data was captured, closing the %scapture file!\n"
305 "Help about capturing can be found at:\n"
307 " http://wiki.wireshark.org/CaptureSetup"
310 "Wireless (Wi-Fi/WLAN):\n"
311 "Try to switch off promiscuous mode in the Capture Options!"
314 simple_dialog_primary_start(), simple_dialog_primary_end(),
315 (cf_is_tempfile(capture_opts->cf)) ? "temporary " : "");
316 cf_close(capture_opts->cf);
322 /* capture child tells us we have a new (or the first) capture file */
324 capture_input_new_file(capture_options *capture_opts, gchar *new_file)
326 gboolean is_tempfile;
329 if(capture_opts->state == CAPTURE_PREPARING) {
330 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture started!");
332 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "File: \"%s\"", new_file);
334 g_assert(capture_opts->state == CAPTURE_PREPARING || capture_opts->state == CAPTURE_RUNNING);
336 /* free the old filename */
337 if(capture_opts->save_file != NULL) {
338 /* we start a new capture file, close the old one (if we had one before). */
339 /* (we can only have an open capture file in real_time_mode!) */
340 if( ((capture_file *) capture_opts->cf)->state != FILE_CLOSED) {
341 if(capture_opts->real_time_mode) {
342 capture_callback_invoke(capture_cb_capture_update_finished, capture_opts);
343 cf_finish_tail(capture_opts->cf, &err);
344 cf_close(capture_opts->cf);
346 capture_callback_invoke(capture_cb_capture_fixed_finished, capture_opts);
349 g_free(capture_opts->save_file);
351 cf_set_tempfile(capture_opts->cf, FALSE);
353 /* we didn't have a save_file before; must be a tempfile */
355 cf_set_tempfile(capture_opts->cf, TRUE);
358 /* save the new filename */
359 capture_opts->save_file = g_strdup(new_file);
361 /* if we are in real-time mode, open the new file now */
362 if(capture_opts->real_time_mode) {
363 /* Attempt to open the capture file and set up to read from it. */
364 switch(cf_start_tail(capture_opts->cf, capture_opts->save_file, is_tempfile, &err)) {
368 /* Don't unlink (delete) the save file - leave it around,
369 for debugging purposes. */
370 g_free(capture_opts->save_file);
371 capture_opts->save_file = NULL;
375 capture_callback_invoke(capture_cb_capture_prepared, capture_opts);
378 if(capture_opts->show_info) {
379 if (!capture_info_new_file(new_file))
383 if(capture_opts->real_time_mode) {
384 capture_callback_invoke(capture_cb_capture_update_started, capture_opts);
386 capture_callback_invoke(capture_cb_capture_fixed_started, capture_opts);
388 capture_opts->state = CAPTURE_RUNNING;
394 /* capture child tells us we have new packets to read */
396 capture_input_new_packets(capture_options *capture_opts, int to_read)
401 g_assert(capture_opts->save_file);
403 if(capture_opts->real_time_mode) {
404 /* Read from the capture file the number of records the child told us it added. */
405 switch (cf_continue_tail(capture_opts->cf, to_read, &err)) {
409 /* Just because we got an error, that doesn't mean we were unable
410 to read any of the file; we handle what we could get from the
413 XXX - abort on a read error? */
414 capture_callback_invoke(capture_cb_capture_update_continue, capture_opts);
417 case CF_READ_ABORTED:
418 /* Kill the child capture process; the user wants to exit, and we
419 shouldn't just leave it running. */
420 capture_kill_child(capture_opts);
424 /* increase the capture file packet counter by the number of incoming packets */
425 cf_set_packet_count(capture_opts->cf,
426 cf_get_packet_count(capture_opts->cf) + to_read);
427 cf_fake_continue_tail(capture_opts->cf);
429 capture_callback_invoke(capture_cb_capture_fixed_continue, capture_opts);
432 /* update the main window so we get events (e.g. from the stop toolbar button) */
433 /* This causes a hang on Windows (see bug 7305). Do we need this on any platform? */
435 main_window_update();
438 if(capture_opts->show_info)
439 capture_info_new_packets(to_read);
443 /* Capture child told us how many dropped packets it counted.
446 capture_input_drops(capture_options *capture_opts, guint32 dropped)
448 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_INFO, "%u packet%s dropped", dropped, plurality(dropped, "", "s"));
450 g_assert(capture_opts->state == CAPTURE_RUNNING);
452 cf_set_drops_known(capture_opts->cf, TRUE);
453 cf_set_drops(capture_opts->cf, dropped);
457 /* Capture child told us that an error has occurred while starting/running
459 The buffer we're handed has *two* null-terminated strings in it - a
460 primary message and a secondary message, one right after the other.
461 The secondary message might be a null string.
464 capture_input_error_message(capture_options *capture_opts, char *error_msg, char *secondary_error_msg)
466 gchar *safe_error_msg;
467 gchar *safe_secondary_error_msg;
469 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Error message from child: \"%s\", \"%s\"",
470 error_msg, secondary_error_msg);
472 g_assert(capture_opts->state == CAPTURE_PREPARING || capture_opts->state == CAPTURE_RUNNING);
474 safe_error_msg = simple_dialog_format_message(error_msg);
475 if (*secondary_error_msg != '\0') {
476 /* We have both primary and secondary messages. */
477 safe_secondary_error_msg = simple_dialog_format_message(secondary_error_msg);
478 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s%s%s\n\n%s",
479 simple_dialog_primary_start(), safe_error_msg,
480 simple_dialog_primary_end(), safe_secondary_error_msg);
481 g_free(safe_secondary_error_msg);
483 /* We have only a primary message. */
484 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s%s%s",
485 simple_dialog_primary_start(), safe_error_msg,
486 simple_dialog_primary_end());
488 g_free(safe_error_msg);
490 /* the capture child will close the sync_pipe if required, nothing to do for now */
495 /* Capture child told us that an error has occurred while parsing a
496 capture filter when starting/running the capture.
499 capture_input_cfilter_error_message(capture_options *capture_opts, guint i, char *error_message)
501 dfilter_t *rfcode = NULL;
504 gchar *safe_cfilter_error_msg;
505 interface_options interface_opts;
507 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture filter error message from child: \"%s\"", error_message);
509 g_assert(capture_opts->state == CAPTURE_PREPARING || capture_opts->state == CAPTURE_RUNNING);
510 g_assert(i < capture_opts->ifaces->len);
512 interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
513 safe_cfilter = simple_dialog_format_message(interface_opts.cfilter);
514 safe_descr = simple_dialog_format_message(interface_opts.descr);
515 safe_cfilter_error_msg = simple_dialog_format_message(error_message);
516 /* Did the user try a display filter? */
517 if (dfilter_compile(interface_opts.cfilter, &rfcode) && rfcode != NULL) {
518 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
519 "%sInvalid capture filter \"%s\" for interface %s!%s\n"
521 "That string looks like a valid display filter; however, it isn't a valid\n"
522 "capture filter (%s).\n"
524 "Note that display filters and capture filters don't have the same syntax,\n"
525 "so you can't use most display filter expressions as capture filters.\n"
527 "See the User's Guide for a description of the capture filter syntax.",
528 simple_dialog_primary_start(), safe_cfilter, safe_descr,
529 simple_dialog_primary_end(), safe_cfilter_error_msg);
530 dfilter_free(rfcode);
532 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
533 "%sInvalid capture filter \"%s\" for interface %s!%s\n"
535 "That string isn't a valid capture filter (%s).\n"
536 "See the User's Guide for a description of the capture filter syntax.",
537 simple_dialog_primary_start(), safe_cfilter, safe_descr,
538 simple_dialog_primary_end(), safe_cfilter_error_msg);
540 g_free(safe_cfilter_error_msg);
542 g_free(safe_cfilter);
544 /* the capture child will close the sync_pipe if required, nothing to do for now */
548 /* capture child closed its side of the pipe, do the required cleanup */
550 capture_input_closed(capture_options *capture_opts, gchar *msg)
553 int packet_count_save;
555 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture stopped!");
556 g_assert(capture_opts->state == CAPTURE_PREPARING || capture_opts->state == CAPTURE_RUNNING);
559 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", msg);
561 if(capture_opts->state == CAPTURE_PREPARING) {
562 /* We didn't start a capture; note that the attempt to start it
564 capture_callback_invoke(capture_cb_capture_failed, capture_opts);
566 /* We started a capture; process what's left of the capture file if
567 we were in "update list of packets in real time" mode, or process
568 all of it if we weren't. */
569 if(capture_opts->real_time_mode) {
570 cf_read_status_t status;
572 /* Read what remains of the capture file. */
573 status = cf_finish_tail(capture_opts->cf, &err);
575 /* XXX: If -Q (quit-after-cap) then cf->count clr'd below so save it first */
576 packet_count_save = cf_get_packet_count(capture_opts->cf);
577 /* Tell the GUI we are not doing a capture any more.
578 Must be done after the cf_finish_tail(), so file lengths are
579 correctly displayed */
580 capture_callback_invoke(capture_cb_capture_update_finished, capture_opts);
582 /* Finish the capture. */
586 if ((packet_count_save == 0) && !capture_opts->restart) {
587 simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
588 "%sNo packets captured!%s\n"
590 "As no data was captured, closing the %scapture file!\n"
593 "Help about capturing can be found at:\n"
595 " http://wiki.wireshark.org/CaptureSetup"
598 "Wireless (Wi-Fi/WLAN):\n"
599 "Try to switch off promiscuous mode in the Capture Options!"
602 simple_dialog_primary_start(), simple_dialog_primary_end(),
603 cf_is_tempfile(capture_opts->cf) ? "temporary " : "");
604 cf_close(capture_opts->cf);
608 /* Just because we got an error, that doesn't mean we were unable
609 to read any of the file; we handle what we could get from the
613 case CF_READ_ABORTED:
614 /* Exit by leaving the main loop, so that any quit functions
615 we registered get called. */
620 /* first of all, we are not doing a capture any more */
621 capture_callback_invoke(capture_cb_capture_fixed_finished, capture_opts);
623 /* this is a normal mode capture and if no error happened, read in the capture file data */
624 if(capture_opts->save_file != NULL) {
625 capture_input_read_all(capture_opts, cf_is_tempfile(capture_opts->cf),
626 cf_get_drops_known(capture_opts->cf), cf_get_drops(capture_opts->cf));
631 if(capture_opts->show_info)
632 capture_info_close();
634 capture_opts->state = CAPTURE_STOPPED;
636 /* if we couldn't open a capture file, there's nothing more for us to do */
637 if(capture_opts->save_file == NULL) {
638 cf_close(capture_opts->cf);
642 /* does the user wants to restart the current capture? */
643 if(capture_opts->restart) {
644 capture_opts->restart = FALSE;
646 ws_unlink(capture_opts->save_file);
648 /* if it was a tempfile, throw away the old filename (so it will become a tempfile again) */
649 if(cf_is_tempfile(capture_opts->cf)) {
650 g_free(capture_opts->save_file);
651 capture_opts->save_file = NULL;
654 /* ... and start the capture again */
655 if (capture_opts->ifaces->len == 0) {
656 collect_ifaces(capture_opts);
659 /* close the currently loaded capture file */
660 cf_close(capture_opts->cf);
662 capture_start(capture_opts);
664 /* We're not doing a capture any more, so we don't have a save file. */
665 g_free(capture_opts->save_file);
666 capture_opts->save_file = NULL;
671 capture_stat_start(capture_options *capture_opts) {
672 int stat_fd, fork_child;
674 if_stat_cache_t *sc = NULL;
675 if_stat_cache_item_t *sc_item;
679 /* Fire up dumpcap. */
681 * XXX - on systems with BPF, the number of BPF devices limits the
682 * number of devices on which you can capture simultaneously.
686 * 1) this might fail if you run out of BPF devices
690 * 2) opening every interface could leave too few BPF devices
691 * for *other* programs.
693 * It also means the system could end up getting a lot of traffic
694 * that it has to pass through the networking stack and capture
695 * mechanism, so opening all the devices and presenting packet
696 * counts might not always be a good idea.
698 if (sync_interface_stats_open(&stat_fd, &fork_child, &msg) == 0) {
699 sc = g_malloc(sizeof(if_stat_cache_t));
700 sc->stat_fd = stat_fd;
701 sc->fork_child = fork_child;
702 sc->cache_list = NULL;
704 /* Initialize the cache */
705 for (i = 0; i < capture_opts->all_ifaces->len; i++) {
706 device = g_array_index(capture_opts->all_ifaces, interface_t, i);
707 if (device.type != IF_PIPE && &(device.if_info)) {
708 sc_item = g_malloc0(sizeof(if_stat_cache_item_t));
709 sc_item->name = g_strdup(device.if_info.name);
710 sc->cache_list = g_list_append(sc->cache_list, sc_item);
717 #define MAX_STAT_LINE_LEN 500
720 capture_stat_cache_update(if_stat_cache_t *sc) {
721 gchar stat_line[MAX_STAT_LINE_LEN] = "";
724 if_stat_cache_item_t *sc_item;
729 while (sync_pipe_gets_nonblock(sc->stat_fd, stat_line, MAX_STAT_LINE_LEN) > 0) {
730 g_strstrip(stat_line);
731 stat_parts = g_strsplit(stat_line, "\t", 3);
732 if (stat_parts[0] == NULL || stat_parts[1] == NULL ||
733 stat_parts[2] == NULL) {
734 g_strfreev(stat_parts);
737 for (sc_entry = sc->cache_list; sc_entry != NULL; sc_entry = g_list_next(sc_entry)) {
738 sc_item = sc_entry->data;
739 if (strcmp(sc_item->name, stat_parts[0]) == 0) {
740 sc_item->ps.ps_recv = (u_int) strtoul(stat_parts[1], NULL, 10);
741 sc_item->ps.ps_drop = (u_int) strtoul(stat_parts[2], NULL, 10);
744 g_strfreev(stat_parts);
749 capture_stats(if_stat_cache_t *sc, char *ifname, struct pcap_stat *ps) {
751 if_stat_cache_item_t *sc_item;
753 if (!sc || !ifname || !ps) {
757 capture_stat_cache_update(sc);
758 for (sc_entry = sc->cache_list; sc_entry != NULL; sc_entry = g_list_next(sc_entry)) {
759 sc_item = sc_entry->data;
760 if (strcmp(sc_item->name, ifname) == 0) {
761 memcpy(ps, &sc_item->ps, sizeof(struct pcap_stat));
769 capture_stat_stop(if_stat_cache_t *sc) {
771 if_stat_cache_item_t *sc_item;
778 ret = sync_interface_stats_close(&sc->stat_fd, &sc->fork_child, &msg);
780 /* XXX - report failure? */
784 for (sc_entry = sc->cache_list; sc_entry != NULL; sc_entry = g_list_next(sc_entry)) {
785 sc_item = sc_entry->data;
786 g_free(sc_item->name);
792 #endif /* HAVE_LIBPCAP */