aboutsummaryrefslogtreecommitdiffstats
path: root/executor/common_linux.h
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2022-09-08 15:45:47 +0200
committerDmitry Vyukov <dvyukov@google.com>2022-09-09 12:14:52 +0200
commita29cf5afb0f318fae8b15230623d70549a8c5a8c (patch)
treefd6d460c6571f8f51f934d5c696cc45028ca72e3 /executor/common_linux.h
parentf30274687d34e8d50307008f4c9989eaef077696 (diff)
executor: fix setup of xfrm device
XFRM device creation will fail w/o IFLA_XFRM_IF_ID attribute: https://elixir.bootlin.com/linux/v6.0-rc4/source/net/xfrm/xfrm_interface.c#L648 Add this attribute. This ID is also present in descriptions in at least 2 places. In one we got it wrong, it's not ifindex (easy to confuse because of the name). Fix it as well.
Diffstat (limited to 'executor/common_linux.h')
-rw-r--r--executor/common_linux.h41
1 files changed, 29 insertions, 12 deletions
diff --git a/executor/common_linux.h b/executor/common_linux.h
index bf8db5502..6ab9265d1 100644
--- a/executor/common_linux.h
+++ b/executor/common_linux.h
@@ -283,10 +283,12 @@ static int netlink_next_msg(struct nlmsg* nlmsg, unsigned int offset,
#if SYZ_EXECUTOR || SYZ_NET_DEVICES || SYZ_802154
static void netlink_add_device_impl(struct nlmsg* nlmsg, const char* type,
- const char* name)
+ const char* name, bool up)
{
struct ifinfomsg hdr;
memset(&hdr, 0, sizeof(hdr));
+ if (up)
+ hdr.ifi_flags = hdr.ifi_change = IFF_UP;
netlink_init(nlmsg, RTM_NEWLINK, NLM_F_EXCL | NLM_F_CREATE, &hdr, sizeof(hdr));
if (name)
netlink_attr(nlmsg, IFLA_IFNAME, name, strlen(name));
@@ -299,7 +301,7 @@ static void netlink_add_device_impl(struct nlmsg* nlmsg, const char* type,
static void netlink_add_device(struct nlmsg* nlmsg, int sock, const char* type,
const char* name)
{
- netlink_add_device_impl(nlmsg, type, name);
+ netlink_add_device_impl(nlmsg, type, name, false);
netlink_done(nlmsg);
int err = netlink_send(nlmsg, sock);
if (err < 0) {
@@ -310,7 +312,7 @@ static void netlink_add_device(struct nlmsg* nlmsg, int sock, const char* type,
static void netlink_add_veth(struct nlmsg* nlmsg, int sock, const char* name,
const char* peer)
{
- netlink_add_device_impl(nlmsg, "veth", name);
+ netlink_add_device_impl(nlmsg, "veth", name, false);
netlink_nest(nlmsg, IFLA_INFO_DATA);
netlink_nest(nlmsg, VETH_INFO_PEER);
nlmsg->pos += sizeof(struct ifinfomsg);
@@ -324,10 +326,24 @@ static void netlink_add_veth(struct nlmsg* nlmsg, int sock, const char* name,
}
}
+static void netlink_add_xfrm(struct nlmsg* nlmsg, int sock, const char* name)
+{
+ netlink_add_device_impl(nlmsg, "xfrm", name, true);
+ netlink_nest(nlmsg, IFLA_INFO_DATA);
+ int if_id = 1;
+ netlink_attr(nlmsg, IFLA_XFRM_IF_ID, &if_id, sizeof(if_id));
+ netlink_done(nlmsg);
+ netlink_done(nlmsg);
+ int err = netlink_send(nlmsg, sock);
+ if (err < 0) {
+ debug("netlink: adding device %s type xfrm if_id %d: %s\n", name, if_id, strerror(errno));
+ }
+}
+
static void netlink_add_hsr(struct nlmsg* nlmsg, int sock, const char* name,
const char* slave1, const char* slave2)
{
- netlink_add_device_impl(nlmsg, "hsr", name);
+ netlink_add_device_impl(nlmsg, "hsr", name, false);
netlink_nest(nlmsg, IFLA_INFO_DATA);
int ifindex1 = if_nametoindex(slave1);
netlink_attr(nlmsg, IFLA_HSR_SLAVE1, &ifindex1, sizeof(ifindex1));
@@ -337,13 +353,13 @@ static void netlink_add_hsr(struct nlmsg* nlmsg, int sock, const char* name,
netlink_done(nlmsg);
int err = netlink_send(nlmsg, sock);
if (err < 0) {
- debug("netlink: adding device %s type hsr slave1 %s slave2 %s: %s\n", name, slave1, slave2, strerror(err));
+ debug("netlink: adding device %s type hsr slave1 %s slave2 %s: %s\n", name, slave1, slave2, strerror(errno));
}
}
static void netlink_add_linked(struct nlmsg* nlmsg, int sock, const char* type, const char* name, const char* link)
{
- netlink_add_device_impl(nlmsg, type, name);
+ netlink_add_device_impl(nlmsg, type, name, false);
netlink_done(nlmsg);
int ifindex = if_nametoindex(link);
netlink_attr(nlmsg, IFLA_LINK, &ifindex, sizeof(ifindex));
@@ -355,7 +371,7 @@ static void netlink_add_linked(struct nlmsg* nlmsg, int sock, const char* type,
static void netlink_add_vlan(struct nlmsg* nlmsg, int sock, const char* name, const char* link, uint16 id, uint16 proto)
{
- netlink_add_device_impl(nlmsg, "vlan", name);
+ netlink_add_device_impl(nlmsg, "vlan", name, false);
netlink_nest(nlmsg, IFLA_INFO_DATA);
netlink_attr(nlmsg, IFLA_VLAN_ID, &id, sizeof(id));
netlink_attr(nlmsg, IFLA_VLAN_PROTOCOL, &proto, sizeof(proto));
@@ -371,7 +387,7 @@ static void netlink_add_vlan(struct nlmsg* nlmsg, int sock, const char* name, co
static void netlink_add_macvlan(struct nlmsg* nlmsg, int sock, const char* name, const char* link)
{
- netlink_add_device_impl(nlmsg, "macvlan", name);
+ netlink_add_device_impl(nlmsg, "macvlan", name, false);
netlink_nest(nlmsg, IFLA_INFO_DATA);
uint32 mode = MACVLAN_MODE_BRIDGE;
netlink_attr(nlmsg, IFLA_MACVLAN_MODE, &mode, sizeof(mode));
@@ -387,7 +403,7 @@ static void netlink_add_macvlan(struct nlmsg* nlmsg, int sock, const char* name,
static void netlink_add_geneve(struct nlmsg* nlmsg, int sock, const char* name, uint32 vni, struct in_addr* addr4, struct in6_addr* addr6)
{
- netlink_add_device_impl(nlmsg, "geneve", name);
+ netlink_add_device_impl(nlmsg, "geneve", name, false);
netlink_nest(nlmsg, IFLA_INFO_DATA);
netlink_attr(nlmsg, IFLA_GENEVE_ID, &vni, sizeof(vni));
if (addr4)
@@ -409,7 +425,7 @@ static void netlink_add_geneve(struct nlmsg* nlmsg, int sock, const char* name,
static void netlink_add_ipvlan(struct nlmsg* nlmsg, int sock, const char* name, const char* link, uint16 mode, uint16 flags)
{
- netlink_add_device_impl(nlmsg, "ipvlan", name);
+ netlink_add_device_impl(nlmsg, "ipvlan", name, false);
netlink_nest(nlmsg, IFLA_INFO_DATA);
netlink_attr(nlmsg, IFLA_IPVLAN_MODE, &mode, sizeof(mode));
netlink_attr(nlmsg, IFLA_IPVLAN_FLAGS, &flags, sizeof(flags));
@@ -1371,7 +1387,6 @@ static void initialize_netdevices(void)
{"netdevsim", netdevsim},
// This adds connected veth0 and veth1 devices.
{"veth", 0},
- {"xfrm", "xfrm0"},
{"wireguard", "wg0"},
{"wireguard", "wg1"},
{"wireguard", "wg2"},
@@ -1465,6 +1480,8 @@ static void initialize_netdevices(void)
netlink_device_change(&nlmsg, sock, slave0, false, master, 0, 0, NULL);
netlink_device_change(&nlmsg, sock, slave1, false, master, 0, 0, NULL);
}
+ netlink_add_xfrm(&nlmsg, sock, "xfrm0");
+
// bond/team_slave_* will set up automatically when set their master.
// But bridge_slave_* need to set up manually.
netlink_device_change(&nlmsg, sock, "bridge_slave_0", true, 0, 0, 0, NULL);
@@ -4841,7 +4858,7 @@ static void setup_802154()
}
netlink_device_change(&nlmsg, sock_route, devname, true, 0, &hwaddr, sizeof(hwaddr), 0);
if (i == 0) {
- netlink_add_device_impl(&nlmsg, "lowpan", "lowpan0");
+ netlink_add_device_impl(&nlmsg, "lowpan", "lowpan0", false);
netlink_done(&nlmsg);
netlink_attr(&nlmsg, IFLA_LINK, &ifindex, sizeof(ifindex));
int err = netlink_send(&nlmsg, sock_route);