blob: d4cee03862ebfd06330ae4d09bb7dad7cc126bc8 [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. */
Craig Tillera82950e2015-09-22 12:33:20 -070053typedef enum grpc_stream_state {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080054 /* 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 Tillera82950e2015-09-22 12:33:20 -070066typedef struct grpc_transport_stream_op {
Craig Tiller33825112015-09-18 07:44:19 -070067 grpc_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 Tiller33825112015-09-18 07:44:19 -070071 grpc_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 Tiller4efb6962015-06-03 09:32:41 -070075 /** The number of bytes this peer is currently prepared to receive.
Craig Tiller5065d722015-07-15 16:58:59 -070076 These bytes will be eventually used to replenish per-stream flow control
77 windows. */
Craig Tillerf96dfc32015-09-10 14:43:18 -070078 size_t max_recv_bytes;
Craig Tiller33825112015-09-18 07:44:19 -070079 grpc_closure *on_done_recv;
Craig Tiller3f2c2212015-04-23 07:56:33 -070080
81 grpc_pollset *bind_pollset;
82
Craig Tiller45ce9272015-07-31 11:22:35 -070083 /** If != GRPC_STATUS_OK, cancel this stream */
Craig Tiller3f2c2212015-04-23 07:56:33 -070084 grpc_status_code cancel_with_status;
Craig Tiller935cf422015-05-01 14:10:46 -070085
Craig Tiller45ce9272015-07-31 11:22:35 -070086 /** If != GRPC_STATUS_OK, send grpc-status, grpc-message, and close this
87 stream for both reading and writing */
88 grpc_status_code close_with_status;
89 gpr_slice *optional_close_message;
90
Craig Tiller935cf422015-05-01 14:10:46 -070091 /* Indexes correspond to grpc_context_index enum values */
Julien Boeuf83b02972015-05-20 22:50:34 -070092 grpc_call_context_element *context;
Craig Tillerb7959a02015-06-25 08:50:54 -070093} grpc_transport_stream_op;
Craig Tiller3f2c2212015-04-23 07:56:33 -070094
Craig Tiller3f475422015-06-25 10:43:05 -070095/** Transport op: a set of operations to perform on a transport as a whole */
Craig Tillera82950e2015-09-22 12:33:20 -070096typedef struct grpc_transport_op {
Craig Tillere039f032015-06-25 12:54:23 -070097 /** called when processing of this op is done */
Craig Tiller33825112015-09-18 07:44:19 -070098 grpc_closure *on_consumed;
Craig Tiller3f475422015-06-25 10:43:05 -070099 /** connectivity monitoring */
Craig Tiller33825112015-09-18 07:44:19 -0700100 grpc_closure *on_connectivity_state_change;
Craig Tiller3f475422015-06-25 10:43:05 -0700101 grpc_connectivity_state *connectivity_state;
102 /** should the transport be disconnected */
103 int disconnect;
Craig Tiller9188d7a2015-07-05 12:44:37 -0700104 /** should we send a goaway?
105 after a goaway is sent, once there are no more active calls on
106 the transport, the transport should disconnect */
Craig Tiller3f475422015-06-25 10:43:05 -0700107 int send_goaway;
108 /** what should the goaway contain? */
109 grpc_status_code goaway_status;
110 gpr_slice *goaway_message;
111 /** set the callback for accepting new streams;
112 this is a permanent callback, unlike the other one-shot closures */
Craig Tillera82950e2015-09-22 12:33:20 -0700113 void (*set_accept_stream)(void *user_data, grpc_transport *transport,
114 const void *server_data);
Craig Tiller3f475422015-06-25 10:43:05 -0700115 void *set_accept_stream_user_data;
116 /** add this transport to a pollset */
117 grpc_pollset *bind_pollset;
Craig Tiller1ada6ad2015-07-16 16:19:14 -0700118 /** add this transport to a pollset_set */
119 grpc_pollset_set *bind_pollset_set;
Craig Tiller3f475422015-06-25 10:43:05 -0700120 /** send a ping, call this back if not NULL */
Craig Tiller33825112015-09-18 07:44:19 -0700121 grpc_closure *send_ping;
Craig Tiller3f475422015-06-25 10:43:05 -0700122} grpc_transport_op;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800123
124/* Returns the amount of memory required to store a grpc_stream for this
125 transport */
Craig Tillera82950e2015-09-22 12:33:20 -0700126size_t grpc_transport_stream_size(grpc_transport *transport);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800127
128/* Initialize transport data for a stream.
129
130 Returns 0 on success, any other (transport-defined) value for failure.
131
132 Arguments:
133 transport - the transport on which to create this stream
134 stream - a pointer to uninitialized memory to initialize
135 server_data - either NULL for a client initiated stream, or a pointer
136 supplied from the accept_stream callback function */
Craig Tillera82950e2015-09-22 12:33:20 -0700137int grpc_transport_init_stream(grpc_exec_ctx *exec_ctx,
138 grpc_transport *transport, grpc_stream *stream,
139 const void *server_data,
140 grpc_transport_stream_op *initial_op);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800141
142/* Destroy transport data for a stream.
143
144 Requires: a recv_batch with final_state == GRPC_STREAM_CLOSED has been
145 received by the up-layer. Must not be called in the same call stack as
146 recv_frame.
147
148 Arguments:
149 transport - the transport on which to create this stream
150 stream - the grpc_stream to destroy (memory is still owned by the
151 caller, but any child memory must be cleaned up) */
Craig Tillera82950e2015-09-22 12:33:20 -0700152void grpc_transport_destroy_stream(grpc_exec_ctx *exec_ctx,
153 grpc_transport *transport,
154 grpc_stream *stream);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800155
Craig Tillera82950e2015-09-22 12:33:20 -0700156void grpc_transport_stream_op_finish_with_failure(grpc_exec_ctx *exec_ctx,
157 grpc_transport_stream_op *op);
Craig Tiller83f88d92015-04-21 16:02:05 -0700158
Craig Tillera82950e2015-09-22 12:33:20 -0700159void grpc_transport_stream_op_add_cancellation(grpc_transport_stream_op *op,
160 grpc_status_code status);
Craig Tiller45ce9272015-07-31 11:22:35 -0700161
Craig Tillera82950e2015-09-22 12:33:20 -0700162void grpc_transport_stream_op_add_close(grpc_transport_stream_op *op,
163 grpc_status_code status,
164 gpr_slice *optional_message);
Craig Tiller2ea37fd2015-04-24 13:03:49 -0700165
Craig Tillera82950e2015-09-22 12:33:20 -0700166char *grpc_transport_stream_op_string(grpc_transport_stream_op *op);
Craig Tiller83f88d92015-04-21 16:02:05 -0700167
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800168/* Send a batch of operations on a transport
169
170 Takes ownership of any objects contained in ops.
171
172 Arguments:
173 transport - the transport on which to initiate the stream
174 stream - the stream on which to send the operations. This must be
175 non-NULL and previously initialized by the same transport.
Craig Tillerb7959a02015-06-25 08:50:54 -0700176 op - a grpc_transport_stream_op specifying the op to perform */
Craig Tillera82950e2015-09-22 12:33:20 -0700177void grpc_transport_perform_stream_op(grpc_exec_ctx *exec_ctx,
178 grpc_transport *transport,
179 grpc_stream *stream,
180 grpc_transport_stream_op *op);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800181
Craig Tillera82950e2015-09-22 12:33:20 -0700182void grpc_transport_perform_op(grpc_exec_ctx *exec_ctx,
183 grpc_transport *transport,
184 grpc_transport_op *op);
Craig Tiller3f475422015-06-25 10:43:05 -0700185
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800186/* Send a ping on a transport
187
Craig Tiller4aa71a12015-06-15 13:00:55 -0700188 Calls cb with user data when a response is received. */
Craig Tillera82950e2015-09-22 12:33:20 -0700189void grpc_transport_ping(grpc_transport *transport, grpc_closure *cb);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800190
nnoble0c475f02014-12-05 15:37:39 -0800191/* Advise peer of pending connection termination. */
Craig Tillera82950e2015-09-22 12:33:20 -0700192void grpc_transport_goaway(grpc_transport *transport, grpc_status_code status,
193 gpr_slice debug_data);
nnoble0c475f02014-12-05 15:37:39 -0800194
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800195/* Close a transport. Aborts all open streams. */
Craig Tillera82950e2015-09-22 12:33:20 -0700196void grpc_transport_close(grpc_transport *transport);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800197
198/* Destroy the transport */
Craig Tillera82950e2015-09-22 12:33:20 -0700199void grpc_transport_destroy(grpc_exec_ctx *exec_ctx, grpc_transport *transport);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800200
Craig Tiller1b22b9d2015-07-20 13:42:22 -0700201/* Get the transports peer */
Craig Tillera82950e2015-09-22 12:33:20 -0700202char *grpc_transport_get_peer(grpc_exec_ctx *exec_ctx,
203 grpc_transport *transport);
Craig Tiller1b22b9d2015-07-20 13:42:22 -0700204
Craig Tiller06aeea72015-04-23 10:54:45 -0700205#endif /* GRPC_INTERNAL_CORE_TRANSPORT_TRANSPORT_H */