From: Tobias Brunner Date: Mon, 9 Jan 2023 13:54:28 +0000 (+0100) Subject: kernel-netlink: Automatically bring up XFRM interfaces after creation X-Git-Tag: 5.9.10rc1~5^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0cc780d317561b9837566132cc8a131b627ca219;p=thirdparty%2Fstrongswan.git kernel-netlink: Automatically bring up XFRM interfaces after creation --- diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_xfrmi.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_xfrmi.c index 1bdd95edd8..1cc44d8e99 100644 --- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_xfrmi.c +++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_xfrmi.c @@ -47,6 +47,38 @@ struct private_kernel_netlink_xfrmi_t { netlink_socket_t *socket; }; +/** + * "up" the interface with the given name + */ +static bool interface_up(private_kernel_netlink_xfrmi_t *this, char *name) +{ + netlink_buf_t request; + struct nlmsghdr *hdr; + struct ifinfomsg *msg; + + memset(&request, 0, sizeof(request)); + + hdr = &request.hdr; + hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; + hdr->nlmsg_type = RTM_SETLINK; + hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); + + msg = NLMSG_DATA(hdr); + msg->ifi_family = AF_UNSPEC; + msg->ifi_change |= IFF_UP; + msg->ifi_flags |= IFF_UP; + + netlink_add_attribute(hdr, IFLA_IFNAME, chunk_from_str(name), + sizeof(request)); + + if (this->socket->send_ack(this->socket, hdr) != SUCCESS) + { + DBG1(DBG_KNL, "failed to bring up XFRM interface '%s'", name); + return FALSE; + } + return TRUE; +} + METHOD(kernel_netlink_xfrmi_t, create, bool, private_kernel_netlink_xfrmi_t *this, char *name, uint32_t if_id, char *phys, uint32_t mtu) @@ -106,7 +138,7 @@ METHOD(kernel_netlink_xfrmi_t, create, bool, switch (this->socket->send_ack(this->socket, hdr)) { case SUCCESS: - return TRUE; + return interface_up(this, name); case ALREADY_DONE: DBG1(DBG_KNL, "XFRM interface '%s' already exists", name); break;