mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-09-01 08:49:16 +00:00
4a10d1c2b9
* feat(mobile): add embedded iOS runtime API Add a thin panic-safe C ABI crate for embedding no-TUN instances on iOS. Expose lifecycle, status, JSON-RPC, string ownership, and error handling. Build device and simulator XCFramework static libraries on macOS. Add exact named-instance deletion to the iOS and Android wrappers. Cover wrapper lifecycle and the port-forward patch flow on host targets. * fix(gateway): recover TCP port-forward listeners Release an unusable TCP port-forward listener after an accept failure. Retry binding until the forward is cancelled. Keep the old listener released while rebinding so mobile sockets can recover. Expose opt-in iOS diagnostics for listener and connection events. Trace configuration removal and adapter shutdown. Add tests for recovery, release-before-rebind, and cancellation. * feat(web): persist incremental managed config patches Add a revision-CAS PATCH contract for managed configs while keeping the existing Full PUT path for compatibility and recovery. Apply Full and Patch mutations with their revision in one SQLite transaction. Reject ownership conflicts and invalidate revisions on alternate web-owned writes. Document limits, failure semantics, rollout order, and verification. Cover delta updates, conflicts, idempotency, and transaction rollback. * feat(web): apply managed config patches to live sessions Carry Patch fences and touched instance IDs into live sessions. Reconcile only those instances when the applied revision matches the Patch base. Fall back to Full reconciliation for gaps and restarts. Invalidate the applied revision around every direct runtime mutation. Fence revision advancement with the runtime cache epoch so stale reconcile rounds cannot overwrite a newer invalidation. Require deletion responses to confirm each requested instance before advancing the revision. Raise the managed PUT and PATCH body limit to 32 MiB and return typed conflicts for publisher recovery. * fix(core): retry transient accepted TCP errors Keep TCP tunnel listeners alive when an accepted socket fails during upgrade with a retryable connection-state error. Share the retryable I/O classifier with the socket listener. Cover a rejected connection followed by success and propagation of permanent errors. * feat(core): add internal Peer Relay edge projection Derive the local advertised OSPF row from physical adjacency and transport-authenticated credential relay coverage. Keep full local adjacency only in the temporary SPF snapshot so direct destinations retain a fallback route. Leave Peer Relay disabled at the public configuration seam. A follow-up change can expose the preference without coupling route projection to credential reauthorization. feat(config): expose Peer Relay routing preference Add prefer_peer_relay to public protobuf, TOML, management patch, and hosted runtime surfaces. Read the preference from live peer context so runtime config updates take effect. Refresh authenticated peer metadata when the option is enabled. Cover dynamic enable and disable in a five-node, dual-admin credential topology, including forwarded relay coverage and local fallback.
284 lines
6.3 KiB
Protocol Buffer
284 lines
6.3 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
import "error.proto";
|
|
|
|
package common;
|
|
|
|
message FlagsInConfig {
|
|
string default_protocol = 1;
|
|
string dev_name = 2;
|
|
bool enable_encryption = 3;
|
|
bool enable_ipv6 = 4;
|
|
uint32 mtu = 5;
|
|
bool latency_first = 6;
|
|
bool enable_exit_node = 7;
|
|
bool no_tun = 8;
|
|
bool use_smoltcp = 9;
|
|
string relay_network_whitelist = 10;
|
|
bool disable_p2p = 11;
|
|
bool relay_all_peer_rpc = 12;
|
|
bool disable_udp_hole_punching = 13;
|
|
// string ipv6_listener = 14; [deprecated = true]; use -l udp://[::]:12345
|
|
// instead
|
|
bool multi_thread = 15;
|
|
CompressionAlgoPb data_compress_algo = 16;
|
|
bool bind_device = 17;
|
|
|
|
// should we convert all tcp streams into kcp streams
|
|
bool enable_kcp_proxy = 18;
|
|
// does this peer allow kcp input
|
|
bool disable_kcp_input = 19;
|
|
// disable relay local network kcp packets
|
|
bool disable_relay_kcp = 20;
|
|
bool proxy_forward_by_system = 21;
|
|
|
|
// enable magic dns or not
|
|
bool accept_dns = 22;
|
|
// enable private mode
|
|
bool private_mode = 23;
|
|
|
|
// should we convert all tcp streams into quic streams
|
|
bool enable_quic_proxy = 24;
|
|
// does this peer allow quic input
|
|
bool disable_quic_input = 25;
|
|
// disable relay local network quic packets
|
|
bool disable_relay_quic = 35;
|
|
|
|
// quic listen port
|
|
uint32 quic_listen_port = 33 [deprecated = true];
|
|
|
|
// a global relay limit, only work for foreign network
|
|
uint64 foreign_relay_bps_limit = 26;
|
|
|
|
uint32 multi_thread_count = 27;
|
|
|
|
// enable relay foreign network kcp packets
|
|
bool enable_relay_foreign_network_kcp = 28;
|
|
|
|
// enable relay foreign network quic packets
|
|
bool enable_relay_foreign_network_quic = 36;
|
|
|
|
// encryption algorithm to use, empty string means default (aes-gcm)
|
|
string encryption_algorithm = 29;
|
|
|
|
// disable symmetric nat hole punching, treat symmetric as cone when enabled
|
|
bool disable_sym_hole_punching = 30;
|
|
|
|
// tld dns zone for magic dns
|
|
string tld_dns_zone = 31;
|
|
|
|
bool p2p_only = 32;
|
|
|
|
bool disable_tcp_hole_punching = 34;
|
|
|
|
bool lazy_p2p = 37;
|
|
bool need_p2p = 38;
|
|
uint64 instance_recv_bps_limit = 39;
|
|
bool disable_upnp = 40;
|
|
bool disable_relay_data = 41;
|
|
bool enable_udp_broadcast_relay = 42;
|
|
|
|
// Linux-only: SO_MARK (fwmark) value applied to every outbound underlay
|
|
// socket (TCP/UDP/QUIC/WS/WG connectors and listeners). Unset = leave
|
|
// SO_MARK untouched (kernel default 0). Any set value (including 0) is
|
|
// applied via setsockopt. Requires CAP_NET_ADMIN; silently ignored on
|
|
// non-Linux platforms.
|
|
optional uint32 socket_mark = 43;
|
|
|
|
// Prefer direct credential peers that already relay to a destination over
|
|
// advertising another direct edge to the same destination.
|
|
bool prefer_peer_relay = 44;
|
|
}
|
|
|
|
message RpcDescriptor {
|
|
// allow same service registered multiple times in different domain
|
|
string domain_name = 1;
|
|
|
|
string proto_name = 2;
|
|
string service_name = 3;
|
|
uint32 method_index = 4;
|
|
}
|
|
|
|
message RpcRequest {
|
|
RpcDescriptor descriptor = 1 [ deprecated = true ];
|
|
|
|
bytes request = 2;
|
|
int32 timeout_ms = 3;
|
|
}
|
|
|
|
// One transport-neutral RPC invocation submitted through a direct ABI.
|
|
//
|
|
// full_method_name uses the protobuf reflection form:
|
|
// "<package>.<service>.<method>" or "<service>.<method>" for an empty package.
|
|
message DirectRpcRequest {
|
|
string full_method_name = 1;
|
|
bytes request = 2;
|
|
optional uint64 timeout_ms = 3;
|
|
}
|
|
|
|
// One process-level management call delegated by the WASI WebClient to its host.
|
|
message HostManagementRequest {
|
|
DirectRpcRequest rpc = 1;
|
|
optional string prepared_config = 2;
|
|
// Runtime identity paired with prepared_config without rewriting rpc.request.
|
|
UUID prepared_instance_id = 3;
|
|
}
|
|
|
|
message RpcResponse {
|
|
bytes response = 1;
|
|
error.Error error = 2;
|
|
|
|
uint64 runtime_us = 3;
|
|
}
|
|
|
|
enum CompressionAlgoPb {
|
|
Invalid = 0;
|
|
None = 1;
|
|
Zstd = 2;
|
|
}
|
|
|
|
message RpcCompressionInfo {
|
|
// use this to compress the content
|
|
CompressionAlgoPb algo = 1;
|
|
|
|
// tell the peer which compression algo is used to compress the next
|
|
// response/request
|
|
CompressionAlgoPb accepted_algo = 2;
|
|
}
|
|
|
|
message RpcPacket {
|
|
uint32 from_peer = 1;
|
|
uint32 to_peer = 2;
|
|
int64 transaction_id = 3;
|
|
|
|
RpcDescriptor descriptor = 4;
|
|
bytes body = 5;
|
|
bool is_request = 6;
|
|
|
|
uint32 total_pieces = 7;
|
|
uint32 piece_idx = 8;
|
|
|
|
int32 trace_id = 9;
|
|
|
|
RpcCompressionInfo compression_info = 10;
|
|
}
|
|
|
|
message Void {}
|
|
|
|
message UUID {
|
|
uint32 part1 = 1;
|
|
uint32 part2 = 2;
|
|
uint32 part3 = 3;
|
|
uint32 part4 = 4;
|
|
}
|
|
|
|
enum NatType {
|
|
// has NAT; but own a single public IP, port is not changed
|
|
Unknown = 0;
|
|
OpenInternet = 1;
|
|
NoPAT = 2;
|
|
FullCone = 3;
|
|
Restricted = 4;
|
|
PortRestricted = 5;
|
|
Symmetric = 6;
|
|
SymUdpFirewall = 7;
|
|
SymmetricEasyInc = 8;
|
|
SymmetricEasyDec = 9;
|
|
}
|
|
|
|
message Ipv4Addr { uint32 addr = 1; }
|
|
|
|
message Ipv6Addr {
|
|
uint32 part1 = 1;
|
|
uint32 part2 = 2;
|
|
uint32 part3 = 3;
|
|
uint32 part4 = 4;
|
|
}
|
|
|
|
message IpAddr {
|
|
oneof ip {
|
|
Ipv4Addr ipv4 = 1;
|
|
Ipv6Addr ipv6 = 2;
|
|
};
|
|
}
|
|
|
|
message Ipv4Inet {
|
|
Ipv4Addr address = 1;
|
|
uint32 network_length = 2;
|
|
}
|
|
|
|
message Ipv6Inet {
|
|
Ipv6Addr address = 1;
|
|
uint32 network_length = 2;
|
|
}
|
|
|
|
message IpInet {
|
|
oneof ip {
|
|
Ipv4Inet ipv4 = 1;
|
|
Ipv6Inet ipv6 = 2;
|
|
};
|
|
}
|
|
|
|
message Url { string url = 1; }
|
|
|
|
message SocketAddr {
|
|
oneof ip {
|
|
Ipv4Addr ipv4 = 1;
|
|
Ipv6Addr ipv6 = 2;
|
|
};
|
|
uint32 port = 3;
|
|
}
|
|
|
|
message TunnelInfo {
|
|
string tunnel_type = 1;
|
|
common.Url local_addr = 2;
|
|
common.Url remote_addr = 3;
|
|
common.Url resolved_remote_addr = 4;
|
|
}
|
|
|
|
message StunInfo {
|
|
NatType udp_nat_type = 1;
|
|
NatType tcp_nat_type = 2;
|
|
int64 last_update_time = 3;
|
|
repeated string public_ip = 4;
|
|
uint32 min_port = 5;
|
|
uint32 max_port = 6;
|
|
}
|
|
|
|
message PeerFeatureFlag {
|
|
bool is_public_server = 1;
|
|
bool avoid_relay_data = 2;
|
|
bool kcp_input = 3;
|
|
bool no_relay_kcp = 4;
|
|
bool support_conn_list_sync = 5;
|
|
bool quic_input = 6;
|
|
bool no_relay_quic = 7;
|
|
bool is_credential_peer = 8;
|
|
bool need_p2p = 9;
|
|
bool disable_p2p = 10;
|
|
bool ipv6_public_addr_provider = 11;
|
|
}
|
|
|
|
enum SocketType {
|
|
TCP = 0;
|
|
UDP = 1;
|
|
}
|
|
|
|
message PortForwardConfigPb {
|
|
SocketAddr bind_addr = 1;
|
|
SocketAddr dst_addr = 2;
|
|
SocketType socket_type = 3;
|
|
}
|
|
|
|
message ProxyDstInfo { SocketAddr dst_addr = 1; }
|
|
|
|
message SecureModeConfig {
|
|
bool enabled = 1;
|
|
|
|
// base64(X25519 private key), used by shared node to present a stable identity
|
|
optional string local_private_key = 2;
|
|
|
|
// base64(X25519 public key), required if local_private_key is set
|
|
optional string local_public_key = 3;
|
|
}
|