-/* 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;
}