moby / vpnkit

A toolkit for embedding VPN capabilities in your application
Apache License 2.0
1.11k stars 190 forks source link

Add support for AF_UNIX SOCK_DGRAM #602

Open djs55 opened 2 years ago

djs55 commented 2 years ago

Unfortunately these aren't supported by libuv directly, so we need to implement our own separate system. It doesn't need to be particularly scalable as the expected use-case is to send and receive ethernet frames.

The server will listen on a Unix domain socket and receive connected SOCK_DGRAM sockets which will have ethernet frames on them.

Signed-off-by: David Scott dave@recoil.org

djs55 commented 2 years ago

CircleCI caught this:

  thread #1, queue = 'com.apple.main-thread'
    frame #0: 0x00007ff806b273a2 libsystem_kernel.dylib`close + 10
    frame #1: 0x00000001007a3e98 inline_test_runner_hostnet.exe`unix_close(fd=<unavailable>) at close.c:24:9 [opt]
    frame #2: 0x0000000100014be7 inline_test_runner_hostnet.exe`camlHost_unix_dgram__close_927 + 103
    frame #3: 0x0000000100015063 inline_test_runner_hostnet.exe`camlHost_unix_dgram__fun_2409 + 211
    frame #4: 0x00000001006c48c1 inline_test_runner_hostnet.exe`camlLwt__callback_1391 + 129
    frame #5: 0x00000001006c35d8 inline_test_runner_hostnet.exe`camlLwt__iter_callback_list_954 + 120
    frame #6: 0x00000001006c3745 inline_test_runner_hostnet.exe`camlLwt__run_in_resolution_loop_1024 + 37
    frame #7: 0x00000001006c38e3 inline_test_runner_hostnet.exe`camlLwt__resolve_1044 + 83
    frame #8: 0x00000001006c3cd2 inline_test_runner_hostnet.exe`camlLwt__wakeup_later_general_1141 + 178
    frame #9: 0x0000000100721a74 inline_test_runner_hostnet.exe`camlStdlib__Queue__iter_329 + 52
    frame #10: 0x0000000100710b15 inline_test_runner_hostnet.exe`camlStdlib__Array__iter_330 + 117
    frame #11: 0x00000001006c20b2 inline_test_runner_hostnet.exe`camlLwt_sequence__loop_344 + 50
    frame #12: 0x00000001007061e0 inline_test_runner_hostnet.exe`camlStdlib__List__iter_507 + 48
    frame #13: 0x00000001000b5370 inline_test_runner_hostnet.exe`camlLwt_engine__fun_2681 + 640
    frame #14: 0x00000001000b7b8a inline_test_runner_hostnet.exe`camlLwt_main__run_loop_436 + 154
    frame #15: 0x00000001000b7e1c inline_test_runner_hostnet.exe`camlLwt_main__run_494 + 268
    frame #16: 0x000000010005c212 inline_test_runner_hostnet.exe`camlPpx_inline_test_lib__Runtime__fun_2843 + 18
    frame #17: 0x00000001002946cd inline_test_runner_hostnet.exe`camlBase__Exn__protectx_1498 + 45
    frame #18: 0x000000010005b694 inline_test_runner_hostnet.exe`camlPpx_inline_test_lib__Runtime__time_and_reset_random_seeds_2302 + 212
    frame #19: 0x000000010005be01 inline_test_runner_hostnet.exe`camlPpx_inline_test_lib__Runtime__test_2359 + 737
    frame #20: 0x0000000100016388 inline_test_runner_hostnet.exe`camlHost_unix_dgram__entry + 296
    frame #21: 0x0000000100005179 inline_test_runner_hostnet.exe`caml_program + 13001
    frame #22: 0x00000001007d58e5 inline_test_runner_hostnet.exe`caml_start_program + 73
    frame #23: 0x00000001007ac8e6 inline_test_runner_hostnet.exe`caml_startup_common(argv=0x00007ff7bfeff008, pooling=<unavailable>) at startup_nat.c:160:9 [opt]
    frame #24: 0x00000001007ac95b inline_test_runner_hostnet.exe`caml_main [inlined] caml_startup_exn(argv=<unavailable>) at startup_nat.c:167:10 [opt]
    frame #25: 0x00000001007ac954 inline_test_runner_hostnet.exe`caml_main [inlined] caml_startup(argv=<unavailable>) at startup_nat.c:172:15 [opt]
    frame #26: 0x00000001007ac954 inline_test_runner_hostnet.exe`caml_main(argv=<unavailable>) at startup_nat.c:179:3 [opt]
    frame #27: 0x00000001007ac9cc inline_test_runner_hostnet.exe`main(argc=<unavailable>, argv=<unavailable>) at main.c:37:3 [opt]
    frame #28: 0x00000001016ed52e dyld`start + 462
  thread #2
    frame #0: 0x00007ff806b2ed5a libsystem_kernel.dylib`__select + 10
    frame #1: 0x000000010079d06f inline_test_runner_hostnet.exe`caml_thread_tick(arg=<unavailable>) at st_posix.h:388:5 [opt]
    frame #2: 0x00007ff806b634e1 libsystem_pthread.dylib`_pthread_start + 125
    frame #3: 0x00007ff806b5ef6b libsystem_pthread.dylib`thread_start + 15
* thread #3, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x00000001007d24bf inline_test_runner_hostnet.exe`caml_memprof_set_suspended(s=1) at memprof.c:561:20 [opt]
    frame #1: 0x00000001007c9677 inline_test_runner_hostnet.exe`caml_fatal_uncaught_exception(exn=4326427160) at printexc.c:149:3 [opt]
    frame #2: 0x00000001007aca35 inline_test_runner_hostnet.exe`caml_raise(v=4326427160) at fail_nat.c:76:5 [opt]
    frame #3: 0x00000001007aa926 inline_test_runner_hostnet.exe`unix_error(errcode=9, cmdname="recv", cmdarg=<unavailable>) at unixsupport.c:309:3 [opt]
    frame #4: 0x000000010076a5f2 inline_test_runner_hostnet.exe`stub_cstruct_recv(val_fd=<unavailable>, val_buf=<unavailable>, val_ofs=<unavailable>, val_len=<unavailable>) at stubs_utils.c:93:14 [opt]
    frame #5: 0x0000000100013ade inline_test_runner_hostnet.exe`camlUtils__cstruct_recv_731 + 30
    frame #6: 0x00000001000141e5 inline_test_runner_hostnet.exe`camlHost_unix_dgram__receive_thread_861 + 117
    frame #7: 0x00000001000f6785 inline_test_runner_hostnet.exe`camlThread__fun_850 + 37
    frame #8: 0x00000001007d58e5 inline_test_runner_hostnet.exe`caml_start_program + 73
    frame #9: 0x00000001007c9785 inline_test_runner_hostnet.exe`caml_callback_exn(closure=<unavailable>, arg=1) at callback.c:111:10 [opt]
    frame #10: 0x000000010079cfff inline_test_runner_hostnet.exe`caml_thread_start(arg=<unavailable>) at st_stubs.c:548:5 [opt]
    frame #11: 0x00007ff806b634e1 libsystem_pthread.dylib`_pthread_start + 125
    frame #12: 0x00007ff806b5ef6b libsystem_pthread.dylib`thread_start + 15
  thread #4, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x00000001007d59a0 inline_test_runner_hostnet.exe`caml_raise_exception + 72

Edit: fixed by moving the caml_acquire_runtime_system up one line 😅