Coverage Report

Created: 2025-12-14 06:36

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