Initial interface change
diff --git a/src/core/transport/transport.h b/src/core/transport/transport.h
index ce8c17c..6dd0fda 100644
--- a/src/core/transport/transport.h
+++ b/src/core/transport/transport.h
@@ -62,24 +62,6 @@
 
 /* Callbacks made from the transport to the upper layers of grpc. */
 struct grpc_transport_callbacks {
-  /* Allocate a buffer to receive data into.
-     It's safe to call grpc_slice_new() to do this, but performance minded
-     proxies may want to carefully place data into optimal locations for
-     transports.
-     This function must return a valid, non-empty slice.
-
-     Arguments:
-       user_data - the transport user data set at transport creation time
-       transport - the grpc_transport instance making this call
-       stream    - the grpc_stream instance the buffer will be used for, or
-                   NULL if this is not known
-       size_hint - how big of a buffer would the transport optimally like?
-                   the actual returned buffer can be smaller or larger than
-                   size_hint as the implementation finds convenient */
-  struct gpr_slice (*alloc_recv_buffer)(void *user_data,
-                                        grpc_transport *transport,
-                                        grpc_stream *stream, size_t size_hint);
-
   /* Initialize a new stream on behalf of the transport.
      Must result in a call to
      grpc_transport_init_stream(transport, ..., request) in the same call
@@ -96,31 +78,6 @@
   void (*accept_stream)(void *user_data, grpc_transport *transport,
                         const void *server_data);
 
-  /* Process a set of stream ops that have been received by the transport.
-     Called by network threads, so must be careful not to block on network
-     activity.
-
-     If final_state == GRPC_STREAM_CLOSED, the upper layers should arrange to
-     call grpc_transport_destroy_stream.
-
-     Ownership of any objects contained in ops is transferred to the callee.
-
-     Arguments:
-       user_data   - the transport user data set at transport creation time
-       transport   - the grpc_transport instance making this call
-       stream      - the stream this data was received for
-       ops         - stream operations that are part of this batch
-       ops_count   - the number of stream operations in this batch
-       final_state - the state of the stream as of the final operation in this
-                     batch */
-  void (*recv_batch)(void *user_data, grpc_transport *transport,
-                     grpc_stream *stream, grpc_stream_op *ops, size_t ops_count,
-                     grpc_stream_state final_state);
-
-  /* The transport received a goaway */
-  void (*goaway)(void *user_data, grpc_transport *transport,
-                 grpc_status_code status, gpr_slice debug);
-
   /* The transport has been closed */
   void (*closed)(void *user_data, grpc_transport *transport);
 };
@@ -169,6 +126,21 @@
 void grpc_transport_set_allow_window_updates(grpc_transport *transport,
                                              grpc_stream *stream, int allow);
 
+/* Transport op: a set of operations to perform on a transport */
+typedef struct grpc_transport_op {
+  grpc_stream_op_buffer *send_ops;
+  int is_last_send;
+  void (*on_done_send)(void *user_data, int success);
+  void *send_user_data;
+
+  grpc_stream_op_buffer *recv_ops;
+  grpc_stream_state *recv_state;
+  void (*on_done_recv)(void *user_data, int success);
+  void *recv_user_data;
+
+  grpc_pollset *bind_pollset;
+} grpc_transport_op;
+
 /* Send a batch of operations on a transport
 
    Takes ownership of any objects contained in ops.
@@ -177,13 +149,9 @@
      transport - the transport on which to initiate the stream
      stream    - the stream on which to send the operations. This must be
                  non-NULL and previously initialized by the same transport.
-     ops       - an array of operations to apply to the stream - can be NULL
-                 if ops_count == 0.
-     ops_count - the number of elements in ops
-     is_last   - is this the last batch of operations to be sent out */
-void grpc_transport_send_batch(grpc_transport *transport, grpc_stream *stream,
-                               grpc_stream_op *ops, size_t ops_count,
-                               int is_last);
+     op        - a grpc_transport_op specifying the op to perform */
+void grpc_transport_perform_op(grpc_transport *transport, grpc_stream *stream,
+                               grpc_transport_op *op);
 
 /* Send a ping on a transport