X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fsync%2Fevent_processing_lttng_standard.c;h=489dec5fd6e60481b377cf514a9ca4c3efd1aed2;hb=9a9ca632e32af79f5f77894ef6e981ac0138102a;hp=de2d86a4fa8dd8fc4a498cc74ac70d816a2996bb;hpb=10341d26543c63ff318a4cf5cb163bccdc58b19d;p=lttv.git diff --git a/lttv/lttv/sync/event_processing_lttng_standard.c b/lttv/lttv/sync/event_processing_lttng_standard.c index de2d86a4..489dec5f 100644 --- a/lttv/lttv/sync/event_processing_lttng_standard.c +++ b/lttv/lttv/sync/event_processing_lttng_standard.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "sync_chain_lttv.h" #include "event_processing_lttng_common.h" @@ -131,7 +132,8 @@ static void initProcessingLTTVStandard(SyncState* const syncState, LttvTracesetC } registerHooks(processingData->hookListList, traceSetContext, - &processEventLTTVStandard, syncState); + &processEventLTTVStandard, syncState, + syncState->matchingModule->canMatch); } @@ -244,10 +246,21 @@ static void printProcessingStatsLTTVStandard(SyncState* const syncState) printf("\treceived frames: %d\n", processingData->stats->totRecv); printf("\treceived frames that are IP: %d\n", processingData->stats->totRecvIp); - printf("\treceived and processed packets that are TCP: %d\n", - processingData->stats->totInE); - printf("\tsent packets that are TCP: %d\n", - processingData->stats->totOutE); + if (syncState->matchingModule->canMatch[TCP]) + { + printf("\treceived and processed packets that are TCP: %d\n", + processingData->stats->totRecvTCP); + } + if (syncState->matchingModule->canMatch[UDP]) + { + printf("\treceived and processed packets that are UDP: %d\n", + processingData->stats->totRecvUDP); + } + if (syncState->matchingModule->canMatch[TCP]) + { + printf("\tsent packets that are TCP: %d\n", + processingData->stats->totOutE); + } if (syncState->matchingModule->printMatchingStats != NULL) { @@ -367,12 +380,12 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) traceHook= (LttvTraceHook*) hookData; tfc= (LttvTracefileContext*) callData; + trace= tfc->t_context->t; syncState= (SyncState*) traceHook->hook_data; processingData= (ProcessingDataLTTVStandard*) syncState->processingData; event= ltt_tracefile_get_event(tfc->tf); time= ltt_event_time(event); - tsc= ltt_event_cycle_count(event); - trace= tfc->t_context->t; + tsc= trace->drift * ltt_event_cycle_count(event) + trace->offset; info= marker_get_info_from_id(tfc->tf->mdata, event->event_id); g_assert(g_hash_table_lookup_extended(processingData->traceNumTable, @@ -382,7 +395,7 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) (long) time.tv_sec, time.tv_nsec, traceNum, trace, g_quark_to_string(info->name)); - if (info->name == LTT_EVENT_DEV_XMIT) + if (info->name == LTT_EVENT_DEV_XMIT_EXTENDED) { Event* outE; @@ -394,6 +407,11 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) return FALSE; } + if (!syncState->matchingModule->canMatch[TCP]) + { + return FALSE; + } + if (syncState->stats) { processingData->stats->totOutE++; @@ -484,7 +502,7 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) g_debug("\n"); } } - else if (info->name == LTT_EVENT_TCPV4_RCV) + else if (info->name == LTT_EVENT_TCPV4_RCV_EXTENDED) { Event* inE; void* skb; @@ -498,13 +516,13 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) if (inE == NULL) { // This should only happen in case of lost events - g_debug("No matching pending receive event found\n"); + g_warning("No matching pending receive event found"); } else { if (syncState->stats) { - processingData->stats->totInE++; + processingData->stats->totRecvTCP++; } // If it's there, remove it and proceed with a receive event @@ -557,29 +575,81 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) syncState->matchingModule->matchEvent(syncState, inE); - g_debug("Input event %p for skb %p done\n", inE, skb); + g_debug("TCP input event %p for skb %p done\n", inE, skb); } } - else if (info->name == LTT_EVENT_NETWORK_IPV4_INTERFACE) + else if (info->name == LTT_EVENT_UDPV4_RCV_EXTENDED) { - char* name; - guint64 address; - gint64 up; - char addressString[17]; + Event* inE; + void* skb; - address= ltt_event_get_long_unsigned(event, - lttv_trace_get_hook_field(traceHook, 1)); - up= ltt_event_get_long_int(event, lttv_trace_get_hook_field(traceHook, - 2)); - /* name must be the last field to get or else copy the string, see the - * doc for ltt_event_get_string() - */ - name= ltt_event_get_string(event, lttv_trace_get_hook_field(traceHook, - 0)); + // Search pendingRecv for an event with the same skb + skb= (void*) (long) ltt_event_get_long_unsigned(event, + lttv_trace_get_hook_field(traceHook, 0)); - convertIP(addressString, address); + inE= (Event*) + g_hash_table_lookup(processingData->pendingRecv[traceNum], skb); + if (inE == NULL) + { + // This should only happen in case of lost events + g_warning("No matching pending receive event found"); + } + else + { + guint64 dataStart; - g_debug("name \"%s\" address %s up %lld\n", name, addressString, up); + if (syncState->stats) + { + processingData->stats->totRecvUDP++; + } + + // If it's there, remove it and proceed with a receive event + g_hash_table_steal(processingData->pendingRecv[traceNum], skb); + + inE->type= UDP; + inE->event.udpEvent= malloc(sizeof(UDPEvent)); + inE->destroy= &destroyUDPEvent; + inE->event.udpEvent->direction= IN; + inE->event.udpEvent->datagramKey= malloc(sizeof(DatagramKey)); + inE->event.udpEvent->datagramKey->saddr= + ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 1)); + inE->event.udpEvent->datagramKey->daddr= + ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 2)); + inE->event.udpEvent->unicast= ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 3)) == 0 ? false : true; + inE->event.udpEvent->datagramKey->ulen= + ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 4)); + inE->event.udpEvent->datagramKey->source= + ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 5)); + inE->event.udpEvent->datagramKey->dest= + ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 6)); + dataStart= ltt_event_get_long_unsigned(event, + lttv_trace_get_hook_field(traceHook, 7)); + g_assert_cmpuint(sizeof(inE->event.udpEvent->datagramKey->dataKey), + ==, sizeof(guint64)); + if (inE->event.udpEvent->datagramKey->ulen - 8 >= + sizeof(inE->event.udpEvent->datagramKey->dataKey)) + { + memcpy(inE->event.udpEvent->datagramKey->dataKey, &dataStart, + sizeof(inE->event.udpEvent->datagramKey->dataKey)); + } + else + { + memset(inE->event.udpEvent->datagramKey->dataKey, 0, + sizeof(inE->event.udpEvent->datagramKey->dataKey)); + memcpy(inE->event.udpEvent->datagramKey->dataKey, &dataStart, + inE->event.udpEvent->datagramKey->ulen - 8); + } + + syncState->matchingModule->matchEvent(syncState, inE); + + g_debug("UDP input event %p for skb %p done\n", inE, skb); + } } else {