Exemplo n.º 1
0
static void
benchmark(struct classifier *cls)
{
    struct timespec before, after;
    struct rusage rbefore, rafter;
    struct flow_wildcards wc;
    struct match match_wc_str;
    struct flow flow;
    size_t i;

    memset(&flow, 0, sizeof flow);
    flow.in_port.ofp_port = OFPP_LOCAL;
    flow.dl_type = htons(ETH_TYPE_IP);
    flow.nw_proto = IPPROTO_TCP;

    fat_rwlock_rdlock(&cls->rwlock);
    clock_gettime(CLOCK_MONOTONIC_RAW, &before);
    getrusage(RUSAGE_SELF, &rbefore);
    for (i = 0; i < 10000000; i++) {
        eth_addr_random(flow.dl_src);
        eth_addr_random(flow.dl_dst);
        flow.nw_src = htonl(random_uint32());
        flow.nw_dst = htonl(random_uint32());
        flow.tp_src = htons(random_uint16());
        flow.tp_dst = htons(random_uint16());
        flow.tp_dst = htons(i);
        flow_wildcards_init_catchall(&wc);
        //VLOG_DBG("Finding relevant wc's for flow: tp_dst=%d (0x%04x)",
        //         ntohs(flow.tp_dst), ntohs(flow.tp_dst));
        classifier_lookup(cls, &flow, &wc);
        match_init(&match_wc_str, &flow, &wc);
        //VLOG_DBG("Relevant fields: %s", match_to_string(&match_wc_str, 0));
    }
    getrusage(RUSAGE_SELF, &rafter);
    clock_gettime(CLOCK_MONOTONIC_RAW, &after);
    fat_rwlock_unlock(&cls->rwlock);

    printf("real        %lldms\n"
           "user        %lldms\n"
           "sys         %lldms\n"
           "soft faults %ld\n"
           "hard faults %ld\n",
           timespec_to_msec(&after) - timespec_to_msec(&before),
           timeval_to_msec(&rafter.ru_utime)
               - timeval_to_msec(&rbefore.ru_utime),
           timeval_to_msec(&rafter.ru_stime)
               - timeval_to_msec(&rbefore.ru_stime),
            rafter.ru_minflt - rbefore.ru_minflt,
            rafter.ru_majflt - rbefore.ru_majflt);
}
Exemplo n.º 2
0
/* Initialize a flow with random fields that matter for nx_hash_fields. */
void
flow_random_hash_fields(struct flow *flow)
{
    uint16_t rnd = random_uint16();

    /* Initialize to all zeros. */
    memset(flow, 0, sizeof *flow);

    eth_addr_random(flow->dl_src);
    eth_addr_random(flow->dl_dst);

    flow->vlan_tci = (OVS_FORCE ovs_be16) (random_uint16() & VLAN_VID_MASK);

    /* Make most of the random flows IPv4, some IPv6, and rest random. */
    flow->dl_type = rnd < 0x8000 ? htons(ETH_TYPE_IP) :
        rnd < 0xc000 ? htons(ETH_TYPE_IPV6) : (OVS_FORCE ovs_be16)rnd;

    if (dl_type_is_ip_any(flow->dl_type)) {
        if (flow->dl_type == htons(ETH_TYPE_IP)) {
            flow->nw_src = (OVS_FORCE ovs_be32)random_uint32();
            flow->nw_dst = (OVS_FORCE ovs_be32)random_uint32();
        } else {
            random_bytes(&flow->ipv6_src, sizeof flow->ipv6_src);
            random_bytes(&flow->ipv6_dst, sizeof flow->ipv6_dst);
        }
        /* Make most of IP flows TCP, some UDP or SCTP, and rest random. */
        rnd = random_uint16();
        flow->nw_proto = rnd < 0x8000 ? IPPROTO_TCP :
            rnd < 0xc000 ? IPPROTO_UDP :
            rnd < 0xd000 ? IPPROTO_SCTP : (uint8_t)rnd;
        if (flow->nw_proto == IPPROTO_TCP ||
            flow->nw_proto == IPPROTO_UDP ||
            flow->nw_proto == IPPROTO_SCTP) {
            flow->tp_src = (OVS_FORCE ovs_be16)random_uint16();
            flow->tp_dst = (OVS_FORCE ovs_be16)random_uint16();
        }
    }
}