HooksRegistrar& HooksRegistrar::connection_data( Engine::state_event_e event, connection_data_t f ) { if (f.empty()) { BOOST_THROW_EXCEPTION(einval() << errinfo_what( "Empty functional passed to hook registrarion." )); } throw_if_error( ib_hook_conndata_register( m_engine.ib(), static_cast<ib_state_event_type_t>(event), &Internal::Hooks::connection_data, value_to_data<connection_data_t>( f, m_engine.main_memory_pool().ib() ) ) ); return *this; }
/** * @internal * Initialize a context for the perf_stats module. * * This is a hack. * Hook callbacks set here to get end times for hooks. * Currently no other modules register hook call backs. * Because of this it should * ensure that we are the last thing called per event. * * @param[in] ib IronBee object * @param[in] m Module object * @param[in] ctx Context object * @param[in] cbdata Callback data (unused) */ static ib_status_t perf_stats_context_close(ib_engine_t *ib, ib_module_t *m, ib_context_t *ctx, void *cbdata) { IB_FTRACE_INIT(); ib_status_t rc; int event; /* Check that we are in the main ctx otherwise return */ if (ctx != ib_context_main(ib)) { IB_FTRACE_RET_STATUS(IB_OK); } for (event = 0; event < IB_STATE_EVENT_NUM; ++event) { event_info_t *eventp = &event_info[event]; if ((eventp->cbdata_type == IB_CBDATA_NONE) || (eventp->cbdata_type == IB_CBDATA_CONN_DATA_T)) { rc = IB_EINVAL; ib_log_error(ib, "Cannot register handler " "for:%d name:%s cbdata_type: %d", eventp->number, eventp->name, eventp->cbdata_type); } else { switch( ib_state_hook_type( (ib_state_event_type_t)event ) ) { case IB_STATE_HOOK_CONN: rc = ib_hook_conn_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_stop_conn_callback, (void *)eventp ); break; case IB_STATE_HOOK_CONNDATA: rc = ib_hook_conndata_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_stop_conndata_callback, (void *)eventp ); break; case IB_STATE_HOOK_TX: rc = ib_hook_tx_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_stop_tx_callback, (void *)eventp ); break; case IB_STATE_HOOK_TXDATA: rc = ib_hook_txdata_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_stop_txdata_callback, (void *)eventp ); break; default: rc = IB_EINVAL; ib_log_error(ib, "Event with unknown hook type: %d/%s", eventp->number, eventp->name); } } if (rc != IB_OK) { ib_log_error(ib, "Hook register for " "event:%d name:%s cbdata_type: %d returned %s", eventp->number, eventp->name, eventp->cbdata_type, ib_status_to_string(rc)); } } IB_FTRACE_RET_STATUS(IB_OK); }
/** * @internal * Called when module is loaded * Start event hooks are registered here. * * @param[in] ib IronBee object * @param[in] m Module object * @param[in] cbdata Callback data (unused) */ static ib_status_t perf_stats_init(ib_engine_t *ib, ib_module_t *m, void *cbdata) { /*Detect main context otherwise return IB_ENGINE_CONTEXT_MAIN. */ IB_FTRACE_INIT(); ib_log_debug(ib, "Perf stats module loaded."); ib_status_t rc; int event; /* Register specific handlers for specific events, and a * generic handler for the rest */ for (event = 0; event < IB_STATE_EVENT_NUM; ++event) { event_info_t *eventp = &event_info[event]; /* Record event info */ eventp->number = event; eventp->name = ib_state_event_name((ib_state_event_type_t)event); eventp->cbdata_type = ib_state_event_cbdata_type(event); /* init the per connection counters here. * Otherwise use callback data type. */ if (event == conn_started_event) { rc = ib_hook_conn_register( ib, (ib_state_event_type_t)event, mod_perf_stats_reg_conn_counter, (void *)eventp ); } else if ((eventp->cbdata_type == IB_CBDATA_NONE) || (eventp->cbdata_type == IB_CBDATA_CONN_DATA_T)) { rc = IB_EINVAL; ib_log_error(ib, "Cannot register handler " "for:%d name:%s cbdata_type: %d", eventp->number, eventp->name, eventp->cbdata_type); } else { switch( ib_state_hook_type( (ib_state_event_type_t)event ) ) { case IB_STATE_HOOK_CONN: rc = ib_hook_conn_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_start_conn_callback, (void *)eventp ); break; case IB_STATE_HOOK_CONNDATA: rc = ib_hook_conndata_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_start_conndata_callback, (void *)eventp ); break; case IB_STATE_HOOK_TX: rc = ib_hook_tx_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_start_tx_callback, (void *)eventp ); break; case IB_STATE_HOOK_TXDATA: rc = ib_hook_txdata_register( ib, (ib_state_event_type_t)event, mod_perf_stats_event_start_txdata_callback, (void *)eventp ); break; default: rc = IB_EINVAL; ib_log_error(ib, "Event with unknown hook type: %d/%s", eventp->number, eventp->name); } } if (rc != IB_OK) { ib_log_error(ib, "Hook register for" "event:%d name:%s cbdata_type: %d returned %s", eventp->number, eventp->name, eventp->cbdata_type, ib_status_to_string(rc)); } } IB_FTRACE_RET_STATUS(IB_OK); }