Coverage Report

Created: 2025-08-03 06:34

/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
}