Пример #1
0
static void on_secure_handshake_done(grpc_exec_ctx *exec_ctx, void *statep,
                                     grpc_security_status status,
                                     grpc_endpoint *secure_endpoint,
                                     grpc_auth_context *auth_context) {
  server_secure_connect *state = statep;
  if (status == GRPC_SECURITY_OK) {
    if (secure_endpoint) {
      gpr_mu_lock(&state->state->mu);
      if (!state->state->is_shutdown) {
        grpc_transport *transport = grpc_create_chttp2_transport(
            exec_ctx, grpc_server_get_channel_args(state->state->server),
            secure_endpoint, 0);
        grpc_arg args_to_add[2];
        args_to_add[0] = grpc_server_credentials_to_arg(state->state->creds);
        args_to_add[1] = grpc_auth_context_to_arg(auth_context);
        grpc_channel_args *args_copy = grpc_channel_args_copy_and_add(
            state->args, args_to_add, GPR_ARRAY_SIZE(args_to_add));
        grpc_server_setup_transport(exec_ctx, state->state->server, transport,
                                    state->accepting_pollset, args_copy);
        grpc_channel_args_destroy(args_copy);
        grpc_chttp2_transport_start_reading(exec_ctx, transport, NULL);
      } else {
        /* We need to consume this here, because the server may already have
         * gone away. */
        grpc_endpoint_destroy(exec_ctx, secure_endpoint);
      }
      gpr_mu_unlock(&state->state->mu);
    }
  } else {
    gpr_log(GPR_ERROR, "Secure transport failed with error %d", status);
  }
  grpc_channel_args_destroy(state->args);
  state_unref(state->state);
  gpr_free(state);
}
Пример #2
0
static void on_handshake_done(grpc_exec_ctx *exec_ctx, grpc_endpoint *endpoint,
                              grpc_channel_args *args,
                              gpr_slice_buffer *read_buffer, void *user_data,
                              grpc_error *error) {
  server_secure_connect *state = user_data;
  if (error != GRPC_ERROR_NONE) {
    const char *error_str = grpc_error_string(error);
    gpr_log(GPR_ERROR, "Handshaking failed: %s", error_str);
    grpc_error_free_string(error_str);
    GRPC_ERROR_UNREF(error);
    grpc_channel_args_destroy(args);
    gpr_free(read_buffer);
    grpc_handshake_manager_shutdown(exec_ctx, state->handshake_mgr);
    grpc_handshake_manager_destroy(exec_ctx, state->handshake_mgr);
    state_unref(state->state);
    gpr_free(state);
    return;
  }
  grpc_handshake_manager_destroy(exec_ctx, state->handshake_mgr);
  state->handshake_mgr = NULL;
  // TODO(roth, jboeuf): Convert security connector handshaking to use new
  // handshake API, and then move the code from on_secure_handshake_done()
  // into this function.
  state->args = args;
  grpc_server_security_connector_do_handshake(
      exec_ctx, state->state->sc, state->acceptor, endpoint, read_buffer,
      state->deadline, on_secure_handshake_done, state);
}
Пример #3
0
static void on_secure_handshake_done(grpc_exec_ctx *exec_ctx, void *statep,
                                     grpc_security_status status,
                                     grpc_endpoint *secure_endpoint,
                                     grpc_auth_context *auth_context) {
  grpc_server_secure_state *state = statep;
  grpc_transport *transport;
  if (status == GRPC_SECURITY_OK) {
    if (secure_endpoint) {
      gpr_mu_lock(&state->mu);
      if (!state->is_shutdown) {
        transport = grpc_create_chttp2_transport(
            exec_ctx, grpc_server_get_channel_args(state->server),
            secure_endpoint, 0);
        setup_transport(exec_ctx, state, transport, auth_context);
        grpc_chttp2_transport_start_reading(exec_ctx, transport, NULL, 0);
      } else {
        /* We need to consume this here, because the server may already have
         * gone away. */
        grpc_endpoint_destroy(exec_ctx, secure_endpoint);
      }
      gpr_mu_unlock(&state->mu);
    }
  } else {
    gpr_log(GPR_ERROR, "Secure transport failed with error %d", status);
  }
  state_unref(state);
}
Пример #4
0
static void destroy_done(grpc_exec_ctx *exec_ctx, void *statep, int success) {
  grpc_server_secure_state *state = statep;
  state->destroy_callback->cb(exec_ctx, state->destroy_callback->cb_arg,
                              success);
  grpc_security_connector_shutdown(exec_ctx, state->sc);
  state_unref(state);
}
Пример #5
0
/* Server callback: destroy the tcp listener (so we don't generate further
   callbacks) */
static void destroy(grpc_server *server, void *statep) {
  grpc_server_secure_state *state = statep;
  gpr_mu_lock(&state->mu);
  state->is_shutdown = 1;
  grpc_tcp_server_destroy(state->tcp, grpc_server_listener_destroy_done,
                          server);
  gpr_mu_unlock(&state->mu);
  state_unref(state);
}
Пример #6
0
static void destroy_done(grpc_exec_ctx *exec_ctx, void *statep,
                         grpc_error *error) {
  server_secure_state *state = statep;
  if (state->destroy_callback != NULL) {
    state->destroy_callback->cb(exec_ctx, state->destroy_callback->cb_arg,
                                GRPC_ERROR_REF(error));
  }
  grpc_server_security_connector_shutdown(exec_ctx, state->sc);
  state_unref(state);
}
Пример #7
0
Transition* trans_clist_free_1(struct reactor_d *reactor, Transition *trans){
    Transition *ret;
    if(trans == NULL) return NULL;
    if(trans->enrequisites != NULL)
        reactor_slist_foreach(trans->enrequisites, en_remove_one_curr_trans, trans);
    while(trans->enrequisites != NULL){
        en_unref(reactor, trans->enrequisites->data);
        trans->enrequisites = reactor_slist_delete_link(trans->enrequisites, trans->enrequisites);
    }
    ret = trans_clist_remove_link(trans);
    state_unref(reactor, trans->dest);
    action_free(trans->raction);
    free(trans);
    return ret;
}
Пример #8
0
void state_unref(struct reactor_d *reactor, State *ste){
    Transition *aux;
    if( ste == NULL || 
        --ste->refcount > 1 ||
        (ste->refcount == 1 && ste != ste->fsminitial) ) 
    {
        return;
    }
    for(;ste->transitions != NULL;){
        aux = ste->transitions;
        ste->transitions = trans_clist_free_1(reactor, aux);
    }
//     trans_clist_free_full(reactor, ste->transitions);
    if(ste != ste->fsminitial)
        state_unref(reactor, ste->fsminitial);
    reactor_hash_table_remove(reactor->states, ste->id);
    info("State '%s' removed", ste->id);
    free(ste->id);
    free(ste);
}
Пример #9
0
static void on_secure_transport_setup_done(void *statep,
                                           grpc_security_status status,
                                           grpc_endpoint *secure_endpoint) {
  grpc_server_secure_state *state = statep;
  if (status == GRPC_SECURITY_OK) {
    gpr_mu_lock(&state->mu);
    if (!state->is_shutdown) {
      grpc_create_chttp2_transport(
          setup_transport, state, grpc_server_get_channel_args(state->server),
          secure_endpoint, NULL, 0, grpc_mdctx_create(), 0);
    } else {
      /* We need to consume this here, because the server may already have gone
       * away. */
      grpc_endpoint_destroy(secure_endpoint);
    }
    gpr_mu_unlock(&state->mu);
  } else {
    gpr_log(GPR_ERROR, "Secure transport failed with error %d", status);
  }
  state_unref(state);
}
Пример #10
0
static void destroy_done(void *statep) {
  grpc_server_secure_state *state = statep;
  grpc_server_listener_destroy_done(state->server);
  state_unref(state);
}