9
9
#include <stdio.h>
10
10
#include <stdlib.h>
11
11
#include <string.h>
12
+ #include <sys/socket.h>
13
+ #include <sys/un.h>
12
14
#include <unistd.h>
13
15
#include <libkrun.h>
14
16
#include <getopt.h>
20
22
#define MAX_PATH 4096
21
23
#endif
22
24
25
+ enum net_mode {
26
+ NET_MODE_PASST = 0 ,
27
+ NET_MODE_TSI ,
28
+ };
29
+
23
30
static void print_help (char * const name )
24
31
{
25
32
fprintf (stderr ,
26
33
"Usage: %s [OPTIONS] NEWROOT COMMAND [COMMAND_ARGS...]\n"
27
34
"OPTIONS: \n"
28
35
" -h --help Show help\n"
36
+ " --net=NET_MODE Set network mode\n"
37
+ "NET_MODE can be either TSI (default) or PASST\n"
29
38
"\n"
30
39
"NEWROOT: the root directory of the vm\n"
31
40
"COMMAND: the command you want to execute in the vm\n"
@@ -36,11 +45,13 @@ static void print_help(char *const name)
36
45
37
46
static const struct option long_options [] = {
38
47
{ "help" , no_argument , NULL , 'h' },
48
+ { "net_mode" , required_argument , NULL , 'N' },
39
49
{ NULL , 0 , NULL , 0 }
40
50
};
41
51
42
52
struct cmdline {
43
53
bool show_help ;
54
+ enum net_mode net_mode ;
44
55
char const * new_root ;
45
56
char * const * guest_argv ;
46
57
};
@@ -52,6 +63,7 @@ bool parse_cmdline(int argc, char *const argv[], struct cmdline *cmdline)
52
63
// set the defaults
53
64
* cmdline = (struct cmdline ){
54
65
.show_help = false,
66
+ .net_mode = NET_MODE_TSI ,
55
67
.new_root = NULL ,
56
68
.guest_argv = NULL ,
57
69
};
@@ -64,6 +76,16 @@ bool parse_cmdline(int argc, char *const argv[], struct cmdline *cmdline)
64
76
case 'h' :
65
77
cmdline -> show_help = true;
66
78
return true;
79
+ case 'N' :
80
+ if (strcasecmp ("TSI" , optarg ) == 0 ) {
81
+ cmdline -> net_mode = NET_MODE_TSI ;
82
+ } else if (strcasecmp ("PASST" , optarg ) == 0 ) {
83
+ cmdline -> net_mode = NET_MODE_PASST ;
84
+ } else {
85
+ fprintf (stderr , "Unknown mode %s\n" , optarg );
86
+ return false;
87
+ }
88
+ break ;
67
89
case '?' :
68
90
return false;
69
91
default :
@@ -89,6 +111,27 @@ bool parse_cmdline(int argc, char *const argv[], struct cmdline *cmdline)
89
111
return false;
90
112
}
91
113
114
+ int connect_to_passt ()
115
+ {
116
+ struct sockaddr_un addr ;
117
+ int socket_fd = socket (AF_UNIX , SOCK_STREAM , 0 );
118
+ if (socket_fd < 0 ) {
119
+ perror ("Failed to create passt socket fd" );
120
+ return -1 ;
121
+ }
122
+
123
+ memset (& addr , 0 , sizeof (addr ));
124
+ addr .sun_family = AF_UNIX ;
125
+ strncpy (addr .sun_path , "/tmp/passt_1.socket" , sizeof (addr .sun_path ) - 1 );
126
+
127
+ if (connect (socket_fd , (const struct sockaddr * ) & addr , sizeof (addr )) < 0 ) {
128
+ perror ("Failed to bind passt socket" );
129
+ return -1 ;
130
+ }
131
+
132
+ return socket_fd ;
133
+ }
134
+
92
135
93
136
int main (int argc , char * const argv [])
94
137
{
@@ -182,11 +225,24 @@ int main(int argc, char *const argv[])
182
225
return -1 ;
183
226
}
184
227
185
- // Map port 18000 in the host to 8000 in the guest.
186
- if (err = krun_set_port_map (ctx_id , & port_map [0 ])) {
187
- errno = - err ;
188
- perror ("Error configuring port map" );
189
- return -1 ;
228
+ // Map port 18000 in the host to 8000 in the guest (if networking uses TSI)
229
+ if (cmdline .net_mode == NET_MODE_TSI ) {
230
+ if (err = krun_set_port_map (ctx_id , & port_map [0 ])) {
231
+ errno = - err ;
232
+ perror ("Error configuring port map" );
233
+ return -1 ;
234
+ }
235
+ } else {
236
+ int passt_fd = connect_to_passt ();
237
+ if (passt_fd < 0 ) {
238
+ return -1 ;
239
+ }
240
+
241
+ if (err = krun_set_passt_fd (ctx_id , passt_fd )) {
242
+ errno = - err ;
243
+ perror ("Error configuring net mode" );
244
+ return -1 ;
245
+ }
190
246
}
191
247
192
248
// Configure the rlimits that will be set in the guest
0 commit comments