diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2022-09-08 15:45:47 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2022-09-09 12:14:52 +0200 |
| commit | a29cf5afb0f318fae8b15230623d70549a8c5a8c (patch) | |
| tree | fd6d460c6571f8f51f934d5c696cc45028ca72e3 /executor/common_linux.h | |
| parent | f30274687d34e8d50307008f4c9989eaef077696 (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.h | 41 |
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); |
