hook in ziti_callbacks

This commit is contained in:
eugene
2020-04-21 11:52:33 -04:00
parent a4912ce25c
commit 230c55ca28
6 changed files with 41 additions and 84 deletions
+4 -1
View File
@@ -21,7 +21,10 @@ if [[ ! -f ./build/CMakeCache.txt ]]; then
fi
"${CMAKE}" --build ./build --target install
cp ./install/lib/ziti.dll .
cp ./install/lib/libuv.dll .
export CGO_CFLAGS="-DNOGDI -I $(cygpath -a -m ./install/include)"
export CGO_LDFLAGS="-L $(cygpath -a -m ./install/lib)"
go build ./ziti-wintun
go build -a ./ziti-wintun
+26 -55
View File
@@ -2,10 +2,12 @@ package cziti
//
/*
#cgo LDFLAGS: -l ziti_tunneler -l lwipcore -l lwipwin32arch -l ziti_tunneler
#cgo LDFLAGS: -l ziti_tunneler -l lwipcore -l lwipwin32arch -l ziti_tunneler -l ziti_tunneler_cbs
#include "nf/netif_driver.h"
#include <nf/netif_driver.h>
#include <nf/ziti_tunneler.h>
#include <nf/ziti_tunneler_cbs.h>
#include <uv.h>
extern int netifClose(netif_handle dev);
@@ -13,20 +15,15 @@ extern ssize_t netifRead(netif_handle dev, void *buf, size_t buf_len);
extern ssize_t netifWrite(netif_handle dev, void *buf, size_t len);
extern int netifSetup(netif_handle dev, uv_loop_t *loop, packet_cb packetCb, void* ctx);
extern tunneler_sdk_options* new_tun_opts();
typedef struct netif_handle_s {
const char* id;
packet_cb on_packet_cb;
void *packet_cb_ctx;
} netif_handle_t;
extern void* zitiDial(char *service_name, void *ziti_dial_ctx, tunneler_io_context tnlr_io_ctx);
extern void zitiClose(void *ziti_dial_ctx);
extern int zitiWrite(void *ziti_io_ctx, void *data, int len);
extern void readAsync(struct uv_async_s *a);
extern void call_on_packet(void *packet, ssize_t len, packet_cb cb, void *ctx);
extern uv_async_t* new_async();
extern void dnsHandler(tunneler_io_context tio, void *ctx, addr_t src, uint16_t sport, void *data, ssize_t len);
*/
@@ -37,14 +34,13 @@ import (
"github.com/miekg/dns"
"golang.zx2c4.com/wireguard/tun"
"net"
"strings"
"unsafe"
)
const dnsIP = "169.254.1.253"
type Tunnel interface {
AddIntercept(service string, hostname string, port int)
AddIntercept(service string, hostname string, port int, ctx unsafe.Pointer)
}
type tunnel struct{
@@ -64,7 +60,7 @@ type tunnel struct{
var devMap = make(map[string]*tunnel)
func HookupTun(dev tun.Device) (Tunnel, error) {
fmt.Println("in HookupTun")
fmt.Println("in HookupTun ")
defer fmt.Println("exiting HookupTun")
name, err := dev.Name()
if err != nil {
@@ -78,16 +74,16 @@ func HookupTun(dev tun.Device) (Tunnel, error) {
t := &tunnel{
dev: dev,
driver: drv,
writeQ: make(chan []byte),
writeQ: make(chan []byte, 64),
readQ: make(chan []byte, 64),
}
devMap[name] = t
opts := C.new_tun_opts()
opts := (*C.tunneler_sdk_options)(C.calloc(1, C.sizeof_tunneler_sdk_options))
opts.netif_driver = drv
opts.ziti_dial = C.ziti_dial_cb(C.zitiDial)
opts.ziti_close = C.ziti_close_cb(C.zitiClose)
opts.ziti_write = C.ziti_write_cb(C.zitiWrite)
opts.ziti_dial = C.ziti_dial_cb(C.ziti_sdk_c_dial)
opts.ziti_close = C.ziti_close_cb(C.ziti_sdk_c_close)
opts.ziti_write = C.ziti_write_cb(C.ziti_sdk_c_write)
t.tunCtx = C.NF_tunneler_init(opts, _impl.libuvCtx.l)
@@ -113,10 +109,9 @@ func makeDriver(name string) C.netif_driver {
func netifWrite(h C.netif_handle, buf unsafe.Pointer, length C.size_t) C.ssize_t {
t, found := devMap[C.GoString(h.id)]
if !found {
fmt.Errorf("should not be here\n")
panic("should not be here\n")
return -1
}
fmt.Println("netifWrite len=", length);
b := C.GoBytes(buf, C.int(length))
@@ -139,7 +134,7 @@ func netifSetup(h C.netif_handle, l *C.uv_loop_t, packetCb C.packet_cb, ctx unsa
return -1
}
t.read = C.new_async()
t.read = (*C.uv_async_t)(C.calloc(1, C.sizeof_uv_async_t))
C.uv_async_init(l, t.read, C.uv_async_cb(C.readAsync))
t.read.data = unsafe.Pointer(h)
fmt.Printf("in netifSetup netif[%s] handle[%p]\n", C.GoString(h.id), h)
@@ -167,6 +162,10 @@ func (t *tunnel)runReadLoop() {
if err != nil {
panic(err)
}
if len(t.readQ) == cap(t.readQ) {
fmt.Println("read loop is about to block")
}
t.readQ <- buf[:nr]
C.uv_async_send((*C.uv_async_t)(unsafe.Pointer(t.read)))
}
@@ -174,8 +173,6 @@ func (t *tunnel)runReadLoop() {
//export readAsync
func readAsync(a *C.uv_async_t) {
i := 0
dev := (*C.netif_handle_t)(a.data)
id := C.GoString(dev.id)
@@ -185,12 +182,12 @@ func readAsync(a *C.uv_async_t) {
panic(errors.New("where is my tunnel?"))
}
for len(t.readQ) > 0 {
np := len(t.readQ)
for i := np; i > 0; i-- {
b := <- t.readQ
buf := C.CBytes(b)
C.call_on_packet(buf, C.ssize_t(len(b)), t.onPacket, t.onPacketCtx)
C.free(buf)
i++
}
}
@@ -218,8 +215,11 @@ func (t *tunnel) runWriteLoop() {
}
func (t *tunnel) AddIntercept(service string, host string, port int) {
res := C.NF_tunneler_intercept_v1(t.tunCtx, unsafe.Pointer(nil), C.CString(service), C.CString(host), C.int(port))
func (t *tunnel) AddIntercept(service string, host string, port int, ctx unsafe.Pointer) {
zitiCtx := (*C.ziti_context)(C.malloc(C.sizeof_ziti_context))
zitiCtx.nf_ctx = ctx
res := C.NF_tunneler_intercept_v1(t.tunCtx, unsafe.Pointer(zitiCtx),
C.CString(service), C.CString(host), C.int(port))
fmt.Println("intercept added", res)
}
@@ -260,6 +260,7 @@ func dnsHandler(tio C.tunneler_io_context, ctx unsafe.Pointer, src C.addr_t, spo
if err == nil {
replyC := C.CBytes(reply)
rc := C.NF_udp_send(tio, src, sport, replyC, C.ssize_t(len(reply)))
C.free(replyC)
if rc != 0 {
fmt.Println("NF_udp_reply rc=", rc)
}
@@ -268,34 +269,4 @@ func dnsHandler(tio C.tunneler_io_context, ctx unsafe.Pointer, src C.addr_t, spo
}
}
/*******************************************************************/
//export zitiDial
func zitiDial(service *C.char, ziti_dial_ctx unsafe.Pointer, tio C.tunneler_io_context) unsafe.Pointer {
fmt.Println("received dial request for ", C.GoString(service))
defer fmt.Println("dial finished")
msg := []byte("welcome to Canadian translator\n")
msgC := C.CBytes(msg)
C.NF_tunneler_write(tio, msgC, C.int(len(msg)))
// C.free(msgC)
return unsafe.Pointer(tio)
}
//export zitiClose
func zitiClose(ziti_dial_ctx unsafe.Pointer) {
fmt.Println("in zitiClose")
}
//export zitiWrite
func zitiWrite(zio unsafe.Pointer, data unsafe.Pointer, length C.int) C.int {
msg := strings.TrimSpace(string(C.GoBytes(data, length)))
reply := []byte(fmt.Sprint(msg, ", eh?\n"))
replyC := C.CBytes(reply)
C.NF_tunneler_write(C.tunneler_io_context(zio), replyC, C.int(len(reply)))
//C.free(replyC)
return C.ZITI_CONNECTED
}
/*******************************************************************/
+6 -20
View File
@@ -3,57 +3,43 @@
#include <nf/ziti_tunneler.h>
#include <nf/ziti_log.h>
libuv_ctx* new_libuv_ctx() {
return calloc(1, sizeof(libuv_ctx));
}
void libuv_stopper(uv_async_t *a) {
uv_stop(a->loop);
}
void libuv_init(libuv_ctx *lctx) {
lctx->l = uv_default_loop();
uv_async_init(lctx->l, &lctx->stopper, libuv_stopper);
}
void libuv_runner(void *arg) {
init_debug();
printf("starting event loop\n");
ZITI_LOG(INFO, "starting event loop");
fflush(stdout);
uv_loop_t *l = arg;
uv_run(l, UV_RUN_DEFAULT);
printf("event finished finished\n");
ZITI_LOG(INFO, "event finished finished\n");
}
void libuv_run(libuv_ctx *lctx) {
uv_thread_create(&lctx->t, libuv_runner, lctx->l);
}
void libuv_stop(libuv_ctx *lctx) {
uv_async_send(&lctx->stopper);
int err = uv_thread_join(&lctx->t);
if (err) {
fprintf(stderr, "%d: %s\n", err, uv_strerror(err));
ZITI_LOG(ERROR, "failed to join uv_loop thread: %d[%s]", err, uv_strerror(err));
}
}
extern void initCB(nf_context nf, int status, void *ctx);
extern void _init_cb(nf_context nf, int status, void *ctx) {
initCB(nf, status, ctx);
}
static const char* _all[] = {
"all", NULL
};
const char** all_configs = _all;
extern tunneler_sdk_options* new_tun_opts() {
return calloc(1, sizeof(tunneler_sdk_options));
}
extern void call_on_packet(const char *packet, ssize_t len, packet_cb cb, void *ctx) {
cb(packet, len, ctx);
}
extern uv_async_t* new_async() {
return calloc(1, sizeof(uv_async_t));
}
+4 -4
View File
@@ -21,7 +21,7 @@ type sdk struct {
var _impl sdk
func init() {
_impl.libuvCtx = C.new_libuv_ctx()
_impl.libuvCtx = (*C.libuv_ctx)(C.calloc(1, C.sizeof_libuv_ctx))
C.libuv_init(_impl.libuvCtx)
}
@@ -69,13 +69,10 @@ var tunCfgName = C.CString("ziti-tunneler-client.v1")
func serviceCB(nf C.nf_context, service *C.ziti_service, status C.int, data unsafe.Pointer) {
ctx := (*CZitiCtx)(data)
fmt.Printf("%+v\n", ctx)
if ctx.Services == nil {
m := make(map[string]Service)
ctx.Services = &m
}
fmt.Printf("%+v\n", ctx)
name := C.GoString(service.name)
if status == C.ZITI_SERVICE_UNAVAILABLE {
@@ -106,6 +103,9 @@ func serviceCB(nf C.nf_context, service *C.ziti_service, status C.int, data unsa
fmt.Println(err)
} else {
fmt.Printf("service[%s] is mapped to <%s:%d>\n", name, ip.String(), port)
for _, t := range devMap {
t.AddIntercept(name, ip.String(), port, unsafe.Pointer(ctx.nf))
}
}
}
}
-3
View File
@@ -17,13 +17,10 @@ typedef struct libuv_ctx_s {
uv_async_t stopper;
} libuv_ctx;
libuv_ctx* new_libuv_ctx();
void libuv_stopper(uv_async_t *a);
void libuv_init(libuv_ctx *lctx);
void libuv_runner(void *arg);
void libuv_run(libuv_ctx *lctx);
void libuv_stop(libuv_ctx *lctx);
extern void _init_cb(nf_context nf, int status, void *ctx);
extern const char** all_configs;
+1 -1
View File
@@ -29,7 +29,7 @@ func main() {
interfaceName := os.Args[1]
fmt.Println("creating TUN device")
tunDevice, err := tun.CreateTUN(interfaceName, 0)
tunDevice, err := tun.CreateTUN(interfaceName, 64 * 1024)
if err == nil {
realInterfaceName, err2 := tunDevice.Name()
if err2 == nil {