1 /*******************************************************************************
2 * Copyright (c) 2013, 2016 École Polytechnique de Montréal
4 * All rights reserved. This program and the accompanying materials are made
5 * available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Geneviève Bastien - Initial implementation and API
11 * Patrick Tasse - Remove getSubField
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.internal
.lttng2
.kernel
.core
.event
.matching
;
16 import java
.util
.HashMap
;
17 import java
.util
.HashSet
;
20 import java
.util
.WeakHashMap
;
22 import org
.eclipse
.tracecompass
.analysis
.os
.linux
.core
.trace
.IKernelAnalysisEventLayout
;
23 import org
.eclipse
.tracecompass
.analysis
.os
.linux
.core
.trace
.IKernelTrace
;
24 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
25 import org
.eclipse
.tracecompass
.tmf
.core
.event
.TmfEventField
;
26 import org
.eclipse
.tracecompass
.tmf
.core
.event
.matching
.IEventMatchingKey
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.event
.matching
.ITmfMatchEventDefinition
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.event
.matching
.TcpEventKey
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.event
.matching
.TmfEventMatching
.Direction
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTraceWithPreDefinedEvents
;
32 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfEventTypeCollectionHelper
;
35 * Class to match tcp events. They use the main kernel's tracepoints
36 * netif_receive_skb and net_dev_queue to check if they have a TCP header and
37 * use the sequence, acknowledge and flags fields to match packets
39 * @author Geneviève Bastien
41 public class TcpLttngEventMatching
implements ITmfMatchEventDefinition
{
43 private static final Map
<IKernelAnalysisEventLayout
, Set
<String
>> REQUIRED_EVENTS
= new HashMap
<>();
45 /** Use a weak hash map so that traces can be garbage collected */
46 private static final Map
<ITmfTrace
, IKernelAnalysisEventLayout
> TRACE_LAYOUTS
= new WeakHashMap
<>();
49 public boolean canMatchTrace(ITmfTrace trace
) {
50 // Get the events that this trace needs to have
51 if (!(trace
instanceof IKernelTrace
)) {
52 // Not a kernel trace, we cannot know what events to use, return
56 IKernelAnalysisEventLayout layout
= ((IKernelTrace
) trace
).getKernelEventLayout();
57 TRACE_LAYOUTS
.put(trace
, layout
);
59 Set
<String
> events
= REQUIRED_EVENTS
.get(layout
);
61 events
= new HashSet
<>();
62 events
.addAll(layout
.eventsNetworkSend());
63 events
.addAll(layout
.eventsNetworkReceive());
64 REQUIRED_EVENTS
.put(layout
, events
);
67 if (!(trace
instanceof ITmfTraceWithPreDefinedEvents
)) {
68 // No predefined events, suppose events are present
71 ITmfTraceWithPreDefinedEvents ktrace
= (ITmfTraceWithPreDefinedEvents
) trace
;
73 Set
<String
> traceEvents
= TmfEventTypeCollectionHelper
.getEventNames(ktrace
.getContainedEventTypes());
74 traceEvents
.retainAll(events
);
75 return !traceEvents
.isEmpty();
82 public Direction
getDirection(ITmfEvent event
) {
83 IKernelAnalysisEventLayout layout
= TRACE_LAYOUTS
.get(event
.getTrace());
87 String evname
= event
.getName();
88 /* Is the event a tcp socket in or out event */
89 if (layout
.eventsNetworkReceive().contains(evname
)) {
90 return Direction
.EFFECT
;
91 } else if (layout
.eventsNetworkSend().contains(evname
)) {
92 return Direction
.CAUSE
;
98 public IEventMatchingKey
getEventKey(ITmfEvent event
) {
99 IKernelAnalysisEventLayout layout
= TRACE_LAYOUTS
.get(event
.getTrace());
100 if (layout
== null) {
104 TmfEventField content
= (TmfEventField
) event
.getContent();
106 Long sequence
= content
.getFieldValue(Long
.class, layout
.fieldPathTcpSeq());
107 Long ack
= content
.getFieldValue(Long
.class, layout
.fieldPathTcpAckSeq());
108 Long flags
= content
.getFieldValue(Long
.class, layout
.fieldPathTcpFlags());
110 if (sequence
== null || ack
== null || flags
== null) {
114 IEventMatchingKey key
= new TcpEventKey(sequence
, ack
, flags
);