Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : :
3 : : #include "sd-netlink.h"
4 : :
5 : : #include "netlink-internal.h"
6 : : #include "netlink-util.h"
7 : :
8 : 0 : int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name) {
9 : 0 : _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL;
10 : : int r;
11 : :
12 [ # # ]: 0 : assert(rtnl);
13 [ # # ]: 0 : assert(ifindex > 0);
14 [ # # ]: 0 : assert(name);
15 : :
16 [ # # ]: 0 : if (!ifname_valid(name))
17 : 0 : return -EINVAL;
18 : :
19 [ # # ]: 0 : if (!*rtnl) {
20 : 0 : r = sd_netlink_open(rtnl);
21 [ # # ]: 0 : if (r < 0)
22 : 0 : return r;
23 : : }
24 : :
25 : 0 : r = sd_rtnl_message_new_link(*rtnl, &message, RTM_SETLINK, ifindex);
26 [ # # ]: 0 : if (r < 0)
27 : 0 : return r;
28 : :
29 : 0 : r = sd_netlink_message_append_string(message, IFLA_IFNAME, name);
30 [ # # ]: 0 : if (r < 0)
31 : 0 : return r;
32 : :
33 : 0 : r = sd_netlink_call(*rtnl, message, 0, NULL);
34 [ # # ]: 0 : if (r < 0)
35 : 0 : return r;
36 : :
37 : 0 : return 0;
38 : : }
39 : :
40 : 0 : int rtnl_set_link_properties(sd_netlink **rtnl, int ifindex, const char *alias,
41 : : const struct ether_addr *mac, uint32_t mtu) {
42 : 0 : _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL;
43 : : int r;
44 : :
45 [ # # ]: 0 : assert(rtnl);
46 [ # # ]: 0 : assert(ifindex > 0);
47 : :
48 [ # # # # : 0 : if (!alias && !mac && mtu == 0)
# # ]
49 : 0 : return 0;
50 : :
51 [ # # ]: 0 : if (!*rtnl) {
52 : 0 : r = sd_netlink_open(rtnl);
53 [ # # ]: 0 : if (r < 0)
54 : 0 : return r;
55 : : }
56 : :
57 : 0 : r = sd_rtnl_message_new_link(*rtnl, &message, RTM_SETLINK, ifindex);
58 [ # # ]: 0 : if (r < 0)
59 : 0 : return r;
60 : :
61 [ # # ]: 0 : if (alias) {
62 : 0 : r = sd_netlink_message_append_string(message, IFLA_IFALIAS, alias);
63 [ # # ]: 0 : if (r < 0)
64 : 0 : return r;
65 : : }
66 : :
67 [ # # ]: 0 : if (mac) {
68 : 0 : r = sd_netlink_message_append_ether_addr(message, IFLA_ADDRESS, mac);
69 [ # # ]: 0 : if (r < 0)
70 : 0 : return r;
71 : : }
72 : :
73 [ # # ]: 0 : if (mtu != 0) {
74 : 0 : r = sd_netlink_message_append_u32(message, IFLA_MTU, mtu);
75 [ # # ]: 0 : if (r < 0)
76 : 0 : return r;
77 : : }
78 : :
79 : 0 : r = sd_netlink_call(*rtnl, message, 0, NULL);
80 [ # # ]: 0 : if (r < 0)
81 : 0 : return r;
82 : :
83 : 0 : return 0;
84 : : }
85 : :
86 : 4 : int rtnl_message_new_synthetic_error(sd_netlink *rtnl, int error, uint32_t serial, sd_netlink_message **ret) {
87 : : struct nlmsgerr *err;
88 : : int r;
89 : :
90 [ - + ]: 4 : assert(error <= 0);
91 : :
92 : 4 : r = message_new(rtnl, ret, NLMSG_ERROR);
93 [ - + ]: 4 : if (r < 0)
94 : 0 : return r;
95 : :
96 : 4 : (*ret)->hdr->nlmsg_seq = serial;
97 : :
98 : 4 : err = NLMSG_DATA((*ret)->hdr);
99 : :
100 : 4 : err->error = error;
101 : :
102 : 4 : return 0;
103 : : }
104 : :
105 : 0 : int rtnl_log_parse_error(int r) {
106 [ # # ]: 0 : return log_error_errno(r, "Failed to parse netlink message: %m");
107 : : }
108 : :
109 : 0 : int rtnl_log_create_error(int r) {
110 [ # # ]: 0 : return log_error_errno(r, "Failed to create netlink message: %m");
111 : : }
|