diff --git a/src/include/linux/udp.h b/src/include/linux/udp.h index b68a166f2..c0920eaa2 100644 --- a/src/include/linux/udp.h +++ b/src/include/linux/udp.h @@ -29,6 +29,7 @@ struct udphdr { /* UDP socket options */ #define UDP_CORK 1 /* Never send partially complete segments */ #define UDP_ENCAP 100 /* Set the socket to accept encapsulated packets */ +#define UDP_GRO 104 /* This socket can receive UDP GRO packets */ /* UDP encapsulation types */ #define UDP_ENCAP_ESPINUDP_NON_IKE 1 /* draft-ietf-ipsec-nat-t-ike-00/01 */ diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c index c6e50cc05..df2822885 100644 --- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c +++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c @@ -3884,6 +3884,12 @@ METHOD(kernel_ipsec_t, enable_udp_decap, bool, DBG1(DBG_KNL, "unable to set UDP_ENCAP: %s", strerror(errno)); return FALSE; } + type = 1; + if (setsockopt(fd, SOL_UDP, UDP_GRO, &type, sizeof(type)) < 0) + { + DBG1(DBG_KNL, "unable to set UDP_GRO: %s", strerror(errno)); + return FALSE; + } return TRUE; }