From f282ce20aaa767f5395b065f2be587cdef3e5491 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 30 Apr 2021 06:57:15 +0900 Subject: [PATCH 1/7] network: drop duplicated link_up_can() --- src/network/networkd-can.c | 46 ++----------------------------------- src/network/networkd-link.c | 2 +- src/network/networkd-link.h | 1 + 3 files changed, 4 insertions(+), 45 deletions(-) diff --git a/src/network/networkd-can.c b/src/network/networkd-can.c index c0018c306f..2ab8d32812 100644 --- a/src/network/networkd-can.c +++ b/src/network/networkd-can.c @@ -52,48 +52,6 @@ int config_parse_can_bitrate( return 0; } -static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { - int r; - - assert(link); - - if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) - return 1; - - r = sd_netlink_message_get_errno(m); - if (r < 0) - /* we warn but don't fail the link, as it may be brought up later */ - log_link_message_warning_errno(link, m, r, "Could not bring up interface"); - - return 1; -} - -static int link_up_can(Link *link) { - _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; - int r; - - assert(link); - - log_link_debug(link, "Bringing CAN link up"); - - r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex); - if (r < 0) - return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m"); - - r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP); - if (r < 0) - return log_link_error_errno(link, r, "Could not set link flags: %m"); - - r = netlink_call_async(link->manager->rtnl, NULL, req, link_up_handler, - link_netlink_destroy_callback, link); - if (r < 0) - return log_link_error_errno(link, r, "Could not send rtnetlink message: %m"); - - link_ref(link); - - return 0; -} - static int link_set_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { int r; @@ -256,7 +214,7 @@ static int link_set_can(Link *link) { link_ref(link); if (!(link->flags & IFF_UP)) - return link_up_can(link); + return link_up(link); return 0; } @@ -308,7 +266,7 @@ int link_configure_can(Link *link) { } if (!(link->flags & IFF_UP)) { - r = link_up_can(link); + r = link_up(link); if (r < 0) { link_enter_failed(link); return r; diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index d29ba13ad3..c93cdf7bb1 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1376,7 +1376,7 @@ static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) return 1; } -static int link_up(Link *link) { +int link_up(Link *link) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; int r; diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 8e91c05f0f..f4a2b1f240 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -207,6 +207,7 @@ DEFINE_TRIVIAL_DESTRUCTOR(link_netlink_destroy_callback, Link, link_unref); int link_get(Manager *m, int ifindex, Link **ret); +int link_up(Link *link); int link_down(Link *link, link_netlink_message_handler_t callback); void link_enter_failed(Link *link); From ed52cce33f588bbeb3d7f5d7f5e76a85cf6e4f89 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 30 Apr 2021 07:00:45 +0900 Subject: [PATCH 2/7] network: can: do not warn if link does not exist anymore --- src/network/networkd-can.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/network/networkd-can.c b/src/network/networkd-can.c index 2ab8d32812..8e4cd21c6f 100644 --- a/src/network/networkd-can.c +++ b/src/network/networkd-can.c @@ -57,14 +57,18 @@ static int link_set_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) assert(link); - log_link_debug(link, "Set link"); + if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) + return 1; r = sd_netlink_message_get_errno(m); if (r < 0 && r != -EEXIST) { log_link_message_warning_errno(link, m, r, "Failed to configure CAN link"); link_enter_failed(link); + return 1; } + log_link_debug(link, "Link set"); + return 1; } From e361398e48133cf7e28d96ff32224e338b127735 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 30 Apr 2021 07:06:28 +0900 Subject: [PATCH 3/7] network: can: shorten code a bit --- src/network/networkd-can.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/network/networkd-can.c b/src/network/networkd-can.c index 8e4cd21c6f..1279d1b89f 100644 --- a/src/network/networkd-can.c +++ b/src/network/networkd-can.c @@ -252,21 +252,13 @@ int link_configure_can(Link *link) { if (streq_ptr(link->kind, "can")) { /* The CAN interface must be down to configure bitrate, etc... */ - if ((link->flags & IFF_UP)) { + if ((link->flags & IFF_UP)) r = link_down(link, link_down_handler); - if (r < 0) { - link_enter_failed(link); - return r; - } - } else { + else r = link_set_can(link); - if (r < 0) { - link_enter_failed(link); - return r; - } - } - - return 0; + if (r < 0) + link_enter_failed(link); + return r; } if (!(link->flags & IFF_UP)) { From 600b7898e8d1a09a0f48866fe2cc8bdab597538f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 30 Apr 2021 07:10:34 +0900 Subject: [PATCH 4/7] network: do not try to configure address or etc on can device --- src/network/networkd-can.c | 6 ++++++ src/network/networkd-link.c | 18 ++++++++++++++++++ src/network/networkd-link.h | 1 + 3 files changed, 25 insertions(+) diff --git a/src/network/networkd-can.c b/src/network/networkd-can.c index 1279d1b89f..e448a1ad02 100644 --- a/src/network/networkd-can.c +++ b/src/network/networkd-can.c @@ -69,6 +69,9 @@ static int link_set_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) log_link_debug(link, "Link set"); + link->can_configured = true; + link_check_ready(link); + return 1; } @@ -269,5 +272,8 @@ int link_configure_can(Link *link) { } } + link->can_configured = true; + link_check_ready(link); + return 0; } diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index c93cdf7bb1..7da08c5430 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -764,6 +764,15 @@ void link_check_ready(Link *link) { if (!link->network) return; + if (link->iftype == ARPHRD_CAN) { + /* let's shortcut things for CAN which doesn't need most of checks below. */ + if (!link->can_configured) + return (void) log_link_debug(link, "%s(): CAN device is not configured.", __func__); + + link_enter_configured(link); + return; + } + if (!link->addresses_configured) return (void) log_link_debug(link, "%s(): static addresses are not configured.", __func__); @@ -2076,6 +2085,7 @@ int link_configure(Link *link) { return r; if (link->iftype == ARPHRD_CAN) + /* let's shortcut things for CAN which doesn't need most of what's done below. */ return link_configure_can(link); r = link_set_sysctl(link); @@ -2567,6 +2577,10 @@ static int link_carrier_gained(Link *link) { assert(link); + if (link->iftype == ARPHRD_CAN) + /* let's shortcut things for CAN which doesn't need most of what's done below. */ + return link_handle_bound_by_list(link); + r = wifi_get_info(link); if (r < 0) return r; @@ -2625,6 +2639,10 @@ static int link_carrier_lost(Link *link) { if (link->network && link->network->ignore_carrier_loss) return 0; + if (link->iftype == ARPHRD_CAN) + /* let's shortcut things for CAN which doesn't need most of what's done below. */ + return link_handle_bound_by_list(link); + /* Some devices reset itself while setting the MTU. This causes the DHCP client fall into a loop. * setting_mtu keep track whether the device got reset because of setting MTU and does not drop the * configuration and stop the clients as well. */ diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index f4a2b1f240..541231b4b9 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -131,6 +131,7 @@ typedef struct Link { bool setting_genmode:1; bool ipv6_mtu_set:1; bool bridge_mdb_configured:1; + bool can_configured:1; bool activated:1; sd_dhcp_server *dhcp_server; From 04952b25e81a137c9357fcf499527c6b713d50b9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 30 Apr 2021 08:08:23 +0900 Subject: [PATCH 5/7] network: introduce link_activate() --- src/network/networkd-link.c | 23 ++++++++++++++++------- src/network/networkd-link.h | 1 + 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 7da08c5430..8b8c385220 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1780,7 +1780,7 @@ static void link_drop(Link *link) { link_detach_from_manager(link); } -static int link_joined(Link *link) { +int link_activate(Link *link) { int r; assert(link); @@ -1798,10 +1798,8 @@ static int link_joined(Link *link) { _fallthrough_; case ACTIVATION_POLICY_ALWAYS_UP: r = link_up(link); - if (r < 0) { - link_enter_failed(link); + if (r < 0) return r; - } break; case ACTIVATION_POLICY_DOWN: if (link->activated) @@ -1809,16 +1807,27 @@ static int link_joined(Link *link) { _fallthrough_; case ACTIVATION_POLICY_ALWAYS_DOWN: r = link_down(link, NULL); - if (r < 0) { - link_enter_failed(link); + if (r < 0) return r; - } break; default: break; } link->activated = true; + return 0; +} + +static int link_joined(Link *link) { + int r; + + assert(link); + assert(link->network); + + r = link_activate(link); + if (r < 0) + return r; + if (link->network->bridge) { r = link_set_bridge(link); if (r < 0) diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 541231b4b9..b560dde0dc 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -210,6 +210,7 @@ int link_get(Manager *m, int ifindex, Link **ret); int link_up(Link *link); int link_down(Link *link, link_netlink_message_handler_t callback); +int link_activate(Link *link); void link_enter_failed(Link *link); From d9fc3b0da97924d778a5d77316fa55302918b156 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 30 Apr 2021 07:03:13 +0900 Subject: [PATCH 6/7] network: make CAN device follow activation policy --- src/network/networkd-can.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/network/networkd-can.c b/src/network/networkd-can.c index e448a1ad02..787cfd711e 100644 --- a/src/network/networkd-can.c +++ b/src/network/networkd-can.c @@ -69,6 +69,12 @@ static int link_set_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) log_link_debug(link, "Link set"); + r = link_activate(link); + if (r < 0) { + link_enter_failed(link); + return 1; + } + link->can_configured = true; link_check_ready(link); @@ -220,9 +226,6 @@ static int link_set_can(Link *link) { link_ref(link); - if (!(link->flags & IFF_UP)) - return link_up(link); - return 0; } @@ -264,13 +267,9 @@ int link_configure_can(Link *link) { return r; } - if (!(link->flags & IFF_UP)) { - r = link_up(link); - if (r < 0) { - link_enter_failed(link); - return r; - } - } + r = link_activate(link); + if (r < 0) + return r; link->can_configured = true; link_check_ready(link); From 36161cba7ce9227c83d9aa3c9d621ffcca829f56 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 30 Apr 2021 08:10:36 +0900 Subject: [PATCH 7/7] network: do not bring up CAN interface on configure --- src/network/networkd-link.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 8b8c385220..ffaebbbf6d 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2739,6 +2739,10 @@ static int link_admin_state_down(Link *link) { return 0; if (link->network->activation_policy == ACTIVATION_POLICY_ALWAYS_UP) { + if (streq_ptr(link->kind, "can") && !link->can_configured) + /* CAN device needs to be down on configure. */ + return 0; + log_link_info(link, "ActivationPolicy is \"always-on\", forcing link up"); return link_up(link); }