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