Example #1
0
void read_cb(int fd, short events, void *arg)
#endif
{
	struct pcap_pkthdr	header;
	const uint8_t	*packet;
	struct iface_config	*ifc;

	ifc = (struct iface_config *) arg;
	packet = pcap_next(ifc->pcap_handle, &header);

	if(packet)
		pcap_callback(arg, &header, packet);
}
Example #2
0
int launch_config(struct event_base* base) {
  bpf_u_int32 netaddr = 0, mask = 0;
  struct bpf_program filter;
  char errbuf[PCAP_ERRBUF_SIZE];
  memset(errbuf, 0, PCAP_ERRBUF_SIZE);
  struct config* config_node = config;
  while (config_node) {
    struct module* mod = config_node->modules;
    while (mod) {
      pre_capture_function* precapture_func = dlsym(mod->mod_handle, "preCapture");
      if ((precapture_func && precapture_func(base, config_node->interface, mod->context)) || precapture_func == NULL) {
        if (offline_file) {
          if ((mod->pcap_handle = pcap_open_offline(offline_file, errbuf)) == NULL) {
            fprintf(stderr, "ERROR: %s\n", errbuf);
            exit(1);
          }
        } else {
          if ((mod->pcap_handle = pcap_open_live(config_node->interface, BUFSIZ, 0, 512, errbuf)) == NULL) {
            fprintf(stderr, "ERROR: %s\n", errbuf);
            exit(1);
          } else if (pcap_lookupnet(config_node->interface, &netaddr, &mask, errbuf) == -1) {
            fprintf(stderr, "ERROR: %s\n", errbuf);
            exit(1);
          }
        }
      }
      pcaprule_function* rule_func = dlsym(mod->mod_handle, "getPcapRule");
      if (rule_func == NULL) {
        fprintf(stderr, "ERROR: %s\n", dlerror());
        exit(1);
      } else if (pcap_compile(mod->pcap_handle, &filter, rule_func(mod->context), 1, mask) == -1) {
        fprintf(stderr, "ERROR: %s\n", pcap_geterr(mod->pcap_handle));
        exit(1);
      } else if (pcap_setfilter(mod->pcap_handle, &filter) == -1) {
        fprintf(stderr, "ERROR: %s\n", pcap_geterr(mod->pcap_handle));
        exit(1);
      } else {
        if (offline_file) {
          pcap_callback(0, 0, mod);
        } else {
          struct event* ev = event_new(base, pcap_fileno(mod->pcap_handle), EV_READ|EV_PERSIST, pcap_callback, mod);
          event_add(ev, NULL);
        }
      }
      mod = mod->next;
    }
    config_node = config_node->next;
  }
  return 1;
};