platform,device: merge branch 'replace-sysfs-with-netlink'

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1127
This commit is contained in:
Thomas Haller 2022-04-02 22:40:39 +02:00
commit d1dfcc4c9d
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
4 changed files with 120 additions and 40 deletions

View file

@ -791,23 +791,68 @@ bridge_set_vlan_options(NMDevice *device, NMSettingBridge *s_bridge)
return TRUE;
}
static void
_platform_lnk_bridge_init_from_setting(NMSettingBridge *s_bridge, NMPlatformLnkBridge *props)
{
*props = (NMPlatformLnkBridge){
.forward_delay = _DEFAULT_IF_ZERO(nm_setting_bridge_get_forward_delay(s_bridge) * 100u,
NM_BRIDGE_FORWARD_DELAY_DEF_SYS),
.hello_time = _DEFAULT_IF_ZERO(nm_setting_bridge_get_hello_time(s_bridge) * 100u,
NM_BRIDGE_HELLO_TIME_DEF_SYS),
.max_age = _DEFAULT_IF_ZERO(nm_setting_bridge_get_max_age(s_bridge) * 100u,
NM_BRIDGE_MAX_AGE_DEF_SYS),
.ageing_time = nm_setting_bridge_get_ageing_time(s_bridge) * 100u,
.stp_state = nm_setting_bridge_get_stp(s_bridge),
.priority = nm_setting_bridge_get_priority(s_bridge),
.vlan_protocol = to_sysfs_vlan_protocol_sys(nm_setting_bridge_get_vlan_protocol(s_bridge)),
.vlan_stats_enabled = nm_setting_bridge_get_vlan_stats_enabled(s_bridge),
.group_fwd_mask = nm_setting_bridge_get_group_forward_mask(s_bridge),
.mcast_snooping = nm_setting_bridge_get_multicast_snooping(s_bridge),
.mcast_router =
to_sysfs_multicast_router_sys(nm_setting_bridge_get_multicast_router(s_bridge)),
.mcast_query_use_ifaddr = nm_setting_bridge_get_multicast_query_use_ifaddr(s_bridge),
.mcast_querier = nm_setting_bridge_get_multicast_querier(s_bridge),
.mcast_hash_max = nm_setting_bridge_get_multicast_hash_max(s_bridge),
.mcast_last_member_count = nm_setting_bridge_get_multicast_last_member_count(s_bridge),
.mcast_startup_query_count = nm_setting_bridge_get_multicast_startup_query_count(s_bridge),
.mcast_last_member_interval =
nm_setting_bridge_get_multicast_last_member_interval(s_bridge),
.mcast_membership_interval = nm_setting_bridge_get_multicast_membership_interval(s_bridge),
.mcast_querier_interval = nm_setting_bridge_get_multicast_querier_interval(s_bridge),
.mcast_query_interval = nm_setting_bridge_get_multicast_query_interval(s_bridge),
.mcast_query_response_interval =
nm_setting_bridge_get_multicast_query_response_interval(s_bridge),
.mcast_startup_query_interval =
nm_setting_bridge_get_multicast_startup_query_interval(s_bridge),
};
to_sysfs_group_address_sys(nm_setting_bridge_get_group_address(s_bridge), &props->group_addr);
}
static NMActStageReturn
act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason)
{
NMConnection *connection;
NMSetting *s_bridge;
const Option *option;
NMConnection *connection;
NMSettingBridge *s_bridge;
NMPlatformLnkBridge props;
int r;
int ifindex = nm_device_get_ifindex(device);
connection = nm_device_get_applied_connection(device);
g_return_val_if_fail(connection, NM_ACT_STAGE_RETURN_FAILURE);
s_bridge = (NMSetting *) nm_connection_get_setting_bridge(connection);
s_bridge = nm_connection_get_setting_bridge(connection);
g_return_val_if_fail(s_bridge, NM_ACT_STAGE_RETURN_FAILURE);
for (option = master_options; option->name; option++)
commit_option(device, s_bridge, option, FALSE);
_platform_lnk_bridge_init_from_setting(s_bridge, &props);
if (!bridge_set_vlan_options(device, (NMSettingBridge *) s_bridge)) {
r = nm_platform_link_bridge_change(nm_device_get_platform(device), ifindex, &props);
if (r < 0) {
NM_SET_OUT(out_failure_reason, NM_DEVICE_STATE_REASON_CONFIG_FAILED);
return NM_ACT_STAGE_RETURN_FAILURE;
}
if (!bridge_set_vlan_options(device, s_bridge)) {
NM_SET_OUT(out_failure_reason, NM_DEVICE_STATE_REASON_CONFIG_FAILED);
return NM_ACT_STAGE_RETURN_FAILURE;
}
@ -1054,39 +1099,7 @@ create_and_realize(NMDevice *device,
}
}
props = (NMPlatformLnkBridge){
.forward_delay = _DEFAULT_IF_ZERO(nm_setting_bridge_get_forward_delay(s_bridge) * 100u,
NM_BRIDGE_FORWARD_DELAY_DEF_SYS),
.hello_time = _DEFAULT_IF_ZERO(nm_setting_bridge_get_hello_time(s_bridge) * 100u,
NM_BRIDGE_HELLO_TIME_DEF_SYS),
.max_age = _DEFAULT_IF_ZERO(nm_setting_bridge_get_max_age(s_bridge) * 100u,
NM_BRIDGE_MAX_AGE_DEF_SYS),
.ageing_time = nm_setting_bridge_get_ageing_time(s_bridge) * 100u,
.stp_state = nm_setting_bridge_get_stp(s_bridge),
.priority = nm_setting_bridge_get_priority(s_bridge),
.vlan_protocol = to_sysfs_vlan_protocol_sys(nm_setting_bridge_get_vlan_protocol(s_bridge)),
.vlan_stats_enabled = nm_setting_bridge_get_vlan_stats_enabled(s_bridge),
.group_fwd_mask = nm_setting_bridge_get_group_forward_mask(s_bridge),
.mcast_snooping = nm_setting_bridge_get_multicast_snooping(s_bridge),
.mcast_router =
to_sysfs_multicast_router_sys(nm_setting_bridge_get_multicast_router(s_bridge)),
.mcast_query_use_ifaddr = nm_setting_bridge_get_multicast_query_use_ifaddr(s_bridge),
.mcast_querier = nm_setting_bridge_get_multicast_querier(s_bridge),
.mcast_hash_max = nm_setting_bridge_get_multicast_hash_max(s_bridge),
.mcast_last_member_count = nm_setting_bridge_get_multicast_last_member_count(s_bridge),
.mcast_startup_query_count = nm_setting_bridge_get_multicast_startup_query_count(s_bridge),
.mcast_last_member_interval =
nm_setting_bridge_get_multicast_last_member_interval(s_bridge),
.mcast_membership_interval = nm_setting_bridge_get_multicast_membership_interval(s_bridge),
.mcast_querier_interval = nm_setting_bridge_get_multicast_querier_interval(s_bridge),
.mcast_query_interval = nm_setting_bridge_get_multicast_query_interval(s_bridge),
.mcast_query_response_interval =
nm_setting_bridge_get_multicast_query_response_interval(s_bridge),
.mcast_startup_query_interval =
nm_setting_bridge_get_multicast_startup_query_interval(s_bridge),
};
to_sysfs_group_address_sys(nm_setting_bridge_get_group_address(s_bridge), &props.group_addr);
_platform_lnk_bridge_init_from_setting(s_bridge, &props);
/* If mtu != 0, we set the MTU of the new bridge at creation time. However, kernel will still
* automatically adjust the MTU of the bridge based on the minimum of the slave's MTU.

View file

@ -7538,6 +7538,21 @@ out:
return result;
}
static int
link_change(NMPlatform *platform, NMLinkType type, int ifindex, gconstpointer extra_data)
{
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
nlmsg = _nl_msg_new_link(RTM_NEWLINK, 0, ifindex, 0);
if (!nlmsg)
return -NME_UNSPEC;
if (!_nl_msg_new_link_set_linkinfo(nlmsg, type, extra_data))
return -NME_UNSPEC;
return do_change_link(platform, CHANGE_LINK_TYPE_UNSPEC, ifindex, nlmsg, NULL);
}
static int
link_add(NMPlatform *platform,
NMLinkType type,
@ -9920,6 +9935,7 @@ nm_linux_platform_class_init(NMLinuxPlatformClass *klass)
platform_class->sysctl_get = sysctl_get;
platform_class->link_add = link_add;
platform_class->link_change = link_change;
platform_class->link_delete = link_delete;
platform_class->link_refresh = link_refresh;

View file

@ -1304,6 +1304,45 @@ nm_platform_link_add(NMPlatform *self,
->link_add(self, type, name, parent, address, address_len, mtu, extra_data, out_link);
}
int
nm_platform_link_change(NMPlatform *self, NMLinkType type, int ifindex, gconstpointer extra_data)
{
char buf[512];
const char *name = nm_platform_link_get_name(self, ifindex);
_CHECK_SELF(self, klass, -NME_BUG);
_LOG2D("link: changing link: "
"%s " /* type */
"\"%s\"" /* name */
"%s" /* extra_data */
"",
nm_link_type_to_string(type),
name,
({
char *buf_p = buf;
gsize buf_len = sizeof(buf);
buf[0] = '\0';
switch (type) {
case NM_LINK_TYPE_BRIDGE:
nm_strbuf_append_str(&buf_p, &buf_len, ", ");
nm_platform_lnk_bridge_to_string((const NMPlatformLnkBridge *) extra_data,
buf_p,
buf_len);
break;
default:
nm_assert(!extra_data);
break;
}
buf;
}));
return klass->link_change(self, type, ifindex, extra_data);
}
/**
* nm_platform_link_delete:
* @self: platform instance

View file

@ -1113,6 +1113,9 @@ typedef struct {
guint32 mtu,
gconstpointer extra_data,
const NMPlatformLink **out_link);
int (*link_change)(NMPlatform *self, NMLinkType type, int ifindex, gconstpointer extra_data);
gboolean (*link_delete)(NMPlatform *self, int ifindex);
gboolean (*link_refresh)(NMPlatform *self, int ifindex);
gboolean (*link_set_netns)(NMPlatform *self, int ifindex, int netns_fd);
@ -1586,6 +1589,9 @@ int nm_platform_link_add(NMPlatform *self,
gconstpointer extra_data,
const NMPlatformLink **out_link);
int
nm_platform_link_change(NMPlatform *self, NMLinkType type, int ifindex, gconstpointer extra_data);
static inline int
nm_platform_link_veth_add(NMPlatform *self,
const char *name,
@ -1621,6 +1627,12 @@ nm_platform_link_bridge_add(NMPlatform *self,
out_link);
}
static inline int
nm_platform_link_bridge_change(NMPlatform *self, int ifindex, const NMPlatformLnkBridge *props)
{
return nm_platform_link_change(self, NM_LINK_TYPE_BRIDGE, ifindex, props);
}
static inline int
nm_platform_link_bond_add(NMPlatform *self, const char *name, const NMPlatformLink **out_link)
{