syntax = "proto2"; option go_package = "socket"; package appengine; message RemoteSocketServiceError { enum ErrorCode { SYSTEM_ERROR = 1; GAI_ERROR = 2; FAILURE = 4; PERMISSION_DENIED = 5; INVALID_REQUEST = 6; SOCKET_CLOSED = 7; } enum SystemError { option allow_alias = true; SYS_SUCCESS = 0; SYS_EPERM = 1; SYS_ENOENT = 2; SYS_ESRCH = 3; SYS_EINTR = 4; SYS_EIO = 5; SYS_ENXIO = 6; SYS_E2BIG = 7; SYS_ENOEXEC = 8; SYS_EBADF = 9; SYS_ECHILD = 10; SYS_EAGAIN = 11; SYS_EWOULDBLOCK = 11; SYS_ENOMEM = 12; SYS_EACCES = 13; SYS_EFAULT = 14; SYS_ENOTBLK = 15; SYS_EBUSY = 16; SYS_EEXIST = 17; SYS_EXDEV = 18; SYS_ENODEV = 19; SYS_ENOTDIR = 20; SYS_EISDIR = 21; SYS_EINVAL = 22; SYS_ENFILE = 23; SYS_EMFILE = 24; SYS_ENOTTY = 25; SYS_ETXTBSY = 26; SYS_EFBIG = 27; SYS_ENOSPC = 28; SYS_ESPIPE = 29; SYS_EROFS = 30; SYS_EMLINK = 31; SYS_EPIPE = 32; SYS_EDOM = 33; SYS_ERANGE = 34; SYS_EDEADLK = 35; SYS_EDEADLOCK = 35; SYS_ENAMETOOLONG = 36; SYS_ENOLCK = 37; SYS_ENOSYS = 38; SYS_ENOTEMPTY = 39; SYS_ELOOP = 40; SYS_ENOMSG = 42; SYS_EIDRM = 43; SYS_ECHRNG = 44; SYS_EL2NSYNC = 45; SYS_EL3HLT = 46; SYS_EL3RST = 47; SYS_ELNRNG = 48; SYS_EUNATCH = 49; SYS_ENOCSI = 50; SYS_EL2HLT = 51; SYS_EBADE = 52; SYS_EBADR = 53; SYS_EXFULL = 54; SYS_ENOANO = 55; SYS_EBADRQC = 56; SYS_EBADSLT = 57; SYS_EBFONT = 59; SYS_ENOSTR = 60; SYS_ENODATA = 61; SYS_ETIME = 62; SYS_ENOSR = 63; SYS_ENONET = 64; SYS_ENOPKG = 65; SYS_EREMOTE = 66; SYS_ENOLINK = 67; SYS_EADV = 68; SYS_ESRMNT = 69; SYS_ECOMM = 70; SYS_EPROTO = 71; SYS_EMULTIHOP = 72; SYS_EDOTDOT = 73; SYS_EBADMSG = 74; SYS_EOVERFLOW = 75; SYS_ENOTUNIQ = 76; SYS_EBADFD = 77; SYS_EREMCHG = 78; SYS_ELIBACC = 79; SYS_ELIBBAD = 80; SYS_ELIBSCN = 81; SYS_ELIBMAX = 82; SYS_ELIBEXEC = 83; SYS_EILSEQ = 84; SYS_ERESTART = 85; SYS_ESTRPIPE = 86; SYS_EUSERS = 87; SYS_ENOTSOCK = 88; SYS_EDESTADDRREQ = 89; SYS_EMSGSIZE = 90; SYS_EPROTOTYPE = 91; SYS_ENOPROTOOPT = 92; SYS_EPROTONOSUPPORT = 93; SYS_ESOCKTNOSUPPORT = 94; SYS_EOPNOTSUPP = 95; SYS_ENOTSUP = 95; SYS_EPFNOSUPPORT = 96; SYS_EAFNOSUPPORT = 97; SYS_EADDRINUSE = 98; SYS_EADDRNOTAVAIL = 99; SYS_ENETDOWN = 100; SYS_ENETUNREACH = 101; SYS_ENETRESET = 102; SYS_ECONNABORTED = 103; SYS_ECONNRESET = 104; SYS_ENOBUFS = 105; SYS_EISCONN = 106; SYS_ENOTCONN = 107; SYS_ESHUTDOWN = 108; SYS_ETOOMANYREFS = 109; SYS_ETIMEDOUT = 110; SYS_ECONNREFUSED = 111; SYS_EHOSTDOWN = 112; SYS_EHOSTUNREACH = 113; SYS_EALREADY = 114; SYS_EINPROGRESS = 115; SYS_ESTALE = 116; SYS_EUCLEAN = 117; SYS_ENOTNAM = 118; SYS_ENAVAIL = 119; SYS_EISNAM = 120; SYS_EREMOTEIO = 121; SYS_EDQUOT = 122; SYS_ENOMEDIUM = 123; SYS_EMEDIUMTYPE = 124; SYS_ECANCELED = 125; SYS_ENOKEY = 126; SYS_EKEYEXPIRED = 127; SYS_EKEYREVOKED = 128; SYS_EKEYREJECTED = 129; SYS_EOWNERDEAD = 130; SYS_ENOTRECOVERABLE = 131; SYS_ERFKILL = 132; } optional int32 system_error = 1 [default=0]; optional string error_detail = 2; } message AddressPort { required int32 port = 1; optional bytes packed_address = 2; optional string hostname_hint = 3; } message CreateSocketRequest { enum SocketFamily { IPv4 = 1; IPv6 = 2; } enum SocketProtocol { TCP = 1; UDP = 2; } required SocketFamily family = 1; required SocketProtocol protocol = 2; repeated SocketOption socket_options = 3; optional AddressPort proxy_external_ip = 4; optional int32 listen_backlog = 5 [default=0]; optional AddressPort remote_ip = 6; optional string app_id = 9; optional int64 project_id = 10; } message CreateSocketReply { optional string socket_descriptor = 1; optional AddressPort server_address = 3; optional AddressPort proxy_external_ip = 4; extensions 1000 to max; } message BindRequest { required string socket_descriptor = 1; required AddressPort proxy_external_ip = 2; } message BindReply { optional AddressPort proxy_external_ip = 1; } message GetSocketNameRequest { required string socket_descriptor = 1; } message GetSocketNameReply { optional AddressPort proxy_external_ip = 2; } message GetPeerNameRequest { required string socket_descriptor = 1; } message GetPeerNameReply { optional AddressPort peer_ip = 2; } message SocketOption { enum SocketOptionLevel { SOCKET_SOL_IP = 0; SOCKET_SOL_SOCKET = 1; SOCKET_SOL_TCP = 6; SOCKET_SOL_UDP = 17; } enum SocketOptionName { option allow_alias = true; SOCKET_SO_DEBUG = 1; SOCKET_SO_REUSEADDR = 2; SOCKET_SO_TYPE = 3; SOCKET_SO_ERROR = 4; SOCKET_SO_DONTROUTE = 5; SOCKET_SO_BROADCAST = 6; SOCKET_SO_SNDBUF = 7; SOCKET_SO_RCVBUF = 8; SOCKET_SO_KEEPALIVE = 9; SOCKET_SO_OOBINLINE = 10; SOCKET_SO_LINGER = 13; SOCKET_SO_RCVTIMEO = 20; SOCKET_SO_SNDTIMEO = 21; SOCKET_IP_TOS = 1; SOCKET_IP_TTL = 2; SOCKET_IP_HDRINCL = 3; SOCKET_IP_OPTIONS = 4; SOCKET_TCP_NODELAY = 1; SOCKET_TCP_MAXSEG = 2; SOCKET_TCP_CORK = 3; SOCKET_TCP_KEEPIDLE = 4; SOCKET_TCP_KEEPINTVL = 5; SOCKET_TCP_KEEPCNT = 6; SOCKET_TCP_SYNCNT = 7; SOCKET_TCP_LINGER2 = 8; SOCKET_TCP_DEFER_ACCEPT = 9; SOCKET_TCP_WINDOW_CLAMP = 10; SOCKET_TCP_INFO = 11; SOCKET_TCP_QUICKACK = 12; } required SocketOptionLevel level = 1; required SocketOptionName option = 2; required bytes value = 3; } message SetSocketOptionsRequest { required string socket_descriptor = 1; repeated SocketOption options = 2; } message SetSocketOptionsReply { } message GetSocketOptionsRequest { required string socket_descriptor = 1; repeated SocketOption options = 2; } message GetSocketOptionsReply { repeated SocketOption options = 2; } message ConnectRequest { required string socket_descriptor = 1; required AddressPort remote_ip = 2; optional double timeout_seconds = 3 [default=-1]; } message ConnectReply { optional AddressPort proxy_external_ip = 1; extensions 1000 to max; } message ListenRequest { required string socket_descriptor = 1; required int32 backlog = 2; } message ListenReply { } message AcceptRequest { required string socket_descriptor = 1; optional double timeout_seconds = 2 [default=-1]; } message AcceptReply { optional bytes new_socket_descriptor = 2; optional AddressPort remote_address = 3; } message ShutDownRequest { enum How { SOCKET_SHUT_RD = 1; SOCKET_SHUT_WR = 2; SOCKET_SHUT_RDWR = 3; } required string socket_descriptor = 1; required How how = 2; required int64 send_offset = 3; } message ShutDownReply { } message CloseRequest { required string socket_descriptor = 1; optional int64 send_offset = 2 [default=-1]; } message CloseReply { } message SendRequest { required string socket_descriptor = 1; required bytes data = 2 [ctype=CORD]; required int64 stream_offset = 3; optional int32 flags = 4 [default=0]; optional AddressPort send_to = 5; optional double timeout_seconds = 6 [default=-1]; } message SendReply { optional int32 data_sent = 1; } message ReceiveRequest { enum Flags { MSG_OOB = 1; MSG_PEEK = 2; } required string socket_descriptor = 1; required int32 data_size = 2; optional int32 flags = 3 [default=0]; optional double timeout_seconds = 5 [default=-1]; } message ReceiveReply { optional int64 stream_offset = 2; optional bytes data = 3 [ctype=CORD]; optional AddressPort received_from = 4; optional int32 buffer_size = 5; } message PollEvent { enum PollEventFlag { SOCKET_POLLNONE = 0; SOCKET_POLLIN = 1; SOCKET_POLLPRI = 2; SOCKET_POLLOUT = 4; SOCKET_POLLERR = 8; SOCKET_POLLHUP = 16; SOCKET_POLLNVAL = 32; SOCKET_POLLRDNORM = 64; SOCKET_POLLRDBAND = 128; SOCKET_POLLWRNORM = 256; SOCKET_POLLWRBAND = 512; SOCKET_POLLMSG = 1024; SOCKET_POLLREMOVE = 4096; SOCKET_POLLRDHUP = 8192; }; required string socket_descriptor = 1; required int32 requested_events = 2; required int32 observed_events = 3; } message PollRequest { repeated PollEvent events = 1; optional double timeout_seconds = 2 [default=-1]; } message PollReply { repeated PollEvent events = 2; } message ResolveRequest { required string name = 1; repeated CreateSocketRequest.SocketFamily address_families = 2; } message ResolveReply { enum ErrorCode { SOCKET_EAI_ADDRFAMILY = 1; SOCKET_EAI_AGAIN = 2; SOCKET_EAI_BADFLAGS = 3; SOCKET_EAI_FAIL = 4; SOCKET_EAI_FAMILY = 5; SOCKET_EAI_MEMORY = 6; SOCKET_EAI_NODATA = 7; SOCKET_EAI_NONAME = 8; SOCKET_EAI_SERVICE = 9; SOCKET_EAI_SOCKTYPE = 10; SOCKET_EAI_SYSTEM = 11; SOCKET_EAI_BADHINTS = 12; SOCKET_EAI_PROTOCOL = 13; SOCKET_EAI_OVERFLOW = 14; SOCKET_EAI_MAX = 15; }; repeated bytes packed_address = 2; optional string canonical_name = 3; repeated string aliases = 4; }