summaryrefslogtreecommitdiff
path: root/libnm-core/nm-team-utils.h
blob: 2d22d63e7109487e21cd7bd061d1b97c9a2c86b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
// SPDX-License-Identifier: LGPL-2.1+
/*
 * Copyright (C) 2019 Red Hat, Inc.
 */

#ifndef __NM_TEAM_UITLS_H__
#define __NM_TEAM_UITLS_H__

#if !((NETWORKMANAGER_COMPILATION) & NM_NETWORKMANAGER_COMPILATION_WITH_LIBNM_CORE_PRIVATE)
#error Cannot use this header.
#endif

#include "nm-glib-aux/nm-value-type.h"
#include "nm-core-internal.h"

struct _NMSetting;

struct NMTeamLinkWatcher;

typedef enum {

	_NM_TEAM_ATTRIBUTE_0            = 0,
	NM_TEAM_ATTRIBUTE_CONFIG        = 1,
	NM_TEAM_ATTRIBUTE_LINK_WATCHERS = 2,

	_NM_TEAM_ATTRIBUTE_START        = 3,

	NM_TEAM_ATTRIBUTE_MASTER_NOTIFY_PEERS_COUNT = _NM_TEAM_ATTRIBUTE_START,
	NM_TEAM_ATTRIBUTE_MASTER_NOTIFY_PEERS_INTERVAL,
	NM_TEAM_ATTRIBUTE_MASTER_MCAST_REJOIN_COUNT,
	NM_TEAM_ATTRIBUTE_MASTER_MCAST_REJOIN_INTERVAL,
	NM_TEAM_ATTRIBUTE_MASTER_RUNNER,
	NM_TEAM_ATTRIBUTE_MASTER_RUNNER_HWADDR_POLICY,
	NM_TEAM_ATTRIBUTE_MASTER_RUNNER_TX_HASH,
	NM_TEAM_ATTRIBUTE_MASTER_RUNNER_TX_BALANCER,
	NM_TEAM_ATTRIBUTE_MASTER_RUNNER_TX_BALANCER_INTERVAL,
	NM_TEAM_ATTRIBUTE_MASTER_RUNNER_ACTIVE,
	NM_TEAM_ATTRIBUTE_MASTER_RUNNER_FAST_RATE,
	NM_TEAM_ATTRIBUTE_MASTER_RUNNER_SYS_PRIO,
	NM_TEAM_ATTRIBUTE_MASTER_RUNNER_MIN_PORTS,
	NM_TEAM_ATTRIBUTE_MASTER_RUNNER_AGG_SELECT_POLICY,
	_NM_TEAM_ATTRIBUTE_MASTER_NUM,

	NM_TEAM_ATTRIBUTE_PORT_QUEUE_ID = _NM_TEAM_ATTRIBUTE_START,
	NM_TEAM_ATTRIBUTE_PORT_PRIO,
	NM_TEAM_ATTRIBUTE_PORT_STICKY,
	NM_TEAM_ATTRIBUTE_PORT_LACP_PRIO,
	NM_TEAM_ATTRIBUTE_PORT_LACP_KEY,
	_NM_TEAM_ATTRIBUTE_PORT_NUM,

	_NM_TEAM_ATTRIBUTE_NUM = MAX (_NM_TEAM_ATTRIBUTE_MASTER_NUM, _NM_TEAM_ATTRIBUTE_PORT_NUM),

} NMTeamAttribute;

static inline guint32
nm_team_attribute_to_flags (NMTeamAttribute team_attr)
{
	nm_assert (_NM_INT_NOT_NEGATIVE (team_attr));
	nm_assert (team_attr < _NM_TEAM_ATTRIBUTE_NUM);
	G_STATIC_ASSERT_EXPR (_NM_TEAM_ATTRIBUTE_NUM < 32);

	return ((guint32) 1) << team_attr;
}

struct _NMTeamSettingData {

	const char *_js_str;

	const GPtrArray *link_watchers;

	/* this means that @_js_str is unset and needs to be created by
	 * converting the properties to JSON. This flag indicates that
	 * we need to re-generate the JSON string on-demand (lazily). */
	bool _js_str_need_synthetize;

	bool strict_validated:1;

	/* indicates tha the JSON is invalid. Usually, we do a very relaxed validation of
	 * the JSON config, in case !@strict_validated and accept all unknown fields. This
	 * flag indicates that the JSON value is not even parsable as JSON. nm_connection_verify()
	 * would reject such a setting. */
	bool js_str_invalid:1;

	bool is_port:1;

	guint32 has_fields_mask;

	union {
		struct {
			const GPtrArray *runner_tx_hash;
			const char *runner;
			const char *runner_hwaddr_policy;
			const char *runner_tx_balancer;
			const char *runner_agg_select_policy;
			gint32 notify_peers_count;
			gint32 notify_peers_interval;
			gint32 mcast_rejoin_count;
			gint32 mcast_rejoin_interval;
			gint32 runner_sys_prio;
			gint32 runner_min_ports;
			gint32 runner_tx_balancer_interval;
			bool runner_active;
			bool runner_fast_rate;
		} master;
		struct {
			gint32 queue_id;
			gint32 prio;
			gint32 lacp_prio;
			gint32 lacp_key;
			bool sticky;
		} port;
	};
};

/*****************************************************************************/

typedef struct {
	union {
		const struct _NMTeamSettingData d;

		struct _NMTeamSettingData _data_priv;
	};
} NMTeamSetting;

NMTeamSetting *nm_team_setting_new (gboolean is_port,
                                    const char *js_str);

void nm_team_setting_free (NMTeamSetting *self);

NM_AUTO_DEFINE_FCN0 (NMTeamSetting *, _nm_auto_free_team_setting, nm_team_setting_free)
#define nm_auto_free_team_setting nm_auto (_nm_auto_free_team_setting)

/*****************************************************************************/

const char *nm_team_setting_config_get (const NMTeamSetting *self);

guint32 nm_team_setting_config_set (NMTeamSetting *self, const char *js_str);

/*****************************************************************************/

gconstpointer _nm_team_setting_value_get (const NMTeamSetting *self,
                                          NMTeamAttribute team_attr,
                                          NMValueType value_type);

static inline gboolean
nm_team_setting_value_get_bool (const NMTeamSetting *self,
                                NMTeamAttribute team_attr)
{
	const bool *p;

	p = _nm_team_setting_value_get (self, team_attr, NM_VALUE_TYPE_BOOL);
	return p ? *p : 0;
}

static inline gint32
nm_team_setting_value_get_int32 (const NMTeamSetting *self,
                                 NMTeamAttribute team_attr)
{
	const gint32 *p;

	p = _nm_team_setting_value_get (self, team_attr, NM_VALUE_TYPE_INT32);
	return p ? *p : 0;
}

static inline const char *
nm_team_setting_value_get_string (const NMTeamSetting *self,
                                  NMTeamAttribute team_attr)
{
	const char *const*p;

	p = _nm_team_setting_value_get (self, team_attr, NM_VALUE_TYPE_STRING);
	return p ? *p : NULL;
}

/*****************************************************************************/

guint32 nm_team_setting_value_reset (NMTeamSetting *self,
                                     NMTeamAttribute team_attr,
                                     gboolean to_default /* or else unset */);

guint32 _nm_team_setting_value_set (NMTeamSetting *self,
                                    NMTeamAttribute team_attr,
                                    NMValueType value_type,
                                    gconstpointer val);

static inline guint32
nm_team_setting_value_set_bool (NMTeamSetting *self,
                                NMTeamAttribute team_attr,
                                gboolean val)
{
	const bool bool_val = val;

	return _nm_team_setting_value_set (self, team_attr, NM_VALUE_TYPE_BOOL, &bool_val);
}

static inline guint32
nm_team_setting_value_set_int32 (NMTeamSetting *self,
                                 NMTeamAttribute team_attr,
                                 gint32 val)
{
	return _nm_team_setting_value_set (self, team_attr, NM_VALUE_TYPE_INT32, &val);
}

static inline guint32
nm_team_setting_value_set_string (NMTeamSetting *self,
                                  NMTeamAttribute team_attr,
                                  const char *arg)
{
	return _nm_team_setting_value_set (self, team_attr, NM_VALUE_TYPE_STRING, &arg);
}

/*****************************************************************************/

guint32 nm_team_setting_value_link_watchers_add (NMTeamSetting *self,
                                                 const struct NMTeamLinkWatcher *link_watcher);

guint32 nm_team_setting_value_link_watchers_remove (NMTeamSetting *self,
                                                    guint idx);

guint32 nm_team_setting_value_link_watchers_remove_by_value (NMTeamSetting *self,
                                                             const struct NMTeamLinkWatcher *link_watcher);

guint32 nm_team_setting_value_link_watchers_set_list (NMTeamSetting *self,
                                                      const struct NMTeamLinkWatcher *const*arr,
                                                      guint len);

/*****************************************************************************/

guint32 nm_team_setting_value_master_runner_tx_hash_add (NMTeamSetting *self,
                                                         const char *txhash);

guint32 nm_team_setting_value_master_runner_tx_hash_remove (NMTeamSetting *self,
                                                            guint idx);

guint32 nm_team_setting_value_master_runner_tx_hash_set_list (NMTeamSetting *self,
                                                              const char *const*arr,
                                                              guint len);

/*****************************************************************************/

gboolean nm_team_setting_verify (const NMTeamSetting *self,
                                 GError **error);

/*****************************************************************************/

int nm_team_setting_cmp (const NMTeamSetting *self_a,
                         const NMTeamSetting *self_b,
                         gboolean ignore_js_str);

guint32 nm_team_setting_reset (NMTeamSetting *self,
                               const NMTeamSetting *src);

gboolean nm_team_setting_reset_from_dbus (NMTeamSetting *self,
                                          GVariant *setting_dict,
                                          GHashTable *keys,
                                          guint32 *out_changed,
                                          guint /* NMSettingParseFlags */ parse_flags,
                                          GError **error);

/*****************************************************************************/

GPtrArray *_nm_utils_team_link_watchers_from_variant (GVariant *value,
                                                      gboolean strict_parsing,
                                                      GError **error);
GVariant  *_nm_utils_team_link_watchers_to_variant (const GPtrArray *link_watchers);

/*****************************************************************************/

gboolean nm_team_setting_maybe_changed (struct _NMSetting *source,
                                        const GParamSpec *const*obj_properties,
                                        guint32 changed);

struct _NMSettingTeam;
struct _NMSettingTeamPort;
NMTeamSetting *_nm_setting_team_get_team_setting (struct _NMSettingTeam *setting);
NMTeamSetting *_nm_setting_team_port_get_team_setting (struct _NMSettingTeamPort *setting);
NMTeamSetting *_nm_setting_get_team_setting (struct _NMSetting *setting);

/*****************************************************************************/

extern const NMSettInfoPropertType nm_sett_info_propert_type_team_b;
extern const NMSettInfoPropertType nm_sett_info_propert_type_team_i;
extern const NMSettInfoPropertType nm_sett_info_propert_type_team_s;
extern const NMSettInfoPropertType nm_sett_info_propert_type_team_as;
extern const NMSettInfoPropertType nm_sett_info_propert_type_team_link_watchers;

#endif /* __NM_TEAM_UITLS_H__ */