diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-05-01 15:03:22 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-01 15:03:22 +0900 |
commit | 0c9cdcb9d4e0a74c355265844d3be2a54982a180 (patch) | |
tree | 8244664730d75bdfd7d3d5f3c12f580f941d6df7 | |
parent | bff97a251de07b58737c5c9822e048c9cc116c21 (diff) | |
parent | 36161cba7ce9227c83d9aa3c9d621ffcca829f56 (diff) | |
download | systemd-0c9cdcb9d4e0a74c355265844d3be2a54982a180.tar.gz |
Merge pull request #19476 from yuwata/network-can
network: several CAN device related updates
-rw-r--r-- | src/network/networkd-can.c | 89 | ||||
-rw-r--r-- | src/network/networkd-link.c | 47 | ||||
-rw-r--r-- | src/network/networkd-link.h | 3 |
3 files changed, 66 insertions, 73 deletions
diff --git a/src/network/networkd-can.c b/src/network/networkd-can.c index c0018c306f..787cfd711e 100644 --- a/src/network/networkd-can.c +++ b/src/network/networkd-can.c @@ -52,7 +52,7 @@ int config_parse_can_bitrate( return 0; } -static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { +static int link_set_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { int r; assert(link); @@ -61,52 +61,23 @@ static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) 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; - - assert(link); - - log_link_debug(link, "Set link"); - - 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"); + + r = link_activate(link); + if (r < 0) { + link_enter_failed(link); + return 1; } + link->can_configured = true; + link_check_ready(link); + return 1; } @@ -255,9 +226,6 @@ static int link_set_can(Link *link) { link_ref(link); - if (!(link->flags & IFF_UP)) - return link_up_can(link); - return 0; } @@ -290,30 +258,21 @@ 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 (!(link->flags & IFF_UP)) { - r = link_up_can(link); - if (r < 0) { + if (r < 0) link_enter_failed(link); - return r; - } + return r; } + r = link_activate(link); + if (r < 0) + return r; + + 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 d29ba13ad3..ffaebbbf6d 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__); @@ -1376,7 +1385,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; @@ -1771,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); @@ -1789,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) @@ -1800,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) @@ -2076,6 +2094,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 +2586,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 +2648,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. */ @@ -2712,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); } diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 8e91c05f0f..b560dde0dc 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; @@ -207,7 +208,9 @@ 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); +int link_activate(Link *link); void link_enter_failed(Link *link); |