1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 /* Make sure the net/if.h header is included before any linux/ one */
6 #include <linux/nl80211.h>
7 #include <linux/veth.h>
11 #include "sd-device.h"
13 #include "sd-netlink.h"
15 #include "alloc-util.h"
16 #include "device-private.h"
17 #include "device-util.h"
18 #include "ether-addr-util.h"
20 #include "hexdecoct.h"
21 #include "lock-util.h"
22 #include "missing_network.h"
24 #include "mount-util.h"
25 #include "namespace-util.h"
26 #include "netif-naming-scheme.h"
27 #include "netif-util.h"
28 #include "netlink-util.h"
29 #include "nspawn-network.h"
30 #include "parse-util.h"
31 #include "process-util.h"
32 #include "siphash24.h"
33 #include "socket-netlink.h"
34 #include "socket-util.h"
35 #include "stat-util.h"
36 #include "string-util.h"
38 #include "udev-util.h"
40 #define HOST_HASH_KEY SD_ID128_MAKE(1a,37,6f,c7,46,ec,45,0b,ad,a3,d5,31,06,60,5d,b1)
41 #define CONTAINER_HASH_KEY SD_ID128_MAKE(c3,c4,f9,19,b5,57,b2,1c,e6,cf,14,27,03,9c,ee,a2)
42 #define VETH_EXTRA_HOST_HASH_KEY SD_ID128_MAKE(48,c7,f6,b7,ea,9d,4c,9e,b7,28,d4,de,91,d5,bf,66)
43 #define VETH_EXTRA_CONTAINER_HASH_KEY SD_ID128_MAKE(af,50,17,61,ce,f9,4d,35,84,0d,2b,20,54,be,ce,59)
44 #define MACVLAN_HASH_KEY SD_ID128_MAKE(00,13,6d,bc,66,83,44,81,bb,0c,f9,51,1f,24,a6,6f)
46 static int remove_one_link(sd_netlink
*rtnl
, const char *name
) {
47 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*m
= NULL
;
53 r
= sd_rtnl_message_new_link(rtnl
, &m
, RTM_DELLINK
, 0);
55 return log_error_errno(r
, "Failed to allocate netlink message: %m");
57 r
= sd_netlink_message_append_string(m
, IFLA_IFNAME
, name
);
59 return log_error_errno(r
, "Failed to add netlink interface name: %m");
61 r
= sd_netlink_call(rtnl
, m
, 0, NULL
);
62 if (r
== -ENODEV
) /* Already gone */
65 return log_error_errno(r
, "Failed to remove interface %s: %m", name
);
70 static int set_alternative_ifname(sd_netlink
*rtnl
, const char *ifname
, const char *altifname
) {
79 if (strlen(altifname
) >= ALTIFNAMSIZ
)
80 return log_warning_errno(SYNTHETIC_ERRNO(ERANGE
),
81 "Alternative interface name '%s' for '%s' is too long, ignoring",
84 r
= rtnl_set_link_alternative_names_by_ifname(&rtnl
, ifname
, STRV_MAKE(altifname
));
86 return log_warning_errno(r
,
87 "Failed to set alternative interface name '%s' to '%s', ignoring: %m",
96 const char *ifname_host
,
97 const char *altifname_host
,
98 const struct ether_addr
*mac_host
,
99 const char *ifname_container
,
100 const struct ether_addr
*mac_container
) {
102 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*m
= NULL
;
108 assert(ifname_container
);
109 assert(mac_container
);
111 r
= sd_rtnl_message_new_link(rtnl
, &m
, RTM_NEWLINK
, 0);
113 return log_error_errno(r
, "Failed to allocate netlink message: %m");
115 r
= sd_netlink_message_append_string(m
, IFLA_IFNAME
, ifname_host
);
117 return log_error_errno(r
, "Failed to add netlink interface name: %m");
119 r
= sd_netlink_message_append_ether_addr(m
, IFLA_ADDRESS
, mac_host
);
121 return log_error_errno(r
, "Failed to add netlink MAC address: %m");
123 r
= sd_netlink_message_open_container(m
, IFLA_LINKINFO
);
125 return log_error_errno(r
, "Failed to open netlink container: %m");
127 r
= sd_netlink_message_open_container_union(m
, IFLA_INFO_DATA
, "veth");
129 return log_error_errno(r
, "Failed to open netlink container: %m");
131 r
= sd_netlink_message_open_container(m
, VETH_INFO_PEER
);
133 return log_error_errno(r
, "Failed to open netlink container: %m");
135 r
= sd_netlink_message_append_string(m
, IFLA_IFNAME
, ifname_container
);
137 return log_error_errno(r
, "Failed to add netlink interface name: %m");
139 r
= sd_netlink_message_append_ether_addr(m
, IFLA_ADDRESS
, mac_container
);
141 return log_error_errno(r
, "Failed to add netlink MAC address: %m");
143 r
= sd_netlink_message_append_u32(m
, IFLA_NET_NS_PID
, pid
);
145 return log_error_errno(r
, "Failed to add netlink namespace field: %m");
147 r
= sd_netlink_message_close_container(m
);
149 return log_error_errno(r
, "Failed to close netlink container: %m");
151 r
= sd_netlink_message_close_container(m
);
153 return log_error_errno(r
, "Failed to close netlink container: %m");
155 r
= sd_netlink_message_close_container(m
);
157 return log_error_errno(r
, "Failed to close netlink container: %m");
159 r
= sd_netlink_call(rtnl
, m
, 0, NULL
);
161 return log_error_errno(r
, "Failed to add new veth interfaces (%s:%s): %m", ifname_host
, ifname_container
);
163 (void) set_alternative_ifname(rtnl
, ifname_host
, altifname_host
);
168 int setup_veth(const char *machine_name
,
170 char iface_name
[IFNAMSIZ
],
172 const struct ether_addr
*provided_mac
) {
174 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
;
175 struct ether_addr mac_host
, mac_container
;
180 assert(machine_name
);
184 /* Use two different interface name prefixes depending whether
185 * we are in bridge mode or not. */
186 n
= strjoina(bridge
? "vb-" : "ve-", machine_name
);
187 r
= net_shorten_ifname(n
, /* check_naming_scheme= */ true);
189 a
= strjoina(bridge
? "vb-" : "ve-", machine_name
);
191 if (ether_addr_is_null(provided_mac
)){
192 r
= net_generate_mac(machine_name
, &mac_container
, CONTAINER_HASH_KEY
, 0);
194 return log_error_errno(r
, "Failed to generate predictable MAC address for container side: %m");
196 mac_container
= *provided_mac
;
198 r
= net_generate_mac(machine_name
, &mac_host
, HOST_HASH_KEY
, 0);
200 return log_error_errno(r
, "Failed to generate predictable MAC address for host side: %m");
202 r
= sd_netlink_open(&rtnl
);
204 return log_error_errno(r
, "Failed to connect to netlink: %m");
206 r
= add_veth(rtnl
, pid
, n
, a
, &mac_host
, "host0", &mac_container
);
210 u
= if_nametoindex(n
); /* We don't need to use rtnl_resolve_ifname() here because the
211 * name we assigned is always the main name. */
213 return log_error_errno(errno
, "Failed to resolve interface %s: %m", n
);
215 strcpy(iface_name
, n
);
219 int setup_veth_extra(
220 const char *machine_name
,
224 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
;
228 assert(machine_name
);
231 if (strv_isempty(pairs
))
234 r
= sd_netlink_open(&rtnl
);
236 return log_error_errno(r
, "Failed to connect to netlink: %m");
238 STRV_FOREACH_PAIR(a
, b
, pairs
) {
239 struct ether_addr mac_host
, mac_container
;
241 r
= net_generate_mac(machine_name
, &mac_container
, VETH_EXTRA_CONTAINER_HASH_KEY
, idx
);
243 return log_error_errno(r
, "Failed to generate predictable MAC address for container side of extra veth link: %m");
245 r
= net_generate_mac(machine_name
, &mac_host
, VETH_EXTRA_HOST_HASH_KEY
, idx
);
247 return log_error_errno(r
, "Failed to generate predictable MAC address for host side of extra veth link: %m");
249 r
= add_veth(rtnl
, pid
, *a
, NULL
, &mac_host
, *b
, &mac_container
);
259 static int join_bridge(sd_netlink
*rtnl
, const char *veth_name
, const char *bridge_name
) {
260 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*m
= NULL
;
267 bridge_ifi
= rtnl_resolve_interface(&rtnl
, bridge_name
);
271 r
= sd_rtnl_message_new_link(rtnl
, &m
, RTM_SETLINK
, 0);
275 r
= sd_rtnl_message_link_set_flags(m
, IFF_UP
, IFF_UP
);
279 r
= sd_netlink_message_append_string(m
, IFLA_IFNAME
, veth_name
);
283 r
= sd_netlink_message_append_u32(m
, IFLA_MASTER
, bridge_ifi
);
287 r
= sd_netlink_call(rtnl
, m
, 0, NULL
);
294 static int create_bridge(sd_netlink
*rtnl
, const char *bridge_name
) {
295 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*m
= NULL
;
298 r
= sd_rtnl_message_new_link(rtnl
, &m
, RTM_NEWLINK
, 0);
302 r
= sd_netlink_message_append_string(m
, IFLA_IFNAME
, bridge_name
);
306 r
= sd_netlink_message_open_container(m
, IFLA_LINKINFO
);
310 r
= sd_netlink_message_open_container_union(m
, IFLA_INFO_DATA
, "bridge");
314 r
= sd_netlink_message_close_container(m
);
318 r
= sd_netlink_message_close_container(m
);
322 r
= sd_netlink_call(rtnl
, m
, 0, NULL
);
329 int setup_bridge(const char *veth_name
, const char *bridge_name
, bool create
) {
330 _cleanup_(release_lock_file
) LockFile bridge_lock
= LOCK_FILE_INIT
;
331 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
;
338 r
= sd_netlink_open(&rtnl
);
340 return log_error_errno(r
, "Failed to connect to netlink: %m");
343 /* We take a system-wide lock here, so that we can safely check whether there's still a member in the
344 * bridge before removing it, without risking interference from other nspawn instances. */
346 r
= make_lock_file("/run/systemd/nspawn-network-zone", LOCK_EX
, &bridge_lock
);
348 return log_error_errno(r
, "Failed to take network zone lock: %m");
352 bridge_ifi
= join_bridge(rtnl
, veth_name
, bridge_name
);
355 if (bridge_ifi
!= -ENODEV
|| !create
|| n
> 10)
356 return log_error_errno(bridge_ifi
, "Failed to add interface %s to bridge %s: %m", veth_name
, bridge_name
);
358 /* Count attempts, so that we don't enter an endless loop here. */
361 /* The bridge doesn't exist yet. Let's create it */
362 r
= create_bridge(rtnl
, bridge_name
);
364 return log_error_errno(r
, "Failed to create bridge interface %s: %m", bridge_name
);
366 /* Try again, now that the bridge exists */
370 int remove_bridge(const char *bridge_name
) {
371 _cleanup_(release_lock_file
) LockFile bridge_lock
= LOCK_FILE_INIT
;
372 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
;
376 /* Removes the specified bridge, but only if it is currently empty */
378 if (isempty(bridge_name
))
381 r
= make_lock_file("/run/systemd/nspawn-network-zone", LOCK_EX
, &bridge_lock
);
383 return log_error_errno(r
, "Failed to take network zone lock: %m");
385 path
= strjoina("/sys/class/net/", bridge_name
, "/brif");
387 r
= dir_is_empty(path
, /* ignore_hidden_or_backup= */ false);
388 if (r
== -ENOENT
) /* Already gone? */
391 return log_error_errno(r
, "Can't detect if bridge %s is empty: %m", bridge_name
);
392 if (r
== 0) /* Still populated, leave it around */
395 r
= sd_netlink_open(&rtnl
);
397 return log_error_errno(r
, "Failed to connect to netlink: %m");
399 return remove_one_link(rtnl
, bridge_name
);
402 static int test_network_interface_initialized(const char *name
) {
403 _cleanup_(sd_device_unrefp
) sd_device
*d
= NULL
;
406 if (!udev_available())
409 /* udev should be around. */
411 r
= sd_device_new_from_ifname(&d
, name
);
413 return log_error_errno(r
, "Failed to get device %s: %m", name
);
415 r
= device_is_processed(d
);
417 return log_error_errno(r
, "Failed to determine whether interface %s is initialized: %m", name
);
419 return log_error_errno(SYNTHETIC_ERRNO(EBUSY
), "Network interface %s is not initialized yet.", name
);
421 r
= device_is_renaming(d
);
423 return log_error_errno(r
, "Failed to determine the interface %s is being renamed: %m", name
);
425 return log_error_errno(SYNTHETIC_ERRNO(EBUSY
), "Interface %s is being renamed.", name
);
430 int test_network_interfaces_initialized(char **iface_pairs
) {
432 STRV_FOREACH_PAIR(a
, b
, iface_pairs
) {
433 r
= test_network_interface_initialized(*a
);
440 int resolve_network_interface_names(char **iface_pairs
) {
441 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
;
444 /* Due to a bug in kernel fixed by 8e15aee621618a3ee3abecaf1fd8c1428098b7ef (v6.6, backported to
445 * 6.1.60 and 6.5.9), an interface with alternative names cannot be resolved by the alternative name
446 * if the interface is moved to another network namespace. Hence, we need to adjust the provided
447 * names before moving interfaces to container namespace. */
449 STRV_FOREACH_PAIR(from
, to
, iface_pairs
) {
450 _cleanup_free_
char *name
= NULL
;
451 _cleanup_strv_free_
char **altnames
= NULL
;
453 r
= rtnl_resolve_ifname_full(&rtnl
, _RESOLVE_IFNAME_ALL
, *from
, &name
, &altnames
);
457 /* Always use the resolved name for 'from'. */
458 free_and_replace(*from
, name
);
460 /* If the name 'to' is assigned as an alternative name, we cannot rename the interface.
461 * Hence, use the assigned interface name (including the alternative names) as is, and
462 * use the resolved name for 'to'. */
463 if (strv_contains(altnames
, *to
)) {
464 r
= free_and_strdup_warn(to
, *from
);
472 static int netns_child_begin(int netns_fd
, int *ret_original_netns_fd
) {
473 _cleanup_close_
int original_netns_fd
= -EBADF
;
476 assert(netns_fd
>= 0);
478 if (ret_original_netns_fd
) {
479 r
= namespace_open(0,
480 /* ret_pidns_fd = */ NULL
,
481 /* ret_mntns_fd = */ NULL
,
483 /* ret_userns_fd = */ NULL
,
484 /* ret_root_fd = */ NULL
);
486 return log_error_errno(r
, "Failed to open original network namespace: %m");
489 r
= namespace_enter(/* pidns_fd = */ -EBADF
,
490 /* mntns_fd = */ -EBADF
,
492 /* userns_fd = */ -EBADF
,
493 /* root_fd = */ -EBADF
);
495 return log_error_errno(r
, "Failed to enter child network namespace: %m");
497 r
= umount_recursive("/sys/", /* flags = */ 0);
499 log_debug_errno(r
, "Failed to unmount directories below /sys/, ignoring: %m");
501 (void) mkdir_p("/sys/", 0755);
503 /* Populate new sysfs instance associated with the client netns, to make sd_device usable. */
504 r
= mount_nofollow_verbose(LOG_ERR
, "sysfs", "/sys/", "sysfs",
505 MS_RDONLY
|MS_NOSUID
|MS_NOEXEC
|MS_NODEV
, /* opts = */ NULL
);
507 return log_error_errno(r
, "Failed to mount sysfs on /sys/: %m");
509 /* udev_avaliable() might be called previously and the result may be cached.
510 * Now, we (re-)mount sysfs. Hence, we need to reset the cache. */
511 reset_cached_udev_availability();
513 if (ret_original_netns_fd
)
514 *ret_original_netns_fd
= TAKE_FD(original_netns_fd
);
519 static int netns_fork_and_wait(int netns_fd
, int *ret_original_netns_fd
) {
522 assert(netns_fd
>= 0);
524 r
= safe_fork("(sd-netns)", FORK_RESET_SIGNALS
|FORK_DEATHSIG_SIGTERM
|FORK_WAIT
|FORK_LOG
|FORK_NEW_MOUNTNS
|FORK_MOUNTNS_SLAVE
, NULL
);
526 return log_error_errno(r
, "Failed to fork process (sd-netns): %m");
528 if (netns_child_begin(netns_fd
, ret_original_netns_fd
) < 0)
534 if (ret_original_netns_fd
)
535 *ret_original_netns_fd
= -EBADF
;
540 static int move_wlan_interface_impl(sd_netlink
**genl
, int netns_fd
, sd_device
*dev
) {
541 _cleanup_(sd_netlink_unrefp
) sd_netlink
*our_genl
= NULL
;
542 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*m
= NULL
;
545 assert(netns_fd
>= 0);
551 r
= sd_genl_socket_open(genl
);
553 return log_error_errno(r
, "Failed to connect to generic netlink: %m");
556 r
= sd_genl_message_new(*genl
, NL80211_GENL_NAME
, NL80211_CMD_SET_WIPHY_NETNS
, &m
);
558 return log_device_error_errno(dev
, r
, "Failed to allocate netlink message: %m");
561 r
= device_get_sysattr_u32(dev
, "phy80211/index", &phy_index
);
563 return log_device_error_errno(dev
, r
, "Failed to get phy index: %m");
565 r
= sd_netlink_message_append_u32(m
, NL80211_ATTR_WIPHY
, phy_index
);
567 return log_device_error_errno(dev
, r
, "Failed to append phy index to netlink message: %m");
569 r
= sd_netlink_message_append_u32(m
, NL80211_ATTR_NETNS_FD
, netns_fd
);
571 return log_device_error_errno(dev
, r
, "Failed to append namespace fd to netlink message: %m");
573 r
= sd_netlink_call(*genl
, m
, 0, NULL
);
575 return log_device_error_errno(dev
, r
, "Failed to move interface to namespace: %m");
580 static int move_wlan_interface_one(
592 assert(temp_netns_fd
);
593 assert(netns_fd
>= 0);
597 return move_wlan_interface_impl(genl
, netns_fd
, dev
);
599 /* The command NL80211_CMD_SET_WIPHY_NETNS takes phy instead of network interface, and does not take
600 * an interface name in the passed network namespace. Hence, we need to move the phy and interface to
601 * a temporary network namespace, rename the interface in it, and move them to the requested netns. */
603 if (*temp_netns_fd
< 0) {
606 return log_error_errno(r
, "Failed to acquire new network namespace: %m");
610 r
= move_wlan_interface_impl(genl
, *temp_netns_fd
, dev
);
615 r
= sd_device_get_sysname(dev
, &sysname
);
617 return log_device_error_errno(dev
, r
, "Failed to get interface name: %m");
619 r
= netns_fork_and_wait(*temp_netns_fd
, NULL
);
621 return log_error_errno(r
, "Failed to fork process (nspawn-rename-wlan): %m");
623 _cleanup_(sd_device_unrefp
) sd_device
*temp_dev
= NULL
;
625 r
= rtnl_rename_link(NULL
, sysname
, name
);
627 log_error_errno(r
, "Failed to rename network interface '%s' to '%s': %m", sysname
, name
);
631 r
= sd_device_new_from_ifname(&temp_dev
, name
);
633 log_error_errno(r
, "Failed to acquire device '%s': %m", name
);
637 r
= move_wlan_interface_impl(NULL
, netns_fd
, temp_dev
);
640 _exit(r
< 0 ? EXIT_FAILURE
: EXIT_SUCCESS
);
646 static int move_network_interface_one(sd_netlink
**rtnl
, int netns_fd
, sd_device
*dev
, const char *name
) {
647 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*m
= NULL
;
651 assert(netns_fd
>= 0);
655 r
= sd_netlink_open(rtnl
);
657 return log_error_errno(r
, "Failed to connect to rtnetlink: %m");
661 r
= sd_device_get_ifindex(dev
, &ifindex
);
663 return log_device_error_errno(dev
, r
, "Failed to get ifindex: %m");
665 r
= sd_rtnl_message_new_link(*rtnl
, &m
, RTM_SETLINK
, ifindex
);
667 return log_device_error_errno(dev
, r
, "Failed to allocate netlink message: %m");
669 r
= sd_netlink_message_append_u32(m
, IFLA_NET_NS_FD
, netns_fd
);
671 return log_device_error_errno(dev
, r
, "Failed to append namespace fd to netlink message: %m");
674 r
= sd_netlink_message_append_string(m
, IFLA_IFNAME
, name
);
676 return log_device_error_errno(dev
, r
, "Failed to add netlink interface name: %m");
679 r
= sd_netlink_call(*rtnl
, m
, 0, NULL
);
681 return log_device_error_errno(dev
, r
, "Failed to move interface to namespace: %m");
686 int move_network_interfaces(int netns_fd
, char **iface_pairs
) {
687 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
, *genl
= NULL
;
688 _cleanup_close_
int temp_netns_fd
= -EBADF
;
691 assert(netns_fd
>= 0);
693 if (strv_isempty(iface_pairs
))
696 STRV_FOREACH_PAIR(from
, to
, iface_pairs
) {
697 _cleanup_(sd_device_unrefp
) sd_device
*dev
= NULL
;
700 name
= streq(*from
, *to
) ? NULL
: *to
;
702 r
= sd_device_new_from_ifname(&dev
, *from
);
704 return log_error_errno(r
, "Unknown interface name %s: %m", *from
);
706 if (device_is_devtype(dev
, "wlan"))
707 r
= move_wlan_interface_one(&rtnl
, &genl
, &temp_netns_fd
, netns_fd
, dev
, name
);
709 r
= move_network_interface_one(&rtnl
, netns_fd
, dev
, name
);
717 int move_back_network_interfaces(int child_netns_fd
, char **interface_pairs
) {
718 _cleanup_close_
int parent_netns_fd
= -EBADF
;
721 assert(child_netns_fd
>= 0);
723 if (strv_isempty(interface_pairs
))
726 r
= netns_fork_and_wait(child_netns_fd
, &parent_netns_fd
);
730 /* Reverse network interfaces pair list so that interfaces get their initial name back.
731 * This is about ensuring interfaces get their old name back when being moved back. */
732 interface_pairs
= strv_reverse(interface_pairs
);
734 r
= move_network_interfaces(parent_netns_fd
, interface_pairs
);
735 _exit(r
< 0 ? EXIT_FAILURE
: EXIT_SUCCESS
);
741 int setup_macvlan(const char *machine_name
, pid_t pid
, char **iface_pairs
) {
742 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
;
746 if (strv_isempty(iface_pairs
))
749 r
= sd_netlink_open(&rtnl
);
751 return log_error_errno(r
, "Failed to connect to netlink: %m");
753 STRV_FOREACH_PAIR(i
, b
, iface_pairs
) {
754 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*m
= NULL
;
755 _cleanup_free_
char *n
= NULL
;
757 struct ether_addr mac
;
759 ifi
= rtnl_resolve_interface_or_warn(&rtnl
, *i
);
763 r
= net_generate_mac(machine_name
, &mac
, MACVLAN_HASH_KEY
, idx
++);
765 return log_error_errno(r
, "Failed to create MACVLAN MAC address: %m");
767 r
= sd_rtnl_message_new_link(rtnl
, &m
, RTM_NEWLINK
, 0);
769 return log_error_errno(r
, "Failed to allocate netlink message: %m");
771 r
= sd_netlink_message_append_u32(m
, IFLA_LINK
, ifi
);
773 return log_error_errno(r
, "Failed to add netlink interface index: %m");
779 shortened
= net_shorten_ifname(n
, /* check_naming_scheme= */ true);
781 r
= sd_netlink_message_append_string(m
, IFLA_IFNAME
, n
);
783 return log_error_errno(r
, "Failed to add netlink interface name: %m");
785 r
= sd_netlink_message_append_ether_addr(m
, IFLA_ADDRESS
, &mac
);
787 return log_error_errno(r
, "Failed to add netlink MAC address: %m");
789 r
= sd_netlink_message_append_u32(m
, IFLA_NET_NS_PID
, pid
);
791 return log_error_errno(r
, "Failed to add netlink namespace field: %m");
793 r
= sd_netlink_message_open_container(m
, IFLA_LINKINFO
);
795 return log_error_errno(r
, "Failed to open netlink container: %m");
797 r
= sd_netlink_message_open_container_union(m
, IFLA_INFO_DATA
, "macvlan");
799 return log_error_errno(r
, "Failed to open netlink container: %m");
801 r
= sd_netlink_message_append_u32(m
, IFLA_MACVLAN_MODE
, MACVLAN_MODE_BRIDGE
);
803 return log_error_errno(r
, "Failed to append macvlan mode: %m");
805 r
= sd_netlink_message_close_container(m
);
807 return log_error_errno(r
, "Failed to close netlink container: %m");
809 r
= sd_netlink_message_close_container(m
);
811 return log_error_errno(r
, "Failed to close netlink container: %m");
813 r
= sd_netlink_call(rtnl
, m
, 0, NULL
);
815 return log_error_errno(r
, "Failed to add new macvlan interfaces: %m");
818 (void) set_alternative_ifname(rtnl
, n
, *b
);
824 static int remove_macvlan_impl(char **interface_pairs
) {
825 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
;
828 assert(interface_pairs
);
830 r
= sd_netlink_open(&rtnl
);
832 return log_error_errno(r
, "Failed to connect to netlink: %m");
834 STRV_FOREACH_PAIR(a
, b
, interface_pairs
) {
835 _cleanup_free_
char *n
= NULL
;
841 (void) net_shorten_ifname(n
, /* check_naming_scheme= */ true);
843 r
= remove_one_link(rtnl
, n
);
845 log_warning_errno(r
, "Failed to remove macvlan interface %s, ignoring: %m", n
);
851 int remove_macvlan(int child_netns_fd
, char **interface_pairs
) {
852 _cleanup_close_
int parent_netns_fd
= -EBADF
;
855 /* In some cases the kernel might pin the macvlan links on the container even after the namespace
856 * died. Hence, let's better remove them explicitly too. See issue #680. */
858 assert(child_netns_fd
>= 0);
860 if (strv_isempty(interface_pairs
))
863 r
= netns_fork_and_wait(child_netns_fd
, &parent_netns_fd
);
867 r
= remove_macvlan_impl(interface_pairs
);
868 _exit(r
< 0 ? EXIT_FAILURE
: EXIT_SUCCESS
);
874 int setup_ipvlan(const char *machine_name
, pid_t pid
, char **iface_pairs
) {
875 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
;
878 if (strv_isempty(iface_pairs
))
881 r
= sd_netlink_open(&rtnl
);
883 return log_error_errno(r
, "Failed to connect to netlink: %m");
885 STRV_FOREACH_PAIR(i
, b
, iface_pairs
) {
886 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*m
= NULL
;
887 _cleanup_free_
char *n
= NULL
;
890 ifi
= rtnl_resolve_interface_or_warn(&rtnl
, *i
);
894 r
= sd_rtnl_message_new_link(rtnl
, &m
, RTM_NEWLINK
, 0);
896 return log_error_errno(r
, "Failed to allocate netlink message: %m");
898 r
= sd_netlink_message_append_u32(m
, IFLA_LINK
, ifi
);
900 return log_error_errno(r
, "Failed to add netlink interface index: %m");
906 shortened
= net_shorten_ifname(n
, /* check_naming_scheme= */ true);
908 r
= sd_netlink_message_append_string(m
, IFLA_IFNAME
, n
);
910 return log_error_errno(r
, "Failed to add netlink interface name: %m");
912 r
= sd_netlink_message_append_u32(m
, IFLA_NET_NS_PID
, pid
);
914 return log_error_errno(r
, "Failed to add netlink namespace field: %m");
916 r
= sd_netlink_message_open_container(m
, IFLA_LINKINFO
);
918 return log_error_errno(r
, "Failed to open netlink container: %m");
920 r
= sd_netlink_message_open_container_union(m
, IFLA_INFO_DATA
, "ipvlan");
922 return log_error_errno(r
, "Failed to open netlink container: %m");
924 r
= sd_netlink_message_append_u16(m
, IFLA_IPVLAN_MODE
, IPVLAN_MODE_L2
);
926 return log_error_errno(r
, "Failed to add ipvlan mode: %m");
928 r
= sd_netlink_message_close_container(m
);
930 return log_error_errno(r
, "Failed to close netlink container: %m");
932 r
= sd_netlink_message_close_container(m
);
934 return log_error_errno(r
, "Failed to close netlink container: %m");
936 r
= sd_netlink_call(rtnl
, m
, 0, NULL
);
938 return log_error_errno(r
, "Failed to add new ipvlan interfaces: %m");
941 (void) set_alternative_ifname(rtnl
, n
, *b
);
947 int veth_extra_parse(char ***l
, const char *p
) {
948 _cleanup_free_
char *a
= NULL
, *b
= NULL
;
951 r
= extract_first_word(&p
, &a
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
);
954 if (r
== 0 || !ifname_valid(a
))
957 r
= extract_first_word(&p
, &b
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
);
960 if (r
== 0 || !ifname_valid(b
)) {
961 r
= free_and_strdup(&b
, a
);
969 r
= strv_push_pair(l
, a
, b
);
977 int remove_veth_links(const char *primary
, char **pairs
) {
978 _cleanup_(sd_netlink_unrefp
) sd_netlink
*rtnl
= NULL
;
981 /* In some cases the kernel might pin the veth links between host and container even after the namespace
982 * died. Hence, let's better remove them explicitly too. */
984 if (isempty(primary
) && strv_isempty(pairs
))
987 r
= sd_netlink_open(&rtnl
);
989 return log_error_errno(r
, "Failed to connect to netlink: %m");
991 remove_one_link(rtnl
, primary
);
993 STRV_FOREACH_PAIR(a
, b
, pairs
)
994 remove_one_link(rtnl
, *a
);
999 static int network_iface_pair_parse(const char* iftype
, char ***l
, const char *p
, const char* ifprefix
) {
1003 _cleanup_free_
char *word
= NULL
, *a
= NULL
, *b
= NULL
;
1004 const char *interface
;
1006 r
= extract_first_word(&p
, &word
, NULL
, 0);
1008 return log_error_errno(r
, "Failed to parse interface name: %m");
1013 r
= extract_first_word(&interface
, &a
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
);
1015 return log_error_errno(r
, "Failed to extract first word in %s parameter: %m", iftype
);
1017 return log_error_errno(SYNTHETIC_ERRNO(EINVAL
),
1018 "Short read while reading %s parameter: %m", iftype
);
1019 if (!ifname_valid(a
))
1020 return log_error_errno(SYNTHETIC_ERRNO(EINVAL
),
1021 "%s, interface name not valid: %s", iftype
, a
);
1023 /* Here, we only check the validity of the specified second name. If it is not specified,
1024 * the copied or prefixed name should be already valid, except for its length. If it is too
1025 * long, then it will be shortened later. */
1026 if (!isempty(interface
)) {
1027 if (!ifname_valid(interface
))
1028 return log_error_errno(SYNTHETIC_ERRNO(EINVAL
),
1029 "%s, interface name not valid: %s", iftype
, interface
);
1031 b
= strdup(interface
);
1032 } else if (ifprefix
)
1033 b
= strjoin(ifprefix
, a
);
1039 r
= strv_consume_pair(l
, TAKE_PTR(a
), TAKE_PTR(b
));
1047 int interface_pair_parse(char ***l
, const char *p
) {
1048 return network_iface_pair_parse("Network interface", l
, p
, NULL
);
1051 int macvlan_pair_parse(char ***l
, const char *p
) {
1052 return network_iface_pair_parse("MACVLAN network interface", l
, p
, "mv-");
1055 int ipvlan_pair_parse(char ***l
, const char *p
) {
1056 return network_iface_pair_parse("IPVLAN network interface", l
, p
, "iv-");