9 #include <sys/socket.h>
12 #include <linux/if_tun.h>
16 #define OVS_SOCK "/var/run/pl-ovs.control"
18 void send_fd(int p, int fd, char* vif_name);
24 fprintf(stderr, "%s: %s: %s", appname, msg, strerror(errno)); \
30 int send_vif_fd(int sock_fd, int vif_fd, char *vif_name)
34 struct cmsghdr *p_cmsg;
36 size_t cmsgbuf[CMSG_SPACE(sizeof(vif_fd)) / sizeof(size_t)];
40 msg.msg_control = cmsgbuf;
41 msg.msg_controllen = sizeof(cmsgbuf);
42 p_cmsg = CMSG_FIRSTHDR(&msg);
43 p_cmsg->cmsg_level = SOL_SOCKET;
44 p_cmsg->cmsg_type = SCM_RIGHTS;
45 p_cmsg->cmsg_len = CMSG_LEN(sizeof(vif_fd));
46 p_fds = (int *) CMSG_DATA(p_cmsg);
48 msg.msg_controllen = p_cmsg->cmsg_len;
55 /* Send the interface name as the iov */
56 vec.iov_base = vif_name;
57 vec.iov_len = strlen(vif_name)+1;
59 while ((retval = sendmsg(sock_fd, &msg, 0)) == -1 && errno == EINTR);
61 ERROR("sending file descriptor");
66 void send_fd(int p, int fd, char* vif_name)
70 struct sockaddr_un addr, accept_addr;
71 socklen_t addr_len = sizeof(accept_addr);
73 control_fd = socket(AF_UNIX, SOCK_STREAM, 0);
74 if (control_fd == -1 && errno != ENOENT) {
75 ERROR("Could not create UNIX socket");
78 memset(&addr, 0, sizeof(struct sockaddr_un));
80 addr.sun_family = AF_UNIX;
81 strncpy(addr.sun_path, OVS_SOCK,
82 sizeof(addr.sun_path) - 1);
84 if (unlink(OVS_SOCK) == -1 && errno != ENOENT) {
85 ERROR("Could not unlink " OVS_SOCK " control socket");
88 if (bind(control_fd, (struct sockaddr *) &addr,
89 sizeof(struct sockaddr_un)) == -1) {
90 ERROR("Could not bind to " OVS_SOCK " control socket");
93 if (listen(control_fd, 5) == -1) {
94 ERROR("listen on " OVS_SOCK " failed");
96 if (write(p, "1", 1) != 1) {
97 ERROR("writing on the synch pipe");
99 if ((accept_fd = accept(control_fd, (struct sockaddr*) &accept_addr,
101 ERROR("accept on " OVS_SOCK " failed");
103 send_vif_fd(accept_fd, fd, vif_name);
106 int main(int argc, char* argv[])
108 char if_name[IFNAMSIZ];
109 int p[2]; // synchronization pipe
113 (void) argc; // unused
119 tun_fd = tun_alloc(IFF_TAP, if_name);
129 open("/dev/null", O_WRONLY);
131 send_fd(p[1], tun_fd, if_name);
135 if (read(p[0], &dummy, 1) != 1) {
136 ERROR("reading from the synch pipe");
138 printf("%s\n", if_name);