From: Wei Liu Date: Fri, 31 Jul 2015 10:08:58 +0000 (+0100) Subject: use ioctl etc X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=6fb05bc59f9e4d52e4b217f55e3b2697f4885e3c;p=people%2Fliuw%2Fqemu-rump-config.git use ioctl etc --- diff --git a/qemu-rump-config.c b/qemu-rump-config.c index 6598ba7..4a79ccf 100644 --- a/qemu-rump-config.c +++ b/qemu-rump-config.c @@ -1,5 +1,3 @@ -/* This program brings up rump kernel to a static network topology. */ - #include #include #include @@ -16,25 +14,76 @@ #include #include -#define NOFAIL_RV(a) do{int rv=a;if(rv){printf("%s:%d",#a,rv);abort();}}while(0) +/* Create and bring up interface */ +void new_interface(const char *name) +{ + int s, rc; + struct ifreq ifr; -int main(int argc, char **argv) + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s == -1) + err(1, "socket"); + + memset(&ifr, 0, sizeof(ifr)); + (void) strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); + rc = ioctl(s, SIOCIFCREATE, &ifr); + if (rc < 0) + err(1, "SIOCIFCREATE"); + + memset(&ifr, 0, sizeof(ifr)); + (void) strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); + rc = ioctl(s, SIOCGIFFLAGS, &ifr); + if (rc < 0) + err(1, "SIOCGIFFLAGS"); + ifr.ifr_flags |= IFF_UP; + rc = ioctl(s, SIOCSIFFLAGS, &ifr); + if (rc < 0) + err(1, "SIOCSIFFLAGS"); + rc = ioctl(s, SIOCGIFFLAGS, &ifr); + if (rc < 0) + err(1, "SIOCGIFFLAGS"); + if (!(ifr.ifr_flags & IFF_UP)) + err(1, "%s is not up", name); + + close(s); +} + +void add_to_bridge(const char *bridge, const char *interface) { + int s, rc; + struct ifbreq ifbr; + struct ifdrv ifd; + + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s == -1) + err(1, "socket"); - NOFAIL_RV(rump_pub_netconfig_ifcreate("tap0")); - NOFAIL_RV(rump_pub_netconfig_ifup("tap0")); + memset(&ifbr, 0, sizeof(ifbr)); + strlcpy(ifbr.ifbr_ifsname, interface, sizeof(ifbr.ifbr_ifsname)); + memset(&ifd, 0, sizeof(ifd)); + strlcpy(ifd.ifd_name, bridge, sizeof(ifd.ifd_name)); + ifd.ifd_cmd = BRDGADD; + ifd.ifd_len = sizeof(ifbr); + ifd.ifd_data = &ifbr; + rc = ioctl(s, SIOCSDRVSPEC, &ifd); + if (rc < 0) + err(1, "SIOCSDRVSPEC"); - NOFAIL_RV(rump_pub_netconfig_ifcreate("tap1")); - NOFAIL_RV(rump_pub_netconfig_ifup("tap1")); + close(s); +} - NOFAIL_RV(rump_pub_netconfig_ifcreate("tap2")); - NOFAIL_RV(rump_pub_netconfig_ifup("tap2")); +int main(int argc, char **argv) +{ + new_interface("tap0"); + new_interface("tap1"); + new_interface("tap2"); + new_interface("bridge0"); - NOFAIL_RV(rump_pub_netconfig_ifcreate("bridge0")); - NOFAIL_RV(rump_pub_netconfig_bradd("bridge0", "tap0")); - NOFAIL_RV(rump_pub_netconfig_bradd("bridge0", "xenif0")); - NOFAIL_RV(rump_pub_netconfig_ifup("bridge0")); + add_to_bridge("bridge0", "tap0"); + add_to_bridge("bridge0", "tap1"); + add_to_bridge("bridge0", "tap2"); + sleep(1000000); return 0; }