• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 //
3 // Copyright 2015 gRPC authors.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 //
18 
19 #ifndef GRPC_SRC_CORE_LIB_IOMGR_TCP_SERVER_H
20 #define GRPC_SRC_CORE_LIB_IOMGR_TCP_SERVER_H
21 
22 #include <grpc/event_engine/endpoint_config.h>
23 #include <grpc/grpc.h>
24 #include <grpc/impl/grpc_types.h>
25 #include <grpc/support/port_platform.h>
26 
27 #include <vector>
28 
29 #include "src/core/lib/iomgr/closure.h"
30 #include "src/core/lib/iomgr/endpoint.h"
31 #include "src/core/lib/iomgr/resolve_address.h"
32 
33 // Forward decl of grpc_tcp_server
34 typedef struct grpc_tcp_server grpc_tcp_server;
35 
36 typedef struct grpc_tcp_server_acceptor {
37   // grpc_tcp_server_cb functions share a ref on from_server that is valid
38   // until the function returns.
39   grpc_tcp_server* from_server;
40   // Indices that may be passed to grpc_tcp_server_port_fd().
41   unsigned port_index;
42   unsigned fd_index;
43   // Data when the connection is passed to tcp_server from external.
44   bool external_connection;
45   int listener_fd;
46   grpc_byte_buffer* pending_data;
47 } grpc_tcp_server_acceptor;
48 
49 // Called for newly connected TCP connections.
50 // Takes ownership of acceptor.
51 typedef void (*grpc_tcp_server_cb)(void* arg, grpc_endpoint* ep,
52                                    grpc_pollset* accepting_pollset,
53                                    grpc_tcp_server_acceptor* acceptor);
54 namespace grpc_core {
55 // An interface for a handler to take a externally connected fd as a internal
56 // connection.
57 class TcpServerFdHandler {
58  public:
59   virtual ~TcpServerFdHandler() = default;
60   virtual void Handle(int listener_fd, int fd,
61                       grpc_byte_buffer* pending_read) = 0;
62 };
63 }  // namespace grpc_core
64 
65 typedef struct grpc_tcp_server_vtable {
66   grpc_error_handle (*create)(
67       grpc_closure* shutdown_complete,
68       const grpc_event_engine::experimental::EndpointConfig& config,
69       grpc_tcp_server_cb on_accept_cb, void* cb_arg, grpc_tcp_server** server);
70   void (*start)(grpc_tcp_server* server,
71                 const std::vector<grpc_pollset*>* pollsets);
72   grpc_error_handle (*add_port)(grpc_tcp_server* s,
73                                 const grpc_resolved_address* addr,
74                                 int* out_port);
75   grpc_core::TcpServerFdHandler* (*create_fd_handler)(grpc_tcp_server* s);
76   unsigned (*port_fd_count)(grpc_tcp_server* s, unsigned port_index);
77   int (*port_fd)(grpc_tcp_server* s, unsigned port_index, unsigned fd_index);
78   grpc_tcp_server* (*ref)(grpc_tcp_server* s);
79   void (*shutdown_starting_add)(grpc_tcp_server* s,
80                                 grpc_closure* shutdown_starting);
81   void (*unref)(grpc_tcp_server* s);
82   void (*shutdown_listeners)(grpc_tcp_server* s);
83   int (*pre_allocated_fd)(grpc_tcp_server* s);
84   void (*set_pre_allocated_fd)(grpc_tcp_server* s, int fd);
85 } grpc_tcp_server_vtable;
86 
87 // Create a server, initially not bound to any ports. The caller owns one ref.
88 // If shutdown_complete is not NULL, it will be used by
89 // grpc_tcp_server_unref() when the ref count reaches zero.
90 // Takes ownership of the slice_allocator_factory.
91 grpc_error_handle grpc_tcp_server_create(
92     grpc_closure* shutdown_complete,
93     const grpc_event_engine::experimental::EndpointConfig& config,
94     grpc_tcp_server_cb on_accept_cb, void* cb_arg, grpc_tcp_server** server);
95 
96 // Start listening to bound ports
97 void grpc_tcp_server_start(grpc_tcp_server* server,
98                            const std::vector<grpc_pollset*>* pollsets);
99 
100 // Add a port to the server, returning the newly allocated port on success, or
101 // -1 on failure.
102 
103 // The :: and 0.0.0.0 wildcard addresses are treated identically, accepting
104 // both IPv4 and IPv6 connections, but :: is the preferred style.  This usually
105 // creates one socket, but possibly two on systems which support IPv6,
106 // but not dualstack sockets.
107 // TODO(ctiller): deprecate this, and make grpc_tcp_server_add_ports to handle
108 //                all of the multiple socket port matching logic in one place
109 grpc_error_handle grpc_tcp_server_add_port(grpc_tcp_server* s,
110                                            const grpc_resolved_address* addr,
111                                            int* out_port);
112 
113 // Create and return a TcpServerFdHandler so that it can be used by upper layer
114 // to hand over an externally connected fd to the grpc server.
115 grpc_core::TcpServerFdHandler* grpc_tcp_server_create_fd_handler(
116     grpc_tcp_server* s);
117 
118 // Number of fds at the given port_index, or 0 if port_index is out of
119 // bounds.
120 unsigned grpc_tcp_server_port_fd_count(grpc_tcp_server* s, unsigned port_index);
121 
122 // Returns the file descriptor of the Mth (fd_index) listening socket of the Nth
123 // (port_index) call to add_port() on this server, or -1 if the indices are out
124 // of bounds. The file descriptor remains owned by the server, and will be
125 // cleaned up when the ref count reaches zero.
126 int grpc_tcp_server_port_fd(grpc_tcp_server* s, unsigned port_index,
127                             unsigned fd_index);
128 
129 // Ref s and return s.
130 grpc_tcp_server* grpc_tcp_server_ref(grpc_tcp_server* s);
131 
132 // shutdown_starting is called when ref count has reached zero and the server is
133 // about to be destroyed. The server will be deleted after it returns. Calling
134 // grpc_tcp_server_ref() from it has no effect.
135 void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server* s,
136                                            grpc_closure* shutdown_starting);
137 
138 // If the refcount drops to zero, enqueue calls on exec_ctx to
139 // shutdown_listeners and delete s.
140 void grpc_tcp_server_unref(grpc_tcp_server* s);
141 
142 // Shutdown the fds of listeners.
143 void grpc_tcp_server_shutdown_listeners(grpc_tcp_server* s);
144 
145 /* Get pre-allocated FD for server. -1 if none is set */
146 int grpc_tcp_server_pre_allocated_fd(grpc_tcp_server* s);
147 
148 /* Set pre-allocated FD for server */
149 void grpc_tcp_server_set_pre_allocated_fd(grpc_tcp_server* s, int fd);
150 
151 void grpc_tcp_server_global_init();
152 
153 void grpc_set_tcp_server_impl(grpc_tcp_server_vtable* impl);
154 
155 #endif  // GRPC_SRC_CORE_LIB_IOMGR_TCP_SERVER_H
156