Esempio n. 1
0
void 
core_init(struct Core *core)
{
    memset(core, 0, sizeof(*core));

    /*
     * Create two databases. One database is for loading new/changed
     * content. The other database is used by the running system, with
     * multiple thtreads querying it. Once loaded, changes will be moved
     * from the loading db to the running db in a thread-safe manner.
     * (This is similar to cfg_load/cfg_run).
     */
    core->db_load = catalog_create();
    core->db_run = catalog_create();

}
Esempio n. 2
0
int
pcap2zone(int argc, char *argv[])
{
    struct Pcap2Zone pcap2zone[1];
    struct Catalog *catalog;
    int i;

    /*
     * Create a catalog/database
     */
    catalog = catalog_create();
    pcap2zone->db = catalog;

    /* 
     * Initialize it with a pseudo-SOA record for the root zone
     */
    {
        static const struct DomainPointer root = {(const unsigned char*)"\0",1};
    	struct ZoneFileParser *parser;
        parser = zonefile_begin(
                    root,           /* origin */
                    60,             /* TTL */
                    10000,          /* filesize */
                    "<pcap2zone>",  /* filename */
                    zonefile_load,  /* callback */
                    catalog         /* callback data */
                    );
        LOAD("$TTL 60\r\n"
             "@    IN    SOA   ns hostmaster (\r\n"
             "                     2003080800 ; sn = serial number\r\n"
             "                     172800     ; ref = refresh = 2d\r\n"
             "                     15m        ; ret = update retry = 15m\r\n"
             "                     1209600    ; ex = expiry = 2w\r\n"
             "                     1H         ; nx = nxdomain ttl = 1h\r\n"
             "                     )\r\n", parser);
        zonefile_end(parser);

    }

    
    
    for (i=2; i<argc; i++) {
        const char *filename = argv[i];
        struct Tracker tracker[1];
        struct PcapFile *p;
        //uint64_t filesize;

        memset(tracker, 0, sizeof(tracker[0]));
        //filesize = 
            tracker_get_filesize(tracker, filename);

        p = pcapfile_openread(filename);
        if (p == NULL) {
            perror(filename);
            continue;
        }
               

        for (;;) {
            unsigned char buf[65536];
            int x;
            unsigned secs;
            unsigned usecs;
            unsigned original_length;
            unsigned bytes_read;

            x = pcapfile_readframe(
	            p,
                &secs, &usecs,
                &original_length, &bytes_read,
                buf, 
                sizeof(buf)
	            );
            if (x <= 0)
                break;


            {
                struct PreprocessedInfo info;
                unsigned x;

                
                x = preprocess_frame(
                    buf, 
                    bytes_read,
                    1,
                    &info);


                if (x && info.found == FOUND_DNS && info.port_src == 53)
                    grab_dns_response(catalog, buf, info.found_offset, bytes_read);

            }

            tracker_report(tracker, bytes_read);
        }

        pcapfile_close(p);
    }


    return Success;
}
Esempio n. 3
0
int
perftest(int argc, char *argv[])
{
    struct PerfTest perftest[1];
	struct ZoneFileParser *parser;
    struct Catalog *db;
    size_t i;
    
    
    perftest->loop_count = 10000000;
    
    /*
     * Create a pseudo-network subsystem for generating packets
     */
    perftest->server.parent = perftest;
    perftest->server.adapter = adapter_create(
                                              perftest_alloc_packet, 
                                              perftest_server_to_client_response, 
                                              &perftest->server);
    adapter_add_ipv4(perftest->server.adapter, 0xC0A80101, 0xFFFFffff);
    
    
    /* create a catalog/database, this is where all the parsed zonefile
     * records will be put */
    perftest->db = catalog_create();
    perftest->thread->catalog = perftest->db;
    db = perftest->db;
    
    /* 
     * Parse a sample zone
     */
    parser = zonefile_begin(
                            example_origin, /* origin */
                            60,             /* TTL */
                            10000,          /* filesize */
                            "<perftest>",   /* filename */
                            zonefile_load,  /* callback */
                            db,             /* callback data */
                            0
                            );
    zonefile_set_singlestep(parser);
    for (i=0; perftest_zone[i]; i++) {
        zonefile_parse(parser,
                       (const unsigned char*)perftest_zone[i],
                       strlen(perftest_zone[i])
                       );
    }
    zonefile_end(parser);
    
    /*
     * Send packets. This creates one thread per CPU processing requests.
     */
    {
        unsigned threads_desired = pixie_cpu_get_count();
        uint64_t start, stop;
        double requests_per_second;
        
        fprintf(stderr, "running %u threads\n", threads_desired);
        
        start = pixie_gettime();
        for (i=0; i<threads_desired; i++) {
            __sync_fetch_and_add(&threads_running, 1);
            pixie_begin_thread((void(*)(void*))run_perf, 0, perftest);
        }
        while (threads_running)
            pixie_usleep(1000);
        stop = pixie_gettime();
        
        requests_per_second = 1000000.0 
                                * (1.0 * threads_desired * perftest->loop_count)
                                / (stop - start);
	fprintf(stderr, "queries = %u\n", (unsigned)(threads_desired * perftest->loop_count));
	fprintf(stderr, "seconds = %5.3f\n", (stop - start)/1000000.0);
        fprintf(stderr, "queries/second = %5.3f\n", requests_per_second);
    }
    
    exit(1);
    return 0;
}