mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-07-25 19:54:38 +00:00
tap-vsockd: open the tap device, connect the hvsock and negotiate
Signed-off-by: David Scott <dave@recoil.org>
This commit is contained in:
parent
3533ff526e
commit
853d17e04f
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
|
||||||
int verbose_flag = 0;
|
int verbose_flag = 0;
|
||||||
|
|
||||||
@ -101,10 +102,43 @@ struct client_args {
|
|||||||
int tosend;
|
int tosend;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Handle a connection. Echo back anything sent to us and when the
|
void negotiate(SOCKET fd, struct vif_info *vif)
|
||||||
* connection is closed send a bye message.
|
{
|
||||||
|
/* Negotiate with com.docker.slirp */
|
||||||
|
struct init_message *me = create_init_message();
|
||||||
|
if (write_init_message(fd, me) == -1) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
struct init_message you;
|
||||||
|
if (read_init_message(fd, &you) == -1) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
char *txt = print_init_message(&you);
|
||||||
|
fprintf(stderr, "Server reports %s\n", txt);
|
||||||
|
free(txt);
|
||||||
|
enum command command = ethernet;
|
||||||
|
if (write_command(fd, &command) == -1) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
struct ethernet_args args;
|
||||||
|
/* We don't need a uuid */
|
||||||
|
memset(&args.uuid_string[0], 0, sizeof(args.uuid_string));
|
||||||
|
if (write_ethernet_args(fd, &args) == -1) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
if (read_vif_info(fd, vif) == -1) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
err:
|
||||||
|
fprintf(stderr, "Failed to negotiate with com.docker.slirp\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle a connection. Handshake with the com.docker.slirp process and start
|
||||||
|
* exchanging ethernet frames between the socket and the tap device.
|
||||||
*/
|
*/
|
||||||
static void handle(SOCKET fd)
|
static void handle(SOCKET fd, int tapfd)
|
||||||
{
|
{
|
||||||
char recvbuf[SVR_BUF_LEN];
|
char recvbuf[SVR_BUF_LEN];
|
||||||
int recvbuflen = SVR_BUF_LEN;
|
int recvbuflen = SVR_BUF_LEN;
|
||||||
@ -112,6 +146,9 @@ static void handle(SOCKET fd)
|
|||||||
int sent;
|
int sent;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
struct vif_info vif;
|
||||||
|
negotiate(fd, &vif);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
received = recv(fd, recvbuf, recvbuflen, 0);
|
received = recv(fd, recvbuf, recvbuflen, 0);
|
||||||
if (received == 0) {
|
if (received == 0) {
|
||||||
@ -145,7 +182,7 @@ static void handle(SOCKET fd)
|
|||||||
/* Server:
|
/* Server:
|
||||||
* accept() in an endless loop, handle a connection at a time
|
* accept() in an endless loop, handle a connection at a time
|
||||||
*/
|
*/
|
||||||
static int server(GUID serviceid)
|
static int server(GUID serviceid, int tapfd)
|
||||||
{
|
{
|
||||||
SOCKET lsock = INVALID_SOCKET;
|
SOCKET lsock = INVALID_SOCKET;
|
||||||
SOCKET csock = INVALID_SOCKET;
|
SOCKET csock = INVALID_SOCKET;
|
||||||
@ -189,7 +226,7 @@ static int server(GUID serviceid)
|
|||||||
printf("Connect from: "GUID_FMT":"GUID_FMT"\n",
|
printf("Connect from: "GUID_FMT":"GUID_FMT"\n",
|
||||||
GUID_ARGS(sac.VmId), GUID_ARGS(sac.ServiceId));
|
GUID_ARGS(sac.VmId), GUID_ARGS(sac.ServiceId));
|
||||||
|
|
||||||
handle(csock);
|
handle(csock, tapfd);
|
||||||
closesocket(csock);
|
closesocket(csock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -204,7 +241,7 @@ void usage(char *name)
|
|||||||
int __cdecl main(int argc, char **argv)
|
int __cdecl main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
GUID target = HV_GUID_PARENT;
|
GUID sid;
|
||||||
int c;
|
int c;
|
||||||
char *serviceid = NULL;
|
char *serviceid = NULL;
|
||||||
char *tap = "tap0";
|
char *tap = "tap0";
|
||||||
@ -243,7 +280,15 @@ int __cdecl main(int argc, char **argv)
|
|||||||
fprintf(stderr, "serviceid=%s\n", serviceid);
|
fprintf(stderr, "serviceid=%s\n", serviceid);
|
||||||
/* 3049197C-9A4E-4FBF-9367-97F792F16994 */
|
/* 3049197C-9A4E-4FBF-9367-97F792F16994 */
|
||||||
fprintf(stderr, "tap=%s\n", tap);
|
fprintf(stderr, "tap=%s\n", tap);
|
||||||
server(target);
|
res = parseguid(serviceid, &sid);
|
||||||
|
if (res) {
|
||||||
|
fprintf(stderr, "Failed to parse serviceid as GUID: %s\n", serviceid);
|
||||||
|
usage(argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
int tapfd = alloc_tap(tap);
|
||||||
|
|
||||||
return res;
|
server(sid, tapfd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user