blob: cdea0b9a0b920b307e974cc5f8bd6330ee27f968 [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"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080040#include "src/core/transport/stream_op.h"
41
42/* forward declarations */
43typedef struct grpc_transport grpc_transport;
44typedef struct grpc_transport_callbacks grpc_transport_callbacks;
45
46/* grpc_stream doesn't actually exist. It's used as a typesafe
47 opaque pointer for whatever data the transport wants to track
48 for a stream. */
49typedef struct grpc_stream grpc_stream;
50
51/* Represents the send/recv closed state of a stream. */
52typedef enum grpc_stream_state {
53 /* the stream is open for sends and receives */
54 GRPC_STREAM_OPEN,
55 /* the stream is closed for sends, but may still receive data */
56 GRPC_STREAM_SEND_CLOSED,
57 /* the stream is closed for receives, but may still send data */
58 GRPC_STREAM_RECV_CLOSED,
59 /* the stream is closed for both sends and receives */
60 GRPC_STREAM_CLOSED
61} grpc_stream_state;
62
Craig Tiller3f2c2212015-04-23 07:56:33 -070063/* Transport op: a set of operations to perform on a transport */
64typedef struct grpc_transport_op {
65 grpc_stream_op_buffer *send_ops;
66 int is_last_send;
67 void (*on_done_send)(void *user_data, int success);
68 void *send_user_data;
69
70 grpc_stream_op_buffer *recv_ops;
71 grpc_stream_state *recv_state;
72 void (*on_done_recv)(void *user_data, int success);
73 void *recv_user_data;
74
75 grpc_pollset *bind_pollset;
76
77 grpc_status_code cancel_with_status;
Craig Tiller2ea37fd2015-04-24 13:03:49 -070078 grpc_mdstr *cancel_message;
Craig Tiller3f2c2212015-04-23 07:56:33 -070079} grpc_transport_op;
80
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080081/* Callbacks made from the transport to the upper layers of grpc. */
82struct grpc_transport_callbacks {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080083 /* Initialize a new stream on behalf of the transport.
84 Must result in a call to
85 grpc_transport_init_stream(transport, ..., request) in the same call
86 stack.
87 Must not result in any other calls to the transport.
88
89 Arguments:
90 user_data - the transport user data set at transport creation time
91 transport - the grpc_transport instance making this call
92 request - request parameters for this stream (owned by the caller)
93 server_data - opaque transport dependent argument that should be passed
94 to grpc_transport_init_stream
95 */
96 void (*accept_stream)(void *user_data, grpc_transport *transport,
97 const void *server_data);
98
Craig Tiller06aeea72015-04-23 10:54:45 -070099 void (*goaway)(void *user_data, grpc_transport *transport,
100 grpc_status_code status, gpr_slice debug);
Craig Tiller83f88d92015-04-21 16:02:05 -0700101
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800102 /* The transport has been closed */
103 void (*closed)(void *user_data, grpc_transport *transport);
104};
105
106/* Returns the amount of memory required to store a grpc_stream for this
107 transport */
108size_t grpc_transport_stream_size(grpc_transport *transport);
109
110/* Initialize transport data for a stream.
111
112 Returns 0 on success, any other (transport-defined) value for failure.
113
114 Arguments:
115 transport - the transport on which to create this stream
116 stream - a pointer to uninitialized memory to initialize
117 server_data - either NULL for a client initiated stream, or a pointer
118 supplied from the accept_stream callback function */
119int grpc_transport_init_stream(grpc_transport *transport, grpc_stream *stream,
Craig Tiller06aeea72015-04-23 10:54:45 -0700120 const void *server_data,
121 grpc_transport_op *initial_op);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800122
123/* Destroy transport data for a stream.
124
125 Requires: a recv_batch with final_state == GRPC_STREAM_CLOSED has been
126 received by the up-layer. Must not be called in the same call stack as
127 recv_frame.
128
129 Arguments:
130 transport - the transport on which to create this stream
131 stream - the grpc_stream to destroy (memory is still owned by the
132 caller, but any child memory must be cleaned up) */
133void grpc_transport_destroy_stream(grpc_transport *transport,
134 grpc_stream *stream);
135
Craig Tiller83f88d92015-04-21 16:02:05 -0700136void grpc_transport_op_finish_with_failure(grpc_transport_op *op);
137
Craig Tiller1a727fd2015-04-24 13:21:22 -0700138void grpc_transport_op_add_cancellation(grpc_transport_op *op,
139 grpc_status_code status,
140 grpc_mdstr *message);
Craig Tiller2ea37fd2015-04-24 13:03:49 -0700141
Craig Tillerbe18b8d2015-04-22 14:00:47 -0700142/* TODO(ctiller): remove this */
Craig Tiller06aeea72015-04-23 10:54:45 -0700143void grpc_transport_add_to_pollset(grpc_transport *transport,
144 grpc_pollset *pollset);
Craig Tillerbe18b8d2015-04-22 14:00:47 -0700145
Craig Tiller83f88d92015-04-21 16:02:05 -0700146char *grpc_transport_op_string(grpc_transport_op *op);
147
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800148/* Send a batch of operations on a transport
149
150 Takes ownership of any objects contained in ops.
151
152 Arguments:
153 transport - the transport on which to initiate the stream
154 stream - the stream on which to send the operations. This must be
155 non-NULL and previously initialized by the same transport.
Craig Tiller65582322015-04-21 09:24:41 -0700156 op - a grpc_transport_op specifying the op to perform */
157void grpc_transport_perform_op(grpc_transport *transport, grpc_stream *stream,
158 grpc_transport_op *op);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800159
160/* Send a ping on a transport
161
162 Calls cb with user data when a response is received.
163 cb *MAY* be called with arbitrary transport level locks held. It is not safe
164 to call into the transport during cb. */
165void grpc_transport_ping(grpc_transport *transport, void (*cb)(void *user_data),
166 void *user_data);
167
nnoble0c475f02014-12-05 15:37:39 -0800168/* Advise peer of pending connection termination. */
ctillerd79b4862014-12-17 16:36:59 -0800169void grpc_transport_goaway(grpc_transport *transport, grpc_status_code status,
170 gpr_slice debug_data);
nnoble0c475f02014-12-05 15:37:39 -0800171
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800172/* Close a transport. Aborts all open streams. */
ctillerd79b4862014-12-17 16:36:59 -0800173void grpc_transport_close(grpc_transport *transport);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800174
175/* Destroy the transport */
ctillerd79b4862014-12-17 16:36:59 -0800176void grpc_transport_destroy(grpc_transport *transport);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800177
178/* Return type for grpc_transport_setup_callback */
179typedef struct grpc_transport_setup_result {
180 void *user_data;
181 const grpc_transport_callbacks *callbacks;
182} grpc_transport_setup_result;
183
184/* Given a transport, return callbacks for that transport. Used to finalize
185 setup as a transport is being created */
186typedef grpc_transport_setup_result (*grpc_transport_setup_callback)(
187 void *setup_arg, grpc_transport *transport, grpc_mdctx *mdctx);
188
189typedef struct grpc_transport_setup grpc_transport_setup;
190typedef struct grpc_transport_setup_vtable grpc_transport_setup_vtable;
191
192struct grpc_transport_setup_vtable {
193 void (*initiate)(grpc_transport_setup *setup);
194 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. */
209void grpc_transport_setup_initiate(grpc_transport_setup *setup);
210/* Cancel transport setup. After this returns, no new transports should be
211 created, and all pending transport setup callbacks should be completed.
212 After this call completes, setup should be considered invalid (this can be
213 used as a destruction call by setup). */
214void grpc_transport_setup_cancel(grpc_transport_setup *setup);
215
Craig Tiller06aeea72015-04-23 10:54:45 -0700216#endif /* GRPC_INTERNAL_CORE_TRANSPORT_TRANSPORT_H */