]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
fc2f9534 LP |
2 | #pragma once |
3 | ||
ddc026f3 | 4 | #include "sd-dhcp-lease.h" |
0d7d377b | 5 | #include "sd-netlink.h" |
ddc026f3 | 6 | |
a2106925 | 7 | #include "conf-parser.h" |
833f3663 | 8 | #include "hashmap.h" |
0d7d377b | 9 | #include "log.h" |
fc2f9534 | 10 | #include "macro.h" |
86ae2d69 | 11 | #include "network-util.h" |
0d7d377b | 12 | #include "string-util.h" |
fc2f9534 | 13 | |
fd221544 YW |
14 | typedef struct Link Link; |
15 | ||
a093533c YW |
16 | typedef enum NetworkConfigSource { |
17 | NETWORK_CONFIG_SOURCE_FOREIGN, /* configured by kernel */ | |
18 | NETWORK_CONFIG_SOURCE_STATIC, | |
19 | NETWORK_CONFIG_SOURCE_IPV4LL, | |
20 | NETWORK_CONFIG_SOURCE_DHCP4, | |
21 | NETWORK_CONFIG_SOURCE_DHCP6, | |
a27588d4 | 22 | NETWORK_CONFIG_SOURCE_DHCP_PD, |
a093533c | 23 | NETWORK_CONFIG_SOURCE_NDISC, |
2e62139a | 24 | NETWORK_CONFIG_SOURCE_RUNTIME, /* through D-Bus method */ |
a093533c YW |
25 | _NETWORK_CONFIG_SOURCE_MAX, |
26 | _NETWORK_CONFIG_SOURCE_INVALID = -EINVAL, | |
27 | } NetworkConfigSource; | |
28 | ||
29 | typedef enum NetworkConfigState { | |
e402e99e YW |
30 | NETWORK_CONFIG_STATE_REQUESTING = 1 << 0, /* request is queued */ |
31 | NETWORK_CONFIG_STATE_CONFIGURING = 1 << 1, /* e.g. address_configure() is called, but no response is received yet */ | |
32 | NETWORK_CONFIG_STATE_CONFIGURED = 1 << 2, /* e.g. address_configure() is called and received a response from kernel. | |
a093533c YW |
33 | * Note that address may not be ready yet, so please use address_is_ready() |
34 | * to check whether the address can be usable or not. */ | |
e402e99e YW |
35 | NETWORK_CONFIG_STATE_MARKED = 1 << 3, /* used GC'ing the old config */ |
36 | NETWORK_CONFIG_STATE_REMOVING = 1 << 4, /* e.g. address_remove() is called, but no response is received yet */ | |
a093533c YW |
37 | } NetworkConfigState; |
38 | ||
0cf1fe88 YW |
39 | static inline usec_t sec_to_usec(uint32_t sec, usec_t timestamp_usec) { |
40 | return | |
41 | sec == 0 ? 0 : | |
42 | sec == UINT32_MAX ? USEC_INFINITY : | |
43 | usec_add(timestamp_usec, sec * USEC_PER_SEC); | |
5235d739 YW |
44 | } |
45 | ||
0cf1fe88 YW |
46 | static inline usec_t sec16_to_usec(uint16_t sec, usec_t timestamp_usec) { |
47 | return sec_to_usec(sec == UINT16_MAX ? UINT32_MAX : (uint32_t) sec, timestamp_usec); | |
5235d739 YW |
48 | } |
49 | ||
50 | static inline uint32_t usec_to_sec(usec_t usec, usec_t now_usec) { | |
51 | return MIN(DIV_ROUND_UP(usec_sub_unsigned(usec, now_usec), USEC_PER_SEC), UINT32_MAX); | |
52 | } | |
53 | ||
2d792895 | 54 | CONFIG_PARSER_PROTOTYPE(config_parse_link_local_address_family); |
4c72d851 | 55 | CONFIG_PARSER_PROTOTYPE(config_parse_ip_masquerade); |
77976a68 | 56 | CONFIG_PARSER_PROTOTYPE(config_parse_mud_url); |
89fa9a6b | 57 | |
a093533c YW |
58 | const char *network_config_source_to_string(NetworkConfigSource s) _const_; |
59 | ||
60 | int network_config_state_to_string_alloc(NetworkConfigState s, char **ret); | |
61 | ||
62 | #define DEFINE_NETWORK_CONFIG_STATE_FUNCTIONS(type, name) \ | |
63 | static inline void name##_update_state( \ | |
64 | type *t, \ | |
65 | NetworkConfigState mask, \ | |
66 | NetworkConfigState value) { \ | |
67 | \ | |
68 | assert(t); \ | |
69 | \ | |
70 | t->state = (t->state & ~mask) | (value & mask); \ | |
71 | } \ | |
b088c3d3 | 72 | static inline bool name##_exists(const type *t) { \ |
a093533c YW |
73 | assert(t); \ |
74 | \ | |
75 | if ((t->state & (NETWORK_CONFIG_STATE_CONFIGURING | \ | |
76 | NETWORK_CONFIG_STATE_CONFIGURED)) == 0) \ | |
77 | return false; /* Not assigned yet. */ \ | |
78 | if (FLAGS_SET(t->state, NETWORK_CONFIG_STATE_REMOVING)) \ | |
79 | return false; /* Already removing. */ \ | |
80 | return true; \ | |
81 | } \ | |
82 | static inline void name##_enter_requesting(type *t) { \ | |
83 | name##_update_state(t, \ | |
84 | NETWORK_CONFIG_STATE_REQUESTING, \ | |
85 | NETWORK_CONFIG_STATE_REQUESTING); \ | |
86 | } \ | |
87 | static inline void name##_cancel_requesting(type *t) { \ | |
88 | name##_update_state(t, \ | |
89 | NETWORK_CONFIG_STATE_REQUESTING, \ | |
90 | 0); \ | |
91 | } \ | |
b088c3d3 | 92 | static inline bool name##_is_requesting(const type *t) { \ |
f3016c40 | 93 | assert(t); \ |
a093533c YW |
94 | return FLAGS_SET(t->state, NETWORK_CONFIG_STATE_REQUESTING); \ |
95 | } \ | |
96 | static inline void name##_enter_configuring(type *t) { \ | |
97 | name##_update_state(t, \ | |
98 | NETWORK_CONFIG_STATE_REQUESTING | \ | |
f4ee7b98 YW |
99 | NETWORK_CONFIG_STATE_CONFIGURING | \ |
100 | NETWORK_CONFIG_STATE_REMOVING, \ | |
a093533c YW |
101 | NETWORK_CONFIG_STATE_CONFIGURING); \ |
102 | } \ | |
103 | static inline void name##_enter_configured(type *t) { \ | |
104 | name##_update_state(t, \ | |
105 | NETWORK_CONFIG_STATE_CONFIGURING | \ | |
106 | NETWORK_CONFIG_STATE_CONFIGURED, \ | |
107 | NETWORK_CONFIG_STATE_CONFIGURED); \ | |
108 | } \ | |
109 | static inline void name##_mark(type *t) { \ | |
110 | name##_update_state(t, \ | |
111 | NETWORK_CONFIG_STATE_MARKED, \ | |
112 | NETWORK_CONFIG_STATE_MARKED); \ | |
113 | } \ | |
114 | static inline void name##_unmark(type *t) { \ | |
115 | name##_update_state(t, NETWORK_CONFIG_STATE_MARKED, 0); \ | |
116 | } \ | |
b088c3d3 | 117 | static inline bool name##_is_marked(const type *t) { \ |
a093533c YW |
118 | assert(t); \ |
119 | return FLAGS_SET(t->state, NETWORK_CONFIG_STATE_MARKED); \ | |
120 | } \ | |
121 | static inline void name##_enter_removing(type *t) { \ | |
122 | name##_update_state(t, \ | |
123 | NETWORK_CONFIG_STATE_MARKED | \ | |
124 | NETWORK_CONFIG_STATE_REMOVING, \ | |
125 | NETWORK_CONFIG_STATE_REMOVING); \ | |
126 | } \ | |
127 | static inline void name##_enter_removed(type *t) { \ | |
128 | name##_update_state(t, \ | |
129 | NETWORK_CONFIG_STATE_CONFIGURED | \ | |
130 | NETWORK_CONFIG_STATE_REMOVING, \ | |
131 | 0); \ | |
132 | } | |
133 | ||
2d792895 YW |
134 | const char *address_family_to_string(AddressFamily b) _const_; |
135 | AddressFamily address_family_from_string(const char *s) _pure_; | |
e800fd24 | 136 | |
2d792895 | 137 | AddressFamily link_local_address_family_from_string(const char *s) _pure_; |
f02ba163 | 138 | |
f6c6ff97 YW |
139 | const char *routing_policy_rule_address_family_to_string(AddressFamily b) _const_; |
140 | AddressFamily routing_policy_rule_address_family_from_string(const char *s) _pure_; | |
141 | ||
f1923efc YW |
142 | const char *nexthop_address_family_to_string(AddressFamily b) _const_; |
143 | AddressFamily nexthop_address_family_from_string(const char *s) _pure_; | |
144 | ||
051e77ca SS |
145 | const char *duplicate_address_detection_address_family_to_string(AddressFamily b) _const_; |
146 | AddressFamily duplicate_address_detection_address_family_from_string(const char *s) _pure_; | |
147 | ||
bde8467a YW |
148 | AddressFamily dhcp_deprecated_address_family_from_string(const char *s) _pure_; |
149 | ||
2324fd3a LP |
150 | const char *dhcp_lease_server_type_to_string(sd_dhcp_lease_server_type_t t) _const_; |
151 | sd_dhcp_lease_server_type_t dhcp_lease_server_type_from_string(const char *s) _pure_; | |
ddc026f3 | 152 | |
fd221544 YW |
153 | int log_link_message_full_errno(Link *link, sd_netlink_message *m, int level, int err, const char *msg); |
154 | #define log_link_message_error_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_ERR, err, msg) | |
155 | #define log_link_message_warning_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_WARNING, err, msg) | |
156 | #define log_link_message_notice_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_NOTICE, err, msg) | |
157 | #define log_link_message_info_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_INFO, err, msg) | |
158 | #define log_link_message_debug_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_DEBUG, err, msg) | |
159 | #define log_message_full_errno(m, level, err, msg) log_link_message_full_errno(NULL, m, level, err, msg) | |
160 | #define log_message_error_errno(m, err, msg) log_message_full_errno(m, LOG_ERR, err, msg) | |
161 | #define log_message_warning_errno(m, err, msg) log_message_full_errno(m, LOG_WARNING, err, msg) | |
162 | #define log_message_notice_errno(m, err, msg) log_message_full_errno(m, LOG_NOTICE, err, msg) | |
163 | #define log_message_info_errno(m, err, msg) log_message_full_errno(m, LOG_INFO, err, msg) | |
164 | #define log_message_debug_errno(m, err, msg) log_message_full_errno(m, LOG_DEBUG, err, msg) |