Coverage Report

Created: 2025-11-11 06:38

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