kernel-netlink: Add global option to configure MSS-clamping on installed routes

This commit is contained in:
Tobias Brunner 2014-08-04 15:57:46 +02:00
parent c1adf7e0c4
commit 47a0e289d9
2 changed files with 29 additions and 6 deletions

View File

@ -7,6 +7,9 @@ charon.plugins.kernel-netlink.fwmark =
inverts the meaning (i.e. the rule only applies to packets that don't match inverts the meaning (i.e. the rule only applies to packets that don't match
the mark). the mark).
charon.plugins.kernel-netlink.mss = 0
MSS to set on installed routes, 0 to disable.
charon.plugins.kernel-netlink.mtu = 0 charon.plugins.kernel-netlink.mtu = 0
MTU to set on installed routes, 0 to disable. MTU to set on installed routes, 0 to disable.

View File

@ -483,6 +483,11 @@ struct private_kernel_netlink_net_t {
* MTU to set on installed routes * MTU to set on installed routes
*/ */
u_int32_t mtu; 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); chunk.len = sizeof(ifindex);
netlink_add_attribute(hdr, RTA_OIF, chunk, sizeof(request)); 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) + chunk = chunk_alloca(RTA_LENGTH((sizeof(struct rtattr) +
sizeof(u_int32_t))); sizeof(u_int32_t)) * 2));
chunk.len = 0;
rta = (struct rtattr*)chunk.ptr; rta = (struct rtattr*)chunk.ptr;
rta->rta_type = RTAX_MTU; if (this->mtu)
rta->rta_len = chunk.len; {
memcpy(RTA_DATA(rta), &this->mtu, sizeof(u_int32_t)); 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)); 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), "%s.plugins.kernel-netlink.roam_events", TRUE, lib->ns),
.mtu = lib->settings->get_int(lib->settings, .mtu = lib->settings->get_int(lib->settings,
"%s.plugins.kernel-netlink.mtu", 0, lib->ns), "%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->last_route_reinstall);
timerclear(&this->next_roam); timerclear(&this->next_roam);