Example #1
0
static void *reader_pfring_thread(void *ringv)
{
    pfring                *ring = ringv;

    while (1) {
        int r = pfring_loop(ring, reader_pfring_packet_cb, NULL, -1);

        // Some kind of failure we quit
        if (unlikely(r <= 0)) {
            moloch_quit();
            ring = 0;
            break;
        }
    }
    return NULL;
}
Example #2
0
int frame_pfring(pfring *pd, struct frame_buf *f){
	fbuf = f;
	pfcount = 0;
	packet_direction direction = rx_and_tx_direction;
	int rc;

	pfring_set_direction(pd, direction);

	if((rc = pfring_set_socket_mode(pd, recv_only_mode)) != 0)
		fprintf(stderr, "pfring_set_socket_mode returned [rc=%d]\n", rc);

	pfring_set_application_stats(pd, "statistics not yet computed, please try again...\n");
	
	if(pfring_enable_ring(pd) != 0){
		fprintf(stderr, "unable to enable ring\n");
		pfring_close(pd);
		return -1;
	}

	printf("capture start...\n");
	pfring_loop(pd, pf_dummy_packet, (u_char *)NULL, 1);
	pfring_close(pd);
	return 0;
}
int main() {
    char* dev = "zc:eth3";
    // We could pool device in multiple threads
    unsigned int num_threads = 1;

    bool promisc = true;
    /* This flag manages packet parser for extended_hdr */
    bool use_extended_pkt_header = true;
    bool enable_hw_timestamp = false;
    bool dont_strip_timestamps = false;

    u_int32_t flags = 0;
    if (num_threads > 1) flags |= PF_RING_REENTRANT;
    if (use_extended_pkt_header) flags |= PF_RING_LONG_HEADER;
    if (promisc) flags |= PF_RING_PROMISC;
    if (enable_hw_timestamp) flags |= PF_RING_HW_TIMESTAMP;
    if (!dont_strip_timestamps) flags |= PF_RING_STRIP_HW_TIMESTAMP;

    // if (!we_use_pf_ring_in_kernel_parser) {
    //    flags != PF_RING_DO_NOT_PARSE;
    //}

    // flags |= PF_RING_DNA_SYMMETRIC_RSS;  /* Note that symmetric RSS is ignored by non-DNA drivers
    // */

    // use default value from pfcount.c
    unsigned int snaplen = 128;

    pfring* pf_ring_descr = pfring_open(dev, snaplen, flags);

    if (pf_ring_descr == NULL) {
        std::cout
        << "pfring_open error: " << strerror(errno)
        << " (pf_ring not loaded or perhaps you use quick mode and have already a socket bound to: " << dev
        << ")";
        return false;
    }


    u_int32_t version;
    // Set spplication name in /proc
    int pfring_set_application_name_result =
    pfring_set_application_name(pf_ring_descr, (char*)"fastnetmon");

    if (pfring_set_application_name_result != 0) {
        std::cout << "Can't set programm name for PF_RING: pfring_set_application_name";
    }

    pfring_version(pf_ring_descr, &version);

    int pfring_set_socket_mode_result = pfring_set_socket_mode(pf_ring_descr, recv_only_mode);

    // enable ring
    if (pfring_enable_ring(pf_ring_descr) != 0) {
        std::cout << "Unable to enable ring :-(";
        pfring_close(pf_ring_descr);
        return false;
    }

    u_int8_t wait_for_packet = 1;
    pfring_loop(pf_ring_descr, parse_packet_pf_ring, (u_char*)NULL, wait_for_packet);
}