/* * * Copyright 2018 gRPC 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. * */ #ifndef GRPC_CORE_LIB_IOMGR_TCP_CUSTOM_H #define GRPC_CORE_LIB_IOMGR_TCP_CUSTOM_H #include #include "src/core/lib/iomgr/endpoint.h" #include "src/core/lib/iomgr/sockaddr.h" typedef struct grpc_tcp_listener grpc_tcp_listener; typedef struct grpc_custom_tcp_connect grpc_custom_tcp_connect; typedef struct grpc_custom_socket { // Implementation defined void* impl; grpc_endpoint* endpoint; grpc_tcp_listener* listener; grpc_custom_tcp_connect* connector; int refs; } grpc_custom_socket; typedef void (*grpc_custom_connect_callback)(grpc_custom_socket* socket, grpc_error* error); typedef void (*grpc_custom_write_callback)(grpc_custom_socket* socket, grpc_error* error); typedef void (*grpc_custom_read_callback)(grpc_custom_socket* socket, size_t nread, grpc_error* error); typedef void (*grpc_custom_accept_callback)(grpc_custom_socket* socket, grpc_custom_socket* client, grpc_error* error); typedef void (*grpc_custom_close_callback)(grpc_custom_socket* socket); typedef struct grpc_socket_vtable { grpc_error* (*init)(grpc_custom_socket* socket, int domain); void (*connect)(grpc_custom_socket* socket, const grpc_sockaddr* addr, size_t len, grpc_custom_connect_callback cb); void (*destroy)(grpc_custom_socket* socket); void (*shutdown)(grpc_custom_socket* socket); void (*close)(grpc_custom_socket* socket, grpc_custom_close_callback cb); void (*write)(grpc_custom_socket* socket, grpc_slice_buffer* slices, grpc_custom_write_callback cb); void (*read)(grpc_custom_socket* socket, char* buffer, size_t length, grpc_custom_read_callback cb); grpc_error* (*getpeername)(grpc_custom_socket* socket, const grpc_sockaddr* addr, int* len); grpc_error* (*getsockname)(grpc_custom_socket* socket, const grpc_sockaddr* addr, int* len); grpc_error* (*bind)(grpc_custom_socket* socket, const grpc_sockaddr* addr, size_t len, int flags); grpc_error* (*listen)(grpc_custom_socket* socket); void (*accept)(grpc_custom_socket* socket, grpc_custom_socket* client, grpc_custom_accept_callback cb); } grpc_socket_vtable; /* Internal APIs */ void grpc_custom_endpoint_init(grpc_socket_vtable* impl); void grpc_custom_close_server_callback(grpc_tcp_listener* listener); grpc_endpoint* custom_tcp_endpoint_create(grpc_custom_socket* socket, grpc_resource_quota* resource_quota, char* peer_string); #endif /* GRPC_CORE_LIB_IOMGR_TCP_CUSTOM_H */