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