Skip to content

Commit

Permalink
team: add link_watch_policy
Browse files Browse the repository at this point in the history
  • Loading branch information
cfconrad committed Feb 22, 2024
1 parent 820f237 commit 5c71eba
Show file tree
Hide file tree
Showing 9 changed files with 93 additions and 5 deletions.
15 changes: 15 additions & 0 deletions client/compat.c
Expand Up @@ -773,6 +773,18 @@ __ni_compat_generate_team_runner(xml_node_t *tnode, const ni_team_runner_t *runn
return TRUE;
}

static ni_bool_t
ni_compat_generate_team_link_watch_policy(xml_node_t *tnode, const ni_team_link_watch_policy_t policy)
{
const char *name;

if (policy != NI_TEAM_LINK_WATCH_POLICY_ANY &&
(name = ni_team_link_watch_policy_type_to_name(policy)))
xml_node_new_element("link_watch_policy", tnode, name);

return TRUE;
}

static ni_bool_t
__ni_compat_generate_team_link_watch(xml_node_t *tnode, const ni_team_link_watch_array_t *array)
{
Expand Down Expand Up @@ -921,6 +933,9 @@ __ni_compat_generate_team(xml_node_t *ifnode, const ni_compat_netdev_t *compat)
if (!__ni_compat_generate_team_runner(tnode, &team->runner))
return FALSE;

if (!ni_compat_generate_team_link_watch_policy(tnode, team->link_watch_policy))
return FALSE;

if (!__ni_compat_generate_team_link_watch(tnode, &team->link_watch))
return FALSE;

Expand Down
8 changes: 8 additions & 0 deletions client/suse/compat-suse.c
Expand Up @@ -2798,6 +2798,14 @@ try_team(ni_sysconfig_t *sc, ni_compat_netdev_t *compat)
}
}

if ((value = ni_sysconfig_get_value(sc, "TEAM_LINK_WATCH_POLICY"))) {
if (!ni_team_link_watch_policy_name_to_type(value, &team->link_watch_policy)) {
ni_error("ifcfg-%s: Cannot parse TEAM_LINK_WATCH_POLICY='%s'",
dev->name, value);
return -1;
}
}

if (__process_indexed_variables(sc, dev, "TEAM_LW_NAME",
try_add_team_link_watch) < 0)
return -1;
Expand Down
10 changes: 10 additions & 0 deletions include/wicked/team.h
Expand Up @@ -227,11 +227,17 @@ typedef struct ni_team_port_array {
ni_team_port_t ** data;
} ni_team_port_array_t;

typedef enum {
NI_TEAM_LINK_WATCH_POLICY_ANY = 0U,
NI_TEAM_LINK_WATCH_POLICY_ALL = 1,
} ni_team_link_watch_policy_t;

/*
* team device
*/
struct ni_team {
ni_team_runner_t runner;
ni_team_link_watch_policy_t link_watch_policy;
ni_team_link_watch_array_t link_watch;
ni_team_port_array_t ports;
};
Expand Down Expand Up @@ -261,6 +267,10 @@ extern ni_bool_t ni_team_ab_hwaddr_policy_name_to_type(const char *, ni_team_
extern const char * ni_team_link_watch_type_to_name(ni_team_link_watch_type_t);
extern ni_bool_t ni_team_link_watch_name_to_type(const char *, ni_team_link_watch_type_t *);

extern const char * ni_team_link_watch_policy_type_to_name(ni_team_link_watch_policy_t);
extern ni_bool_t ni_team_link_watch_policy_name_to_type(const char *,
ni_team_link_watch_policy_t *);

extern ni_team_link_watch_t * ni_team_link_watch_new(ni_team_link_watch_type_t);
extern void ni_team_link_watch_free(ni_team_link_watch_t *);
extern ni_declare_ptr_array_append(ni_team_link_watch);
Expand Down
3 changes: 3 additions & 0 deletions schema/constants.xml.in
Expand Up @@ -211,6 +211,9 @@
<define name="builtin-team-lacp-select-policy" type="uint32" constraint="enum">
<@@TEAM_LACP_SELECT_POLICY_NAME@@ value="@@TEAM_LACP_SELECT_POLICY_VALUE@@"/>
</define>
<define name="builtin-team-link-watch-policy" type="uint32" constraint="enum">
<@@TEAM_LINK_WATCH_POLICY_NAME@@ value="@@TEAM_LINK_WATCH_POLICY_VALUE@@"/>
</define>

<!-- Built-in gre constants -->
<define name="builtin-gre-flag-mask" type="uint32" constraint="bitmap">
Expand Down
2 changes: 1 addition & 1 deletion schema/team.xml
Expand Up @@ -92,7 +92,7 @@
<random type="random-runner"/>
<lacp type="lacp-runner"/>
</runner>

<link_watch_policy type="builtin-team-link-watch-policy" />
<link_watch class="dict">
<watch class="union" switch="name">
<ethtool type="ethtool-linkwatch-type" />
Expand Down
12 changes: 8 additions & 4 deletions src/dbus-objects/team.c
Expand Up @@ -248,8 +248,8 @@ __ni_objectmodel_delete_team(ni_dbus_object_t *object, const ni_dbus_method_t *m
/*
* Helper function to obtain team config from dbus object
*/
static ni_team_t *
__ni_objectmodel_team_handle(const ni_dbus_object_t *object, ni_bool_t write_access, DBusError *error)
static void *
ni_objectmodel_get_team(const ni_dbus_object_t *object, ni_bool_t write_access, DBusError *error)
{
ni_netdev_t *dev;
ni_team_t *team;
Expand All @@ -270,13 +270,13 @@ __ni_objectmodel_team_handle(const ni_dbus_object_t *object, ni_bool_t write_acc
static ni_team_t *
__ni_objectmodel_team_write_handle(const ni_dbus_object_t *object, DBusError *error)
{
return __ni_objectmodel_team_handle(object, TRUE, error);
return ni_objectmodel_get_team(object, TRUE, error);
}

static const ni_team_t *
__ni_objectmodel_team_read_handle(const ni_dbus_object_t *object, DBusError *error)
{
return __ni_objectmodel_team_handle(object, FALSE, error);
return ni_objectmodel_get_team(object, FALSE, error);
}

#if 0
Expand Down Expand Up @@ -883,12 +883,16 @@ __ni_objectmodel_team_set_ports(ni_dbus_object_t *object, const ni_dbus_property
#define TEAM_DICT_PROPERTY(dbus_name, member_name,rw) \
___NI_DBUS_PROPERTY(NI_DBUS_DICT_SIGNATURE, dbus_name, \
member_name, __ni_objectmodel_team, RO)
#define TEAM_UINT_PROPERTY(dbus_name, member_name, rw) \
NI_DBUS_GENERIC_UINT_PROPERTY(team, dbus_name, member_name, rw)

#define TEAM_DICT_ARRAY_PROPERTY(dbus_name, member_name,rw) \
___NI_DBUS_PROPERTY(DBUS_TYPE_ARRAY_AS_STRING NI_DBUS_DICT_SIGNATURE, \
dbus_name, member_name, __ni_objectmodel_team, RO)

static ni_dbus_property_t ni_objectmodel_team_properties[] = {
TEAM_DICT_PROPERTY(runner, runner, RO),
TEAM_UINT_PROPERTY(link_watch_policy, link_watch_policy, RO),
TEAM_DICT_PROPERTY(link_watch, link_watch, RO),
TEAM_DICT_ARRAY_PROPERTY(ports, ports, RO),
TEAM_HWADDR_PROPERTY(address, RO),
Expand Down
28 changes: 28 additions & 0 deletions src/team.c
Expand Up @@ -292,6 +292,34 @@ ni_team_link_watch_free(ni_team_link_watch_t *lw)
free(lw);
}

/*
* Map teamd link watch policy to constants
*/
static const ni_intmap_t ni_team_link_watch_policy[] = {
{ "any", NI_TEAM_LINK_WATCH_POLICY_ANY },
{ "all", NI_TEAM_LINK_WATCH_POLICY_ALL },

{ NULL, -1U }
};

const char *
ni_team_link_watch_policy_type_to_name(ni_team_link_watch_policy_t type)
{
return ni_format_uint_mapped(type, ni_team_link_watch_policy);
}

ni_bool_t
ni_team_link_watch_policy_name_to_type(const char *name, ni_team_link_watch_policy_t *type)
{
if (!name || !type)
return FALSE;

if (ni_parse_uint_mapped(name, ni_team_link_watch_policy, type) != 0)
return FALSE;

return TRUE;
}

static ni_define_ptr_array_init(ni_team_link_watch);
static ni_define_ptr_array_destroy(ni_team_link_watch);
static ni_define_ptr_array_realloc(ni_team_link_watch, NI_TEAM_LINK_WATCH_ARRAY_CHUNK);
Expand Down
19 changes: 19 additions & 0 deletions src/teamd.c
Expand Up @@ -960,6 +960,19 @@ ni_teamd_discover_link_watch_item_details(ni_team_link_watch_t *lw, ni_json_t *l
return 0;
}


static void
ni_teamd_discover_link_watch_policy(ni_netdev_t *dev, ni_team_t *team, ni_json_t *conf)
{
char * name = NULL;

if (!ni_json_string_get(ni_json_object_get_value(conf, "link_watch_policy"), &name))
return;

if (!ni_team_link_watch_policy_name_to_type(name, &team->link_watch_policy))
ni_warn("%s: Unknown link_watch_policy value %s", dev->name, name);
}

static int
ni_teamd_discover_link_watch_item(ni_team_link_watch_array_t *array, ni_json_t *link_watch)
{
Expand Down Expand Up @@ -1131,6 +1144,8 @@ ni_teamd_discover(ni_netdev_t *dev)
if (ni_teamd_discover_runner(team, conf) < 0)
goto failure;

ni_teamd_discover_link_watch_policy(dev, team, conf);

if (ni_teamd_discover_link_watch(team, conf) < 0)
goto failure;

Expand Down Expand Up @@ -1391,6 +1406,7 @@ ni_teamd_config_file_dump(FILE *fp, const char *instance, const ni_team_t *confi
{
ni_stringbuf_t dump = NI_STRINGBUF_INIT_DYNAMIC;
ni_json_t *object, *child;
const char *name;

if (!fp || ni_string_empty(instance) || !config)
return -1;
Expand All @@ -1406,6 +1422,9 @@ ni_teamd_config_file_dump(FILE *fp, const char *instance, const ni_team_t *confi
goto failure;
ni_json_object_set(object, "runner", child);

if ((name = ni_team_link_watch_policy_type_to_name(config->link_watch_policy)))
ni_json_object_set(object, "link_watch_policy", ni_json_new_string(name));

if (config->link_watch.count) {
if (!(child = ni_teamd_config_json_link_watch(&config->link_watch)))
goto failure;
Expand Down
1 change: 1 addition & 0 deletions util/mkconst.c
Expand Up @@ -98,6 +98,7 @@ static struct generic_map generic_maps[] = {
MAP(TEAM_TX_BALANCER, ni_team_tx_balancer_type_to_name),
MAP(TEAM_AB_HWADDR_POLICY, ni_team_ab_hwaddr_policy_type_to_name),
MAP(TEAM_LACP_SELECT_POLICY, ni_team_lacp_select_policy_type_to_name),
MAP(TEAM_LINK_WATCH_POLICY, ni_team_link_watch_policy_type_to_name),
MAP(GRE_FLAG_BIT, ni_gre_flag_bit_to_name),
MAP(GRE_ENCAP_TYPE, ni_gre_encap_type_to_name),
MAP(GRE_ENCAP_FLAG_BIT, ni_gre_encap_flag_bit_to_name),
Expand Down

0 comments on commit 5c71eba

Please sign in to comment.