From d42948fc057e25624c547649425b19ae4ebfa1e4 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Mon, 20 Jun 2016 15:14:40 +0200 Subject: kernel-netlink: Enable hardware offloading if configured for an SA --- .../plugins/kernel_netlink/kernel_netlink_ipsec.c | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c') diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c index becf6b5dc..ff3728f4f 100644 --- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c +++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c @@ -1639,6 +1639,31 @@ METHOD(kernel_ipsec_t, add_sa, status_t, data->replay_window); sa->replay_window = data->replay_window; } + if (data->hw_offload) + { + host_t *local = data->inbound ? id->dst : id->src; + char *ifname; + + if (charon->kernel->get_interface(charon->kernel, local, &ifname)) + { + struct xfrm_user_offload *offload; + + offload = netlink_reserve(hdr, sizeof(request), + XFRMA_OFFLOAD_DEV, sizeof(*offload)); + if (!offload) + { + free(ifname); + goto failed; + } + offload->ifindex = if_nametoindex(ifname); + if (local->get_family(local) == AF_INET6) + { + offload->flags |= XFRM_OFFLOAD_IPV6; + } + offload->flags |= data->inbound ? XFRM_OFFLOAD_INBOUND : 0; + free(ifname); + } + } } if (this->socket_xfrm->send_ack(this->socket_xfrm, hdr) != SUCCESS) -- cgit v1.2.3