From fcc7f15cc0a2d25fa12d4297964dbf2c0230d287 Mon Sep 17 00:00:00 2001 From: Xiao Jia Date: Fri, 22 Jan 2016 13:22:28 -0800 Subject: [PATCH] lkl tools: allow setting the MTU of an interface Tested with the hijack script: $ LKL_HIJACK_NET_MTU=1400 ./run ip link list | grep eth0 2: eth0: mtu 1400 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 $ LKL_HIJACK_NET_MTU=0 ./run ip link list | grep eth0 failed to set MTU: Invalid argument 2: eth0: mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 Signed-off-by: Xiao Jia --- tools/lkl/include/lkl.h | 9 +++++++++ tools/lkl/lib/hijack/init.c | 9 +++++++++ tools/lkl/lib/net.c | 22 ++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/tools/lkl/include/lkl.h b/tools/lkl/include/lkl.h index 55a53f40a53258..8a516dea8a0488 100644 --- a/tools/lkl/include/lkl.h +++ b/tools/lkl/include/lkl.h @@ -170,6 +170,15 @@ int lkl_if_up(int ifindex); */ int lkl_if_down(int ifindex); +/** + * lkl_if_set_mtu - set MTU on interface + * + * @ifindex - the ifindex of the interface + * @mtu - the requested MTU size + * @returns - return 0 if no error: otherwise negative value returns + */ +int lkl_if_set_mtu(int ifindex, int mtu); + /** * lkl_if_set_ipv4 - set IPv4 address on interface * diff --git a/tools/lkl/lib/hijack/init.c b/tools/lkl/lib/hijack/init.c index 2aa5d0be39d0ac..4775ad082a7a89 100644 --- a/tools/lkl/lib/hijack/init.c +++ b/tools/lkl/lib/hijack/init.c @@ -35,6 +35,7 @@ hijack_init(void) { int ret, i, dev_null, nd_id = -1, nd_ifindex = -1; char *tap = getenv("LKL_HIJACK_NET_TAP"); + char *mtu_str = getenv("LKL_HIJACK_NET_MTU"); char *ip = getenv("LKL_HIJACK_NET_IP"); char *netmask_len = getenv("LKL_HIJACK_NET_NETMASK_LEN"); char *gateway = getenv("LKL_HIJACK_NET_GATEWAY"); @@ -105,6 +106,14 @@ hijack_init(void) nd_id, lkl_strerror(nd_ifindex)); } + if (nd_ifindex >= 0 && mtu_str) { + int mtu = atoi(mtu_str); + + ret = lkl_if_set_mtu(nd_ifindex, mtu); + if (ret < 0) + fprintf(stderr, "failed to set MTU: %s\n", lkl_strerror(ret)); + } + if (nd_ifindex >= 0 && ip && netmask_len) { unsigned int addr = inet_addr(ip); int nmlen = atoi(netmask_len); diff --git a/tools/lkl/lib/net.c b/tools/lkl/lib/net.c index 92404a7cdddd9f..dd9017c63b39f0 100644 --- a/tools/lkl/lib/net.c +++ b/tools/lkl/lib/net.c @@ -65,6 +65,28 @@ int lkl_if_down(int ifindex) return err; } +int lkl_if_set_mtu(int ifindex, int mtu) +{ + struct lkl_ifreq ifr; + int err, sock; + + sock = lkl_sys_socket(LKL_AF_INET, LKL_SOCK_DGRAM, 0); + if (sock < 0) + return sock; + + err = ifindex_to_name(sock, &ifr, ifindex); + if (err < 0) + return err; + + ifr.lkl_ifr_mtu = mtu; + + err = lkl_sys_ioctl(sock, LKL_SIOCSIFMTU, (long)&ifr); + + lkl_sys_close(sock); + + return err; +} + int lkl_if_set_ipv4(int ifindex, unsigned int addr, unsigned int netmask_len) { struct lkl_ifreq ifr;