]> xenbits.xensource.com Git - people/liuw/qemu-rump-config.git/commitdiff
use ioctl etc
authorWei Liu <wei.liu2@citrix.com>
Fri, 31 Jul 2015 10:08:58 +0000 (11:08 +0100)
committerWei Liu <wei.liu2@citrix.com>
Fri, 31 Jul 2015 10:08:58 +0000 (11:08 +0100)
qemu-rump-config.c

index 6598ba71fc4439f84e7fd7dc0c675df2fe405eb0..4a79ccf2bd0257237844ae3bf00a1ca2fbf8bff4 100644 (file)
@@ -1,5 +1,3 @@
-/* This program brings up rump kernel to a static network topology. */
-
 #include <sys/types.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <fcntl.h>
 #include <assert.h>
 
-#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;
 }