952c338a5a0d0bcc09d2a0cb90507d3333bf84ca
[deliverable/tracecompass.git] / lttng / org.eclipse.tracecompass.lttng2.kernel.core / src / org / eclipse / tracecompass / internal / lttng2 / kernel / core / event / matching / TcpLttngEventMatching.java
1 /*******************************************************************************
2 * Copyright (c) 2013, 2016 École Polytechnique de Montréal
3 *
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
8 *
9 * Contributors:
10 * Geneviève Bastien - Initial implementation and API
11 * Patrick Tasse - Remove getSubField
12 *******************************************************************************/
13
14 package org.eclipse.tracecompass.internal.lttng2.kernel.core.event.matching;
15
16 import java.util.HashMap;
17 import java.util.HashSet;
18 import java.util.Map;
19 import java.util.Set;
20 import java.util.WeakHashMap;
21
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;
33
34 /**
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
38 *
39 * @author Geneviève Bastien
40 */
41 public class TcpLttngEventMatching implements ITmfMatchEventDefinition {
42
43 private static final Map<IKernelAnalysisEventLayout, Set<String>> REQUIRED_EVENTS = new HashMap<>();
44
45 /** Use a weak hash map so that traces can be garbage collected */
46 private static final Map<ITmfTrace, IKernelAnalysisEventLayout> TRACE_LAYOUTS = new WeakHashMap<>();
47
48 @Override
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
53 // false
54 return false;
55 }
56 IKernelAnalysisEventLayout layout = ((IKernelTrace) trace).getKernelEventLayout();
57 TRACE_LAYOUTS.put(trace, layout);
58
59 Set<String> events = REQUIRED_EVENTS.get(layout);
60 if (events == null) {
61 events = new HashSet<>();
62 events.addAll(layout.eventsNetworkSend());
63 events.addAll(layout.eventsNetworkReceive());
64 REQUIRED_EVENTS.put(layout, events);
65 }
66
67 if (!(trace instanceof ITmfTraceWithPreDefinedEvents)) {
68 // No predefined events, suppose events are present
69 return true;
70 }
71 ITmfTraceWithPreDefinedEvents ktrace = (ITmfTraceWithPreDefinedEvents) trace;
72
73 Set<String> traceEvents = TmfEventTypeCollectionHelper.getEventNames(ktrace.getContainedEventTypes());
74 traceEvents.retainAll(events);
75 return !traceEvents.isEmpty();
76 }
77
78 /**
79 * @since 1.0
80 */
81 @Override
82 public Direction getDirection(ITmfEvent event) {
83 IKernelAnalysisEventLayout layout = TRACE_LAYOUTS.get(event.getTrace());
84 if (layout == null) {
85 return null;
86 }
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;
93 }
94 return null;
95 }
96
97 @Override
98 public IEventMatchingKey getEventKey(ITmfEvent event) {
99 IKernelAnalysisEventLayout layout = TRACE_LAYOUTS.get(event.getTrace());
100 if (layout == null) {
101 return null;
102 }
103
104 TmfEventField content = (TmfEventField) event.getContent();
105
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());
109
110 if (sequence == null || ack == null || flags == null) {
111 return null;
112 }
113
114 IEventMatchingKey key = new TcpEventKey(sequence, ack, flags);
115 return key;
116
117 }
118
119 }
This page took 0.034308 seconds and 5 git commands to generate.