HACK: set up iptables rules after setting up tap device
BUG=chromium:703920
TEST=start vm and see that iptables mangle rule has been added
Change-Id: Idd832396c9a420c273820bb980e8da9cca53cd82
Reviewed-on: https://chromium-review.googlesource.com/482704
Commit-Ready: Stephen Barber <smbarber@chromium.org>
Tested-by: Stephen Barber <smbarber@chromium.org>
Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
diff --git a/virtio/net.c b/virtio/net.c
index 6d1be65..e6ee6ac 100644
--- a/virtio/net.c
+++ b/virtio/net.c
@@ -323,6 +323,7 @@
bool skipconf = !!params->tapif;
bool macvtap = skipconf && (params->tapif[0] == '/');
const char *tap_file = "/dev/net/tun";
+ char iptables_buf[1024];
/* Did the user already gave us the FD? */
if (params->fd) {
@@ -372,6 +373,15 @@
}
}
+ snprintf(iptables_buf, sizeof(iptables_buf),
+ "iptables -t mangle -A PREROUTING -i %s -j MARK --set-xmark 0x1/0xffffffff",
+ ndev->tap_name);
+
+ if (system(iptables_buf)) {
+ pr_warning("Failed to set iptables rule");
+ goto fail;
+ }
+
if (!skipconf) {
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ndev->tap_name, sizeof(ndev->tap_name));
@@ -893,6 +903,7 @@
struct virtio_net_params *params;
struct net_dev *ndev;
struct list_head *ptr;
+ char iptables_buf[1024];
list_for_each(ptr, &ndevs) {
ndev = list_entry(ptr, struct net_dev, list);
@@ -901,6 +912,14 @@
if (ndev->mode == NET_MODE_TAP &&
strcmp(params->downscript, "none"))
virtio_net_exec_script(params->downscript, ndev->tap_name);
+ else if (ndev->mode == NET_MODE_TAP) {
+ snprintf(iptables_buf, sizeof(iptables_buf),
+ "iptables -t mangle -D PREROUTING -i %s -j MARK --set-xmark 0x1/0xffffffff",
+ ndev->tap_name);
+
+ if (system(iptables_buf))
+ pr_warning("Failed to unset iptables rule");
+ }
}
return 0;
}