negotiate() function extracted from vpnkit
From: https://github.com/moby/vpnkit commit 2ffc1dd8a84ea7359dd09b1f4b51bb728d4f46a0 c/vpnkit-tap-vsockd/tap-vsockd.c With minimum changes to make it build.
This commit is contained in:
parent
b748fcde0a
commit
4062727333
58
arch/sim/src/sim/vpnkit/negotiate.c
Normal file
58
arch/sim/src/sim/vpnkit/negotiate.c
Normal file
@ -0,0 +1,58 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "protocol.h"
|
||||
|
||||
#define ERROR(fmt, ...) \
|
||||
fprintf(stderr, "up_vpnkit: " fmt "\r\n", ##__VA_ARGS__)
|
||||
#define INFO(fmt, ...) \
|
||||
fprintf(stderr, "up_vpnkit: " fmt "\r\n", ##__VA_ARGS__)
|
||||
|
||||
/* Negotiate a vmnet connection, returns 0 on success and 1 on error. */
|
||||
int negotiate(int fd, struct vif_info *vif)
|
||||
{
|
||||
enum command command = ethernet;
|
||||
struct init_message *me;
|
||||
struct ethernet_args args;
|
||||
struct init_message you;
|
||||
char *txt;
|
||||
|
||||
me = create_init_message();
|
||||
if (!me)
|
||||
goto err;
|
||||
|
||||
if (write_init_message(fd, me) == -1)
|
||||
goto err;
|
||||
|
||||
if (read_init_message(fd, &you) == -1)
|
||||
goto err;
|
||||
|
||||
if (me->version != you.version) {
|
||||
ERROR("Server did not accept our protocol version (client: %d, server: %d)", me->version, you.version);
|
||||
goto err;
|
||||
}
|
||||
|
||||
txt = print_init_message(&you);
|
||||
if (!txt)
|
||||
goto err;
|
||||
|
||||
INFO("Server reports %s", txt);
|
||||
free(txt);
|
||||
|
||||
if (write_command(fd, &command) == -1)
|
||||
goto err;
|
||||
|
||||
/* 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_response(fd, vif) == -1)
|
||||
goto err;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
ERROR("Failed to negotiate vmnet connection");
|
||||
return 1;
|
||||
}
|
Loading…
Reference in New Issue
Block a user