// Copyright 2020 The gVisor Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. syntax = "proto3"; package posix_server; message SockaddrIn { int32 family = 1; uint32 port = 2; bytes addr = 3; } message SockaddrIn6 { uint32 family = 1; uint32 port = 2; uint32 flowinfo = 3; bytes addr = 4; uint32 scope_id = 5; } message Sockaddr { oneof sockaddr { SockaddrIn in = 1; SockaddrIn6 in6 = 2; } } message Timeval { int64 seconds = 1; int64 microseconds = 2; } // Request and Response pairs for each Posix service RPC call, sorted. message AcceptRequest { int32 sockfd = 1; } message AcceptResponse { int32 fd = 1; int32 errno_ = 2; // "errno" may fail to compile in c++. Sockaddr addr = 3; } message BindRequest { int32 sockfd = 1; Sockaddr addr = 2; } message BindResponse { int32 ret = 1; int32 errno_ = 2; // "errno" may fail to compile in c++. } message CloseRequest { int32 fd = 1; } message CloseResponse { int32 ret = 1; int32 errno_ = 2; // "errno" may fail to compile in c++. } message GetSockNameRequest { int32 sockfd = 1; } message GetSockNameResponse { int32 ret = 1; int32 errno_ = 2; // "errno" may fail to compile in c++. Sockaddr addr = 3; } message ListenRequest { int32 sockfd = 1; int32 backlog = 2; } message ListenResponse { int32 ret = 1; int32 errno_ = 2; // "errno" may fail to compile in c++. } message SetSockOptRequest { int32 sockfd = 1; int32 level = 2; int32 optname = 3; bytes optval = 4; } message SetSockOptResponse { int32 ret = 1; int32 errno_ = 2; // "errno" may fail to compile in c++. } message SetSockOptTimevalRequest { int32 sockfd = 1; int32 level = 2; int32 optname = 3; Timeval timeval = 4; } message SetSockOptTimevalResponse { int32 ret = 1; int32 errno_ = 2; // "errno" may fail to compile in c++. } message SocketRequest { int32 domain = 1; int32 type = 2; int32 protocol = 3; } message SocketResponse { int32 fd = 1; int32 errno_ = 2; // "errno" may fail to compile in c++. } message RecvRequest { int32 sockfd = 1; int32 len = 2; int32 flags = 3; } message RecvResponse { int32 ret = 1; int32 errno_ = 2; // "errno" may fail to compile in c++. bytes buf = 3; } service Posix { // Call accept() on the DUT. rpc Accept(AcceptRequest) returns (AcceptResponse); // Call bind() on the DUT. rpc Bind(BindRequest) returns (BindResponse); // Call close() on the DUT. rpc Close(CloseRequest) returns (CloseResponse); // Call getsockname() on the DUT. rpc GetSockName(GetSockNameRequest) returns (GetSockNameResponse); // Call listen() on the DUT. rpc Listen(ListenRequest) returns (ListenResponse); // Call setsockopt() on the DUT. You should prefer one of the other // SetSockOpt* functions with a more structured optval or else you may get the // encoding wrong, such as making a bad assumption about the server's word // sizes or endianness. rpc SetSockOpt(SetSockOptRequest) returns (SetSockOptResponse); // Call setsockopt() on the DUT with a Timeval optval. rpc SetSockOptTimeval(SetSockOptTimevalRequest) returns (SetSockOptTimevalResponse); // Call socket() on the DUT. rpc Socket(SocketRequest) returns (SocketResponse); // Call recv() on the DUT. rpc Recv(RecvRequest) returns (RecvResponse); }