Skip to content

Commit 112a097

Browse files
committed
network: introduce link_request_to_activate()
The request will be processed after all setlink requests are processed. The function will be used in later commits.
1 parent 0e39756 commit 112a097

File tree

8 files changed

+196
-128
lines changed

8 files changed

+196
-128
lines changed

src/network/netdev/netdev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ static int netdev_enslave_ready(NetDev *netdev, Link* link, link_netlink_message
272272

273273
if (link->flags & IFF_UP && netdev->kind == NETDEV_KIND_BOND) {
274274
log_netdev_debug(netdev, "Link '%s' was up when attempting to enslave it. Bringing link down.", link->ifname);
275-
r = link_down(link, NULL);
275+
r = link_down(link);
276276
if (r < 0)
277277
return log_netdev_error_errno(netdev, r, "Could not bring link down: %m");
278278
}

src/network/networkd-can.c

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "networkd-can.h"
88
#include "networkd-link.h"
99
#include "networkd-manager.h"
10+
#include "networkd-setlink.h"
1011
#include "parse-util.h"
1112
#include "string-util.h"
1213

@@ -229,42 +230,20 @@ static int link_set_can(Link *link) {
229230
return 0;
230231
}
231232

232-
static int link_down_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
233-
int r;
234-
235-
assert(link);
236-
237-
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
238-
return 1;
239-
240-
r = sd_netlink_message_get_errno(m);
241-
if (r < 0) {
242-
log_link_message_warning_errno(link, m, r, "Could not bring down interface");
243-
link_enter_failed(link);
244-
return 1;
245-
}
246-
247-
r = link_set_can(link);
248-
if (r < 0)
249-
link_enter_failed(link);
250-
251-
return 1;
252-
}
253-
254233
int link_configure_can(Link *link) {
255234
int r;
256235

257236
link_set_state(link, LINK_STATE_CONFIGURING);
258237

259238
if (streq_ptr(link->kind, "can")) {
260239
/* The CAN interface must be down to configure bitrate, etc... */
261-
if ((link->flags & IFF_UP))
262-
r = link_down(link, link_down_handler);
263-
else
264-
r = link_set_can(link);
265-
if (r < 0)
266-
link_enter_failed(link);
267-
return r;
240+
if (link->flags & IFF_UP) {
241+
r = link_down(link);
242+
if (r < 0)
243+
return r;
244+
}
245+
246+
return link_set_can(link);
268247
}
269248

270249
r = link_activate(link);

src/network/networkd-link.c

Lines changed: 9 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ bool link_is_ready_to_configure(Link *link, bool allow_unmanaged) {
159159
return false;
160160
*/
161161

162+
/* TODO: enable this check when link_request_to_activate() is used.
163+
if (!link->activated)
164+
return false;
165+
*/
166+
162167
return true;
163168
}
164169

@@ -754,97 +759,7 @@ int link_ipv6ll_gained(Link *link, const struct in6_addr *address) {
754759
return 0;
755760
}
756761

757-
static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
758-
int r;
759-
760-
assert(link);
761-
762-
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
763-
return 1;
764-
765-
r = sd_netlink_message_get_errno(m);
766-
if (r < 0)
767-
/* we warn but don't fail the link, as it may be brought up later */
768-
log_link_message_warning_errno(link, m, r, "Could not bring up interface");
769-
770-
return 1;
771-
}
772-
773-
int link_up(Link *link) {
774-
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
775-
int r;
776-
777-
assert(link);
778-
assert(link->network);
779-
assert(link->manager);
780-
assert(link->manager->rtnl);
781-
782-
log_link_debug(link, "Bringing link up");
783-
784-
r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
785-
if (r < 0)
786-
return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
787-
788-
r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
789-
if (r < 0)
790-
return log_link_error_errno(link, r, "Could not set link flags: %m");
791-
792-
r = netlink_call_async(link->manager->rtnl, NULL, req, link_up_handler,
793-
link_netlink_destroy_callback, link);
794-
if (r < 0)
795-
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
796-
797-
link_ref(link);
798-
799-
return 0;
800-
}
801-
802-
static int link_down_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
803-
int r;
804-
805-
assert(link);
806-
807-
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
808-
return 1;
809-
810-
r = sd_netlink_message_get_errno(m);
811-
if (r < 0)
812-
log_link_message_warning_errno(link, m, r, "Could not bring down interface");
813-
814-
return 1;
815-
}
816-
817-
int link_down(Link *link, link_netlink_message_handler_t callback) {
818-
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
819-
int r;
820-
821-
assert(link);
822-
assert(link->manager);
823-
assert(link->manager->rtnl);
824-
825-
log_link_debug(link, "Bringing link down");
826-
827-
r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
828-
RTM_SETLINK, link->ifindex);
829-
if (r < 0)
830-
return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
831-
832-
r = sd_rtnl_message_link_set_flags(req, 0, IFF_UP);
833-
if (r < 0)
834-
return log_link_error_errno(link, r, "Could not set link flags: %m");
835-
836-
r = netlink_call_async(link->manager->rtnl, NULL, req,
837-
callback ?: link_down_handler,
838-
link_netlink_destroy_callback, link);
839-
if (r < 0)
840-
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
841-
842-
link_ref(link);
843-
844-
return 0;
845-
}
846-
847-
static int link_handle_bound_to_list(Link *link) {
762+
int link_handle_bound_to_list(Link *link) {
848763
bool required_up = false;
849764
bool link_is_up = false;
850765
Link *l;
@@ -864,7 +779,7 @@ static int link_handle_bound_to_list(Link *link) {
864779
}
865780

866781
if (!required_up && link_is_up)
867-
return link_down(link, NULL);
782+
return link_down(link);
868783
if (required_up && !link_is_up)
869784
return link_up(link);
870785

@@ -1141,7 +1056,7 @@ int link_activate(Link *link) {
11411056
break;
11421057
_fallthrough_;
11431058
case ACTIVATION_POLICY_ALWAYS_DOWN:
1144-
r = link_down(link, NULL);
1059+
r = link_down(link);
11451060
if (r < 0)
11461061
return r;
11471062
break;
@@ -1945,7 +1860,7 @@ static int link_admin_state_up(Link *link) {
19451860

19461861
if (link->network->activation_policy == ACTIVATION_POLICY_ALWAYS_DOWN) {
19471862
log_link_info(link, "ActivationPolicy is \"always-off\", forcing link down");
1948-
return link_down(link, NULL);
1863+
return link_down(link);
19491864
}
19501865

19511866
/* We set the ipv6 mtu after the device mtu, but the kernel resets

src/network/networkd-link.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,8 @@ int link_get_master(Link *link, Link **ret);
224224

225225
int link_getlink_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg);
226226
int link_call_getlink(Link *link, link_netlink_message_handler_t callback);
227-
int link_up(Link *link);
228-
int link_down(Link *link, link_netlink_message_handler_t callback);
229227
int link_activate(Link *link);
228+
int link_handle_bound_to_list(Link *link);
230229

231230
int link_enter_join_netdev(Link *link);
232231
void link_enter_failed(Link *link);

src/network/networkd-queue.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
static void request_free_object(RequestType type, void *object) {
1717
switch(type) {
18+
case REQUEST_TYPE_ACTIVATE_LINK:
19+
break;
1820
case REQUEST_TYPE_ADDRESS:
1921
address_free(object);
2022
break;
@@ -89,6 +91,8 @@ static void request_hash_func(const Request *req, struct siphash *state) {
8991
siphash24_compress(&req->type, sizeof(req->type), state);
9092

9193
switch(req->type) {
94+
case REQUEST_TYPE_ACTIVATE_LINK:
95+
break;
9296
case REQUEST_TYPE_ADDRESS:
9397
address_hash_func(req->address, state);
9498
break;
@@ -143,6 +147,8 @@ static int request_compare_func(const struct Request *a, const struct Request *b
143147
return r;
144148

145149
switch (a->type) {
150+
case REQUEST_TYPE_ACTIVATE_LINK:
151+
return 0;
146152
case REQUEST_TYPE_ADDRESS:
147153
return address_compare_func(a->address, b->address);
148154
case REQUEST_TYPE_ADDRESS_LABEL:
@@ -192,7 +198,11 @@ int link_queue_request(
192198
assert(link);
193199
assert(link->manager);
194200
assert(type >= 0 && type < _REQUEST_TYPE_MAX);
195-
assert(IN_SET(type, REQUEST_TYPE_DHCP_SERVER, REQUEST_TYPE_SET_LINK) || object);
201+
assert(IN_SET(type,
202+
REQUEST_TYPE_ACTIVATE_LINK,
203+
REQUEST_TYPE_DHCP_SERVER,
204+
REQUEST_TYPE_SET_LINK) ||
205+
object);
196206
assert(type == REQUEST_TYPE_DHCP_SERVER || netlink_handler);
197207

198208
req = new(Request, 1);
@@ -247,6 +257,9 @@ int manager_process_requests(sd_event_source *s, void *userdata) {
247257

248258
ORDERED_SET_FOREACH(req, manager->request_queue) {
249259
switch(req->type) {
260+
case REQUEST_TYPE_ACTIVATE_LINK:
261+
r = request_process_activation(req);
262+
break;
250263
case REQUEST_TYPE_ADDRESS:
251264
r = request_process_address(req);
252265
break;

src/network/networkd-queue.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ typedef int (*request_after_configure_handler_t)(Request*, void*);
2222
typedef void (*request_on_free_handler_t)(Request*);
2323

2424
typedef enum RequestType {
25+
REQUEST_TYPE_ACTIVATE_LINK,
2526
REQUEST_TYPE_ADDRESS,
2627
REQUEST_TYPE_ADDRESS_LABEL,
2728
REQUEST_TYPE_BRIDGE_FDB,

0 commit comments

Comments
 (0)