diff options
author | Tobias Brunner <tobias@strongswan.org> | 2014-08-04 15:57:46 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2014-09-12 10:13:30 +0200 |
commit | 47a0e289d96c570273f0d2c7c2bba70357b56c59 (patch) | |
tree | 38299515936bc5e8ed8be94c41bc3256a13a2187 /src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c | |
parent | c1adf7e0c46140704650a840d2e1319946f3e8c0 (diff) | |
download | strongswan-47a0e289d96c570273f0d2c7c2bba70357b56c59.tar.bz2 strongswan-47a0e289d96c570273f0d2c7c2bba70357b56c59.tar.xz |
kernel-netlink: Add global option to configure MSS-clamping on installed routes
Diffstat (limited to 'src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c')
-rw-r--r-- | src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c index 1b9dd8410..6594b8cca 100644 --- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c +++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c @@ -483,6 +483,11 @@ struct private_kernel_netlink_net_t { * MTU to set on installed routes */ u_int32_t mtu; + + /** + * MSS to set on installed routes + */ + u_int32_t mss; }; /** @@ -2113,14 +2118,27 @@ static status_t manage_srcroute(private_kernel_netlink_net_t *this, chunk.len = sizeof(ifindex); netlink_add_attribute(hdr, RTA_OIF, chunk, sizeof(request)); - if (this->mtu) + if (this->mtu || this->mss) { - chunk = chunk_alloca(RTA_LENGTH(sizeof(struct rtattr) + - sizeof(u_int32_t))); + chunk = chunk_alloca(RTA_LENGTH((sizeof(struct rtattr) + + sizeof(u_int32_t)) * 2)); + chunk.len = 0; rta = (struct rtattr*)chunk.ptr; - rta->rta_type = RTAX_MTU; - rta->rta_len = chunk.len; - memcpy(RTA_DATA(rta), &this->mtu, sizeof(u_int32_t)); + if (this->mtu) + { + rta->rta_type = RTAX_MTU; + rta->rta_len = RTA_LENGTH(sizeof(u_int32_t)); + memcpy(RTA_DATA(rta), &this->mtu, sizeof(u_int32_t)); + chunk.len = rta->rta_len; + } + if (this->mss) + { + rta = (struct rtattr*)(chunk.ptr + RTA_ALIGN(chunk.len)); + rta->rta_type = RTAX_ADVMSS; + rta->rta_len = RTA_LENGTH(sizeof(u_int32_t)); + memcpy(RTA_DATA(rta), &this->mss, sizeof(u_int32_t)); + chunk.len = RTA_ALIGN(chunk.len) + rta->rta_len; + } netlink_add_attribute(hdr, RTA_METRICS, chunk, sizeof(request)); } @@ -2485,6 +2503,8 @@ kernel_netlink_net_t *kernel_netlink_net_create() "%s.plugins.kernel-netlink.roam_events", TRUE, lib->ns), .mtu = lib->settings->get_int(lib->settings, "%s.plugins.kernel-netlink.mtu", 0, lib->ns), + .mss = lib->settings->get_int(lib->settings, + "%s.plugins.kernel-netlink.mss", 0, lib->ns), ); timerclear(&this->last_route_reinstall); timerclear(&this->next_roam); |