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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 capture_callback_invoke(capture_cb_capture_update_finished, capture_opts);
342 cf_finish_tail(capture_opts->cf, &err);
343 cf_close(capture_opts->cf);
345 g_free(capture_opts->save_file);
347 cf_set_tempfile(capture_opts->cf, FALSE);
349 /* we didn't have a save_file before; must be a tempfile */
351 cf_set_tempfile(capture_opts->cf, TRUE);
354 /* save the new filename */
355 capture_opts->save_file = g_strdup(new_file);
357 /* if we are in real-time mode, open the new file now */
358 if(capture_opts->real_time_mode) {
359 /* Attempt to open the capture file and set up to read from it. */
360 switch(cf_start_tail(capture_opts->cf, capture_opts->save_file, is_tempfile, &err)) {
364 /* Don't unlink (delete) the save file - leave it around,
365 for debugging purposes. */
366 g_free(capture_opts->save_file);
367 capture_opts->save_file = NULL;
372 if(capture_opts->show_info) {
373 if (!capture_info_new_file(new_file))
377 if(capture_opts->real_time_mode) {
378 capture_callback_invoke(capture_cb_capture_update_started, capture_opts);
380 capture_callback_invoke(capture_cb_capture_fixed_started, capture_opts);
382 capture_opts->state = CAPTURE_RUNNING;
388 /* capture child tells us we have new packets to read */
390 capture_input_new_packets(capture_options *capture_opts, int to_read)
395 g_assert(capture_opts->save_file);
397 if(capture_opts->real_time_mode) {
398 /* Read from the capture file the number of records the child told us it added. */
399 switch (cf_continue_tail(capture_opts->cf, to_read, &err)) {
403 /* Just because we got an error, that doesn't mean we were unable
404 to read any of the file; we handle what we could get from the
407 XXX - abort on a read error? */
408 capture_callback_invoke(capture_cb_capture_update_continue, capture_opts);
411 case CF_READ_ABORTED:
412 /* Kill the child capture process; the user wants to exit, and we
413 shouldn't just leave it running. */
414 capture_kill_child(capture_opts);
418 /* increase the capture file packet counter by the number of incoming packets */
419 cf_set_packet_count(capture_opts->cf,
420 cf_get_packet_count(capture_opts->cf) + to_read);
421 cf_fake_continue_tail(capture_opts->cf);
423 capture_callback_invoke(capture_cb_capture_fixed_continue, capture_opts);
426 /* update the main window so we get events (e.g. from the stop toolbar button) */
427 main_window_update();
429 if(capture_opts->show_info)
430 capture_info_new_packets(to_read);
434 /* Capture child told us how many dropped packets it counted.
437 capture_input_drops(capture_options *capture_opts, guint32 dropped)
439 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_INFO, "%u packet%s dropped", dropped, plurality(dropped, "", "s"));
441 g_assert(capture_opts->state == CAPTURE_RUNNING);
443 cf_set_drops_known(capture_opts->cf, TRUE);
444 cf_set_drops(capture_opts->cf, dropped);
448 /* Capture child told us that an error has occurred while starting/running
450 The buffer we're handed has *two* null-terminated strings in it - a
451 primary message and a secondary message, one right after the other.
452 The secondary message might be a null string.
455 capture_input_error_message(capture_options *capture_opts, char *error_msg, char *secondary_error_msg)
457 gchar *safe_error_msg;
458 gchar *safe_secondary_error_msg;
460 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Error message from child: \"%s\", \"%s\"",
461 error_msg, secondary_error_msg);
463 g_assert(capture_opts->state == CAPTURE_PREPARING || capture_opts->state == CAPTURE_RUNNING);
465 safe_error_msg = simple_dialog_format_message(error_msg);
466 if (*secondary_error_msg != '\0') {
467 /* We have both primary and secondary messages. */
468 safe_secondary_error_msg = simple_dialog_format_message(secondary_error_msg);
469 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s%s%s\n\n%s",
470 simple_dialog_primary_start(), safe_error_msg,
471 simple_dialog_primary_end(), safe_secondary_error_msg);
472 g_free(safe_secondary_error_msg);
474 /* We have only a primary message. */
475 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s%s%s",
476 simple_dialog_primary_start(), safe_error_msg,
477 simple_dialog_primary_end());
479 g_free(safe_error_msg);
481 /* the capture child will close the sync_pipe if required, nothing to do for now */
486 /* Capture child told us that an error has occurred while parsing a
487 capture filter when starting/running the capture.
490 capture_input_cfilter_error_message(capture_options *capture_opts, guint i, char *error_message)
492 dfilter_t *rfcode = NULL;
495 gchar *safe_cfilter_error_msg;
496 interface_options interface_opts;
498 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture filter error message from child: \"%s\"", error_message);
500 g_assert(capture_opts->state == CAPTURE_PREPARING || capture_opts->state == CAPTURE_RUNNING);
501 g_assert(i < capture_opts->ifaces->len);
503 interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
504 safe_cfilter = simple_dialog_format_message(interface_opts.cfilter);
505 safe_descr = simple_dialog_format_message(interface_opts.descr);
506 safe_cfilter_error_msg = simple_dialog_format_message(error_message);
507 /* Did the user try a display filter? */
508 if (dfilter_compile(interface_opts.cfilter, &rfcode) && rfcode != NULL) {
509 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
510 "%sInvalid capture filter \"%s\" for interface %s!%s\n"
512 "That string looks like a valid display filter; however, it isn't a valid\n"
513 "capture filter (%s).\n"
515 "Note that display filters and capture filters don't have the same syntax,\n"
516 "so you can't use most display filter expressions as capture filters.\n"
518 "See the User's Guide for a description of the capture filter syntax.",
519 simple_dialog_primary_start(), safe_cfilter, safe_descr,
520 simple_dialog_primary_end(), safe_cfilter_error_msg);
521 dfilter_free(rfcode);
523 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
524 "%sInvalid capture filter \"%s\" for interface %s!%s\n"
526 "That string isn't a valid capture filter (%s).\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);
531 g_free(safe_cfilter_error_msg);
533 g_free(safe_cfilter);
535 /* the capture child will close the sync_pipe if required, nothing to do for now */
539 /* capture child closed its side of the pipe, do the required cleanup */
541 capture_input_closed(capture_options *capture_opts, gchar *msg)
544 int packet_count_save;
546 g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture stopped!");
547 g_assert(capture_opts->state == CAPTURE_PREPARING || capture_opts->state == CAPTURE_RUNNING);
550 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", msg);
552 if(capture_opts->state == CAPTURE_PREPARING) {
553 /* We didn't start a capture; note that the attempt to start it
555 capture_callback_invoke(capture_cb_capture_failed, capture_opts);
557 /* We started a capture; process what's left of the capture file if
558 we were in "update list of packets in real time" mode, or process
559 all of it if we weren't. */
560 if(capture_opts->real_time_mode) {
561 cf_read_status_t status;
563 /* Read what remains of the capture file. */
564 status = cf_finish_tail(capture_opts->cf, &err);
566 /* XXX: If -Q (quit-after-cap) then cf->count clr'd below so save it first */
567 packet_count_save = cf_get_packet_count(capture_opts->cf);
568 /* Tell the GUI we are not doing a capture any more.
569 Must be done after the cf_finish_tail(), so file lengths are
570 correctly displayed */
571 capture_callback_invoke(capture_cb_capture_update_finished, capture_opts);
573 /* Finish the capture. */
577 if ((packet_count_save == 0) && !capture_opts->restart) {
578 simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
579 "%sNo packets captured!%s\n"
581 "As no data was captured, closing the %scapture file!\n"
584 "Help about capturing can be found at:\n"
586 " http://wiki.wireshark.org/CaptureSetup"
589 "Wireless (Wi-Fi/WLAN):\n"
590 "Try to switch off promiscuous mode in the Capture Options!"
593 simple_dialog_primary_start(), simple_dialog_primary_end(),
594 cf_is_tempfile(capture_opts->cf) ? "temporary " : "");
595 cf_close(capture_opts->cf);
599 /* Just because we got an error, that doesn't mean we were unable
600 to read any of the file; we handle what we could get from the
604 case CF_READ_ABORTED:
605 /* Exit by leaving the main loop, so that any quit functions
606 we registered get called. */
611 /* first of all, we are not doing a capture any more */
612 capture_callback_invoke(capture_cb_capture_fixed_finished, capture_opts);
614 /* this is a normal mode capture and if no error happened, read in the capture file data */
615 if(capture_opts->save_file != NULL) {
616 capture_input_read_all(capture_opts, cf_is_tempfile(capture_opts->cf),
617 cf_get_drops_known(capture_opts->cf), cf_get_drops(capture_opts->cf));
622 if(capture_opts->show_info)
623 capture_info_close();
625 capture_opts->state = CAPTURE_STOPPED;
627 /* if we couldn't open a capture file, there's nothing more for us to do */
628 if(capture_opts->save_file == NULL) {
629 cf_close(capture_opts->cf);
633 /* does the user wants to restart the current capture? */
634 if(capture_opts->restart) {
635 capture_opts->restart = FALSE;
637 ws_unlink(capture_opts->save_file);
639 /* if it was a tempfile, throw away the old filename (so it will become a tempfile again) */
640 if(cf_is_tempfile(capture_opts->cf)) {
641 g_free(capture_opts->save_file);
642 capture_opts->save_file = NULL;
645 /* ... and start the capture again */
646 if (capture_opts->ifaces->len == 0) {
647 collect_ifaces(capture_opts);
650 /* close the currently loaded capture file */
651 cf_close(capture_opts->cf);
653 capture_start(capture_opts);
655 /* We're not doing a capture any more, so we don't have a save file. */
656 g_free(capture_opts->save_file);
657 capture_opts->save_file = NULL;
662 capture_stat_start(capture_options *capture_opts) {
663 int stat_fd, fork_child;
665 if_stat_cache_t *sc = NULL;
666 if_stat_cache_item_t *sc_item;
670 /* Fire up dumpcap. */
672 * XXX - on systems with BPF, the number of BPF devices limits the
673 * number of devices on which you can capture simultaneously.
677 * 1) this might fail if you run out of BPF devices
681 * 2) opening every interface could leave too few BPF devices
682 * for *other* programs.
684 * It also means the system could end up getting a lot of traffic
685 * that it has to pass through the networking stack and capture
686 * mechanism, so opening all the devices and presenting packet
687 * counts might not always be a good idea.
689 if (sync_interface_stats_open(&stat_fd, &fork_child, &msg) == 0) {
690 sc = g_malloc(sizeof(if_stat_cache_t));
691 sc->stat_fd = stat_fd;
692 sc->fork_child = fork_child;
693 sc->cache_list = NULL;
695 /* Initialize the cache */
696 for (i = 0; i < capture_opts->all_ifaces->len; i++) {
697 device = g_array_index(capture_opts->all_ifaces, interface_t, i);
698 if (device.type != IF_PIPE && &(device.if_info)) {
699 sc_item = g_malloc0(sizeof(if_stat_cache_item_t));
700 sc_item->name = g_strdup(device.if_info.name);
701 sc->cache_list = g_list_append(sc->cache_list, sc_item);
708 #define MAX_STAT_LINE_LEN 500
711 capture_stat_cache_update(if_stat_cache_t *sc) {
712 gchar stat_line[MAX_STAT_LINE_LEN] = "";
715 if_stat_cache_item_t *sc_item;
720 while (sync_pipe_gets_nonblock(sc->stat_fd, stat_line, MAX_STAT_LINE_LEN) > 0) {
721 g_strstrip(stat_line);
722 stat_parts = g_strsplit(stat_line, "\t", 3);
723 if (stat_parts[0] == NULL || stat_parts[1] == NULL ||
724 stat_parts[2] == NULL) {
725 g_strfreev(stat_parts);
728 for (sc_entry = sc->cache_list; sc_entry != NULL; sc_entry = g_list_next(sc_entry)) {
729 sc_item = sc_entry->data;
730 if (strcmp(sc_item->name, stat_parts[0]) == 0) {
731 sc_item->ps.ps_recv = (u_int) strtoul(stat_parts[1], NULL, 10);
732 sc_item->ps.ps_drop = (u_int) strtoul(stat_parts[2], NULL, 10);
735 g_strfreev(stat_parts);
740 capture_stats(if_stat_cache_t *sc, char *ifname, struct pcap_stat *ps) {
742 if_stat_cache_item_t *sc_item;
744 if (!sc || !ifname || !ps) {
748 capture_stat_cache_update(sc);
749 for (sc_entry = sc->cache_list; sc_entry != NULL; sc_entry = g_list_next(sc_entry)) {
750 sc_item = sc_entry->data;
751 if (strcmp(sc_item->name, ifname) == 0) {
752 memcpy(ps, &sc_item->ps, sizeof(struct pcap_stat));
760 capture_stat_stop(if_stat_cache_t *sc) {
762 if_stat_cache_item_t *sc_item;
769 ret = sync_interface_stats_close(&sc->stat_fd, &sc->fork_child, &msg);
771 /* XXX - report failure? */
775 for (sc_entry = sc->cache_list; sc_entry != NULL; sc_entry = g_list_next(sc_entry)) {
776 sc_item = sc_entry->data;
777 g_free(sc_item->name);
783 #endif /* HAVE_LIBPCAP */