1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
#include <config.h>
#include "classifier.h"
#include <assert.h>
#include "fuzzer.h"
#include "dp-packet.h"
#include "flow.h"
#include "openvswitch/ofp-match.h"
#include "openvswitch/ofp-print.h"
#include "openvswitch/match.h"
#include "classifier-private.h"
static void
test_flow_hash(const struct flow *flow)
{
uint32_t hash = flow_hash_5tuple(flow, 0);
hash = flow_hash_symmetric_l4(flow, 0);
hash = flow_hash_symmetric_l2(flow, 0);
hash = flow_hash_symmetric_l3l4(flow, 0, NULL);
hash = flow_hash_symmetric_l3(flow, 0);
hash = flow_hash_fields(flow, NX_HASH_FIELDS_ETH_SRC, hash);
hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L4, hash);
hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3L4, hash);
hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP, hash);
hash = flow_hash_fields(flow, NX_HASH_FIELDS_NW_SRC, hash);
hash = flow_hash_fields(flow, NX_HASH_FIELDS_NW_DST, hash);
hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3, hash);
ignore(hash);
}
static void
test_flow_mask(const struct flow *flow)
{
struct flow_wildcards catchall;
flow_wildcards_init_catchall(&catchall);
flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_ETH_SRC);
flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L4);
flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3L4);
flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP);
flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_NW_SRC);
flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_NW_DST);
flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3);
}
int
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
struct dp_packet packet;
struct flow flow;
dp_packet_use_const(&packet, data, size);
flow_extract(&packet, &flow);
/* Extract flowmap. */
struct flowmap fmap;
flow_wc_map(&flow, &fmap);
/* Parse TCP flags. */
if (dp_packet_size(&packet) >= ETH_HEADER_LEN) {
uint16_t tcp_flags = parse_tcp_flags(&packet, NULL, NULL, NULL);
ignore(tcp_flags);
}
/* Count headers. */
int count = flow_count_vlan_headers(&flow);
ignore(count);
/* Extract metadata. */
struct match flow_metadata;
flow_get_metadata(&flow, &flow_metadata);
/* Hashing functions. */
test_flow_hash(&flow);
/* Masking functions. */
test_flow_mask(&flow);
/* Convert flow to match. */
struct match match;
match_wc_init(&match, &flow);
struct ofp10_match ext_match;
ofputil_match_to_ofp10_match(&match, &ext_match);
/* Print match and packet. */
ofp_print_packet(stdout, dp_packet_data(&packet), dp_packet_size(&packet),
htonl(PT_ETH));
ovs_hex_dump(stdout, dp_packet_data(&packet), dp_packet_size(&packet), 0,
true);
match_print(&match, NULL);
ovs_hex_dump(stdout, &ext_match, sizeof ext_match, 0, false);
return 0;
}
|