some incremetal changes
This commit is contained in:
		| @ -38,6 +38,7 @@ type json_out_client_conn_id struct { | |||||||
| type json_out_client_conn struct { | type json_out_client_conn struct { | ||||||
| 	Id uint32 `json:"id"` | 	Id uint32 `json:"id"` | ||||||
| 	ServerAddr string `json:"server-addr"` | 	ServerAddr string `json:"server-addr"` | ||||||
|  | 	ClientAddr string `json:"client-addr"` | ||||||
| 	Routes []json_out_client_route `json:"routes"` | 	Routes []json_out_client_route `json:"routes"` | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -123,7 +124,12 @@ func (ctl *client_ctl_client_conns) ServeHTTP(w http.ResponseWriter, req *http.R | |||||||
| 						ServerPeerListenAddr: r.server_peer_listen_addr.String(), | 						ServerPeerListenAddr: r.server_peer_listen_addr.String(), | ||||||
| 					}) | 					}) | ||||||
| 				} | 				} | ||||||
| 				js = append(js, json_out_client_conn{Id: cts.id, ServerAddr: cts.cfg.ServerAddr, Routes: jsp}) | 				js = append(js, json_out_client_conn{ | ||||||
|  | 					Id: cts.id, | ||||||
|  | 					ServerAddr: cts.remote_addr, | ||||||
|  | 					ClientAddr: cts.local_addr, | ||||||
|  | 					Routes: jsp, | ||||||
|  | 				}) | ||||||
| 				cts.route_mtx.Unlock() | 				cts.route_mtx.Unlock() | ||||||
| 			} | 			} | ||||||
| 			c.cts_mtx.Unlock() | 			c.cts_mtx.Unlock() | ||||||
| @ -226,7 +232,7 @@ func (ctl *client_ctl_client_conns_id) ServeHTTP(w http.ResponseWriter, req *htt | |||||||
| 					ServerPeerListenAddr: r.server_peer_listen_addr.String(), | 					ServerPeerListenAddr: r.server_peer_listen_addr.String(), | ||||||
| 				}) | 				}) | ||||||
| 			} | 			} | ||||||
| 			js = &json_out_client_conn{Id: cts.id, ServerAddr: cts.cfg.ServerAddr, Routes: jsp} | 			js = &json_out_client_conn{Id: cts.id, ServerAddr: cts.local_addr, ClientAddr: cts.remote_addr, Routes: jsp} | ||||||
| 			cts.route_mtx.Unlock() | 			cts.route_mtx.Unlock() | ||||||
|  |  | ||||||
| 			status_code = http.StatusOK; w.WriteHeader(status_code) | 			status_code = http.StatusOK; w.WriteHeader(status_code) | ||||||
|  | |||||||
							
								
								
									
										19
									
								
								client.go
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								client.go
									
									
									
									
									
								
							| @ -14,6 +14,7 @@ import "time" | |||||||
| import "google.golang.org/grpc" | import "google.golang.org/grpc" | ||||||
| import "google.golang.org/grpc/codes" | import "google.golang.org/grpc/codes" | ||||||
| import "google.golang.org/grpc/credentials/insecure" | import "google.golang.org/grpc/credentials/insecure" | ||||||
|  | import "google.golang.org/grpc/peer" | ||||||
| import "google.golang.org/grpc/status" | import "google.golang.org/grpc/status" | ||||||
|  |  | ||||||
| type PacketStreamClient grpc.BidiStreamingClient[Packet, Packet] | type PacketStreamClient grpc.BidiStreamingClient[Packet, Packet] | ||||||
| @ -64,6 +65,8 @@ type ClientConn struct { | |||||||
| 	id          uint32 | 	id          uint32 | ||||||
| 	lid         string | 	lid         string | ||||||
|  |  | ||||||
|  | 	local_addr  string | ||||||
|  | 	remote_addr string | ||||||
| 	conn       *grpc.ClientConn // grpc connection to the server | 	conn       *grpc.ClientConn // grpc connection to the server | ||||||
| 	hdc         HoduClient | 	hdc         HoduClient | ||||||
| 	psc        *GuardedPacketStreamClient // guarded grpc stream | 	psc        *GuardedPacketStreamClient // guarded grpc stream | ||||||
| @ -611,19 +614,13 @@ func (cts *ClientConn) RunTask(wg *sync.WaitGroup) { | |||||||
| 	var slpctx context.Context | 	var slpctx context.Context | ||||||
| 	var c_seed Seed | 	var c_seed Seed | ||||||
| 	var s_seed *Seed | 	var s_seed *Seed | ||||||
|  | 	var p *peer.Peer | ||||||
|  | 	var ok bool | ||||||
| 	var err error | 	var err error | ||||||
|  |  | ||||||
| 	defer wg.Done() // arrange to call at the end of this function | 	defer wg.Done() // arrange to call at the end of this function | ||||||
|  |  | ||||||
| start_over: | start_over: | ||||||
| /* |  | ||||||
| 	cts.saddr, err = net.ResolveTCPAddr(NET_TYPE_TCP, cts.cfg.ServerAddr) // TODO: make this interruptable... |  | ||||||
| 	if err != nil { |  | ||||||
| 		err = fmt.Errorf("unresolavable address %s - %s", cts.saddr, err.Error()) |  | ||||||
| 		goto reconnect_to_server |  | ||||||
| 	} |  | ||||||
| */ |  | ||||||
|  |  | ||||||
| 	cts.cli.log.Write(cts.lid, LOG_INFO, "Connecting to server %s", cts.cfg.ServerAddr) | 	cts.cli.log.Write(cts.lid, LOG_INFO, "Connecting to server %s", cts.cfg.ServerAddr) | ||||||
| 	cts.conn, err = grpc.NewClient(cts.cfg.ServerAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) | 	cts.conn, err = grpc.NewClient(cts.cfg.ServerAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @ -655,6 +652,12 @@ start_over: | |||||||
| 		goto reconnect_to_server | 		goto reconnect_to_server | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	p, ok = peer.FromContext(psc.Context()) | ||||||
|  | 	if ok { | ||||||
|  | 		cts.remote_addr = p.Addr.String() | ||||||
|  | 		cts.local_addr = p.LocalAddr.String() | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	cts.cli.log.Write(cts.lid, LOG_INFO, "Got packet stream from server %s", cts.cfg.ServerAddr) | 	cts.cli.log.Write(cts.lid, LOG_INFO, "Got packet stream from server %s", cts.cfg.ServerAddr) | ||||||
|  |  | ||||||
| 	cts.psc = &GuardedPacketStreamClient{Hodu_PacketStreamClient: psc} | 	cts.psc = &GuardedPacketStreamClient{Hodu_PacketStreamClient: psc} | ||||||
|  | |||||||
							
								
								
									
										26
									
								
								cmd/main.go
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								cmd/main.go
									
									
									
									
									
								
							| @ -216,14 +216,14 @@ func main() { | |||||||
| 		la = make([]string, 0) | 		la = make([]string, 0) | ||||||
|  |  | ||||||
| 		flgs = flag.NewFlagSet("", flag.ContinueOnError) | 		flgs = flag.NewFlagSet("", flag.ContinueOnError) | ||||||
| 		flgs.Func("rpc-on", "specify a rpc listening address", func(v string) error { |  | ||||||
| 			la = append(la, v) |  | ||||||
| 			return nil |  | ||||||
| 		}) |  | ||||||
| 		flgs.Func("ctl-on", "specify a listening address for control channel", func(v string) error { | 		flgs.Func("ctl-on", "specify a listening address for control channel", func(v string) error { | ||||||
| 			ctl_addr = v // TODO: support multiple addrs | 			ctl_addr = v // TODO: support multiple addrs | ||||||
| 			return nil | 			return nil | ||||||
| 		}) | 		}) | ||||||
|  | 		flgs.Func("rpc-on", "specify a rpc listening address", func(v string) error { | ||||||
|  | 			la = append(la, v) | ||||||
|  | 			return nil | ||||||
|  | 		}) | ||||||
| 		flgs.SetOutput(io.Discard) // prevent usage output | 		flgs.SetOutput(io.Discard) // prevent usage output | ||||||
| 		err = flgs.Parse(os.Args[2:]) | 		err = flgs.Parse(os.Args[2:]) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -241,19 +241,19 @@ func main() { | |||||||
| 			goto oops | 			goto oops | ||||||
| 		} | 		} | ||||||
| 	} else if strings.EqualFold(os.Args[1], "client") { | 	} else if strings.EqualFold(os.Args[1], "client") { | ||||||
| 		var la []string | 		var rpc_addr []string | ||||||
| 		var sa []string | 		var ctl_addr[] string | ||||||
|  |  | ||||||
| 		la = make([]string, 0) | 		ctl_addr = make([]string, 0) | ||||||
| 		sa = make([]string, 0) | 		rpc_addr = make([]string, 0) | ||||||
|  |  | ||||||
| 		flgs = flag.NewFlagSet("", flag.ContinueOnError) | 		flgs = flag.NewFlagSet("", flag.ContinueOnError) | ||||||
| 		flgs.Func("rpc-on", "specify a control channel address", func(v string) error { | 		flgs.Func("ctl-on", "specify a listening address for control channel", func(v string) error { | ||||||
| 			la = append(la, v) | 			ctl_addr = append(ctl_addr, v) | ||||||
| 			return nil | 			return nil | ||||||
| 		}) | 		}) | ||||||
| 		flgs.Func("rpc-server", "specify a rpc server address", func(v string) error { | 		flgs.Func("rpc-server", "specify a rpc server address", func(v string) error { | ||||||
| 			sa = append(sa, v) | 			rpc_addr = append(rpc_addr, v) | ||||||
| 			return nil | 			return nil | ||||||
| 		}) | 		}) | ||||||
| 		flgs.SetOutput(io.Discard) | 		flgs.SetOutput(io.Discard) | ||||||
| @ -263,10 +263,10 @@ func main() { | |||||||
| 			goto wrong_usage | 			goto wrong_usage | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if len(la) != 1 || len(sa) != 1 || flgs.NArg() < 1 { | 		if len(ctl_addr) != 1 || len(rpc_addr) != 1 || flgs.NArg() < 1 { | ||||||
| 			goto wrong_usage | 			goto wrong_usage | ||||||
| 		} | 		} | ||||||
| 		err = client_main(la[0], sa[0], flgs.Args()) | 		err = client_main(ctl_addr[0], rpc_addr[0], flgs.Args()) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			fmt.Fprintf(os.Stderr, "ERROR: client error - %s\n", err.Error()) | 			fmt.Fprintf(os.Stderr, "ERROR: client error - %s\n", err.Error()) | ||||||
| 			goto oops | 			goto oops | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | // Code generated by protoc-gen-go. DO NOT EDIT. | ||||||
| // versions: | // versions: | ||||||
| // 	protoc-gen-go v1.35.2 | // 	protoc-gen-go v1.35.1 | ||||||
| // 	protoc        v5.28.2 | // 	protoc        v3.19.6 | ||||||
| // source: hodu.proto | // source: hodu.proto | ||||||
|  |  | ||||||
| package hodu | package hodu | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| // Code generated by protoc-gen-go-grpc. DO NOT EDIT. | // Code generated by protoc-gen-go-grpc. DO NOT EDIT. | ||||||
| // versions: | // versions: | ||||||
| // - protoc-gen-go-grpc v1.5.1 | // - protoc-gen-go-grpc v1.5.1 | ||||||
| // - protoc             v5.28.2 | // - protoc             v3.19.6 | ||||||
| // source: hodu.proto | // source: hodu.proto | ||||||
|  |  | ||||||
| package hodu | package hodu | ||||||
|  | |||||||
| @ -1,13 +1,80 @@ | |||||||
| package hodu | package hodu | ||||||
|  |  | ||||||
|  | import "encoding/json" | ||||||
| import "net/http" | import "net/http" | ||||||
|  |  | ||||||
| type server_ctl_client_conns struct { |  | ||||||
|  | type json_out_server_conn struct { | ||||||
|  | 	Id uint32 `json:"id"` | ||||||
|  | 	ServerAddr string `json:"server-addr"` | ||||||
|  | 	ClientAddr string `json:"client-addr"` | ||||||
|  | 	Routes []json_out_server_route `json:"routes"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type json_out_server_route struct { | ||||||
|  | 	Id uint32 `json:"id"` | ||||||
|  | 	ClientPeerAddr string `json:"client-peer-addr"` | ||||||
|  | 	ServerPeerListenAddr string `json:"server-peer-listen-addr"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ------------------------------------ | ||||||
|  |  | ||||||
|  | type server_ctl_server_conns struct { | ||||||
| 	s *Server | 	s *Server | ||||||
| } | } | ||||||
|  |  | ||||||
| // ------------------------------------ | // ------------------------------------ | ||||||
|  |  | ||||||
| func (ctl *server_ctl_client_conns) ServeHTTP(w http.ResponseWriter, req *http.Request) { | func (ctl *server_ctl_server_conns) ServeHTTP(w http.ResponseWriter, req *http.Request) { | ||||||
| 	w.Write([]byte("hello")) | 	var s *Server | ||||||
|  | 	var status_code int | ||||||
|  | 	var err error | ||||||
|  | 	var je *json.Encoder | ||||||
|  |  | ||||||
|  | 	s = ctl.s | ||||||
|  | 	je = json.NewEncoder(w) | ||||||
|  |  | ||||||
|  | 	switch req.Method { | ||||||
|  | 		case http.MethodGet: | ||||||
|  | 			var cts *ServerConn | ||||||
|  | 			var js []json_out_server_conn | ||||||
|  |  | ||||||
|  | 			js = make([]json_out_server_conn, 0) | ||||||
|  | 			s.cts_mtx.Lock() | ||||||
|  | 			for _, cts = range s.cts_map { | ||||||
|  | 				var r *ServerRoute | ||||||
|  | 				var jsp []json_out_server_route | ||||||
|  |  | ||||||
|  | 				jsp = make([]json_out_server_route, 0) | ||||||
|  | 				cts.route_mtx.Lock() | ||||||
|  | 				for _, r = range cts.route_map { | ||||||
|  | 					jsp = append(jsp, json_out_server_route{ | ||||||
|  | 						Id: r.id, | ||||||
|  | 						ClientPeerAddr: r.ptc_addr, | ||||||
|  | 						ServerPeerListenAddr: r.laddr.String(), | ||||||
|  | 					}) | ||||||
|  | 				} | ||||||
|  | 				js = append(js, json_out_server_conn{Id: cts.id, ClientAddr: cts.caddr.String(), ServerAddr: cts.local_addr.String(), Routes: jsp}) | ||||||
|  | 				cts.route_mtx.Unlock() | ||||||
|  | 			} | ||||||
|  | 			s.cts_mtx.Unlock() | ||||||
|  |  | ||||||
|  | 			status_code = http.StatusOK; w.WriteHeader(status_code) | ||||||
|  | 			if err = je.Encode(js); err != nil { goto oops } | ||||||
|  |  | ||||||
|  | 		case http.MethodDelete: | ||||||
|  | //	TODO		s.ReqStopAllServerConns() | ||||||
|  | 			status_code = http.StatusNoContent; w.WriteHeader(status_code) | ||||||
|  |  | ||||||
|  | 		default: | ||||||
|  | 			status_code = http.StatusBadRequest; w.WriteHeader(status_code) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | //done: | ||||||
|  | 	s.log.Write("", LOG_DEBUG, "[%s] %s %s %d", req.RemoteAddr, req.Method, req.URL.String(), status_code) // TODO: time taken | ||||||
|  | 	return | ||||||
|  |  | ||||||
|  | oops: | ||||||
|  | 	s.log.Write("", LOG_ERROR, "[%s] %s %s - %s", req.RemoteAddr, req.Method, req.URL.String(), err.Error()) | ||||||
|  | 	return | ||||||
| } | } | ||||||
|  | |||||||
| @ -55,7 +55,7 @@ func (spc *ServerPeerConn) RunTask(wg *sync.WaitGroup) { | |||||||
| 	err = pss.Send(MakePeerStartedPacket(spc.route.id, spc.conn_id, spc.conn.RemoteAddr().String(), spc.conn.LocalAddr().String())) | 	err = pss.Send(MakePeerStartedPacket(spc.route.id, spc.conn_id, spc.conn.RemoteAddr().String(), spc.conn.LocalAddr().String())) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		// TODO: include route id and conn id in the error message | 		// TODO: include route id and conn id in the error message | ||||||
| 		fmt.Printf("unable to send start-pts - %s\n", err.Error()) | 		spc.route.cts.svr.log.Write("", LOG_ERROR, "Unable to notify peer started - %s", err.Error()) | ||||||
| 		goto done_without_stop | 		goto done_without_stop | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -88,12 +88,12 @@ wait_for_started: | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			if errors.Is(err, io.EOF) { | 			if errors.Is(err, io.EOF) { | ||||||
| 				if pss.Send(MakePeerEofPacket(spc.route.id, spc.conn_id)) != nil { | 				if pss.Send(MakePeerEofPacket(spc.route.id, spc.conn_id)) != nil { | ||||||
| 					fmt.Printf("unable to report data - %s\n", err.Error()) | 					spc.route.cts.svr.log.Write("", LOG_ERROR, "Unable to report eof - %s", err.Error()) | ||||||
| 					goto done | 					goto done | ||||||
| 				} | 				} | ||||||
| 				goto wait_for_stopped | 				goto wait_for_stopped | ||||||
| 			} else { | 			} else { | ||||||
| 				fmt.Printf("read error - %s\n", err.Error()) | 				spc.route.cts.svr.log.Write("", LOG_ERROR, "Unable to read data - %s", err.Error()) | ||||||
| 				goto done | 				goto done | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @ -101,7 +101,7 @@ wait_for_started: | |||||||
| 		err = pss.Send(MakePeerDataPacket(spc.route.id, spc.conn_id, buf[:n])) | 		err = pss.Send(MakePeerDataPacket(spc.route.id, spc.conn_id, buf[:n])) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			// TODO: include route id and conn id in the error message | 			// TODO: include route id and conn id in the error message | ||||||
| 			fmt.Printf("unable to send data - %s\n", err.Error()) | 			spc.route.cts.svr.log.Write("", LOG_ERROR, "Unable to send data - %s", err.Error()) | ||||||
| 			goto done | 			goto done | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -17,7 +17,6 @@ func server_ws_tty (ws* websocket.Conn) { | |||||||
| 	ws.Write([]byte("it's so wrong. it's awesome\r\n")) | 	ws.Write([]byte("it's so wrong. it's awesome\r\n")) | ||||||
| 	ws.Write([]byte("it's so wrong. 동키가 지나간다.it's awesome\r\n")) | 	ws.Write([]byte("it's so wrong. 동키가 지나간다.it's awesome\r\n")) | ||||||
|  |  | ||||||
|  |  | ||||||
| 	for { | 	for { | ||||||
| 		err = websocket.Message.Receive(ws, &msg) | 		err = websocket.Message.Receive(ws, &msg) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -30,6 +29,10 @@ fmt.Printf ("RECEIVED MESSAGE [%v]\n", msg) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func new_server_ctl_ws_tty(s *Server) *server_ctl_ws_tty { | ||||||
|  | 	return &server_ctl_ws_tty{s: s, h: websocket.Handler(server_ws_tty)} | ||||||
|  | } | ||||||
|  |  | ||||||
| func (ctl *server_ctl_ws_tty) ServeHTTP(w http.ResponseWriter, req *http.Request) { | func (ctl *server_ctl_ws_tty) ServeHTTP(w http.ResponseWriter, req *http.Request) { | ||||||
| 	ctl.h.ServeHTTP(w, req) | 	ctl.h.ServeHTTP(w, req) | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										35
									
								
								server.go
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								server.go
									
									
									
									
									
								
							| @ -16,8 +16,6 @@ import "google.golang.org/grpc" | |||||||
| //import "google.golang.org/grpc/metadata" | //import "google.golang.org/grpc/metadata" | ||||||
| import "google.golang.org/grpc/peer" | import "google.golang.org/grpc/peer" | ||||||
| import "google.golang.org/grpc/stats" | import "google.golang.org/grpc/stats" | ||||||
| import "golang.org/x/net/websocket" |  | ||||||
|  |  | ||||||
|  |  | ||||||
| const PTS_LIMIT = 8192 | const PTS_LIMIT = 8192 | ||||||
|  |  | ||||||
| @ -57,7 +55,9 @@ type Server struct { | |||||||
| // client connect to the server, the server accept it, and makes a tunnel request | // client connect to the server, the server accept it, and makes a tunnel request | ||||||
| type ServerConn struct { | type ServerConn struct { | ||||||
| 	svr       *Server | 	svr       *Server | ||||||
|  | 	id         uint32 | ||||||
| 	caddr      net.Addr // client address that created this structure | 	caddr      net.Addr // client address that created this structure | ||||||
|  | 	local_addr net.Addr | ||||||
| 	pss       *GuardedPacketStreamServer | 	pss       *GuardedPacketStreamServer | ||||||
|  |  | ||||||
| 	route_mtx  sync.Mutex | 	route_mtx  sync.Mutex | ||||||
| @ -73,6 +73,7 @@ type ServerRoute struct { | |||||||
| 	cts        *ServerConn | 	cts        *ServerConn | ||||||
| 	l          *net.TCPListener | 	l          *net.TCPListener | ||||||
| 	laddr      *net.TCPAddr | 	laddr      *net.TCPAddr | ||||||
|  | 	ptc_addr    string | ||||||
| 	id          uint32 | 	id          uint32 | ||||||
|  |  | ||||||
| 	pts_mtx     sync.Mutex | 	pts_mtx     sync.Mutex | ||||||
| @ -112,7 +113,7 @@ func (g *GuardedPacketStreamServer) Context() context.Context { | |||||||
|  |  | ||||||
| // ------------------------------------ | // ------------------------------------ | ||||||
|  |  | ||||||
| func NewServerRoute(cts *ServerConn, id uint32, proto ROUTE_PROTO) (*ServerRoute, error) { | func NewServerRoute(cts *ServerConn, id uint32, proto ROUTE_PROTO, ptc_addr string) (*ServerRoute, error) { | ||||||
| 	var r ServerRoute | 	var r ServerRoute | ||||||
| 	var l *net.TCPListener | 	var l *net.TCPListener | ||||||
| 	var laddr *net.TCPAddr | 	var laddr *net.TCPAddr | ||||||
| @ -127,6 +128,7 @@ func NewServerRoute(cts *ServerConn, id uint32, proto ROUTE_PROTO) (*ServerRoute | |||||||
| 	r.id = id | 	r.id = id | ||||||
| 	r.l = l | 	r.l = l | ||||||
| 	r.laddr = laddr | 	r.laddr = laddr | ||||||
|  | 	r.ptc_addr = ptc_addr | ||||||
| 	r.pts_limit = PTS_LIMIT | 	r.pts_limit = PTS_LIMIT | ||||||
| 	r.pts_map = make(ServerPeerConnMap) | 	r.pts_map = make(ServerPeerConnMap) | ||||||
| 	r.pts_last_id = 0 | 	r.pts_last_id = 0 | ||||||
| @ -284,7 +286,7 @@ func (cts *ServerConn) make_route_listener(proto ROUTE_PROTO) (*net.TCPListener, | |||||||
| 	return nil, nil, err | 	return nil, nil, err | ||||||
| } | } | ||||||
|  |  | ||||||
| func (cts *ServerConn) AddNewServerRoute(route_id uint32, proto ROUTE_PROTO) (*ServerRoute, error) { | func (cts *ServerConn) AddNewServerRoute(route_id uint32, proto ROUTE_PROTO, ptc_addr string) (*ServerRoute, error) { | ||||||
| 	var r *ServerRoute | 	var r *ServerRoute | ||||||
| 	var err error | 	var err error | ||||||
|  |  | ||||||
| @ -293,7 +295,7 @@ func (cts *ServerConn) AddNewServerRoute(route_id uint32, proto ROUTE_PROTO) (*S | |||||||
| 		cts.route_mtx.Unlock() | 		cts.route_mtx.Unlock() | ||||||
| 		return nil, fmt.Errorf("existent route id - %d", route_id) | 		return nil, fmt.Errorf("existent route id - %d", route_id) | ||||||
| 	} | 	} | ||||||
| 	r, err = NewServerRoute(cts, route_id, proto) | 	r, err = NewServerRoute(cts, route_id, proto, ptc_addr) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		cts.route_mtx.Unlock() | 		cts.route_mtx.Unlock() | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @ -384,7 +386,7 @@ func (cts *ServerConn) receive_from_stream(wg *sync.WaitGroup) { | |||||||
| 				if ok { | 				if ok { | ||||||
| 					var r *ServerRoute | 					var r *ServerRoute | ||||||
|  |  | ||||||
| 					r, err = cts.AddNewServerRoute(x.Route.RouteId, x.Route.Proto) | 					r, err = cts.AddNewServerRoute(x.Route.RouteId, x.Route.Proto, x.Route.AddrStr) | ||||||
| 					if err != nil { | 					if err != nil { | ||||||
| 						cts.svr.log.Write("", LOG_ERROR, "Failed to add server route for client %s peer %s", cts.caddr, x.Route.AddrStr) | 						cts.svr.log.Write("", LOG_ERROR, "Failed to add server route for client %s peer %s", cts.caddr, x.Route.AddrStr) | ||||||
| 					} else { | 					} else { | ||||||
| @ -579,7 +581,7 @@ func (s *Server) PacketStream(strm Hodu_PacketStreamServer) error { | |||||||
| 		return fmt.Errorf("failed to get peer from packet stream context") | 		return fmt.Errorf("failed to get peer from packet stream context") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cts, err = s.AddNewServerConn(p.Addr, strm) | 	cts, err = s.AddNewServerConn(&p.Addr, &p.LocalAddr, strm) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("unable to add client %s - %s", p.Addr.String(), err.Error()) | 		return fmt.Errorf("unable to add client %s - %s", p.Addr.String(), err.Error()) | ||||||
| 	} | 	} | ||||||
| @ -749,8 +751,8 @@ func NewServer(ctx context.Context, ctl_addr string, laddrs []string, logger Log | |||||||
| 	cwd, _ = os.Getwd() | 	cwd, _ = os.Getwd() | ||||||
| 	s.ctl_mux.Handle(s.ctl_prefix + "/ui/", http.StripPrefix(s.ctl_prefix, http.FileServer(http.Dir(cwd)))) // TODO: proper directory. it must not use the current working directory... | 	s.ctl_mux.Handle(s.ctl_prefix + "/ui/", http.StripPrefix(s.ctl_prefix, http.FileServer(http.Dir(cwd)))) // TODO: proper directory. it must not use the current working directory... | ||||||
| 	//s.ctl_mux.HandleFunc(s.ctl_prefix + "/ws/tty", websocket.Handler(server_ws_tty).ServeHTTP) | 	//s.ctl_mux.HandleFunc(s.ctl_prefix + "/ws/tty", websocket.Handler(server_ws_tty).ServeHTTP) | ||||||
| 	s.ctl_mux.Handle(s.ctl_prefix + "/ws/tty", &server_ctl_ws_tty{s: &s, h: websocket.Handler(server_ws_tty)}) | 	s.ctl_mux.Handle(s.ctl_prefix + "/ws/tty", new_server_ctl_ws_tty(&s)) | ||||||
| 	s.ctl_mux.Handle(s.ctl_prefix + "/server-conns", &server_ctl_client_conns{s: &s}) | 	s.ctl_mux.Handle(s.ctl_prefix + "/server-conns", &server_ctl_server_conns{s: &s}) | ||||||
|  |  | ||||||
| 	s.ctl = &http.Server{ | 	s.ctl = &http.Server{ | ||||||
| 		Addr: ctl_addr, | 		Addr: ctl_addr, | ||||||
| @ -868,13 +870,14 @@ func (s *Server) ReqStop() { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (s *Server) AddNewServerConn(addr net.Addr, pss Hodu_PacketStreamServer) (*ServerConn, error) { | func (s *Server) AddNewServerConn(remote_addr *net.Addr, local_addr *net.Addr, pss Hodu_PacketStreamServer) (*ServerConn, error) { | ||||||
| 	var cts ServerConn | 	var cts ServerConn | ||||||
| 	var ok bool | 	var ok bool | ||||||
|  |  | ||||||
| 	cts.svr = s | 	cts.svr = s | ||||||
| 	cts.route_map = make(ServerRouteMap) | 	cts.route_map = make(ServerRouteMap) | ||||||
| 	cts.caddr = addr | 	cts.caddr = *remote_addr | ||||||
|  | 	cts.local_addr = *local_addr | ||||||
| 	cts.pss = &GuardedPacketStreamServer{Hodu_PacketStreamServer: pss} | 	cts.pss = &GuardedPacketStreamServer{Hodu_PacketStreamServer: pss} | ||||||
|  |  | ||||||
| 	cts.stop_req.Store(false) | 	cts.stop_req.Store(false) | ||||||
| @ -883,12 +886,12 @@ func (s *Server) AddNewServerConn(addr net.Addr, pss Hodu_PacketStreamServer) (* | |||||||
| 	s.cts_mtx.Lock() | 	s.cts_mtx.Lock() | ||||||
| 	defer s.cts_mtx.Unlock() | 	defer s.cts_mtx.Unlock() | ||||||
|  |  | ||||||
| 	_, ok = s.cts_map[addr] | 	_, ok = s.cts_map[cts.caddr] | ||||||
| 	if ok { | 	if ok { | ||||||
| 		return nil, fmt.Errorf("existing client - %s", addr.String()) | 		return nil, fmt.Errorf("existing client - %s", cts.caddr.String()) | ||||||
| 	} | 	} | ||||||
| 	s.cts_map[addr] = &cts | 	s.cts_map[cts.caddr] = &cts | ||||||
| 	s.log.Write("", LOG_DEBUG, "Added client connection from %s", addr.String()) | 	s.log.Write("", LOG_DEBUG, "Added client connection from %s", cts.caddr.String()) | ||||||
| 	return &cts, nil | 	return &cts, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -908,8 +911,8 @@ func (s *Server) RemoveServerConnByAddr(addr net.Addr) { | |||||||
|  |  | ||||||
| 	cts, ok = s.cts_map[addr] | 	cts, ok = s.cts_map[addr] | ||||||
| 	if ok { | 	if ok { | ||||||
| 		cts.ReqStop() |  | ||||||
| 		delete(s.cts_map, cts.caddr) | 		delete(s.cts_map, cts.caddr) | ||||||
|  | 		cts.ReqStop() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user