blob: 7f6a37d04817e31f1f2191e03fc5ab22c15161cb [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
Craig Tiller06059952015-02-18 08:34:56 -08003 * Copyright 2015, Google Inc.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
Nicolas "Pixel" Noble1ff52d52015-03-01 05:24:36 +010034#ifndef GRPC_INTERNAL_CORE_TRANSPORT_TRANSPORT_H
35#define GRPC_INTERNAL_CORE_TRANSPORT_TRANSPORT_H
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080036
37#include <stddef.h>
38
ctillerd79b4862014-12-17 16:36:59 -080039#include "src/core/iomgr/pollset.h"
Craig Tiller928cd772015-05-08 09:52:54 -070040#include "src/core/iomgr/pollset_set.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080041#include "src/core/transport/stream_op.h"
Julien Boeufc6f8d0a2015-05-11 22:40:02 -070042#include "src/core/channel/context.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080043
44/* forward declarations */
45typedef struct grpc_transport grpc_transport;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080046
47/* grpc_stream doesn't actually exist. It's used as a typesafe
48 opaque pointer for whatever data the transport wants to track
49 for a stream. */
50typedef struct grpc_stream grpc_stream;
51
52/* Represents the send/recv closed state of a stream. */
53typedef enum grpc_stream_state {
54 /* the stream is open for sends and receives */
55 GRPC_STREAM_OPEN,
56 /* the stream is closed for sends, but may still receive data */
57 GRPC_STREAM_SEND_CLOSED,
58 /* the stream is closed for receives, but may still send data */
59 GRPC_STREAM_RECV_CLOSED,
60 /* the stream is closed for both sends and receives */
61 GRPC_STREAM_CLOSED
62} grpc_stream_state;
63
Craig Tiller3f475422015-06-25 10:43:05 -070064/* Transport stream op: a set of operations to perform on a transport
65 against a single stream */
Craig Tillerb7959a02015-06-25 08:50:54 -070066typedef struct grpc_transport_stream_op {
Craig Tiller1e6facb2015-06-11 22:47:11 -070067 grpc_iomgr_closure *on_consumed;
Craig Tiller5dde66e2015-06-02 09:05:23 -070068
Craig Tiller3f2c2212015-04-23 07:56:33 -070069 grpc_stream_op_buffer *send_ops;
70 int is_last_send;
Craig Tiller1e6facb2015-06-11 22:47:11 -070071 grpc_iomgr_closure *on_done_send;
Craig Tiller3f2c2212015-04-23 07:56:33 -070072
73 grpc_stream_op_buffer *recv_ops;
74 grpc_stream_state *recv_state;
Craig Tiller1e6facb2015-06-11 22:47:11 -070075 grpc_iomgr_closure *on_done_recv;
Craig Tiller3f2c2212015-04-23 07:56:33 -070076
77 grpc_pollset *bind_pollset;
78
79 grpc_status_code cancel_with_status;
Craig Tiller2ea37fd2015-04-24 13:03:49 -070080 grpc_mdstr *cancel_message;
Craig Tiller935cf422015-05-01 14:10:46 -070081
82 /* Indexes correspond to grpc_context_index enum values */
Julien Boeuf83b02972015-05-20 22:50:34 -070083 grpc_call_context_element *context;
Craig Tillerb7959a02015-06-25 08:50:54 -070084} grpc_transport_stream_op;
Craig Tiller3f2c2212015-04-23 07:56:33 -070085
Craig Tiller3f475422015-06-25 10:43:05 -070086/** Transport op: a set of operations to perform on a transport as a whole */
87typedef struct grpc_transport_op {
88 /** connectivity monitoring */
89 grpc_iomgr_closure *on_connectivity_state_change;
90 grpc_connectivity_state *connectivity_state;
91 /** should the transport be disconnected */
92 int disconnect;
93 /** should we send a goaway? */
94 int send_goaway;
95 /** what should the goaway contain? */
96 grpc_status_code goaway_status;
97 gpr_slice *goaway_message;
98 /** set the callback for accepting new streams;
99 this is a permanent callback, unlike the other one-shot closures */
100 void (*set_accept_stream)(void *user_data, grpc_transport *transport, const void *server_data);
101 void *set_accept_stream_user_data;
102 /** add this transport to a pollset */
103 grpc_pollset *bind_pollset;
104 /** send a ping, call this back if not NULL */
105 grpc_iomgr_closure *send_ping;
106} grpc_transport_op;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800107
108/* Returns the amount of memory required to store a grpc_stream for this
109 transport */
110size_t grpc_transport_stream_size(grpc_transport *transport);
111
112/* Initialize transport data for a stream.
113
114 Returns 0 on success, any other (transport-defined) value for failure.
115
116 Arguments:
117 transport - the transport on which to create this stream
118 stream - a pointer to uninitialized memory to initialize
119 server_data - either NULL for a client initiated stream, or a pointer
120 supplied from the accept_stream callback function */
121int grpc_transport_init_stream(grpc_transport *transport, grpc_stream *stream,
Craig Tiller06aeea72015-04-23 10:54:45 -0700122 const void *server_data,
Craig Tillerb7959a02015-06-25 08:50:54 -0700123 grpc_transport_stream_op *initial_op);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800124
125/* Destroy transport data for a stream.
126
127 Requires: a recv_batch with final_state == GRPC_STREAM_CLOSED has been
128 received by the up-layer. Must not be called in the same call stack as
129 recv_frame.
130
131 Arguments:
132 transport - the transport on which to create this stream
133 stream - the grpc_stream to destroy (memory is still owned by the
134 caller, but any child memory must be cleaned up) */
135void grpc_transport_destroy_stream(grpc_transport *transport,
136 grpc_stream *stream);
137
Craig Tillerb7959a02015-06-25 08:50:54 -0700138void grpc_transport_stream_op_finish_with_failure(grpc_transport_stream_op *op);
Craig Tiller83f88d92015-04-21 16:02:05 -0700139
Craig Tillerb7959a02015-06-25 08:50:54 -0700140void grpc_transport_stream_op_add_cancellation(grpc_transport_stream_op *op,
141 grpc_status_code status,
142 grpc_mdstr *message);
Craig Tiller2ea37fd2015-04-24 13:03:49 -0700143
Craig Tillerb7959a02015-06-25 08:50:54 -0700144char *grpc_transport_stream_op_string(grpc_transport_stream_op *op);
Craig Tiller83f88d92015-04-21 16:02:05 -0700145
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800146/* Send a batch of operations on a transport
147
148 Takes ownership of any objects contained in ops.
149
150 Arguments:
151 transport - the transport on which to initiate the stream
152 stream - the stream on which to send the operations. This must be
153 non-NULL and previously initialized by the same transport.
Craig Tillerb7959a02015-06-25 08:50:54 -0700154 op - a grpc_transport_stream_op specifying the op to perform */
Craig Tiller3f475422015-06-25 10:43:05 -0700155void grpc_transport_perform_stream_op(grpc_transport *transport, grpc_stream *stream,
Craig Tillerb7959a02015-06-25 08:50:54 -0700156 grpc_transport_stream_op *op);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800157
Craig Tiller3f475422015-06-25 10:43:05 -0700158void grpc_transport_perform_op(grpc_transport *transport, grpc_transport_op *op);
159
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800160/* Send a ping on a transport
161
Craig Tiller4aa71a12015-06-15 13:00:55 -0700162 Calls cb with user data when a response is received. */
163void grpc_transport_ping(grpc_transport *transport, grpc_iomgr_closure *cb);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800164
nnoble0c475f02014-12-05 15:37:39 -0800165/* Advise peer of pending connection termination. */
ctillerd79b4862014-12-17 16:36:59 -0800166void grpc_transport_goaway(grpc_transport *transport, grpc_status_code status,
167 gpr_slice debug_data);
nnoble0c475f02014-12-05 15:37:39 -0800168
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800169/* Close a transport. Aborts all open streams. */
ctillerd79b4862014-12-17 16:36:59 -0800170void grpc_transport_close(grpc_transport *transport);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800171
172/* Destroy the transport */
ctillerd79b4862014-12-17 16:36:59 -0800173void grpc_transport_destroy(grpc_transport *transport);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800174
175/* Return type for grpc_transport_setup_callback */
176typedef struct grpc_transport_setup_result {
177 void *user_data;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800178} grpc_transport_setup_result;
179
180/* Given a transport, return callbacks for that transport. Used to finalize
181 setup as a transport is being created */
182typedef grpc_transport_setup_result (*grpc_transport_setup_callback)(
183 void *setup_arg, grpc_transport *transport, grpc_mdctx *mdctx);
184
185typedef struct grpc_transport_setup grpc_transport_setup;
186typedef struct grpc_transport_setup_vtable grpc_transport_setup_vtable;
187
188struct grpc_transport_setup_vtable {
Craig Tiller8b4a8742015-05-12 13:33:18 -0700189 void (*initiate)(grpc_transport_setup *setup);
Craig Tiller83b826a2015-05-13 13:43:01 -0700190 void (*add_interested_party)(grpc_transport_setup *setup,
191 grpc_pollset *pollset);
192 void (*del_interested_party)(grpc_transport_setup *setup,
193 grpc_pollset *pollset);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800194 void (*cancel)(grpc_transport_setup *setup);
195};
196
197/* Transport setup is an asynchronous utility interface for client channels to
198 establish connections. It's transport agnostic. */
199struct grpc_transport_setup {
200 const grpc_transport_setup_vtable *vtable;
201};
202
203/* Initiate transport setup: e.g. for TCP+DNS trigger a resolve of the name
204 given at transport construction time, create the tcp connection, perform
205 handshakes, and call some grpc_transport_setup_result function provided at
206 setup construction time.
207 This *may* be implemented as a no-op if the setup process monitors something
208 continuously. */
Craig Tiller8b4a8742015-05-12 13:33:18 -0700209void grpc_transport_setup_initiate(grpc_transport_setup *setup);
210
Craig Tiller83b826a2015-05-13 13:43:01 -0700211void grpc_transport_setup_add_interested_party(grpc_transport_setup *setup,
212 grpc_pollset *pollset);
213void grpc_transport_setup_del_interested_party(grpc_transport_setup *setup,
214 grpc_pollset *pollset);
Craig Tiller8b4a8742015-05-12 13:33:18 -0700215
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800216/* Cancel transport setup. After this returns, no new transports should be
217 created, and all pending transport setup callbacks should be completed.
218 After this call completes, setup should be considered invalid (this can be
219 used as a destruction call by setup). */
220void grpc_transport_setup_cancel(grpc_transport_setup *setup);
221
Craig Tiller06aeea72015-04-23 10:54:45 -0700222#endif /* GRPC_INTERNAL_CORE_TRANSPORT_TRANSPORT_H */