1 /* SPDX-License-Identifier: LGPL-2.1-or-later
2 * Copyright © 2020 VMware, Inc. */
4 #include "netlink-util.h"
5 #include "networkd-link.h"
6 #include "networkd-manager.h"
7 #include "networkd-sriov.h"
9 static int sr_iov_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, Link
*link
) {
13 assert(link
->sr_iov_messages
> 0);
14 link
->sr_iov_messages
--;
16 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
19 r
= sd_netlink_message_get_errno(m
);
20 if (r
< 0 && r
!= -EEXIST
) {
21 log_link_message_error_errno(link
, m
, r
, "Could not set up SR-IOV");
22 link_enter_failed(link
);
26 if (link
->sr_iov_messages
== 0) {
27 log_link_debug(link
, "SR-IOV configured");
28 link
->sr_iov_configured
= true;
29 link_check_ready(link
);
35 static int sr_iov_configure(Link
*link
, SRIOV
*sr_iov
) {
36 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
;
40 assert(link
->manager
);
41 assert(link
->manager
->rtnl
);
42 assert(link
->ifindex
> 0);
44 log_link_debug(link
, "Setting SR-IOV virtual function %"PRIu32
, sr_iov
->vf
);
46 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
50 r
= sr_iov_set_netlink_message(sr_iov
, req
);
54 r
= netlink_call_async(link
->manager
->rtnl
, NULL
, req
, sr_iov_handler
,
55 link_netlink_destroy_callback
, link
);
60 link
->sr_iov_messages
++;
65 int link_configure_sr_iov(Link
*link
) {
70 assert(link
->network
);
72 if (link
->sr_iov_messages
!= 0) {
73 log_link_debug(link
, "SR-IOV is configuring.");
77 link
->sr_iov_configured
= false;
79 ORDERED_HASHMAP_FOREACH(sr_iov
, link
->network
->sr_iov_by_section
) {
80 r
= sr_iov_configure(link
, sr_iov
);
82 return log_link_warning_errno(link
, r
,
83 "Failed to configure SR-IOV virtual function %"PRIu32
": %m",
87 if (link
->sr_iov_messages
== 0)
88 link
->sr_iov_configured
= true;
90 log_link_debug(link
, "Configuring SR-IOV");