aboutsummaryrefslogtreecommitdiffstats
path: root/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2014-08-04 15:57:46 +0200
committerTobias Brunner <tobias@strongswan.org>2014-09-12 10:13:30 +0200
commit47a0e289d96c570273f0d2c7c2bba70357b56c59 (patch)
tree38299515936bc5e8ed8be94c41bc3256a13a2187 /src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
parentc1adf7e0c46140704650a840d2e1319946f3e8c0 (diff)
downloadstrongswan-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.c32
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);