Coverage Report

Created: 2025-12-11 06:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/systemd/src/libsystemd/sd-network/network-util.c
Line
Count
Source
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3
#include "sd-network.h"
4
5
#include "alloc-util.h"
6
#include "network-util.h"
7
#include "string-table.h"
8
#include "string-util.h"
9
#include "strv.h"
10
11
0
bool network_is_online(void) {
12
0
        _cleanup_free_ char *online_state = NULL;
13
0
        LinkOnlineState state;
14
0
        int r;
15
16
0
        r = sd_network_get_online_state(&online_state);
17
0
        if (r < 0)
18
0
                state = _LINK_ONLINE_STATE_INVALID;
19
0
        else
20
0
                state = link_online_state_from_string(online_state);
21
22
0
        if (state >= LINK_ONLINE_STATE_PARTIAL)
23
0
                return true;
24
0
        else if (state < 0) {
25
0
                _cleanup_free_ char *carrier_state = NULL, *addr_state = NULL;
26
27
0
                r = sd_network_get_carrier_state(&carrier_state);
28
0
                if (r < 0) /* if we don't know anything, we consider the system online */
29
0
                        return true;
30
31
0
                r = sd_network_get_address_state(&addr_state);
32
0
                if (r < 0) /* if we don't know anything, we consider the system online */
33
0
                        return true;
34
35
                /* we don't know the online state for certain, so make an educated guess */
36
0
                if (STR_IN_SET(carrier_state, "degraded-carrier", "carrier") &&
37
0
                    STR_IN_SET(addr_state, "routable", "degraded"))
38
0
                        return true;
39
0
        }
40
41
0
        return false;
42
0
}
43
44
static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
45
        [LINK_OPERSTATE_MISSING]          = "missing",
46
        [LINK_OPERSTATE_OFF]              = "off",
47
        [LINK_OPERSTATE_NO_CARRIER]       = "no-carrier",
48
        [LINK_OPERSTATE_DORMANT]          = "dormant",
49
        [LINK_OPERSTATE_DEGRADED_CARRIER] = "degraded-carrier",
50
        [LINK_OPERSTATE_CARRIER]          = "carrier",
51
        [LINK_OPERSTATE_DEGRADED]         = "degraded",
52
        [LINK_OPERSTATE_ENSLAVED]         = "enslaved",
53
        [LINK_OPERSTATE_ROUTABLE]         = "routable",
54
};
55
56
DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);
57
58
static const char* const link_carrier_state_table[_LINK_CARRIER_STATE_MAX] = {
59
        [LINK_CARRIER_STATE_OFF]              = "off",
60
        [LINK_CARRIER_STATE_NO_CARRIER]       = "no-carrier",
61
        [LINK_CARRIER_STATE_DORMANT]          = "dormant",
62
        [LINK_CARRIER_STATE_DEGRADED_CARRIER] = "degraded-carrier",
63
        [LINK_CARRIER_STATE_CARRIER]          = "carrier",
64
        [LINK_CARRIER_STATE_ENSLAVED]         = "enslaved",
65
};
66
67
DEFINE_STRING_TABLE_LOOKUP(link_carrier_state, LinkCarrierState);
68
69
static const char* const link_required_address_family_table[_ADDRESS_FAMILY_MAX] = {
70
        [ADDRESS_FAMILY_NO]   = "any",
71
        [ADDRESS_FAMILY_IPV4] = "ipv4",
72
        [ADDRESS_FAMILY_IPV6] = "ipv6",
73
        [ADDRESS_FAMILY_YES]  = "both",
74
};
75
76
DEFINE_STRING_TABLE_LOOKUP(link_required_address_family, AddressFamily);
77
78
static const char* const link_address_state_table[_LINK_ADDRESS_STATE_MAX] = {
79
        [LINK_ADDRESS_STATE_OFF]      = "off",
80
        [LINK_ADDRESS_STATE_DEGRADED] = "degraded",
81
        [LINK_ADDRESS_STATE_ROUTABLE] = "routable",
82
};
83
84
DEFINE_STRING_TABLE_LOOKUP(link_address_state, LinkAddressState);
85
86
static const char *const link_online_state_table[_LINK_ONLINE_STATE_MAX] = {
87
        [LINK_ONLINE_STATE_OFFLINE] = "offline",
88
        [LINK_ONLINE_STATE_PARTIAL] = "partial",
89
        [LINK_ONLINE_STATE_ONLINE]  = "online",
90
};
91
92
DEFINE_STRING_TABLE_LOOKUP(link_online_state, LinkOnlineState);
93
94
1.55k
int parse_operational_state_range(const char *s, LinkOperationalStateRange *ret) {
95
1.55k
        LinkOperationalStateRange range = LINK_OPERSTATE_RANGE_INVALID;
96
1.55k
        _cleanup_free_ char *buf = NULL;
97
1.55k
        const char *p;
98
99
1.55k
        assert(s);
100
1.55k
        assert(ret);
101
102
        /* allowed formats: "min", "min:", "min:max", ":max" */
103
104
1.55k
        if (isempty(s) || streq(s, ":"))
105
322
                return -EINVAL;
106
107
1.23k
        p = strchr(s, ':');
108
1.23k
        if (!p || isempty(p + 1))
109
630
                range.max = LINK_OPERSTATE_ROUTABLE;
110
605
        else {
111
605
                range.max = link_operstate_from_string(p + 1);
112
605
                if (range.max < 0)
113
203
                        return -EINVAL;
114
605
        }
115
116
1.03k
        if (p) {
117
596
                buf = strndup(s, p - s);
118
596
                if (!buf)
119
0
                        return -ENOMEM;
120
121
596
                s = buf;
122
596
        }
123
124
1.03k
        if (isempty(s))
125
195
                range.min = LINK_OPERSTATE_MISSING;
126
837
        else {
127
837
                range.min = link_operstate_from_string(s);
128
837
                if (range.min < 0)
129
449
                        return -EINVAL;
130
837
        }
131
132
583
        if (!operational_state_range_is_valid(&range))
133
194
                return -EINVAL;
134
135
389
        *ret = range;
136
389
        return 0;
137
583
}
138
139
0
int network_link_get_operational_state(int ifindex, LinkOperationalState *ret) {
140
0
        _cleanup_free_ char *str = NULL;
141
0
        LinkOperationalState s;
142
0
        int r;
143
144
0
        assert(ifindex > 0);
145
0
        assert(ret);
146
147
0
        r = sd_network_link_get_operational_state(ifindex, &str);
148
0
        if (r < 0)
149
0
                return r;
150
151
0
        s = link_operstate_from_string(str);
152
0
        if (s < 0)
153
0
                return s;
154
155
0
        *ret = s;
156
0
        return 0;
157
0
}