org.eclipse.tracecompass.btf.core.tests;bundle-version="3.1.0",
org.eclipse.linuxtools.tmf.analysis.xml.core.tests;bundle-version="1.1.0",
org.eclipse.linuxtools.tmf.analysis.xml.ui.tests;bundle-version="1.1.0",
- org.eclipse.linuxtools.pcap.core.tests;bundle-version="1.0.0",
+ org.eclipse.tracecompass.pcap.core.tests;bundle-version="1.0.0",
org.eclipse.linuxtools.tmf.pcap.core.tests;bundle-version="1.0.0",
org.eclipse.linuxtools.tmf.pcap.ui.swtbot.tests;bundle-version="1.0.0"
Export-Package: org.eclipse.linuxtools.lttng.alltests;x-internal:=true
unpack="false"/>
<plugin
- id="org.eclipse.linuxtools.pcap.core.tests"
+ id="org.eclipse.tracecompass.pcap.core.tests"
download-size="0"
install-size="0"
version="0.0.0"
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="src" path="perf"/>
- <classpathentry kind="src" path="shared"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>org.eclipse.linuxtools.pcap.core.tests</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
- </natures>
-</projectDescription>
+++ /dev/null
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
+++ /dev/null
-eclipse.preferences.version=1
-line.separator=\n
+++ /dev/null
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=enabled
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=error
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=error
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=error
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=error
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=error
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=error
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=enabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=error
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=error
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=error
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=disabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=disabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
-org.eclipse.jdt.core.compiler.source=1.7
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true
-org.eclipse.jdt.core.formatter.join_wrapped_lines=false
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=250
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=false
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+++ /dev/null
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_tmf-style
-formatter_settings_version=12
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=false
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=false
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.organize_imports=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=true
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=false
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+++ /dev/null
-ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
-API_USE_SCAN_FIELD_SEVERITY=Error
-API_USE_SCAN_METHOD_SEVERITY=Error
-API_USE_SCAN_TYPE_SEVERITY=Error
-CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
-CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
-CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
-CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
-CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
-ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
-ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
-ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
-FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
-FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
-FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
-FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
-ILLEGAL_EXTEND=Warning
-ILLEGAL_IMPLEMENT=Warning
-ILLEGAL_INSTANTIATE=Warning
-ILLEGAL_OVERRIDE=Warning
-ILLEGAL_REFERENCE=Warning
-INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
-INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-INVALID_JAVADOC_TAG=Warning
-INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
-LEAK_EXTEND=Warning
-LEAK_FIELD_DECL=Warning
-LEAK_IMPLEMENT=Warning
-LEAK_METHOD_PARAM=Warning
-LEAK_METHOD_RETURN_TYPE=Warning
-METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
-METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-MISSING_EE_DESCRIPTIONS=Ignore
-TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-UNUSED_PROBLEM_FILTERS=Warning
-automatically_removed_unused_problem_filters=false
-eclipse.preferences.version=1
-incompatible_api_component_version=Error
-incompatible_api_component_version_include_major_without_breaking_change=Disabled
-incompatible_api_component_version_include_minor_without_api_change=Disabled
-invalid_since_tag_version=Error
-malformed_since_tag=Error
-missing_since_tag=Error
-report_api_breakage_when_major_version_incremented=Disabled
-report_resolution_errors_api_component=Warning
+++ /dev/null
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.build.bin.includes=1
-compilers.p.build.encodings=2
-compilers.p.build.java.compiler=2
-compilers.p.build.java.compliance=1
-compilers.p.build.missing.output=2
-compilers.p.build.output.library=1
-compilers.p.build.source.library=1
-compilers.p.build.src.includes=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=2
-compilers.p.missing-version-export-package=2
-compilers.p.missing-version-import-package=2
-compilers.p.missing-version-require-bundle=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
+++ /dev/null
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 1.0.0.qualifier
-Bundle-Localization: plugin
-Bundle-SymbolicName: org.eclipse.linuxtools.pcap.core.tests;singleton:=true
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
-Require-Bundle: org.junit;bundle-version="4.0.0",
- org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.linuxtools.pcap.core;bundle-version="1.0.0"
-Export-Package: org.eclipse.linuxtools.pcap.core.tests,
- org.eclipse.linuxtools.pcap.core.tests.file;x-internal:=true,
- org.eclipse.linuxtools.pcap.core.tests.packet;x-internal:=true,
- org.eclipse.linuxtools.pcap.core.tests.perf,
- org.eclipse.linuxtools.pcap.core.tests.perf.trace;x-internal:=true,
- org.eclipse.linuxtools.pcap.core.tests.protocol;x-internal:=true,
- org.eclipse.linuxtools.pcap.core.tests.protocol.ethernet2;x-internal:=true,
- org.eclipse.linuxtools.pcap.core.tests.protocol.ipv4;x-internal:=true,
- org.eclipse.linuxtools.pcap.core.tests.protocol.pcap;x-internal:=true,
- org.eclipse.linuxtools.pcap.core.tests.protocol.tcp;x-internal:=true,
- org.eclipse.linuxtools.pcap.core.tests.protocol.udp;x-internal:=true,
- org.eclipse.linuxtools.pcap.core.tests.protocol.unknown;x-internal:=true,
- org.eclipse.linuxtools.pcap.core.tests.shared;x-friends:="org.eclipse.linuxtools.tmf.pcap.core.tests",
- org.eclipse.linuxtools.pcap.core.tests.stream;x-internal:=true
-Import-Package: com.google.common.collect,
- org.eclipse.test.performance
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<p>June 5, 2006</p>
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, "Program" will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
-being redistributed by another party ("Redistributor") and different terms and conditions may
-apply to your use of any object code in the Content. Check the Redistributor's license that was
-provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-###############################################################################
-# Copyright (c) 2014 Ericsson
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# Ericsson - Initial API and implementation
-###############################################################################
-
-source.. = src/,\
- perf/,\
- shared/
-output.. = bin/
-bin.includes = META-INF/,\
- .,\
- plugin.properties
-src.includes = about.html
-additional.bundles = org.eclipse.jdt.annotation
-jars.extra.classpath = platform:/plugin/org.eclipse.jdt.annotation
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial implementation and API
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.perf;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Run all performance test suites.
- *
- * @author Vincent Perot
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- org.eclipse.linuxtools.pcap.core.tests.perf.trace.AllTests.class
-})
-public class AllPerfTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.perf.trace;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- PcapReadBenchmark.class,
- PcapSeekBenchmark.class
-})
-public class AllTests {
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.perf.trace;
-
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.test.performance.Performance;
-import org.eclipse.test.performance.PerformanceMeter;
-import org.junit.Test;
-
-/**
- * Benchmark of the Pcap parser for reading a trace. Note: We should get a
- * bigger trace. One that has WAYYYY more events since this current trace is
- * just parsed too fast.
- *
- * @author Vincent Perot
- */
-public class PcapReadBenchmark {
-
- private static final String TEST_SUITE_NAME = "Pcap Read Benchmark";
- private static final String TEST_ID = "org.eclipse.linuxtools#" + TEST_SUITE_NAME;
- private static final int LOOP_COUNT = 25;
- private static final int RUN_BETWEEN_COMMIT_COUNT = 15;
-
- /**
- * Benchmark reading the pcap trace
- */
- @Test
- public void testPcapTrace() {
- readTrace(PcapTestTrace.BENCHMARK_TRACE, "trace-pcap", true);
- }
-
- private static void readTrace(PcapTestTrace testTrace, String testName, boolean inGlobalSummary) {
- assumeTrue(testTrace.exists());
-
- Performance perf = Performance.getDefault();
- PerformanceMeter pm = perf.createPerformanceMeter(TEST_ID + '#' + testName);
- perf.tagAsSummary(pm, TEST_SUITE_NAME + ':' + testName, Dimension.CPU_TIME);
-
- if (inGlobalSummary) {
- perf.tagAsGlobalSummary(pm, TEST_SUITE_NAME + ':' + testName, Dimension.CPU_TIME);
- }
-
- for (int loop = 0; loop < LOOP_COUNT; loop++) {
- pm.start();
- try (PcapFile trace = testTrace.getTrace();) {
- for (int i = 0; i < RUN_BETWEEN_COMMIT_COUNT; i++) {
- trace.seekPacket(0);
- while (trace.hasNextPacket()) {
- Packet packet = trace.parseNextPacket();
- if (packet == null) {
- fail("Test failed at iteration " + loop + '.' + i + ", at packet " + trace.getCurrentRank());
- return;
- }
- /* Do something with the packet because we are awesome */
- packet.getPayload();
- }
- }
- } catch (IOException | BadPcapFileException | BadPacketException e) {
- fail("Test failed at iteration " + loop + ':' + e.getMessage());
- }
- pm.stop();
- }
- pm.commit();
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.perf.trace;
-
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Random;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.test.performance.Performance;
-import org.eclipse.test.performance.PerformanceMeter;
-import org.junit.Test;
-
-/**
- * Tests for performance regressions of the pcap reader. It only tests the pcap
- * reader, not tmf. <br>
- * This test runs in 3 passes.
- * <ul>
- * <li>first it opens a trace</li>
- * <li>then it reads the trace completely</li>
- * <li>then it randomly (seeded) seeks NB_SEEKS locations in the trace and reads
- * one event at each position.</li>
- * </ul>
- * <li>Note: We should make more seeks, since the current number is just too
- * fast.</li>
- *
- * @author Vincent Perot
- */
-public class PcapSeekBenchmark {
-
- private static final Random RND = new Random(1000);
-
- private static final int LOOP_COUNT = 25;
- private static final int NB_SEEKS = 1000000;
- private static final String TEST_SUITE_NAME = "Pcap Read & Seek Benchmark (" + NB_SEEKS + " seeks)";
- private static final String TEST_ID = "org.eclipse.linuxtools#" + TEST_SUITE_NAME;
-
- /**
- * Run the benchmark scenario for the pcap trace.
- */
- @Test
- public void testPcapTrace() {
- readAndSeekTrace(PcapTestTrace.BENCHMARK_TRACE, "trace-pcap", true);
- }
-
- private static void readAndSeekTrace(PcapTestTrace testTrace, String testName, boolean inGlobalSummary) {
- assumeTrue(testTrace.exists());
-
- Performance perf = Performance.getDefault();
- PerformanceMeter pm = perf.createPerformanceMeter(TEST_ID + '#' + testName);
- perf.tagAsSummary(pm, TEST_SUITE_NAME + ':' + testName, Dimension.CPU_TIME);
-
- if (inGlobalSummary) {
- perf.tagAsGlobalSummary(pm, TEST_SUITE_NAME + ':' + testName, Dimension.CPU_TIME);
- }
-
- for (int loop = 0; loop < LOOP_COUNT; loop++) {
- try (PcapFile trace = testTrace.getTrace()) {
- trace.seekPacket(0);
-
- /* Read the whole trace to find out the number of packets */
- long nbPackets = trace.getTotalNbPackets();
-
- /* Generate the timestamps we will seek to */
- List<Long> seekTimestamps = new LinkedList<>();
- final long range = nbPackets;
- for (int i = 0; i < NB_SEEKS; i++) {
- long rank = (RND.nextLong() % range);
- if (rank < 0) {
- // This is needed since modulus can return a negative
- // number.
- rank += range;
- }
- seekTimestamps.add(rank);
- }
-
- /* Benchmark seeking to the generated timestamps */
- pm.start();
- for (Long rank : seekTimestamps) {
- trace.seekPacket(rank);
- trace.parseNextPacket();
- }
- pm.stop();
-
- } catch (IOException | BadPcapFileException | BadPacketException e) {
- /* Should not happen if assumeTrue() passed above */
- fail("Test failed at iteration " + loop + ':' + e.getMessage());
- }
- }
- pm.commit();
- }
-}
+++ /dev/null
-###############################################################################
-# Copyright (c) 2014 Ericsson
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# Ericsson - Initial API and implementation
-###############################################################################
-
-#Properties file for org.eclipse.linuxtools.pcap.core.tests
-Bundle-Vendor = Eclipse Linux Tools
-Bundle-Name = Linux Tools Pcap Parser Core Tests Plug-in
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2014, Ericsson
-
- All rights reserved. This program and the accompanying materials
- are made available under the terms of the Eclipse Public License v1.0
- which accompanies this distribution, and is available at
- http://www.eclipse.org/legal/epl-v10.html
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <artifactId>org.eclipse.tracecompass</artifactId>
- <groupId>org.eclipse.tracecompass</groupId>
- <version>3.2.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>org.eclipse.linuxtools.pcap.core.tests</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- <packaging>eclipse-test-plugin</packaging>
-
- <name>Linux Tools Pcap Parser Core Tests Plug-in</name>
-
- <!-- Do not download the test traces if "maven.test.skip" is set -->
- <profiles>
- <profile>
- <id>download-traces</id>
- <activation>
- <property>
- <name>!maven.test.skip</name>
- </property>
- </activation>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
- <executions>
- <execution>
- <id>prepare</id>
- <phase>pre-integration-test</phase>
- <configuration>
- <target>
- <ant antfile="get-traces.xml" dir="rsc" />
- </target>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.eclipse.tycho</groupId>
- <artifactId>tycho-surefire-plugin</artifactId>
- <version>${tycho-version}</version>
- <configuration>
- <testSuite>org.eclipse.linuxtools.pcap.core.tests</testSuite>
- <testClass>org.eclipse.linuxtools.pcap.core.tests.AllPcapCoreTests</testClass>
- <useUIHarness>false</useUIHarness>
- <useUIThread>false</useUIThread>
- <product>org.eclipse.platform.ide</product>
- </configuration>
- </plugin>
-
- <!-- We don't use the ant file to clean because of http://jira.codehaus.org/browse/MANTRUN-78 -->
- <plugin>
- <artifactId>maven-clean-plugin</artifactId>
- <version>2.5</version>
- <executions>
- <execution>
- <id>clean-traces</id>
- <phase>clean</phase>
- <configuration>
- <filesets>
- <fileset>
- <directory>rsc</directory>
- <includes>
- <include>*.zip</include>
- <include>*.pcap</include>
- <include>*.cap</include>
- <include>*.tar*</include>
- </includes>
- <excludes>
- <exclude>*.xml</exclude>
- <exclude>*.sh</exclude>
- </excludes>
- </fileset>
- <fileset><directory>rsc/kernel</directory></fileset>
- </filesets>
- </configuration>
- <goals>
- <goal>clean</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
-
- </plugins>
- </build>
-
- <groupId>org.eclipse.linuxtools.pcap</groupId>
-</project>
+++ /dev/null
-*.zip
-*.pcap
-*.cap
-*.tar*
-/kernel
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (C) 2013, Red Hat, Inc. and others
-
- All rights reserved. This program and the accompanying materials
- are made available under the terms of the Eclipse Public License v1.0
- which accompanies this distribution, and is available at
- http://www.eclipse.org/legal/epl-v10.html
--->
-<!--
-Most traces are taken from the Wireshark website and are available under the GNU General Public License.
-http://wiki.wireshark.org/SampleCaptures
--->
-
-<project name="Extract Traces" default="main" >
-
-<target name="main">
- <echo message="Attempting to download test traces"/>
- <get ignoreerrors="true" maxtime="20" dest="Short_LittleEndian.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/1/18/Short_LittleEndian.pcap.zip" />
- <get ignoreerrors="true" maxtime="20" dest="Short_BigEndian.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/2/25/Short_BigEndian.pcap.zip" />
- <get ignoreerrors="true" maxtime="20" dest="MostlyUDP.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/6/64/MostlyUDP.pcap.zip" />
- <get ignoreerrors="true" maxtime="20" dest="MostlyTCP.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/8/8d/MostlyTCP.pcap.zip" />
- <get ignoreerrors="true" maxtime="20" dest="EmptyPcap.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/c/c1/EmptyPcap.pcap.zip" />
- <get ignoreerrors="true" maxtime="20" dest="BadPcapFile.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/5/5e/BadPcapFile.pcap.zip" />
- <get ignoreerrors="true" maxtime="60" dest="BenchmarkTrace.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/1/12/BenchmarkTrace.pcap.zip" />
- <get ignoreerrors="true" maxtime="20" dest="sample-ctf-trace-20120412.tar.bz2" skipexisting="true" src="http://lttng.org/files/samples/sample-ctf-trace-20120412.tar.bz2"/>
- <condition property="testSuiteExists">
- <and>
- <available file="pcap-testsuite" type="dir"/>
- </and>
- </condition>
- <condition property="tracesExist">
- <and>
- <available file="Short_LittleEndian.pcap.zip"/>
- <available file="Short_BigEndian.pcap.zip"/>
- <available file="MostlyUDP.pcap.zip"/>
- <available file="MostlyTCP.pcap.zip"/>
- <available file="EmptyPcap.pcap.zip"/>
- <available file="BadPcapFile.pcap.zip"/>
- <available file="BenchmarkTrace.pcap.zip"/>
- <available file="sample-ctf-trace-20120412.tar.bz2"/>
- </and>
- </condition>
- <antcall target="extractTraces"/>
-</target>
-
-<target name="extractTraces" if="tracesExist">
- <unzip src="Short_LittleEndian.pcap.zip" dest="." />
- <unzip src="Short_BigEndian.pcap.zip" dest="." />
- <unzip src="MostlyUDP.pcap.zip" dest="." />
- <unzip src="MostlyTCP.pcap.zip" dest="." />
- <unzip src="EmptyPcap.pcap.zip" dest="." />
- <unzip src="BadPcapFile.pcap.zip" dest="." />
- <unzip src="BenchmarkTrace.pcap.zip" dest="." />
- <bunzip2 src="sample-ctf-trace-20120412.tar.bz2"/>
- <untar src="sample-ctf-trace-20120412.tar" dest="." />
- <echo message="Traces extracted successfully"/>
-</target>
-</project>
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.shared;
-
-import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-
-/**
- * Here is the list of the available test traces for the Pcap parser.
- *
- * @author Vincent Perot
- */
-public enum PcapTestTrace {
-
- /** A bad pcap file. */
- BAD_PCAPFILE("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "BadPcapFile.pcap"),
-
- /** A Valid Pcap that is empty. */
- EMPTY_PCAP("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "EmptyPcap.pcap"),
-
- /** A Pcap that mostly contains TCP packets. */
- MOSTLY_TCP("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "mostlyTCP.pcap"),
-
- /** A Pcap that mostly contains UDP packets. */
- MOSTLY_UDP("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "mostlyUDP.pcap"),
-
- /** A big-endian trace that contains two packets. */
- SHORT_BIG_ENDIAN("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "Short_BigEndian.pcap"),
-
- /** A little-endian trace that contains two packets. */
- SHORT_LITTLE_ENDIAN("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "Short_LittleEndian.pcap"),
-
- /** A large trace for benchmarking. */
- BENCHMARK_TRACE("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "benchmarkTrace.pcap"),
-
- /** A Kernel trace directory. */
- KERNEL_DIRECTORY("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "kernel"),
-
- /** A Kernel trace file. */
- KERNEL_TRACE("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "kernel", "channel0_0");
-
- private final @NonNull Path fPath;
-
- private PcapTestTrace(@NonNull String first, String... more) {
- @SuppressWarnings("null")
- @NonNull Path path = FileSystems.getDefault().getPath(first, more);
- fPath = path;
- }
-
- /** @return The path to the test trace */
- public @NonNull Path getPath() {
- return fPath;
- }
-
- /**
- * Get a Pcap Trace instance of a test trace. Make sure to call
- * {@link #exists()} before calling this!
- *
- * @return The PcapFile object
- * @throws IOException
- * Thrown when some IO error occurs.
- * @throws BadPcapFileException
- * Thrown when the file is not a valid Pcap File.
- */
- public PcapFile getTrace() throws BadPcapFileException, IOException {
- return new PcapFile(fPath);
- }
-
- /**
- * Check if this test trace actually exists on disk.
- *
- * @return If the trace exists
- */
- public boolean exists() {
- if (Files.notExists(fPath)) {
- return false;
- }
- return true;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Master test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- org.eclipse.linuxtools.pcap.core.tests.file.AllTests.class,
- org.eclipse.linuxtools.pcap.core.tests.packet.AllTests.class,
- org.eclipse.linuxtools.pcap.core.tests.protocol.AllTests.class,
- org.eclipse.linuxtools.pcap.core.tests.protocol.ethernet2.AllTests.class,
- org.eclipse.linuxtools.pcap.core.tests.protocol.ipv4.AllTests.class,
- org.eclipse.linuxtools.pcap.core.tests.protocol.pcap.AllTests.class,
- org.eclipse.linuxtools.pcap.core.tests.protocol.tcp.AllTests.class,
- org.eclipse.linuxtools.pcap.core.tests.protocol.udp.AllTests.class,
- org.eclipse.linuxtools.pcap.core.tests.protocol.unknown.AllTests.class,
- org.eclipse.linuxtools.pcap.core.tests.stream.AllTests.class
-})
-public class AllPcapCoreTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.file;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * File test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- PcapFileOpenTest.class,
- PcapFileOpenFailTest.class,
- PcapFileReadTest.class,
- PcapFileEndiannessTest.class
-})
-public class AllTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.file;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.nio.ByteOrder;
-import java.nio.file.Path;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Test;
-
-/**
- * JUnit Class that tests whether the Pcap parser can read both big endian and
- * little endian files.
- *
- * @author Vincent Perot
- */
-public class PcapFileEndiannessTest {
-
- /**
- * Test that verify that two files with different endianness contain the
- * same packets.
- *
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- * @throws BadPacketException
- * Thrown when a packet is erroneous. Fails the test.
- */
- @Test
- public void EndiannessTest() throws IOException, BadPcapFileException, BadPacketException {
- PcapTestTrace trace = PcapTestTrace.SHORT_LITTLE_ENDIAN;
- assumeTrue(trace.exists());
- Path path1 = trace.getPath();
-
- trace = PcapTestTrace.SHORT_LITTLE_ENDIAN;
- assumeTrue(trace.exists());
- Path path2 = PcapTestTrace.SHORT_BIG_ENDIAN.getPath();
-
- try (PcapFile littleEndian = new PcapFile(path1);
- PcapFile bigEndian = new PcapFile(path2);) {
- assertEquals(ByteOrder.BIG_ENDIAN, bigEndian.getByteOrder());
- assertEquals(ByteOrder.LITTLE_ENDIAN, littleEndian.getByteOrder());
- while (littleEndian.hasNextPacket() && bigEndian.hasNextPacket()) {
- assertEquals(littleEndian.parseNextPacket(), bigEndian.parseNextPacket());
- }
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.file;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Test;
-
-/**
- * JUnit Class that tests the opening of non-valid pcap files.
- *
- * @author Vincent Perot
- */
-public class PcapFileOpenFailTest {
-
- /**
- * Test that tries to open a pcap with a bad magic number
- *
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- */
- @Test
- public void FileOpenBadPcapTest() throws IOException {
- PcapTestTrace trace = PcapTestTrace.BAD_PCAPFILE;
- assumeTrue(trace.exists());
-
- try (PcapFile file = new PcapFile(trace.getPath());) {
- fail("The pcap was accepted even though the magic number is invalid!");
- } catch (BadPcapFileException e) {
- assertEquals("c3d4a1b2 is not a known magic number.", e.getMessage());
- }
- }
-
- /**
- * Test that tries to open a non-pcap binary file
- *
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- */
- @Test
- public void FileOpenBinaryFile() throws IOException {
- PcapTestTrace trace = PcapTestTrace.KERNEL_TRACE;
- assumeTrue(trace.exists());
-
- try (PcapFile file = new PcapFile(trace.getPath());) {
- fail("The file was accepted even though it is not a pcap file!");
- } catch (BadPcapFileException e) {
- assertEquals("c11ffcc1 is not a known magic number.", e.getMessage());
- }
- }
-
- /**
- * Test that tries to open a directory
- *
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- */
- @Test
- public void FileOpenDirectory() throws IOException {
- PcapTestTrace trace = PcapTestTrace.KERNEL_DIRECTORY;
- assumeTrue(trace.exists());
-
- try (PcapFile file = new PcapFile(trace.getPath());) {
- fail("The file was accepted even though it is not a pcap file!");
- } catch (BadPcapFileException e) {
- assertEquals("Bad Pcap File.", e.getMessage());
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.file;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.nio.ByteOrder;
-
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Test;
-
-/**
- * JUnit Class that tests the opening of valid pcap files.
- *
- * @author Vincent Perot
- */
-public class PcapFileOpenTest {
-
- /**
- * Test that verify that an empty pcap file is properly opened and that the
- * file properties are correct.
- *
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- */
- @Test
- public void FileOpenEmptyTest() throws IOException, BadPcapFileException {
-
- PcapTestTrace trace = PcapTestTrace.EMPTY_PCAP;
- assumeTrue(trace.exists());
-
- try (PcapFile file = new PcapFile(trace.getPath());) {
- assertEquals(PcapTestTrace.EMPTY_PCAP.getPath(), file.getPath());
- assertEquals(2, file.getMajorVersion());
- assertEquals(4, file.getMinorVersion());
- assertEquals(1, file.getDataLinkType());
- assertEquals(65535, file.getSnapLength());
- assertEquals(0, file.getTimeAccuracy());
- assertEquals(0, file.getTimeZoneCorrection());
- assertEquals(ByteOrder.LITTLE_ENDIAN, file.getByteOrder());
-
- assertEquals(0, file.getTotalNbPackets());
-
- }
- }
-
- /**
- * Test that verify that an non-empty pcap file is properly opened and that
- * the file properties are correct.
- *
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- */
-
- @Test
- public void FileOpenTest() throws IOException, BadPcapFileException {
-
- PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
- assumeTrue(trace.exists());
-
- try (PcapFile file = new PcapFile(trace.getPath());) {
- assertEquals(PcapTestTrace.MOSTLY_TCP.getPath(), file.getPath());
- assertEquals(2, file.getMajorVersion());
- assertEquals(4, file.getMinorVersion());
- assertEquals(1, file.getDataLinkType());
- assertEquals(65535, file.getSnapLength());
- assertEquals(0, file.getTimeAccuracy());
- assertEquals(0, file.getTimeZoneCorrection());
- assertEquals(ByteOrder.LITTLE_ENDIAN, file.getByteOrder());
-
- assertEquals(43, file.getTotalNbPackets());
-
- }
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.file;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Test;
-
-/**
- * JUnit Class that tests if packets are read without error.
- *
- * @author Vincent Perot
- */
-public class PcapFileReadTest {
-
- /**
- * Test that verify that packets are well read and that no error happens in
- * file index.
- *
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- * @throws BadPacketException
- * Thrown when a packet is erroneous. Fails the test.
- */
- @Test
- public void FileReadTest() throws IOException, BadPcapFileException, BadPacketException {
-
- PcapTestTrace trace = PcapTestTrace.MOSTLY_UDP;
- assumeTrue(trace.exists());
-
- try (PcapFile file = new PcapFile(trace.getPath());) {
-
- PcapPacket packet = file.parseNextPacket();
- if (packet == null) {
- fail("FileReadTest() failed!");
- return;
- }
-
- assertEquals(1, file.getCurrentRank());
- // Verify Pcap packet.
- assertEquals(file, packet.getPcapFile());
- assertEquals(PcapProtocol.PCAP, packet.getProtocol());
- assertEquals(0, packet.getIndex());
- assertEquals(1120469540839312L, packet.getTimestamp());
- assertEquals(92, packet.getOriginalLength());
- assertEquals(92, packet.getIncludedLength());
- assertEquals(false, packet.isTruncated());
- assertEquals(true, packet.validate());
- // Verify Ethernet Packet
- if (!packet.hasProtocol(PcapProtocol.ETHERNET_II)) {
- fail("Packet doesn't have ethernet!");
- }
- // Verify IPv4 Packet
- if (!packet.hasProtocol(PcapProtocol.IPV4)) {
- fail("Packet doesn't have IPv4!");
- }
- // Verify UDP Packet
- if (!packet.hasProtocol(PcapProtocol.UDP)) {
- fail("Packet doesn't have UDP!");
- }
- // Verify Unknown Packet
- if (!packet.hasProtocol(PcapProtocol.UNKNOWN)) {
- fail("Packet doesn't have payload!");
- }
-
- // Parse a "random" packet
- file.seekPacket(58);
- packet = file.parseNextPacket();
- if (packet == null) {
- fail("FileReadTest() failed!");
- return;
- }
-
- // Verify Pcap packet.
- assertEquals(file, packet.getPcapFile());
- assertEquals(PcapProtocol.PCAP, packet.getProtocol());
- assertEquals(58, packet.getIndex());
- assertEquals(1120469635045415L, packet.getTimestamp());
- assertEquals(113, packet.getOriginalLength());
- assertEquals(113, packet.getIncludedLength());
- assertEquals(false, packet.isTruncated());
- assertEquals(true, packet.validate());
- // Verify Ethernet Packet
- if (!packet.hasProtocol(PcapProtocol.ETHERNET_II)) {
- fail("Packet doesn't have ethernet!");
- }
- // Verify IPv4 Packet
- if (!packet.hasProtocol(PcapProtocol.IPV4)) {
- fail("Packet doesn't have IPv4!");
- }
- // Verify TCP Packet
- if (!packet.hasProtocol(PcapProtocol.TCP)) {
- fail("Packet doesn't have TCP!");
- }
- // Verify Unknown Packet
- if (!packet.hasProtocol(PcapProtocol.UNKNOWN)) {
- fail("Packet doesn't have payload!");
- }
-
- // Skip packet
- file.skipNextPacket();
- assertEquals(60, file.getCurrentRank());
-
- // Parse outside of file.
- file.seekPacket(99999999);
- assertEquals(file.getTotalNbPackets(), file.getCurrentRank());
- file.skipNextPacket(); // Should be a no-op
- assertEquals(file.getTotalNbPackets(), file.getCurrentRank());
- packet = file.parseNextPacket();
- assertNull(packet);
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.packet;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Generic Packet test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- PacketTest.class,
- BadPacketTest.class
-})
-public class AllTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.packet;
-
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * JUnit Class that tests if BadPacketExceptions are thrown correctly.
- *
- * @author Vincent Perot
- */
-public class BadPacketTest {
-
- private ByteBuffer fEthernetPacket;
-
- /**
- * Initialize the packet.
- */
- @Before
- public void initialize() {
- fEthernetPacket = ByteBuffer.allocate(8);
- fEthernetPacket.order(ByteOrder.BIG_ENDIAN);
-
- // This packet is erroneous. It contains 8 bytes while the minimum is 14
- // bytes for an Ethernet II packet.
-
- // Destination MAC - 6 bytes
- fEthernetPacket.put((byte) 0x34);
- fEthernetPacket.put((byte) 0x67);
- fEthernetPacket.put((byte) 0x0C);
- fEthernetPacket.put((byte) 0xD2);
- fEthernetPacket.put((byte) 0x91);
- fEthernetPacket.put((byte) 0x51);
-
- // Source MAC - 2 bytes
- fEthernetPacket.put((byte) 0x10);
- fEthernetPacket.put((byte) 0xF8);
-
- fEthernetPacket.flip();
-
- }
-
- /**
- * Test that verify if a BadPacketException is correctly thrown (when a
- * packet is erroneous).
- *
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- * @throws BadPacketException
- * Thrown when a packet is erroneous. Expected from the test.
- */
- @Test(expected = BadPacketException.class)
- public void PacketExceptionTest() throws BadPacketException, IOException, BadPcapFileException {
- PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
- assumeTrue(trace.exists());
- try (PcapFile dummy = new PcapFile(trace.getPath())) {
- ByteBuffer packet = fEthernetPacket;
- if (packet != null) {
- new EthernetIIPacket(dummy, null, packet);
- }
- fail("PacketExceptionTest has failed!");
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.packet;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * JUnit Class that tests the generic Packet class and its method.
- *
- * @author Vincent Perot
- */
-public class PacketTest {
-
- private ByteBuffer fEthernetPacket;
-
- /**
- * Initialize the packet.
- */
- @Before
- public void initialize() {
- fEthernetPacket = ByteBuffer.allocate(15);
- fEthernetPacket.order(ByteOrder.BIG_ENDIAN);
-
- // Destination MAC - 6 bytes
- fEthernetPacket.put((byte) 0x34);
- fEthernetPacket.put((byte) 0x67);
- fEthernetPacket.put((byte) 0x0C);
- fEthernetPacket.put((byte) 0xD2);
- fEthernetPacket.put((byte) 0x91);
- fEthernetPacket.put((byte) 0x51);
-
- // Source MAC - 6 bytes
- fEthernetPacket.put((byte) 0x10);
- fEthernetPacket.put((byte) 0xF8);
- fEthernetPacket.put((byte) 0x82);
- fEthernetPacket.put((byte) 0xB3);
- fEthernetPacket.put((byte) 0x44);
- fEthernetPacket.put((byte) 0x78);
-
- // Ethertype - 2 bytes
- fEthernetPacket.put((byte) 0xA2);
- fEthernetPacket.put((byte) 0x56);
-
- // Payload - 1 byte
- fEthernetPacket.put((byte) 0xA6);
-
- fEthernetPacket.flip();
-
- }
-
- /**
- * Test that verify the correctness of the Packet's methods.
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- * @throws BadPacketException
- * Thrown when a packet is erroneous. Fails the test.
- */
- @Test
- public void GenericPacketTest() throws BadPacketException, IOException, BadPcapFileException {
- PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
- assumeTrue(trace.exists());
- try (PcapFile dummy = new PcapFile(trace.getPath())) {
- ByteBuffer byteBuffer = fEthernetPacket;
- if (byteBuffer == null) {
- fail("GenericPacketTest has failed!");
- return;
- }
-
- Packet packet = new EthernetIIPacket(dummy, null, byteBuffer);
- assertTrue(packet.hasProtocol(PcapProtocol.ETHERNET_II));
- assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
- assertFalse(packet.hasProtocol(PcapProtocol.TCP));
- assertEquals(PcapProtocol.ETHERNET_II, packet.getProtocol());
-
- assertEquals(packet, packet.getPacket(PcapProtocol.ETHERNET_II));
- assertNull(packet.getPacket(PcapProtocol.TCP));
- assertEquals(packet.getChildPacket(), packet.getPacket(PcapProtocol.UNKNOWN));
- assertEquals(packet.getPacket(PcapProtocol.ETHERNET_II), packet.getMostEcapsulatedPacket());
-
- assertNull(packet.getParentPacket());
- assertFalse(packet.getPcapFile().equals(null));
-
- Packet child = packet.getChildPacket();
- if (child == null) {
- fail("GenericPacketTest has failed!");
- return;
- }
- assertEquals(packet.getPayload(), child.getPayload());
- assertEquals(packet.getGlobalSummaryString(), "Source MAC: 10:f8:82:b3:44:78 , Destination MAC: 34:67:0c:d2:91:51");
-
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Protocol test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- ProtocolTest.class
-})
-public class AllTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.junit.Test;
-
-/**
- * JUnit Class that tests whether protocol operation are happening without
- * error.
- *
- * @author Vincent Perot
- */
-public class ProtocolTest {
-
- /**
- * Test that verify if the protocol attributes are as expected.
- */
- @Test
- public void TestProtocolAttributes() {
- assertEquals(PcapProtocol.PCAP.getName(), "Packet Capture");
- assertEquals(PcapProtocol.PCAP.getShortName(), "pcap");
- assertEquals(PcapProtocol.PCAP.getLayer(), PcapProtocol.Layer.LAYER_0);
- }
-
- /**
- * Test that verify if the protocol getter methods are working properly.
- */
- @Test
- public void TestgetProtocols() {
- List<PcapProtocol> manualListLayer = new ArrayList<>();
- for (PcapProtocol.Layer layer : PcapProtocol.Layer.values()) {
- assertNotNull(layer);
- Collection<PcapProtocol> listLayer = PcapProtocol.getProtocolsOnLayer(layer);
-
- manualListLayer.clear();
- switch (layer) {
- case LAYER_0:
- manualListLayer.add(PcapProtocol.PCAP);
- break;
- case LAYER_1:
- break;
- case LAYER_2:
- manualListLayer.add(PcapProtocol.ETHERNET_II);
- break;
- case LAYER_3:
- manualListLayer.add(PcapProtocol.IPV4);
- break;
- case LAYER_4:
- manualListLayer.add(PcapProtocol.TCP);
- manualListLayer.add(PcapProtocol.UDP);
- break;
- case LAYER_5:
- break;
- case LAYER_6:
- break;
- case LAYER_7:
- manualListLayer.add(PcapProtocol.UNKNOWN);
- break;
- default:
- fail("Illegal layer value!");
- }
- assertEquals(manualListLayer, listLayer);
- }
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.ethernet2;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Ethernet II test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- EthernetIIPacketTest.class
-})
-public class AllTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.ethernet2;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.Map;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIEndpoint;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIPacket;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIValues;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableMap;
-
-/**
- * JUnit Class that tests the EthernetIIPacket class and its method.
- *
- * @author Vincent Perot
- */
-public class EthernetIIPacketTest {
-
- private static final Map<String, String> EXPECTED_FIELDS = ImmutableMap.of(
- "Source MAC Address", "10:f8:82:b3:44:78",
- "Destination MAC Address", "34:67:0c:d2:91:51",
- "Ethertype", "Unknown (0xa256)"
- );
-
- private static final String EXPECTED_TOSTRING =
- "Ethernet II, Source: 10:f8:82:b3:44:78, Destination: 34:67:0c:d2:91:51, Type: Unknown (0xa256)\nPayload: a6";
-
- private ByteBuffer fPacket;
-
- /**
- * Initialize the packet.
- */
- @Before
- public void initialize() {
- fPacket = ByteBuffer.allocate(15);
- fPacket.order(ByteOrder.BIG_ENDIAN);
-
- // Destination MAC - 6 bytes
- fPacket.put((byte) 0x34);
- fPacket.put((byte) 0x67);
- fPacket.put((byte) 0x0C);
- fPacket.put((byte) 0xD2);
- fPacket.put((byte) 0x91);
- fPacket.put((byte) 0x51);
-
- // Source MAC - 6 bytes
- fPacket.put((byte) 0x10);
- fPacket.put((byte) 0xF8);
- fPacket.put((byte) 0x82);
- fPacket.put((byte) 0xB3);
- fPacket.put((byte) 0x44);
- fPacket.put((byte) 0x78);
-
- // Ethertype - 2 bytes
- fPacket.put((byte) 0xA2);
- fPacket.put((byte) 0x56);
-
- // Payload - 1 byte
- fPacket.put((byte) 0xA6);
-
- fPacket.flip();
- }
-
- /**
- * Test that verify the correctness of the EthernetIIPacket's methods.
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- * @throws BadPacketException
- * Thrown when a packet is erroneous. Fails the test.
- */
- @Test
- public void CompleteEthernetIIPacketTest() throws IOException, BadPcapFileException, BadPacketException {
- PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
- assumeTrue(trace.exists());
- try (PcapFile dummy = new PcapFile(trace.getPath())) {
- ByteBuffer byteBuffer = fPacket;
- if (byteBuffer == null) {
- fail("CompleteEthernetIIPacketTest has failed!");
- return;
- }
- EthernetIIPacket packet = new EthernetIIPacket(dummy, null, byteBuffer);
-
- // Protocol Testing
- assertEquals(PcapProtocol.ETHERNET_II, packet.getProtocol());
- assertTrue(packet.hasProtocol(PcapProtocol.ETHERNET_II));
- assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
- assertFalse(packet.hasProtocol(PcapProtocol.TCP));
-
- // Abstract methods Testing
- assertTrue(packet.validate());
- assertEquals(-653947816, packet.hashCode());
- assertFalse(packet.equals(null));
- assertEquals(new EthernetIIPacket(dummy, null, byteBuffer), packet);
-
- assertEquals(EXPECTED_FIELDS, packet.getFields());
- assertEquals(EXPECTED_TOSTRING, packet.toString());
- assertEquals("Src: 10:f8:82:b3:44:78 , Dst: 34:67:0c:d2:91:51", packet.getLocalSummaryString());
- assertEquals("Source MAC: 10:f8:82:b3:44:78 , Destination MAC: 34:67:0c:d2:91:51", packet.getGlobalSummaryString());
-
- assertEquals(new EthernetIIEndpoint(packet, true), packet.getSourceEndpoint());
- assertEquals(new EthernetIIEndpoint(packet, false), packet.getDestinationEndpoint());
-
- fPacket.position(14);
- byte[] payload = new byte[1];
- fPacket.get(payload);
- assertEquals(ByteBuffer.wrap(payload), packet.getPayload());
-
- // Packet-specific methods Testing
- assertTrue(Arrays.equals(packet.getSourceMacAddress(), Arrays.copyOfRange(fPacket.array(), EthernetIIValues.MAC_ADDRESS_SIZE, EthernetIIValues.MAC_ADDRESS_SIZE + EthernetIIValues.MAC_ADDRESS_SIZE)));
- assertTrue(Arrays.equals(packet.getDestinationMacAddress(), Arrays.copyOfRange(fPacket.array(), 0, 0 + EthernetIIValues.MAC_ADDRESS_SIZE)));
- assertEquals(0xA256, packet.getEthertype());
-
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.ipv4;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * IPv4 test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- IPv4PacketTest.class
-})
-public class AllTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.ipv4;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4.IPv4Endpoint;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4.IPv4Packet;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * JUnit Class that tests the IPv4Packet class and its method.
- *
- * @author Vincent Perot
- */
-public class IPv4PacketTest {
-
- private static final Map<String, String> EXPECTED_FIELDS;
- static {
- EXPECTED_FIELDS = new LinkedHashMap<>();
- EXPECTED_FIELDS.put("Version", "4");
- EXPECTED_FIELDS.put("Header Length", "24 bytes");
- EXPECTED_FIELDS.put("Differentiated Services Field", "0x26");
- EXPECTED_FIELDS.put("Explicit Congestion Notification", "0x02");
- EXPECTED_FIELDS.put("Total Length", "255 bytes");
- EXPECTED_FIELDS.put("Identification", "0x0ff0");
- EXPECTED_FIELDS.put("Don't Fragment Flag", "false");
- EXPECTED_FIELDS.put("More Fragment Flag", "false");
- EXPECTED_FIELDS.put("Fragment Offset", "7905");
- EXPECTED_FIELDS.put("Time to live", "160");
- EXPECTED_FIELDS.put("Protocol", "Unknown (254)");
- EXPECTED_FIELDS.put("Checksum", "0x3344");
- EXPECTED_FIELDS.put("Source IP Address", "192.168.1.0");
- EXPECTED_FIELDS.put("Destination IP Address", "193.169.2.1");
- EXPECTED_FIELDS.put("Options", "a2 56 a2 56");
- }
-
- private static final String EXPECTED_TOSTRING;
- static {
- StringBuilder sb = new StringBuilder();
- sb.append("Internet Protocol Version 4, Source: 192.168.1.0, Destination: 193.169.2.1\n");
- sb.append("Version: 4, Identification: 0x0ff0, Header Length: 24 bytes, Total Length: 255 bytes\n");
- sb.append("Differentiated Services Code Point: 0x26; Explicit Congestion Notification: 0x02\n");
- sb.append("Flags: 0x00 (Don't have more fragments), Fragment Offset: 7905\n");
- sb.append("Time to live: 160\n");
- sb.append("Protocol: 254\n");
- sb.append("Header Checksum: 0x3344\n");
- sb.append("Payload: a6");
-
- EXPECTED_TOSTRING = sb.toString();
- }
-
- private ByteBuffer fPacket;
-
- /**
- * Initialize the packet.
- */
- @Before
- public void initialize() {
- fPacket = ByteBuffer.allocate(25);
- fPacket.order(ByteOrder.BIG_ENDIAN);
-
- // Version + IHL
- fPacket.put((byte) 0x46);
-
- // DSCP + ECN
- fPacket.put((byte) 0x9A);
-
- // Total length - this is randomly chosen so that we verify that the
- // packet handles wrong total length.
- fPacket.put((byte) 0x00);
- fPacket.put((byte) 0xFF);
-
- // Identification
- fPacket.put((byte) 0x0F);
- fPacket.put((byte) 0xF0);
-
- // Flags + Fragment Offset
- fPacket.put((byte) 0x1E);
- fPacket.put((byte) 0xE1);
-
- // Time to live
- fPacket.put((byte) 0xA0);
-
- // Protocol - Unknown
- fPacket.put((byte) 0xFE);
-
- // Header checksum - chosen randomly
- fPacket.put((byte) 0x33);
- fPacket.put((byte) 0x44);
-
- // Source IP - 4 bytes
- fPacket.put((byte) 192);
- fPacket.put((byte) 168);
- fPacket.put((byte) 1);
- fPacket.put((byte) 0);
-
- // Destination IP - 4 bytes
- fPacket.put((byte) 193);
- fPacket.put((byte) 169);
- fPacket.put((byte) 2);
- fPacket.put((byte) 1);
-
- // Options - 4 bytes
- fPacket.put((byte) 0xA2);
- fPacket.put((byte) 0x56);
- fPacket.put((byte) 0xA2);
- fPacket.put((byte) 0x56);
-
- // Payload - 1 byte
- fPacket.put((byte) 0xA6);
-
- fPacket.flip();
- }
-
- /**
- * Test that verify the correctness of the IPv4Packet's methods.
- *
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- * @throws BadPacketException
- * Thrown when a packet is erroneous. Fails the test.
- */
- @Test
- public void CompleteIPv4PacketTest() throws IOException, BadPcapFileException, BadPacketException {
- PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
- assumeTrue(trace.exists());
- try (PcapFile dummy = new PcapFile(trace.getPath())) {
- ByteBuffer byteBuffer = fPacket;
- if (byteBuffer == null) {
- fail("CompleteIPv4PacketTest has failed!");
- return;
- }
- IPv4Packet packet = new IPv4Packet(dummy, null, byteBuffer);
-
- // Protocol Testing
- assertEquals(PcapProtocol.IPV4, packet.getProtocol());
- assertTrue(packet.hasProtocol(PcapProtocol.IPV4));
- assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
- assertFalse(packet.hasProtocol(PcapProtocol.TCP));
-
- // Abstract methods Testing
- assertTrue(packet.validate());
- assertEquals(-222021887, packet.hashCode());
- assertFalse(packet.equals(null));
- assertEquals(new IPv4Packet(dummy, null, byteBuffer), packet);
-
- assertEquals(EXPECTED_FIELDS, packet.getFields());
- assertEquals(EXPECTED_TOSTRING, packet.toString());
- assertEquals("Src: 192.168.1.0 , Dst: 193.169.2.1", packet.getLocalSummaryString());
- assertEquals("192.168.1.0 > 193.169.2.1 Id=4080 Len=1", packet.getGlobalSummaryString());
-
- assertEquals(new IPv4Endpoint(packet, true), packet.getSourceEndpoint());
- assertEquals(new IPv4Endpoint(packet, false), packet.getDestinationEndpoint());
-
- fPacket.position(24);
- byte[] payload = new byte[1];
- fPacket.get(payload);
- assertEquals(ByteBuffer.wrap(payload), packet.getPayload());
-
- // Packet-specific methods Testing
- assertEquals(InetAddress.getByAddress(Arrays.copyOfRange(fPacket.array(), 12, 16)), packet.getSourceIpAddress());
- assertEquals(InetAddress.getByAddress(Arrays.copyOfRange(fPacket.array(), 16, 20)), packet.getDestinationIpAddress());
- assertTrue(Arrays.equals(packet.getOptions(), Arrays.copyOfRange(fPacket.array(), 20, 24)));
- assertEquals(4, packet.getVersion());
- assertEquals(24, packet.getHeaderLength());
- assertEquals(0x26, packet.getDSCP());
- assertEquals(0x02, packet.getExplicitCongestionNotification());
- assertEquals(255, packet.getTotalLength());
- assertEquals(0x0FF0, packet.getIdentification());
- assertFalse(packet.getReservedFlag());
- assertFalse(packet.getDontFragmentFlag());
- assertFalse(packet.getHasMoreFragment());
- assertEquals(7905, packet.getFragmentOffset());
- assertEquals(160, packet.getTimeToLive());
- assertEquals(0xFE, packet.getIpDatagramProtocol());
- assertEquals(0x3344, packet.getHeaderChecksum());
-
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.pcap;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Pcap test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- PcapPacketTest.class
-})
-public class AllTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.pcap;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Map;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapEndpoint;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableMap;
-
-/**
- * JUnit Class that tests the PcapPacket class and its method.
- *
- * @author Vincent Perot
- */
-public class PcapPacketTest {
-
- private static final Map<String, String> EXPECTED_FIELDS = ImmutableMap.of(
- "Frame", "36",
- "Frame Length", "75 bytes",
- "Capture Length", "75 bytes",
- "Capture Time", "2005-07-04 05:33:52.829.277.000"
- );
-
- private static final String EXPECTED_TOSTRING;
- static {
- StringBuilder sb = new StringBuilder();
- sb.append("Packet Capture 36: 75 bytes on wire, 75 bytes captured.\n");
- sb.append("Arrival time: 2005-07-04 05:33:52.829.277.000\n");
- sb.append("Ethernet II, Source: 00:e0:ed:01:6e:bd, Destination: 00:30:54:00:34:56, Type: Internet Protocol Version 4 (0x0800)\n");
- sb.append("Internet Protocol Version 4, Source: 192.168.1.2, Destination: 192.168.1.1\n");
- sb.append("Version: 4, Identification: 0x69aa, Header Length: 20 bytes, Total Length: 61 bytes\n");
- sb.append("Differentiated Services Code Point: 0x00; Explicit Congestion Notification: 0x00\n");
- sb.append("Flags: 0x00 (Don't have more fragments), Fragment Offset: 0\n");
- sb.append("Time to live: 128\n");
- sb.append("Protocol: 17\n");
- sb.append("Header Checksum: 0x4db2\n");
- sb.append("User Datagram Protocol, Source Port: 2719, Destination Port: 53, Length: 41, Checksum: 19038\n");
- sb.append("Payload: ed d4 01 00 00 01 00 00 00 00 00 00 03 66 74 70 07 65 63 69 74 65 6c 65 03 63 6f 6d 00 00 01 00 01");
-
- EXPECTED_TOSTRING = sb.toString();
- }
-
- private ByteBuffer fPayload;
-
- /**
- * Initialize the payload.
- */
- @Before
- public void initialize() {
- fPayload = ByteBuffer.allocate(75);
- fPayload.order(ByteOrder.BIG_ENDIAN);
-
- // Values copied from wireshark
-
- // Bytes 0x01-0x10
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x30);
- fPayload.put((byte) 0x54);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x34);
- fPayload.put((byte) 0x56);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0xE0);
- fPayload.put((byte) 0xED);
- fPayload.put((byte) 0x01);
- fPayload.put((byte) 0x6E);
- fPayload.put((byte) 0xBD);
- fPayload.put((byte) 0x08);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x45);
- fPayload.put((byte) 0x00);
-
- // Bytes 0x11-0x20
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x3D);
- fPayload.put((byte) 0x69);
- fPayload.put((byte) 0xAA);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x80);
- fPayload.put((byte) 0x11);
- fPayload.put((byte) 0x4D);
- fPayload.put((byte) 0xB2);
- fPayload.put((byte) 0xC0);
- fPayload.put((byte) 0xA8);
- fPayload.put((byte) 0x01);
- fPayload.put((byte) 0x02);
- fPayload.put((byte) 0xC0);
- fPayload.put((byte) 0xA8);
-
- // Bytes 0x21-0x30
- fPayload.put((byte) 0x01);
- fPayload.put((byte) 0x01);
- fPayload.put((byte) 0x0A);
- fPayload.put((byte) 0x9F);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x35);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x29);
- fPayload.put((byte) 0x4A);
- fPayload.put((byte) 0x5E);
- fPayload.put((byte) 0xED);
- fPayload.put((byte) 0xd4);
- fPayload.put((byte) 0x01);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x01);
-
- // Bytes 0x31-0x40
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x03);
- fPayload.put((byte) 0x66);
- fPayload.put((byte) 0x74);
- fPayload.put((byte) 0x70);
- fPayload.put((byte) 0x07);
- fPayload.put((byte) 0x65);
- fPayload.put((byte) 0x63);
- fPayload.put((byte) 0x69);
- fPayload.put((byte) 0x74);
- fPayload.put((byte) 0x65);
-
- // Bytes 0x41-0x4B
- fPayload.put((byte) 0x6C);
- fPayload.put((byte) 0x65);
- fPayload.put((byte) 0x03);
- fPayload.put((byte) 0x63);
- fPayload.put((byte) 0x6F);
- fPayload.put((byte) 0x6D);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x01);
- fPayload.put((byte) 0x00);
- fPayload.put((byte) 0x01);
-
- fPayload.flip();
- }
-
- /**
- * Test that verify the correctness of the PcapPacket's methods.
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- * @throws BadPacketException
- * Thrown when a packet is erroneous. Fails the test.
- */
- @Test
- public void CompletePcapPacketTest() throws IOException, BadPcapFileException, BadPacketException {
- PcapTestTrace trace = PcapTestTrace.MOSTLY_UDP;
- assumeTrue(trace.exists());
- try (PcapFile file = new PcapFile(trace.getPath());) {
-
- file.seekPacket(36);
- PcapPacket packet = file.parseNextPacket();
- if (packet == null) {
- fail("CompletePcapPacketTest has failed!");
- return;
- }
- // Protocol Testing
- assertEquals(PcapProtocol.PCAP, packet.getProtocol());
- assertTrue(packet.hasProtocol(PcapProtocol.PCAP));
- assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
- assertFalse(packet.hasProtocol(PcapProtocol.TCP));
-
- // Abstract methods Testing
- assertTrue(packet.validate());
- assertEquals(86567859, packet.hashCode());
- assertFalse(packet.equals(null));
- assertFalse(packet.equals(file.parseNextPacket()));
-
- assertEquals(EXPECTED_FIELDS, packet.getFields());
- assertEquals(EXPECTED_TOSTRING, packet.toString());
- assertEquals("Frame 36: 75 bytes on wire, 75 bytes captured", packet.getLocalSummaryString());
- assertEquals("Source Port: 2719, Destination Port: 53", packet.getGlobalSummaryString());
-
- assertEquals(new PcapEndpoint(packet, true), packet.getSourceEndpoint());
- assertEquals(new PcapEndpoint(packet, false), packet.getDestinationEndpoint());
-
- ByteBuffer payload = packet.getPayload();
- if (payload == null) {
- fail("CompletePcapPacketTest has failed!");
- return;
- }
- assertEquals(fPayload, payload.flip());
-
- // Packet-specific methods Testing
- assertEquals(36, packet.getIndex());
- assertEquals(75, packet.getOriginalLength());
- assertEquals(75, packet.getIncludedLength());
- assertEquals(1120469632829277L, packet.getTimestamp());
- assertFalse(packet.isTruncated());
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.tcp;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * TCP test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- TCPPacketTest.class
-})
-public class AllTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.tcp;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.tcp.TCPEndpoint;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.tcp.TCPPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * JUnit Class that tests the TCPPacket class and its method.
- *
- * @author Vincent Perot
- */
-public class TCPPacketTest {
-
- private static final Map<String, String> EXPECTED_FIELDS;
- static {
- EXPECTED_FIELDS = new LinkedHashMap<>();
- EXPECTED_FIELDS.put("Source Port", "18057");
- EXPECTED_FIELDS.put("Destination Port", "39611");
- EXPECTED_FIELDS.put("Sequence Number", "2575857510");
- EXPECTED_FIELDS.put("Acknowledgement Number", "1430532898");
- EXPECTED_FIELDS.put("Length", "24 bytes");
- EXPECTED_FIELDS.put("ECN-Nonce Flag", "true");
- EXPECTED_FIELDS.put("Congestion Window Reduced Flag", "false");
- EXPECTED_FIELDS.put("ECN-Echo Flag", "true");
- EXPECTED_FIELDS.put("Urgent Flag", "false");
- EXPECTED_FIELDS.put("ACK Flag", "true");
- EXPECTED_FIELDS.put("PSH Flag", "false");
- EXPECTED_FIELDS.put("RST Flag", "true");
- EXPECTED_FIELDS.put("SYN Flag", "false");
- EXPECTED_FIELDS.put("FIN Flag", "true");
- EXPECTED_FIELDS.put("Window Size Value", "4352");
- EXPECTED_FIELDS.put("Checksum", "0xffee");
- EXPECTED_FIELDS.put("Urgent Pointer", "0xddcc");
- EXPECTED_FIELDS.put("Options", "ad da bc cb");
- }
-
- private static final String EXPECTED_TOSTRING;
- static {
- StringBuilder sb = new StringBuilder();
- sb.append("Transmission Control Protocol, Source Port: 18057, Destination Port: 39611\n");
- sb.append("Sequence Number: 2575857510, Acknowledgment Number: 1430532898\n");
- sb.append("Header length: 24 bytes, Data length: 4\n");
- sb.append("Window size value: 4352, Urgent Pointer: 0xddcc\n");
- sb.append("Checksum: 0xffee\n");
- sb.append("Payload: 99 88 77 66");
-
- EXPECTED_TOSTRING = sb.toString();
- }
-
- private ByteBuffer fPacket;
-
- /**
- * Initialize the packet.
- */
- @Before
- public void initialize() {
- fPacket = ByteBuffer.allocate(28);
- fPacket.order(ByteOrder.BIG_ENDIAN);
-
- // Source Port
- fPacket.put((byte) 0x46);
- fPacket.put((byte) 0x89);
-
- // Destination Port
- fPacket.put((byte) 0x9A);
- fPacket.put((byte) 0xBB);
-
- // Sequence Number
- fPacket.put((byte) 0x99);
- fPacket.put((byte) 0x88);
- fPacket.put((byte) 0x77);
- fPacket.put((byte) 0x66);
-
- // Acknowledgment Number
- fPacket.put((byte) 0x55);
- fPacket.put((byte) 0x44);
- fPacket.put((byte) 0x33);
- fPacket.put((byte) 0x22);
-
- // Data Offset + Reserved + NS
- fPacket.put((byte) 0x61);
-
- // Other flags
- fPacket.put((byte) 0b01010101);
-
- // Window Size
- fPacket.put((byte) 0x11);
- fPacket.put((byte) 0x00);
-
- // Checksum
- fPacket.put((byte) 0xFF);
- fPacket.put((byte) 0xEE);
-
- // Urgent Pointer
- fPacket.put((byte) 0xDD);
- fPacket.put((byte) 0xCC);
-
- // Options - 4 bytes
- fPacket.put((byte) 0xAD);
- fPacket.put((byte) 0xDA);
- fPacket.put((byte) 0xBC);
- fPacket.put((byte) 0xCB);
-
- // Payload - 4 bytes
- fPacket.put((byte) 0x99);
- fPacket.put((byte) 0x88);
- fPacket.put((byte) 0x77);
- fPacket.put((byte) 0x66);
-
- fPacket.flip();
- }
-
- /**
- * Test that verify the correctness of the TCPPacket's methods.
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- * @throws BadPacketException
- * Thrown when a packet is erroneous. Fails the test.
- */
- @Test
- public void CompleteTCPPacketTest() throws BadPacketException, IOException, BadPcapFileException {
- PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
- assumeTrue(trace.exists());
- try (PcapFile dummy = new PcapFile(trace.getPath())) {
- ByteBuffer byteBuffer = fPacket;
- if (byteBuffer == null) {
- fail("CompleteTCPPacketTest has failed!");
- return;
- }
- TCPPacket packet = new TCPPacket(dummy, null, byteBuffer);
-
- // Protocol Testing
- assertEquals(PcapProtocol.TCP, packet.getProtocol());
- assertTrue(packet.hasProtocol(PcapProtocol.TCP));
- assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
- assertFalse(packet.hasProtocol(PcapProtocol.IPV4));
-
- // Abstract methods Testing
- assertTrue(packet.validate());
- assertEquals(-677046102, packet.hashCode());
- assertFalse(packet.equals(null));
- assertEquals(new TCPPacket(dummy, null, byteBuffer), packet);
-
- assertEquals(EXPECTED_FIELDS, packet.getFields());
- assertEquals(EXPECTED_TOSTRING, packet.toString());
- assertEquals("Src Port: 18057, Dst Port: 39611, Seq: 2575857510, Ack: 1430532898, Len: 24", packet.getLocalSummaryString());
- assertEquals("18057 > 39611 [ACK, FIN, RST, NS, ECE] Seq=2575857510 Ack=1430532898 Len=24", packet.getGlobalSummaryString());
-
- assertEquals(new TCPEndpoint(packet, true), packet.getSourceEndpoint());
- assertEquals(new TCPEndpoint(packet, false), packet.getDestinationEndpoint());
-
- fPacket.position(24);
- byte[] payload = new byte[4];
- fPacket.get(payload);
- assertEquals(ByteBuffer.wrap(payload), packet.getPayload());
-
- // Packet-specific methods Testing
- assertEquals(0x4689, packet.getSourcePort());
- assertEquals(0x9ABB, packet.getDestinationPort());
- assertEquals(2575857510L, packet.getSequenceNumber());
- assertEquals(1430532898L, packet.getAcknowledgmentNumber());
- assertEquals(6, packet.getDataOffset());
- assertEquals(0, packet.getReservedField());
- assertEquals(true, packet.isNSFlagSet());
- assertEquals(false, packet.isCongestionWindowReducedFlagSet());
- assertEquals(true, packet.isECNEchoFlagSet());
- assertEquals(false, packet.isUrgentFlagSet());
- assertEquals(true, packet.isAcknowledgeFlagSet());
- assertEquals(false, packet.isPushFlagSet());
- assertEquals(true, packet.isResetFlagSet());
- assertEquals(false, packet.isSynchronizationFlagSet());
- assertEquals(true, packet.isFinalFlagSet());
- assertEquals(4352, packet.getWindowSize());
- assertEquals(65518, packet.getChecksum());
- assertEquals(56780, packet.getUrgentPointer());
- assertTrue(Arrays.equals(packet.getOptions(), Arrays.copyOfRange(fPacket.array(), 20, 24)));
-
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.udp;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * UDP test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- UDPPacketTest.class
-})
-public class AllTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.udp;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Map;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.udp.UDPEndpoint;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.udp.UDPPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableMap;
-
-/**
- * JUnit Class that tests the UDPPacket class and its method.
- *
- * @author Vincent Perot
- */
-public class UDPPacketTest {
-
- private static final Map<String, String> EXPECTED_FIELDS = ImmutableMap.of(
- "Source Port", "18057",
- "Destination Port", "39611",
- "Length", "41452 bytes",
- "Checksum", "0xfaaf"
- );
-
- private static final String EXPTECTED_TOSTRING;
- static {
- StringBuilder sb = new StringBuilder();
- sb.append("User Datagram Protocol, Source Port: 18057, Destination Port: 39611, Length: 41452, Checksum: 64175\n");
- sb.append("Payload: 99 88 77 66");
-
- EXPTECTED_TOSTRING = sb.toString();
- }
-
- private ByteBuffer fPacket;
-
- /**
- * Initialize the packet.
- */
- @Before
- public void initialize() {
- fPacket = ByteBuffer.allocate(12);
- fPacket.order(ByteOrder.BIG_ENDIAN);
-
- // Source Port
- fPacket.put((byte) 0x46);
- fPacket.put((byte) 0x89);
-
- // Destination Port
- fPacket.put((byte) 0x9A);
- fPacket.put((byte) 0xBB);
-
- // Total length - this is randomly chosen so that we verify that the
- // packet handles wrong total length.
- fPacket.put((byte) 0xA1);
- fPacket.put((byte) 0xEC);
-
- // Checksum
- fPacket.put((byte) 0xFA);
- fPacket.put((byte) 0xAF);
-
- // Payload - 4 bytes
- fPacket.put((byte) 0x99);
- fPacket.put((byte) 0x88);
- fPacket.put((byte) 0x77);
- fPacket.put((byte) 0x66);
-
- fPacket.flip();
- }
-
- /**
- * Test that verify the correctness of the UDPPacket's methods.
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- * @throws BadPacketException
- * Thrown when a packet is erroneous. Fails the test.
- */
- @Test
- public void CompleteUDPPacketTest() throws IOException, BadPcapFileException, BadPacketException {
- PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
- assumeTrue(trace.exists());
- try (PcapFile dummy = new PcapFile(trace.getPath())) {
- ByteBuffer byteBuffer = fPacket;
- if (byteBuffer == null) {
- fail("CompleteUDPPacketTest has failed!");
- return;
- }
- UDPPacket packet = new UDPPacket(dummy, null, byteBuffer);
-
- // Protocol Testing
- assertEquals(PcapProtocol.UDP, packet.getProtocol());
- assertTrue(packet.hasProtocol(PcapProtocol.UDP));
- assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
- assertFalse(packet.hasProtocol(PcapProtocol.ETHERNET_II));
-
- // Abstract methods Testing
- assertTrue(packet.validate());
- assertEquals(473000225, packet.hashCode());
- assertFalse(packet.equals(null));
- assertEquals(new UDPPacket(dummy, null, byteBuffer), packet);
-
- assertEquals(EXPECTED_FIELDS, packet.getFields());
- assertEquals(EXPTECTED_TOSTRING, packet.toString());
- assertEquals("Src Port: 18057, Dst Port: 39611", packet.getLocalSummaryString());
- assertEquals("Source Port: 18057, Destination Port: 39611", packet.getGlobalSummaryString());
-
- assertEquals(new UDPEndpoint(packet, true), packet.getSourceEndpoint());
- assertEquals(new UDPEndpoint(packet, false), packet.getDestinationEndpoint());
-
- fPacket.position(8);
- byte[] payload = new byte[4];
- fPacket.get(payload);
- assertEquals(ByteBuffer.wrap(payload), packet.getPayload());
-
- // Packet-specific methods Testing
- assertEquals(0x4689, packet.getSourcePort());
- assertEquals(0x9ABB, packet.getDestinationPort());
- assertEquals(0xA1EC, packet.getTotalLength());
- assertEquals(0xFAAF, packet.getChecksum());
-
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.unknown;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Unknown test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- UnknownPacketTest.class
-})
-public class AllTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.protocol.unknown;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Map;
-
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownEndpoint;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableMap;
-
-/**
- * JUnit Class that tests the UnknownPacket class and its method.
- *
- * @author Vincent Perot
- */
-public class UnknownPacketTest {
-
- private static final Map<String, String> EXPECTED_FIELDS = ImmutableMap.of(
- "Binary", "61",
- "Character", "a"
- );
-
- private static final String fToString = "Payload: 61";
-
- private ByteBuffer fPacket;
-
- /**
- * Initialize the packet.
- */
- @Before
- public void initialize() {
- fPacket = ByteBuffer.allocate(1);
- fPacket.order(ByteOrder.BIG_ENDIAN);
-
- // Payload - 1 byte
- fPacket.put((byte) 97);
-
- fPacket.flip();
- }
-
- /**
- * Test that verify the correctness of the UnknownPacket's methods.
- * @throws BadPcapFileException
- * Thrown when the file is erroneous. Fails the test.
- * @throws IOException
- * Thrown when an IO error occurs. Fails the test.
- */
- @Test
- public void CompleteUnknownPacketTest() throws IOException, BadPcapFileException {
- PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
- assumeTrue(trace.exists());
- try (PcapFile dummy = new PcapFile(trace.getPath())) {
- ByteBuffer byteBuffer = fPacket;
- if (byteBuffer == null) {
- fail("CompleteUnknownPacketTest has failed!");
- return;
- }
- UnknownPacket packet = new UnknownPacket(dummy, null, byteBuffer);
-
- // Protocol Testing
- assertEquals(PcapProtocol.UNKNOWN, packet.getProtocol());
- assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
- assertFalse(packet.hasProtocol(PcapProtocol.UDP));
-
- // Abstract methods Testing
- assertTrue(packet.validate());
- assertEquals(1089, packet.hashCode());
- assertFalse(packet.equals(null));
- assertEquals(new UnknownPacket(dummy, null, byteBuffer), packet);
-
- assertEquals(EXPECTED_FIELDS, packet.getFields());
- assertEquals(fToString, packet.toString());
- assertEquals("Len: 1 bytes", packet.getLocalSummaryString());
- assertEquals("Data: 1 bytes", packet.getGlobalSummaryString());
- // TODO take care of plural form.
-
- // Unknown Endpoints are never equal!
- assertFalse(packet.getSourceEndpoint().equals(new UnknownEndpoint(packet, true)));
- assertFalse(packet.getDestinationEndpoint().equals(new UnknownEndpoint(packet, false)));
-
- fPacket.position(0);
- byte[] payload = new byte[1];
- fPacket.get(payload);
- ByteBuffer payloadBB = ByteBuffer.wrap(payload);
- payloadBB.flip();
-
- assertEquals(payloadBB, packet.getPayload());
-
- // Packet-specific methods Testing
- // None
-
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.stream;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Stream test suite
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- StreamBuildTest.class
-})
-public class AllTests {
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.pcap.core.tests.stream;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import java.io.IOException;
-
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.stream.PacketStream;
-import org.eclipse.linuxtools.internal.pcap.core.stream.PacketStreamBuilder;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
-import org.junit.Test;
-
-/**
- * JUnit Class that tests whether packet streams are built correctly.
- *
- * @author Vincent Perot
- */
-public class StreamBuildTest {
-
- private static final double DELTA = 0.001;
-
- /**
- * Test that verify that stream building is done correctly.
- */
- @Test
- public void StreamBuildingTest() {
- PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
- assumeTrue(trace.exists());
-
- try {
- // Test Ethernet II stream
- PacketStreamBuilder builder = new PacketStreamBuilder(PcapProtocol.ETHERNET_II);
- builder.parsePcapFile(trace.getPath());
- assertEquals(PcapProtocol.ETHERNET_II, builder.getProtocol());
- // Should do one loop only, so hardcoded values are okay.
- for (PacketStream stream : builder.getStreams()) {
- assertEquals("Stream eth.0, Number of Packets: 43\n", stream.toString());
- assertEquals(43, stream.getNbPackets());
- assertEquals(25091, stream.getNbBytes());
- assertEquals(20, stream.getNbPacketsAtoB());
- assertEquals(2323, stream.getNbBytesAtoB());
- assertEquals(23, stream.getNbPacketsBtoA());
- assertEquals(22768, stream.getNbBytesBtoA());
- assertEquals(1084443427311224000L, stream.getStartTime());
- assertEquals(1084443457704928000L, stream.getStopTime());
- assertEquals(30.393704, stream.getDuration(), DELTA);
- assertEquals(76.43030280218561, stream.getBPSAtoB(), DELTA);
- assertEquals(749.1025114938278, stream.getBPSBtoA(), DELTA);
- }
-
- // Test TCP streams and other constructor
- builder = new PacketStreamBuilder(PcapProtocol.TCP);
- builder.parsePcapFile(trace.getPath());
- assertEquals(PcapProtocol.TCP, builder.getProtocol());
-
- PacketStream stream = builder.getStream(0);
- if (stream == null) {
- fail("StreamBuildingTest has failed!");
- return;
- }
- assertEquals(PcapProtocol.TCP, stream.getProtocol());
- assertEquals(0, stream.getID());
- assertEquals("tcp.0", stream.getUniqueID());
- assertEquals(34, stream.getNbPackets());
- assertEquals(20695, stream.getNbBytes());
- assertEquals(16, stream.getNbPacketsAtoB());
- assertEquals(1351, stream.getNbBytesAtoB());
- assertEquals(18, stream.getNbPacketsBtoA());
- assertEquals(19344, stream.getNbBytesBtoA());
- assertEquals(1084443427311224000L, stream.getStartTime());
- assertEquals(1084443457704928000L, stream.getStopTime());
- assertEquals(30.393704, stream.getDuration(), DELTA);
- assertEquals(44.449995301658525, stream.getBPSAtoB(), DELTA);
- assertEquals(636.4476011216008, stream.getBPSBtoA(), DELTA);
-
- stream = builder.getStream(1);
- if (stream == null) {
- fail("StreamBuildingTest has failed!");
- return;
- }
- assertEquals(PcapProtocol.TCP, stream.getProtocol());
- assertEquals(1, stream.getID());
- assertEquals("tcp.1", stream.getUniqueID());
- assertEquals(7, stream.getNbPackets());
- assertEquals(4119, stream.getNbBytes());
- assertEquals(3, stream.getNbPacketsAtoB());
- assertEquals(883, stream.getNbBytesAtoB());
- assertEquals(4, stream.getNbPacketsBtoA());
- assertEquals(3236, stream.getNbBytesBtoA());
- assertEquals(1084443430295515000L, stream.getStartTime());
- assertEquals(1084443432088092000L, stream.getStopTime());
- assertEquals(1.792577, stream.getDuration(), DELTA);
- assertEquals(492.58692932019096, stream.getBPSAtoB(), DELTA);
- assertEquals(1805.2223140205413, stream.getBPSBtoA(), DELTA);
-
- builder.clear();
- assertEquals(0, builder.getNbStreams());
- } catch (IOException | BadPcapFileException e) {
- fail("StreamBuildingTest has failed!");
- }
-
- }
-}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>org.eclipse.linuxtools.pcap.core</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
- </natures>
-</projectDescription>
+++ /dev/null
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
+++ /dev/null
-eclipse.preferences.version=1
-line.separator=\n
+++ /dev/null
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=enabled
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=error
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=error
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=error
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=error
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=error
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=error
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=enabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
-org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=error
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=disabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=disabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
-org.eclipse.jdt.core.compiler.source=1.7
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true
-org.eclipse.jdt.core.formatter.join_wrapped_lines=false
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=250
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=false
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+++ /dev/null
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_tmf-style
-formatter_settings_version=12
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=false
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=false
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.organize_imports=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=true
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=false
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+++ /dev/null
-ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
-API_USE_SCAN_FIELD_SEVERITY=Error
-API_USE_SCAN_METHOD_SEVERITY=Error
-API_USE_SCAN_TYPE_SEVERITY=Error
-CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
-CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
-CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
-CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
-CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
-ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
-ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
-ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
-FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
-FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
-FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
-FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
-ILLEGAL_EXTEND=Warning
-ILLEGAL_IMPLEMENT=Warning
-ILLEGAL_INSTANTIATE=Warning
-ILLEGAL_OVERRIDE=Warning
-ILLEGAL_REFERENCE=Warning
-INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
-INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-INVALID_JAVADOC_TAG=Warning
-INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
-LEAK_EXTEND=Warning
-LEAK_FIELD_DECL=Warning
-LEAK_IMPLEMENT=Warning
-LEAK_METHOD_PARAM=Warning
-LEAK_METHOD_RETURN_TYPE=Warning
-METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
-METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-MISSING_EE_DESCRIPTIONS=Ignore
-TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-UNUSED_PROBLEM_FILTERS=Warning
-automatically_removed_unused_problem_filters=false
-eclipse.preferences.version=1
-incompatible_api_component_version=Error
-incompatible_api_component_version_include_major_without_breaking_change=Disabled
-incompatible_api_component_version_include_minor_without_api_change=Disabled
-invalid_since_tag_version=Error
-malformed_since_tag=Error
-missing_since_tag=Error
-report_api_breakage_when_major_version_incremented=Disabled
-report_resolution_errors_api_component=Warning
+++ /dev/null
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.build.bin.includes=1
-compilers.p.build.encodings=2
-compilers.p.build.java.compiler=2
-compilers.p.build.java.compliance=1
-compilers.p.build.missing.output=2
-compilers.p.build.output.library=1
-compilers.p.build.source.library=1
-compilers.p.build.src.includes=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=1
-compilers.p.missing-version-export-package=2
-compilers.p.missing-version-import-package=2
-compilers.p.missing-version-require-bundle=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=1
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
+++ /dev/null
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 1.0.0.qualifier
-Bundle-Localization: plugin
-Bundle-SymbolicName: org.eclipse.linuxtools.pcap.core;singleton:=true
-Bundle-Activator: org.eclipse.linuxtools.internal.pcap.core.Activator
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources
-Export-Package: org.eclipse.linuxtools.internal.pcap.core;x-friends:="org.eclipse.linuxtools.pcap.core.tests",
- org.eclipse.linuxtools.internal.pcap.core.endpoint;x-friends:="org.eclipse.linuxtools.tmf.pcap.core",
- org.eclipse.linuxtools.internal.pcap.core.filter;x-internal:=true,
- org.eclipse.linuxtools.internal.pcap.core.packet;x-friends:="org.eclipse.linuxtools.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
- org.eclipse.linuxtools.internal.pcap.core.protocol;x-friends:="org.eclipse.linuxtools.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
- org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2;x-friends:="org.eclipse.linuxtools.pcap.core.tests",
- org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4;x-friends:="org.eclipse.linuxtools.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
- org.eclipse.linuxtools.internal.pcap.core.protocol.pcap;x-friends:="org.eclipse.linuxtools.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
- org.eclipse.linuxtools.internal.pcap.core.protocol.tcp;x-friends:="org.eclipse.linuxtools.pcap.core.tests",
- org.eclipse.linuxtools.internal.pcap.core.protocol.udp;x-friends:="org.eclipse.linuxtools.pcap.core.tests",
- org.eclipse.linuxtools.internal.pcap.core.protocol.unknown;x-friends:="org.eclipse.linuxtools.pcap.core.tests",
- org.eclipse.linuxtools.internal.pcap.core.stream;x-friends:="org.eclipse.linuxtools.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
- org.eclipse.linuxtools.internal.pcap.core.trace;x-friends:="org.eclipse.linuxtools.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
- org.eclipse.linuxtools.internal.pcap.core.util;x-friends:="org.eclipse.linuxtools.tmf.pcap.core"
-Import-Package: com.google.common.collect,
- com.google.common.math
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<p>June 5, 2006</p>
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, "Program" will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
-being redistributed by another party ("Redistributor") and different terms and conditions may
-apply to your use of any object code in the Content. Check the Redistributor's license that was
-provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-###############################################################################
-# Copyright (c) 2014 Ericsson
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# Ericsson - Initial API and implementation
-###############################################################################
-
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
- plugin.properties,\
- about.html,\
- .
-src.includes = about.html
-additional.bundles = org.eclipse.jdt.annotation
-jars.extra.classpath = platform:/plugin/org.eclipse.jdt.annotation
+++ /dev/null
-###############################################################################
-# Copyright (c) 2014 Ericsson
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# Ericsson - Initial API and implementation
-###############################################################################
-
-#Properties file for org.eclipse.linuxtools.pcap.core
-Bundle-Vendor = Eclipse Linux Tools
-Bundle-Name = Linux Tools Pcap Parser Core Plug-in
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2014, Ericsson
-
- All rights reserved. This program and the accompanying materials
- are made available under the terms of the Eclipse Public License v1.0
- which accompanies this distribution, and is available at
- http://www.eclipse.org/legal/epl-v10.html
--->
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <artifactId>org.eclipse.tracecompass</artifactId>
- <groupId>org.eclipse.tracecompass</groupId>
- <version>3.2.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>org.eclipse.linuxtools.pcap.core</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- <packaging>eclipse-plugin</packaging>
-
- <name>Linux Tools Pcap Parser Core Plug-in</name>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.eclipse.tycho</groupId>
- <artifactId>tycho-source-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- <groupId>org.eclipse.linuxtools.pcap</groupId>
-</project>
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.annotation.Nullable;
-import org.osgi.framework.BundleContext;
-
-/**
- * <b><u>Activator</u></b>
- * <p>
- * The activator class controls the plug-in life cycle
- */
-public final class Activator extends Plugin {
-
- // ------------------------------------------------------------------------
- // Attributes
- // ------------------------------------------------------------------------
-
- /**
- * The plug-in ID
- */
- public static final String PLUGIN_ID = "org.eclipse.linuxtools.pcap.core"; //$NON-NLS-1$
-
- /**
- * The shared instance
- */
- private static @Nullable Activator plugin;
-
- // ------------------------------------------------------------------------
- // Constructors
- // ------------------------------------------------------------------------
-
- /**
- * The constructor
- */
- public Activator() {
- }
-
- // ------------------------------------------------------------------------
- // Accessors
- // ------------------------------------------------------------------------
-
- /**
- * Returns the shared instance
- *
- * @return the shared instance
- */
- public static @Nullable Activator getDefault() {
- return plugin;
- }
-
- // ------------------------------------------------------------------------
- // Operators
- // ------------------------------------------------------------------------
-
- @Override
- public void start(@Nullable BundleContext context) throws Exception {
- super.start(context);
- plugin = this;
- }
-
- @Override
- public void stop(@Nullable BundleContext context) throws Exception {
- plugin = null;
- super.stop(context);
- }
-
- /**
- * Logs a message with severity INFO in the runtime log of the plug-in.
- *
- * @param message A message to log
- */
- public void logInfo(String message) {
- getLog().log(new Status(IStatus.INFO, PLUGIN_ID, message));
- }
-
- /**
- * Logs a message and exception with severity INFO in the runtime log of the plug-in.
- *
- * @param message A message to log
- * @param exception A exception to log
- */
- public void logInfo(String message, Throwable exception) {
- getLog().log(new Status(IStatus.INFO, PLUGIN_ID, message, exception));
- }
-
- /**
- * Logs a message and exception with severity WARNING in the runtime log of the plug-in.
- *
- * @param message A message to log
- */
- public void logWarning(String message) {
- getLog().log(new Status(IStatus.WARNING, PLUGIN_ID, message));
- }
-
- /**
- * Logs a message and exception with severity WARNING in the runtime log of the plug-in.
- *
- * @param message A message to log
- * @param exception A exception to log
- */
- public void logWarning(String message, Throwable exception) {
- getLog().log(new Status(IStatus.WARNING, PLUGIN_ID, message, exception));
- }
-
- /**
- * Logs a message and exception with severity ERROR in the runtime log of the plug-in.
- *
- * @param message A message to log
- */
- public void logError(String message) {
- getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, message));
- }
-
- /**
- * Logs a message and exception with severity ERROR in the runtime log of the plug-in.
- *
- * @param message A message to log
- * @param exception A exception to log
- */
- public void logError(String message, Throwable exception) {
- getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, message, exception));
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.endpoint;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-
-/**
- * Abstract class that represents an endpoint. An endpoint is an address where a
- * packet is received or sent. Therefore, it is protocol dependent. For
- * instance, an Ethernet II endpoint is the MAC address. An Ipv4 endpoint is the
- * combination of the MAC address and the IP address. This is useful for
- * building packet streams.
- *
- * @author Vincent Perot
- */
-public abstract class ProtocolEndpoint {
-
- /**
- * Empty string for child classes.
- */
- protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
-
- /**
- * The encapsulating endpoint. Much like packets, endpoints are
- * encapsulated. The higher the layer of the packet protocol is, the more
- * parents an endpoint will have.
- */
- private final @Nullable ProtocolEndpoint fParentEndpoint;
-
- /**
- * Constructor of the {@link ProtocolEndpoint} class. It takes a packet to
- * get its endpoint. Since every packet has two endpoints (source and
- * destination), the isSourceEndpoint parameter is used to specify which
- * endpoint to take.
- *
- * @param packet
- * The packet that contains the endpoints.
- * @param isSourceEndpoint
- * Whether to take the source or the destination endpoint of the
- * packet.
- */
- public ProtocolEndpoint(Packet packet, boolean isSourceEndpoint) {
- Packet parentPacket = packet.getParentPacket();
- if (parentPacket == null) {
- fParentEndpoint = null;
- } else {
- fParentEndpoint = isSourceEndpoint ?
- parentPacket.getSourceEndpoint() :
- parentPacket.getDestinationEndpoint();
- }
- }
-
- /**
- * Getter method that returns the parent endpoint.
- *
- * @return The parent endpoint.
- */
- public @Nullable ProtocolEndpoint getParentEndpoint() {
- return fParentEndpoint;
- }
-
- @Override
- public abstract int hashCode();
-
- @Override
- public abstract boolean equals(@Nullable Object obj);
-
- @Override
- public abstract String toString();
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.endpoint;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-
-/**
- * Class that represents a pair of endpoints. This is used to find a packet
- * stream between to endpoints.
- *
- * @author Vincent Perot
- */
-public class ProtocolEndpointPair {
-
- private final ProtocolEndpoint fEndpointA;
- private final ProtocolEndpoint fEndpointB;
-
- /**
- * Constructor of the class {@link ProtocolEndpointPair}. It constructs a
- * {@link ProtocolEndpointPair} object from a packet.
- *
- * @param packet
- * The packet that contains the endpoints.
- */
- public ProtocolEndpointPair(Packet packet) {
- fEndpointA = packet.getSourceEndpoint();
- fEndpointB = packet.getDestinationEndpoint();
- }
-
- /**
- * Getter method that returns the first endpoint of the pair.
- *
- * @return The first endpoint.
- */
- public ProtocolEndpoint getFirstEndpoint() {
- return fEndpointA;
- }
-
- /**
- * Getter method that returns the second endpoint of the pair.
- *
- * @return The second endpoint.
- */
- public ProtocolEndpoint getSecondEndpoint() {
- return fEndpointB;
- }
-
- /**
- * Constructor of the class {@link ProtocolEndpointPair}. It constructs a
- * {@link ProtocolEndpointPair} object from two endpoints.
- *
- * @param endpointA
- * The first endpoint.
- * @param endpointB
- * The second endpoint.
- */
- public ProtocolEndpointPair(ProtocolEndpoint endpointA, ProtocolEndpoint endpointB) {
- fEndpointA = endpointA;
- fEndpointB = endpointB;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + fEndpointA.hashCode() * fEndpointB.hashCode();
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
-
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof ProtocolEndpointPair)) {
- return false;
- }
- ProtocolEndpointPair other = (ProtocolEndpointPair) obj;
-
- return (this.fEndpointA.equals(other.fEndpointA) && this.fEndpointB.equals(other.fEndpointB)) ||
- (this.fEndpointA.equals(other.fEndpointB) && this.fEndpointB.equals(other.fEndpointA));
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.endpoint;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.filter;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-
-/**
- * Interface used to filter the packets.
- *
- * @author Vincent Perot
- */
-public interface IPacketFilter {
-
- /**
- * Accept a packet or not.
- *
- * @param packet
- * the packet to accept or not
- *
- * @return The decision regarding the packet.
- */
- boolean accepts(Packet packet);
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.filter;
-
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-
-/**
- * Class used to filter the packets by protocol. This is used, for instance, to
- * build the packet streams.
- *
- * @author Vincent Perot
- */
-public class PacketFilterByProtocol implements IPacketFilter {
-
- private final PcapProtocol fProtocol;
-
- /**
- * Constructor of the PacketFilterByProtocol class.
- *
- * @param protocol
- * The protocol that the incoming packets must contain.
- */
- public PacketFilterByProtocol(PcapProtocol protocol) {
- fProtocol = protocol;
- }
-
- @Override
- public boolean accepts(Packet packet) {
- return packet.hasProtocol(fProtocol);
- }
-
- /**
- * Getter method for the protocol of this filter.
- *
- * @return The protocol of this filter.
- */
- public PcapProtocol getProtocol() {
- return fProtocol;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.filter;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.packet;
-
-/**
- * Exception that is thrown when Packet is erroneous. This is different than an
- * invalid packet. An invalid packet contains bad fields (such as bad checksum)
- * and does not throw exceptions while an erroneous packet is a packet that is
- * impossible to obtain. For instance, an erroneous packet can be smaller than
- * the minimum required size. Erroneous packets throw BadPacketExceptions.
- *
- * @author Vincent Perot
- */
-public class BadPacketException extends Exception {
-
- private static final long serialVersionUID = 7071588720009577619L;
-
- /**
- * Default constructor with no message.
- */
- public BadPacketException() {
- super();
- }
-
- /**
- * Constructor with an attached message.
- *
- * @param message
- * The message attached to this exception
- */
- public BadPacketException(String message) {
- super(message);
- }
-
- /**
- * Re-throw an exception into this type.
- *
- * @param e
- * The previous Exception we caught
- */
- public BadPacketException(Exception e) {
- super(e);
- }
-
- /**
- * Constructor with an attached message and re-throw an exception into this
- * type.
- *
- * @param message
- * The message attached to this exception
- * @param exception
- * The previous Exception caught
- */
- public BadPacketException(String message, Throwable exception) {
- super(message, exception);
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.packet;
-
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4.IPv4Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-
-// TODO For all packets, make checks on dimension.
-// TODO maybe add a invalid packet type?
-
-/**
- * Abstract class that implements the methods that are common to every packets.
- *
- * @author Vincent Perot
- */
-public abstract class Packet {
-
- /** Empty string */
- protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
-
- /** The Pcap File to which this packet belong */
- private final PcapFile fPcapFile;
-
- /** The parent packet of this packet */
- private final @Nullable Packet fParentPacket;
-
- /** The protocol that this packet uses */
- private final PcapProtocol fProtocol;
-
- /**
- * Constructor of the Packet Class.
- *
- * @param file
- * The file to which this packet belongs.
- * @param parent
- * The parent packet of this packet.
- * @param protocol
- * The protocol of the packet.
- */
- public Packet(PcapFile file, @Nullable Packet parent, PcapProtocol protocol) {
- fPcapFile = file;
- fParentPacket = parent;
- fProtocol = protocol;
- }
-
- /**
- * Getter method for the Pcap File that contains this packet.
- *
- * @return The Pcap File.
- */
- public PcapFile getPcapFile() {
- return fPcapFile;
- }
-
- /**
- * Method that returns the parent (encapsulating) packet of this packet.
- * This method returns null if the packet is a Pcap Packet (highest level of
- * encapsulation).
- *
- * @return The parent packet.
- */
- public @Nullable Packet getParentPacket() {
- return fParentPacket;
- }
-
- /**
- * Method that returns the child (encapsulated) packet of this packet. This
- * method returns null if the packet is at the lowest level of
- * encapsulation.
- *
- * @return The child packet.
- */
- public abstract @Nullable Packet getChildPacket();
-
- /**
- * Getter method for the protocol of the packet.
- *
- * @return The protocol of the packet.
- */
- public PcapProtocol getProtocol() {
- return fProtocol;
- }
-
- /**
- * Getter method for the payload of the packet. Returns null if there is no
- * payload.
- *
- * @return the payload of the packet.
- */
- public abstract @Nullable ByteBuffer getPayload();
-
- /**
- * Method that looks for the packet that respects the specified protocol. It
- * will go through all the layers of encapsulation and return the wanted
- * packet, or null if the protocol is not present.
- *
- * @param protocol
- * The specified protocol.
- * @return The packet that respects the protocol.
- */
- public final @Nullable Packet getPacket(PcapProtocol protocol) {
-
- Packet wantedPacket = this;
-
- while (wantedPacket != null) {
- if (wantedPacket.getProtocol() == protocol) {
- return wantedPacket;
- }
- wantedPacket = wantedPacket.getParentPacket();
- }
- wantedPacket = this.getChildPacket();
-
- while (wantedPacket != null) {
- if (wantedPacket.getProtocol() == protocol) {
- return wantedPacket;
- }
- wantedPacket = wantedPacket.getChildPacket();
- }
-
- return null;
- }
-
- /**
- * Method that looks if the protocol is contained in the packet, or in one
- * of the encapsulating/encapsulated packet. It will go through all the
- * layers of encapsulation and return true if it finds the specified
- * protocol, and false otherwise. *
- *
- * @param protocol
- * The specified protocol.
- * @return The presence of the protocol.
- */
- public final boolean hasProtocol(PcapProtocol protocol) {
-
- // TODO Verify inputs
- Packet wantedPacket = this;
-
- while (wantedPacket != null) {
- if (wantedPacket.getProtocol() == protocol) {
- return true;
- }
- wantedPacket = wantedPacket.getParentPacket();
- }
- wantedPacket = this.getChildPacket();
-
- while (wantedPacket != null) {
- if (wantedPacket.getProtocol() == protocol) {
- return true;
- }
- wantedPacket = wantedPacket.getChildPacket();
- }
-
- return false;
- }
-
- /**
- * Method that returns the most encapsulated packet possible. If the global
- * packet contains the protocol Unknown, it will stop at the packet just
- * before this protocol. This is because the {@link UnknownPacket} can be
- * considered as plain payload.
- *
- * @return The most encapsulated packet.
- */
- public Packet getMostEcapsulatedPacket() {
- @NonNull Packet packet = this;
- while (packet.getProtocol() != PcapProtocol.UNKNOWN) {
- Packet childPacket = packet.getChildPacket();
- if (childPacket == null || childPacket.getProtocol() == PcapProtocol.UNKNOWN) {
- break;
- }
- packet = childPacket;
- }
- return packet;
- }
-
- /**
- * Method that look at the validity of the different fields (such as
- * checksum). This is protocol dependent and is used to identify bad
- * packets.
- *
- * @return The validity of the packet.
- */
- public abstract boolean validate();
-
- /**
- * Internal method that is used to find the child packet. This is protocol
- * dependent and must be implemented by each packet class.
- *
- * @return The child packet.
- * @throws BadPacketException
- * Thrown when the packet is erroneous.
- */
- protected abstract @Nullable Packet findChildPacket() throws BadPacketException;
-
- /**
- * This method returns the source endpoint of this packet. The endpoint is
- * equivalent to the address of this packet, and is protocol dependent. For
- * instance, a UDP endpoint is the combination of the MAC address, the IP
- * address and the port number.
- *
- * @return The source endpoint of this packet.
- */
- public abstract ProtocolEndpoint getSourceEndpoint();
-
- /**
- * This method returns the destination endpoint of this packet. The endpoint
- * is equivalent to the address of this packet, and is protocol dependent.
- * For instance, a UDP endpoint is the combination of the MAC address, the
- * IP address and the port number.
- *
- * @return The destination endpoint of this packet.
- */
- public abstract ProtocolEndpoint getDestinationEndpoint();
-
- /**
- * Method that returns all the fields of the packet as a Map<Field ID, Field
- * Value>. All child classes of {@link Packet} must implement this method.
- *
- * @return All the packet fields as a map.
- */
- public abstract Map<String, String> getFields();
-
- /**
- * Method that returns a short summary of the local packet, such as the most
- * useful information.
- *
- * For instance, a possible summary string of an {@link IPv4Packet} can be:
- * "Src: 192.168.0.1, Dst: 192.168.1.12".
- *
- * @return A short summary of the local packet, as a string.
- */
- public abstract String getLocalSummaryString();
-
- /**
- * Method that returns the local meaning of a packet, based on its fields.
- *
- * For instance, a possible signification of an ARP packet can be:
- * "Who has 192.168.1.12? Tell 192.168.0.1".
- *
- * @return The local meaning of the packet, as a string.
- */
- protected abstract String getSignificationString();
-
- /**
- * Method that returns the global meaning of the packet. As such, it will
- * look for the most relevant packet and display its signification.
- *
- * For instance, a possible signification of an ARP packet can be:
- * "Who has 192.168.1.12? Tell 192.168.0.1".
- *
- * @return The meaning of the global packet, as a string.
- */
- public final String getGlobalSummaryString() {
- Packet packet = this.getMostEcapsulatedPacket();
- return packet.getSignificationString();
- }
-
- @Override
- public abstract boolean equals(@Nullable Object obj);
-
- @Override
- public abstract int hashCode();
-
- /**
- * Method that is used by child packet classes to verify if a bit is set.
- *
- * @param value
- * the byte containing the flags.
- * @param bit
- * the bit index.
- * @return Whether the bit is set or not.
- */
- protected static final boolean isBitSet(byte value, int bit) {
- if (bit < 0 || bit > 7) {
- throw new IllegalArgumentException("The byte index is not valid!"); //$NON-NLS-1$
- }
- return ((value >>> bit & 0b1) == 0b1);
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.packet;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Enumeration used for describing the different known protocols.
- *
- * @author Vincent Perot
- */
-public enum PcapProtocol {
-
- // Layer 0
- /**
- * The Pcap Protocol is not a real protocol but is used as an helper to
- * generate Pcap packets.
- */
- PCAP("Packet Capture", "pcap", Layer.LAYER_0, false), //$NON-NLS-1$ //$NON-NLS-2$
-
- // Layer 1
- // Should always be empty.
-
- // Layer 2
- /**
- * The description of the Ethernet II Protocol.
- */
- ETHERNET_II("Ethernet II", "eth", Layer.LAYER_2, true), //$NON-NLS-1$ //$NON-NLS-2$
-
- // Layer 3
- /**
- * The description of the Internet Protocol Version 4.
- */
- IPV4("Internet Protocol Version 4", "ipv4", Layer.LAYER_3, true), //$NON-NLS-1$ //$NON-NLS-2$
-
- // Layer 4
- /**
- * The description of the Transmission Control Protocol.
- */
- TCP("Transmission Control Protocol", "tcp", Layer.LAYER_4, true), //$NON-NLS-1$ //$NON-NLS-2$
- /**
- * The description of the User Datagram Protocol.
- */
- UDP("User Datagram Protocol", "udp", Layer.LAYER_4, true), //$NON-NLS-1$ //$NON-NLS-2$
-
- // Layer 5
-
- // Layer 6
-
- // Layer 7
- /**
- * This protocol is used as an helper if the protocol of a packet is not
- * recognized. Since all its data goes into payload, it can also be seen as
- * a "payload packet". This is considered to be on layer 7 since its always
- * the most encapsulated packet if present.
- */
- UNKNOWN("Payload", "???", Layer.LAYER_7, false); //$NON-NLS-1$ //$NON-NLS-2$
-
-
- /**
- * Enum that lists constants related to protocols/layers.
- *
- * See http://en.wikipedia.org/wiki/OSI_model#Description_of_OSI_layers.
- *
- * @author Vincent Perot
- */
- public static enum Layer {
-
- /**
- * Layer 0. This layer is not an OSI layer but is used as an helper to store
- * the pseudo-protocol PCAP.
- */
- LAYER_0,
-
- /** Layer 1 of the OSI model */
- LAYER_1,
-
- /** Layer 2 of the OSI model */
- LAYER_2,
-
- /** Layer 3 of the OSI model */
- LAYER_3,
-
- /** Layer 4 of the OSI model */
- LAYER_4,
-
- /** Layer 5 of the OSI model */
- LAYER_5,
-
- /** Layer 6 of the OSI model */
- LAYER_6,
-
- /** Layer 7 of the OSI model */
- LAYER_7;
- }
-
-
- // Fields
- private final String fName;
- private final String fShortName;
- private final Layer fLayer;
- private final boolean fSupportsStream;
-
- private PcapProtocol(String name, String shortName, Layer layer, boolean supportsStream) {
- fName = name;
- fShortName = shortName;
- fLayer = layer;
- fSupportsStream = supportsStream;
- }
-
- /**
- * Getter method for the long name of the protocol.
- *
- * @return The long name of the protocol, as a string.
- */
- public String getName() {
- return fName;
- }
-
- /**
- * Getter method for the short name of the protocol.
- *
- * @return The short name of the protocol, as a string.
- */
- public String getShortName() {
- return fShortName;
- }
-
- /**
- * Getter method for the OSI layer of the protocol.
- *
- * @return The layer of the protocol.
- */
- public Layer getLayer() {
- return fLayer;
- }
-
- /**
- * Getter method that indicates if the protocol supports streams.
- *
- * @return Whether the protocol supports streams or not.
- */
- public boolean supportsStream() {
- return fSupportsStream;
- }
-
- // TODO make an immutable list that holds this data instead of computing it
- // everytime.
-
- /**
- * Method that returns a list of all the protocols included in a certain OSI
- * layer.
- *
- * @param layer
- * The layer of the protocols.
- * @return The protocols on that layer.
- */
- public static Collection<PcapProtocol> getProtocolsOnLayer(Layer layer) {
- List<PcapProtocol> protocolsOnLayer = new ArrayList<>();
- for (PcapProtocol p : PcapProtocol.values()) {
- if (p.getLayer() == layer) {
- protocolsOnLayer.add(p);
- }
- }
- return protocolsOnLayer;
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2;
-
-import java.util.Arrays;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
-import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
-
-/**
- * Class that extends the {@link ProtocolEndpoint} class. It represents the
- * endpoint at an Ethernet II level.
- *
- * @author Vincent Perot
- */
-public class EthernetIIEndpoint extends ProtocolEndpoint {
-
- private final byte[] fMacAddress;
-
- /**
- * Constructor of the {@link EthernetIIEndpoint} class. It takes a packet to
- * get its endpoint. Since every packet has two endpoints (source and
- * destination), the isSourceEndpoint parameter is used to specify which
- * endpoint to take.
- *
- * @param packet
- * The packet that contains the endpoints.
- * @param isSourceEndpoint
- * Whether to take the source or the destination endpoint of the
- * packet.
- */
- public EthernetIIEndpoint(EthernetIIPacket packet, boolean isSourceEndpoint) {
- super(packet, isSourceEndpoint);
- fMacAddress = isSourceEndpoint ? packet.getSourceMacAddress() : packet.getDestinationMacAddress();
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint == null) {
- result = 0;
- } else {
- result = endpoint.hashCode();
- }
- result = prime * result + Arrays.hashCode(fMacAddress);
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof EthernetIIEndpoint)) {
- return false;
- }
-
- EthernetIIEndpoint other = (EthernetIIEndpoint) obj;
-
- // Check on layer
- boolean localEquals = Arrays.equals(fMacAddress, other.fMacAddress);
- if (!localEquals) {
- return false;
- }
-
- // Check above layers.
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint != null) {
- return endpoint.equals(other.getParentEndpoint());
- }
- return true;
- }
-
- @Override
- public String toString() {
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint == null) {
- return ConversionHelper.toMacAddress(fMacAddress);
- }
- return (endpoint.toString().equals(EMPTY_STRING) ?
- ConversionHelper.toMacAddress(fMacAddress) :
- endpoint.toString() + '/' + ConversionHelper.toMacAddress(fMacAddress));
-
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4.IPv4Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
-import org.eclipse.linuxtools.internal.pcap.core.util.EthertypeHelper;
-
-import com.google.common.collect.ImmutableMap;
-
-/**
- * Class that represents an Ethernet II packet. This should be called an
- * Ethernet frame, but in order to keep the nomenclature consistent, this is
- * called a packet.
- *
- * @author Vincent Perot
- */
-public class EthernetIIPacket extends Packet {
-
- private final @Nullable Packet fChildPacket;
- private final @Nullable ByteBuffer fPayload;
-
- /* We store MAC addresses as byte arrays since
- * there is no standard java class to store them. */
- private final byte[] fSourceMacAddress;
- private final byte[] fDestinationMacAddress;
-
- private final int fType;
-
- private @Nullable EthernetIIEndpoint fSourceEndpoint;
- private @Nullable EthernetIIEndpoint fDestinationEndpoint;
-
- private @Nullable ImmutableMap<String, String> fFields;
-
- /**
- * Constructor of the Ethernet Packet class.
- *
- * @param file
- * The file that contains this packet.
- * @param parent
- * The parent packet of this packet (the encapsulating packet).
- * @param packet
- * The entire packet (header and payload).
- * @throws BadPacketException
- * Thrown when the packet is erroneous.
- */
- public EthernetIIPacket(PcapFile file, @Nullable Packet parent, ByteBuffer packet) throws BadPacketException {
- super(file, parent, PcapProtocol.ETHERNET_II);
-
- if (packet.array().length <= EthernetIIValues.ETHERNET_II_MIN_SIZE) {
- throw new BadPacketException("An Ethernet II packet can't be smaller than 14 bytes."); //$NON-NLS-1$
- }
-
- // The endpoints are lazy loaded. They are defined in the get*Endpoint()
- // methods.
- fSourceEndpoint = null;
- fDestinationEndpoint = null;
-
- fFields = null;
-
- fDestinationMacAddress = new byte[EthernetIIValues.MAC_ADDRESS_SIZE];
- fSourceMacAddress = new byte[EthernetIIValues.MAC_ADDRESS_SIZE];
- packet.order(ByteOrder.BIG_ENDIAN);
- packet.position(0);
- packet.get(fDestinationMacAddress);
- packet.get(fSourceMacAddress);
- fType = ConversionHelper.unsignedShortToInt(packet.getShort());
-
- // Get payload if it exists.
- if (packet.array().length - packet.position() > 0) {
- byte[] array = new byte[packet.array().length - packet.position()];
- packet.get(array);
- ByteBuffer payload = ByteBuffer.wrap(array);
- if (payload != null) {
- payload.order(ByteOrder.BIG_ENDIAN);
- payload.position(0);
- }
- fPayload = payload;
-
- } else {
- fPayload = null;
- }
-
- // Find child
- fChildPacket = findChildPacket();
-
- }
-
- @Override
- public @Nullable Packet getChildPacket() {
- return fChildPacket;
- }
-
- @Override
- public @Nullable ByteBuffer getPayload() {
- return fPayload;
- }
-
- /**
- * Getter method for the source MAC Address.
- *
- * @return The source MAC address.
- */
- public byte[] getSourceMacAddress() {
- @SuppressWarnings("null")
- @NonNull byte[] mac = Arrays.copyOf(fSourceMacAddress, fSourceMacAddress.length);
- return mac;
- }
-
- /**
- * Getter method for the destination MAC Address.
- *
- * @return The destination MAC address.
- */
- public byte[] getDestinationMacAddress() {
- @SuppressWarnings("null")
- @NonNull byte[] mac = Arrays.copyOf(fDestinationMacAddress, fDestinationMacAddress.length);
- return mac;
- }
-
- /**
- * Getter method for Ethertype. See
- * http://standards.ieee.org/develop/regauth/ethertype/eth.txt
- *
- * @return The Ethertype. This is used to determine the child packet..
- */
- public int getEthertype() {
- return fType;
- }
-
- @Override
- protected @Nullable Packet findChildPacket() throws BadPacketException {
- // TODO Add more protocols.
- ByteBuffer payload = fPayload;
- if (payload == null) {
- return null;
- }
- switch (fType) {
- case EthertypeHelper.ETHERTYPE_IPV4:
- return new IPv4Packet(getPcapFile(), this, payload);
- default:
- return new UnknownPacket(getPcapFile(), this, payload);
- }
- }
-
- @Override
- public String toString() {
- String string = getProtocol().getName() + ", Source: " + ConversionHelper.toMacAddress(fSourceMacAddress) + //$NON-NLS-1$
- ", Destination: " + ConversionHelper.toMacAddress(fDestinationMacAddress) + ", Type: " + //$NON-NLS-1$ //$NON-NLS-2$
- EthertypeHelper.toEtherType(fType) + "\n"; //$NON-NLS-1$
- final Packet child = fChildPacket;
- if (child != null) {
- return string + child.toString();
- }
- return string;
- }
-
- @Override
- public boolean validate() {
- // Not yet implemented. ATM, we consider that all packets are valid.
- // This is the case for all packets.
- // TODO Implement it.
- return true;
- }
-
- @Override
- public EthernetIIEndpoint getSourceEndpoint() {
- @Nullable EthernetIIEndpoint endpoint = fSourceEndpoint;
- if (endpoint == null) {
- endpoint = new EthernetIIEndpoint(this, true);
- }
- fSourceEndpoint = endpoint;
- return fSourceEndpoint;
- }
-
- @Override
- public EthernetIIEndpoint getDestinationEndpoint() {
- @Nullable EthernetIIEndpoint endpoint = fDestinationEndpoint;
-
- if (endpoint == null) {
- endpoint = new EthernetIIEndpoint(this, false);
- }
- fDestinationEndpoint = endpoint;
- return fDestinationEndpoint;
- }
-
- @Override
- public Map<String, String> getFields() {
- ImmutableMap<String, String> map = fFields;
- if (map == null) {
- @SuppressWarnings("null")
- @NonNull ImmutableMap<String, String> newMap = ImmutableMap.<String, String> builder()
- .put("Source MAC Address", ConversionHelper.toMacAddress(fSourceMacAddress)) //$NON-NLS-1$
- .put("Destination MAC Address", ConversionHelper.toMacAddress(fDestinationMacAddress)) //$NON-NLS-1$
- .put("Ethertype", String.valueOf(EthertypeHelper.toEtherType(fType))) //$NON-NLS-1$
- .build();
- fFields = newMap;
- return newMap;
- }
- return map;
- }
-
- @Override
- public String getLocalSummaryString() {
- return "Src: " + ConversionHelper.toMacAddress(fSourceMacAddress) + " , Dst: " + ConversionHelper.toMacAddress(fDestinationMacAddress); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- @Override
- protected String getSignificationString() {
- return "Source MAC: " + ConversionHelper.toMacAddress(fSourceMacAddress) + " , Destination MAC: " + ConversionHelper.toMacAddress(fDestinationMacAddress); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- final Packet child = fChildPacket;
- if (child != null) {
- result = prime * result + child.hashCode();
- } else {
- result = prime * result;
- }
- result = prime * result + Arrays.hashCode(fDestinationMacAddress);
- final ByteBuffer payload = fPayload;
- if (payload != null) {
- result = prime * result + payload.hashCode();
- } else {
- result = prime * result;
- }
- result = prime * result + Arrays.hashCode(fSourceMacAddress);
- result = prime * result + fType;
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- EthernetIIPacket other = (EthernetIIPacket) obj;
- if (fChildPacket == null) {
- if (other.fChildPacket != null) {
- return false;
- }
- } else {
- final Packet child = fChildPacket;
- if (child != null) {
- if (!child.equals(other.fChildPacket)) {
- return false;
- }
- } else {
- if (other.fChildPacket != null) {
- return false;
- }
- }
- }
- if (!Arrays.equals(fDestinationMacAddress, other.fDestinationMacAddress)) {
- return false;
- }
- if (fPayload == null) {
- if (other.fPayload != null) {
- return false;
- }
- } else {
- final ByteBuffer payload = fPayload;
- if (payload != null) {
- if (!payload.equals(other.fPayload)) {
- return false;
- }
- } else {
- if (other.fPayload != null) {
- return false;
- }
- }
- }
- if (!Arrays.equals(fSourceMacAddress, other.fSourceMacAddress)) {
- return false;
- }
- if (fType != other.fType) {
- return false;
- }
- return true;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2;
-
-/**
- * Interface that lists constants related to Ethernet II.
- *
- * See http://en.wikipedia.org/wiki/Ethernet_frame#Ethernet_II.
- *
- * @author Vincent Perot
- */
-public interface EthernetIIValues {
-
- /** Size in bytes of a MAC address */
- int MAC_ADDRESS_SIZE = 6;
-
- /** Size in bytes of the ethertype field */
- int ETHERTYPE_SIZE = 4;
-
- /** Size in bytes of the CRC checksum */
- int CRC_CHECKSUM_SIZE = 4;
-
- /** Maximum size in bytes of a entire Ethernet II Frame */
- int ETHERNET_II_MAX_SIZE = 1518;
-
- /** Minimum size in bytes of a entire Ethernet II Frame */
- int ETHERNET_II_MIN_SIZE = 14;
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4;
-
-import java.net.Inet4Address;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
-
-/**
- * Class that extends the {@link ProtocolEndpoint} class. It represents the
- * endpoint at an IPv4 level.
- *
- * @author Vincent Perot
- */
-public class IPv4Endpoint extends ProtocolEndpoint {
-
- private final Inet4Address fIPAddress;
-
- /**
- * Constructor of the {@link IPv4Endpoint} class. It takes a packet to get
- * its endpoint. Since every packet has two endpoints (source and
- * destination), the isSourceEndpoint parameter is used to specify which
- * endpoint to take.
- *
- * @param packet
- * The packet that contains the endpoints.
- * @param isSourceEndpoint
- * Whether to take the source or the destination endpoint of the
- * packet.
- */
- public IPv4Endpoint(IPv4Packet packet, boolean isSourceEndpoint) {
- super(packet, isSourceEndpoint);
- fIPAddress = isSourceEndpoint ? packet.getSourceIpAddress() : packet.getDestinationIpAddress();
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
-
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint == null) {
- result = 0;
- } else {
- result = endpoint.hashCode();
- }
-
- result = prime * result + fIPAddress.hashCode();
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof IPv4Endpoint)) {
- return false;
- }
-
- IPv4Endpoint other = (IPv4Endpoint) obj;
-
- // Check on layer
- boolean localEquals = fIPAddress.equals(other.fIPAddress);
- if (!localEquals) {
- return false;
- }
-
- // Check above layers.
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint != null) {
- return endpoint.equals(other.getParentEndpoint());
- }
- return true;
- }
-
- @Override
- public String toString() {
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint == null) {
- @SuppressWarnings("null")
- @NonNull String ret = fIPAddress.getHostAddress();
- return ret;
- }
- return endpoint.toString() + '/' + fIPAddress.getHostAddress();
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4;
-
-import java.net.Inet4Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.tcp.TCPPacket;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.udp.UDPPacket;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
-import org.eclipse.linuxtools.internal.pcap.core.util.IPProtocolNumberHelper;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMap.Builder;
-
-/**
- * Class that represents an Ethernet II packet.
- *
- * @author Vincent Perot
- */
-public class IPv4Packet extends Packet {
-
- private final @Nullable Packet fChildPacket;
- private final @Nullable ByteBuffer fPayload;
-
- private final int fVersion;
- private final int fInternetHeaderLength; // in 4 bytes blocks
- private final int fDSCP;
- private final int fExplicitCongestionNotification;
- private final int fTotalLength; // in bytes
- private final int fIdentification;
- private final boolean fReservedFlag;
- private final boolean fDontFragmentFlag;
- private final boolean fMoreFragmentFlag;
- private final int fFragmentOffset;
- private final int fTimeToLive;
- private final int fIpDatagramProtocol;
- private final int fHeaderChecksum;
- private final Inet4Address fSourceIpAddress;
- private final Inet4Address fDestinationIpAddress;
- private final @Nullable byte[] fOptions;
-
- private @Nullable IPv4Endpoint fSourceEndpoint;
- private @Nullable IPv4Endpoint fDestinationEndpoint;
-
- private @Nullable ImmutableMap<String, String> fFields;
-
- // TODO Interpret options. See
- // http://www.iana.org/assignments/ip-parameters/ip-parameters.xhtml
-
- /**
- * Constructor of the IPv4 Packet class.
- *
- * @param file
- * The file that contains this packet.
- * @param parent
- * The parent packet of this packet (the encapsulating packet).
- * @param packet
- * The entire packet (header and payload).
- * @throws BadPacketException
- * Thrown when the packet is erroneous.
- */
- public IPv4Packet(PcapFile file, @Nullable Packet parent, ByteBuffer packet) throws BadPacketException {
- super(file, parent, PcapProtocol.IPV4);
-
- // The endpoints are lazy loaded. They are defined in the get*Endpoint()
- // methods.
- fSourceEndpoint = null;
- fDestinationEndpoint = null;
-
- fFields = null;
-
- packet.order(ByteOrder.BIG_ENDIAN);
- packet.position(0);
-
- byte storage = packet.get();
- fVersion = ((storage & 0xF0) >> 4) & 0x000000FF;
- fInternetHeaderLength = storage & 0x0F;
-
- storage = packet.get();
- fDSCP = ((storage & 0b11111100) >> 2) & 0x000000FF;
- fExplicitCongestionNotification = storage & 0b00000011;
-
- fTotalLength = ConversionHelper.unsignedShortToInt(packet.getShort());
- fIdentification = ConversionHelper.unsignedShortToInt(packet.getShort());
-
- storage = packet.get();
- fReservedFlag = isBitSet(storage, 7);
- fDontFragmentFlag = isBitSet(storage, 6);
- fMoreFragmentFlag = isBitSet(storage, 5);
- int msb = ((storage & 0b00011111) << 8);
- int lsb = ConversionHelper.unsignedByteToInt(packet.get());
- fFragmentOffset = msb + lsb;
-
- fTimeToLive = ConversionHelper.unsignedByteToInt(packet.get());
- fIpDatagramProtocol = ConversionHelper.unsignedByteToInt(packet.get());
- fHeaderChecksum = ConversionHelper.unsignedShortToInt(packet.getShort());
-
- byte[] source = new byte[IPv4Values.IP_ADDRESS_SIZE];
- byte[] destination = new byte[IPv4Values.IP_ADDRESS_SIZE];
- packet.get(source);
- packet.get(destination);
-
- try {
- @SuppressWarnings("null")
- @NonNull Inet4Address sourceIP = (Inet4Address) InetAddress.getByAddress(source);
- @SuppressWarnings("null")
- @NonNull Inet4Address destinationIP = (Inet4Address) InetAddress.getByAddress(destination);
- fSourceIpAddress = sourceIP;
- fDestinationIpAddress = destinationIP;
- } catch (UnknownHostException e) {
- throw new BadPacketException("The IP Address size is not valid!"); //$NON-NLS-1$
- }
-
- // Get options if there are any
- if (fInternetHeaderLength > IPv4Values.DEFAULT_HEADER_LENGTH) {
- fOptions = new byte[(fInternetHeaderLength - IPv4Values.DEFAULT_HEADER_LENGTH) * IPv4Values.BLOCK_SIZE];
- packet.get(fOptions);
- } else {
- fOptions = null;
- }
-
- // Get payload if any.
- if (packet.array().length - packet.position() > 0) {
- byte[] array = new byte[packet.array().length - packet.position()];
- packet.get(array);
- ByteBuffer payload = ByteBuffer.wrap(array);
- payload.order(ByteOrder.BIG_ENDIAN);
- payload.position(0);
- fPayload = payload;
- } else {
- fPayload = null;
- }
-
- // Find child
- fChildPacket = findChildPacket();
-
- }
-
- @Override
- public @Nullable Packet getChildPacket() {
- return fChildPacket;
- }
-
- @Override
- public @Nullable ByteBuffer getPayload() {
- return fPayload;
- }
-
- /**
- * {@inheritDoc}
- *
- * See http://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
- */
- @Override
- protected @Nullable Packet findChildPacket() throws BadPacketException {
- // TODO Implement more protocols
- ByteBuffer payload = fPayload;
- if (payload == null) {
- return null;
- }
-
- switch (fIpDatagramProtocol) {
- case IPProtocolNumberHelper.PROTOCOL_NUMBER_TCP:
- return new TCPPacket(getPcapFile(), this, payload);
- case IPProtocolNumberHelper.PROTOCOL_NUMBER_UDP:
- return new UDPPacket(getPcapFile(), this, payload);
- default:
- return new UnknownPacket(getPcapFile(), this, payload);
- }
-
- }
-
- @Override
- public String toString() {
- // Generate flagString
- // This is very ugly.
- String flagString = null;
-
- if (fReservedFlag && fDontFragmentFlag && fMoreFragmentFlag) { // 111
- flagString = "Flags: 0x07 (Invalid)"; //$NON-NLS-1$
- } else if (fReservedFlag && fDontFragmentFlag && !fMoreFragmentFlag) { // 110
- flagString = "Flags: 0x06 (Invalid)"; //$NON-NLS-1$
- } else if (fReservedFlag && !fDontFragmentFlag && fMoreFragmentFlag) { // 101
- flagString = "Flags: 0x05 (Invalid)"; //$NON-NLS-1$
- } else if (fReservedFlag && !fDontFragmentFlag && !fMoreFragmentFlag) { // 100
- flagString = "Flags: 0x04 (Invalid)"; //$NON-NLS-1$
- } else if (!fReservedFlag && fDontFragmentFlag && fMoreFragmentFlag) { // 011
- flagString = "Flags: 0x03 (Invalid)"; //$NON-NLS-1$
- } else if (!fReservedFlag && fDontFragmentFlag && !fMoreFragmentFlag) { // 010
- flagString = "Flags: 0x02 (Don't fragment)"; //$NON-NLS-1$
- } else if (!fReservedFlag && !fDontFragmentFlag && fMoreFragmentFlag) { // 001
- flagString = "Flags: 0x01 (More fragments)"; //$NON-NLS-1$
- } else if (!fReservedFlag && !fDontFragmentFlag && !fMoreFragmentFlag) { // 000
- flagString = "Flags: 0x00 (Don't have more fragments)"; //$NON-NLS-1$
- }
-
- flagString += ", Fragment Offset: " + fFragmentOffset; //$NON-NLS-1$
-
- // Generate checksum string
- // TODO calculate the expected checksum from packet
- String checksumString = "Header Checksum: " + String.format("%s%04x", "0x", fHeaderChecksum); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
- String string = getProtocol().getName() + ", Source: " + fSourceIpAddress.getHostAddress() + ", Destination: " + fDestinationIpAddress.getHostAddress() + //$NON-NLS-1$ //$NON-NLS-2$
- "\nVersion: " + fVersion + ", Identification: " + String.format("%s%04x", "0x", fIdentification) + ", Header Length: " + getHeaderLength() + " bytes, Total Length: " + getTotalLength() + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
- " bytes\nDifferentiated Services Code Point: " + String.format("%s%02x", "0x", fDSCP) + "; Explicit Congestion Notification: " + String.format("%s%02x", "0x", fExplicitCongestionNotification) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
- + "\n" + flagString + "\nTime to live: " + fTimeToLive + //$NON-NLS-1$ //$NON-NLS-2$
- "\nProtocol: " + fIpDatagramProtocol + "\n" //$NON-NLS-1$ //$NON-NLS-2$
- + checksumString + "\n"; //$NON-NLS-1$
- final Packet child = fChildPacket;
- if (child != null) {
- return string + child.toString();
- }
- return string;
- }
-
- /**
- * Getter method that returns the version of the IP protocol used. This
- * should always be set to 4 as IPv6 has its own class.
- *
- * @return The version of the IP used.
- */
- public int getVersion() {
- return fVersion;
- }
-
- /**
- * Getter method that returns the header length in bytes. In the IPv4
- * packet, this is specified in 4-bytes data block. By default, this method
- * returns 20 if there are no options present. Otherwise, it will return a
- * higher number.
- *
- * @return The header length in bytes.
- */
- public int getHeaderLength() {
- return fInternetHeaderLength * IPv4Values.BLOCK_SIZE;
- }
-
- /**
- * Getter method that returns the Differentiated Services Code Point (a.k.a.
- * the Type of Service). This is useful for some technologies that require
- * real-time data exchange.
- *
- * @return The DSCP
- */
- public int getDSCP() {
- return fDSCP;
- }
-
- /**
- * Getter method that returns the Explicit Congestion Notification (ECN).
- * This allows end-to-end communication without dropping packets.
- *
- * @return The ECN.
- */
- public int getExplicitCongestionNotification() {
- return fExplicitCongestionNotification;
- }
-
- /**
- * Getter method to retrieve the length of the entire packet, in bytes. This
- * number is according to the packet, and might not be true if the packet is
- * erroneous.
- *
- * @return The total length (packet and payload) in bytes.
- */
- public int getTotalLength() {
- return fTotalLength;
- }
-
- /**
- * Getter method to retrieve the Identification. This is a field that is
- * used to uniquely identify the packets, thus allowing the reconstruction
- * of fragmented IP packets.
- *
- * @return The packet identification.
- */
- public int getIdentification() {
- return fIdentification;
- }
-
- /**
- * Getter method that returns the state of the Reserved flag. This must
- * always be zero.
- *
- * @return The state of the Reserved flag.
- */
- public boolean getReservedFlag() {
- return fReservedFlag;
- }
-
- /**
- * Getter method that indicates if the packet can be fragmented or not.
- *
- * @return Whether the packet can be fragmented or not.
- */
- public boolean getDontFragmentFlag() {
- return fDontFragmentFlag;
- }
-
- /**
- * Getter method that indicates if the packet has more fragments or not.
- *
- * @return Whether the packet has more fragments or not.
- */
- public boolean getHasMoreFragment() {
- return fMoreFragmentFlag;
- }
-
- /**
- * Getter method that specify the offset of a particular fragment relative
- * to the original unfragmented packet, in 8-bytes blocks. *
- *
- * @return The fragment offset.
- */
- public int getFragmentOffset() {
- return fFragmentOffset;
- }
-
- /**
- * Getter method that returns the time to live in seconds. In practice, this
- * is a hop count. This is used to prevent packets from persisting.
- *
- * @return The time left to live for the packet.
- */
- public int getTimeToLive() {
- return fTimeToLive;
- }
-
- /**
- * Getter method that returns the encapsulated protocol.
- *
- * See http://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
- *
- * @return The encapsulated protocol.
- */
- public int getIpDatagramProtocol() {
- return fIpDatagramProtocol;
- }
-
- /**
- * Getter method that returns the checksum, according to the packet. This
- * checksum might be wrong if the packet is erroneous.
- *
- * @return The header checksum.
- */
- public int getHeaderChecksum() {
- return fHeaderChecksum;
- }
-
- /**
- * Getter method that returns the source IP address.
- *
- * @return The source IP address, as a byte array in big-endian.
- */
- public Inet4Address getSourceIpAddress() {
- return fSourceIpAddress;
- }
-
- /**
- * Getter method that returns the destination IP address.
- *
- * @return The destination IP address, as a byte array in big-endian.
- */
- public Inet4Address getDestinationIpAddress() {
- return fDestinationIpAddress;
- }
-
- /**
- * Getter method that returns the options. This method returns null if no
- * options are present.
- *
- * @return The options of the packet.
- */
- public @Nullable byte[] getOptions() {
- final byte[] options = fOptions;
- if (options == null) {
- return null;
- }
- return Arrays.copyOf(options, options.length);
- }
-
- @Override
- public boolean validate() {
- // Not yet implemented. ATM, we consider that all packets are valid.
- // This is the case for all packets.
- // TODO Implement it.
- return true;
- }
-
- @Override
- public IPv4Endpoint getSourceEndpoint() {
- @Nullable
- IPv4Endpoint endpoint = fSourceEndpoint;
- if (endpoint == null) {
- endpoint = new IPv4Endpoint(this, true);
- }
- fSourceEndpoint = endpoint;
- return fSourceEndpoint;
- }
-
- @Override
- public IPv4Endpoint getDestinationEndpoint() {
- @Nullable
- IPv4Endpoint endpoint = fDestinationEndpoint;
-
- if (endpoint == null) {
- endpoint = new IPv4Endpoint(this, false);
- }
- fDestinationEndpoint = endpoint;
- return fDestinationEndpoint;
- }
-
- @Override
- public Map<String, String> getFields() {
- ImmutableMap<String, String> map = fFields;
- if (map == null) {
- Builder<String, String> builder = ImmutableMap.<String, String> builder()
- .put("Version", String.valueOf(fVersion)) //$NON-NLS-1$
- .put("Header Length", String.valueOf(getHeaderLength()) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
- .put("Differentiated Services Field", String.format("%s%02x", "0x", fDSCP)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- .put("Explicit Congestion Notification", String.format("%s%02x", "0x", fExplicitCongestionNotification)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- .put("Total Length", String.valueOf(fTotalLength) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
- .put("Identification", String.format("%s%04x", "0x", fIdentification)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- .put("Don't Fragment Flag", String.valueOf(fDontFragmentFlag)) //$NON-NLS-1$
- .put("More Fragment Flag", String.valueOf(fMoreFragmentFlag)) //$NON-NLS-1$
- .put("Fragment Offset", String.valueOf(fFragmentOffset)) //$NON-NLS-1$
- .put("Time to live", String.valueOf(fTimeToLive)) //$NON-NLS-1$
- .put("Protocol", IPProtocolNumberHelper.toString(fIpDatagramProtocol) + " (" + String.valueOf(fIpDatagramProtocol) + ")") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- .put("Checksum", String.format("%s%04x", "0x", fHeaderChecksum)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- .put("Source IP Address", fSourceIpAddress.getHostAddress()) //$NON-NLS-1$
- .put("Destination IP Address", fDestinationIpAddress.getHostAddress()); //$NON-NLS-1$
- byte[] options = fOptions;
- if (options == null) {
- builder.put("Options", EMPTY_STRING); //$NON-NLS-1$
- } else {
- builder.put("Options", ConversionHelper.bytesToHex(options, true)); //$NON-NLS-1$
-
- }
- @SuppressWarnings("null")
- @NonNull
- ImmutableMap<String, String> newMap = builder.build();
- fFields = newMap;
- return newMap;
- }
- return map;
- }
-
- @Override
- public String getLocalSummaryString() {
- return "Src: " + fSourceIpAddress.getHostAddress() + " , Dst: " + fDestinationIpAddress.getHostAddress(); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- @Override
- protected String getSignificationString() {
- StringBuilder sb = new StringBuilder();
- sb.append(fSourceIpAddress.getHostAddress())
- .append(" > ") //$NON-NLS-1$
- .append(fDestinationIpAddress.getHostAddress());
-
- String flags = generateFlagString();
- if (!(flags.equals(""))) { //$NON-NLS-1$
- sb.append(' ')
- .append('[')
- .append(flags)
- .append(']');
- }
- sb.append(" Id=") //$NON-NLS-1$
- .append(fIdentification);
-
- final ByteBuffer payload = fPayload;
- if (payload != null) {
- sb.append(" Len=") //$NON-NLS-1$
- .append(payload.array().length);
- } else {
- sb.append(" Len=0"); //$NON-NLS-1$
- }
- String string = sb.toString();
- if (string == null) {
- return EMPTY_STRING;
- }
- return string;
- }
-
- private String generateFlagString() {
- StringBuilder sb = new StringBuilder();
- boolean start = true;
-
- if (fDontFragmentFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("DF"); //$NON-NLS-1$
- start = false;
- }
- if (fMoreFragmentFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("MF"); //$NON-NLS-1$
- start = false;
- }
- String string = sb.toString();
- if (string == null) {
- return EMPTY_STRING;
- }
- return string;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- final Packet child = fChildPacket;
- if (child != null) {
- result = prime * result + child.hashCode();
- } else {
- result = prime * result;
- }
- result = prime * result + fDSCP;
- result = prime * result + fDestinationIpAddress.hashCode();
- result = prime * result + (fDontFragmentFlag ? 1231 : 1237);
- result = prime * result + fExplicitCongestionNotification;
- result = prime * result + fFragmentOffset;
- result = prime * result + fHeaderChecksum;
- result = prime * result + fIdentification;
- result = prime * result + fInternetHeaderLength;
- result = prime * result + fIpDatagramProtocol;
- result = prime * result + (fMoreFragmentFlag ? 1231 : 1237);
- result = prime * result + Arrays.hashCode(fOptions);
- final ByteBuffer payload = fPayload;
- if (payload != null) {
- result = prime * result + payload.hashCode();
- } else {
- result = prime * result;
- }
- result = prime * result + (fReservedFlag ? 1231 : 1237);
- result = prime * result + fSourceIpAddress.hashCode();
- result = prime * result + fTimeToLive;
- result = prime * result + fTotalLength;
- result = prime * result + fVersion;
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- IPv4Packet other = (IPv4Packet) obj;
- final Packet child = fChildPacket;
- if (child != null) {
- if (!child.equals(other.fChildPacket)) {
- return false;
- }
- } else {
- if (other.fChildPacket != null) {
- return false;
- }
- }
-
- if (fDSCP != other.fDSCP) {
- return false;
- }
- if (!(fDestinationIpAddress.equals(other.fDestinationIpAddress))) {
- return false;
- }
- if (fDontFragmentFlag != other.fDontFragmentFlag) {
- return false;
- }
- if (fExplicitCongestionNotification != other.fExplicitCongestionNotification) {
- return false;
- }
- if (fFragmentOffset != other.fFragmentOffset) {
- return false;
- }
- if (fHeaderChecksum != other.fHeaderChecksum) {
- return false;
- }
- if (fIdentification != other.fIdentification) {
- return false;
- }
- if (fInternetHeaderLength != other.fInternetHeaderLength) {
- return false;
- }
- if (fIpDatagramProtocol != other.fIpDatagramProtocol) {
- return false;
- }
- if (fMoreFragmentFlag != other.fMoreFragmentFlag) {
- return false;
- }
- if (!Arrays.equals(fOptions, other.fOptions)) {
- return false;
- }
- final ByteBuffer payload = fPayload;
- if (payload != null) {
- if (!payload.equals(other.fPayload)) {
- return false;
- }
- } else {
- if (other.fPayload != null) {
- return false;
- }
- }
- if (fReservedFlag != other.fReservedFlag) {
- return false;
- }
- if (!(fSourceIpAddress.equals(other.fSourceIpAddress))) {
- return false;
- }
- if (fTimeToLive != other.fTimeToLive) {
- return false;
- }
- if (fTotalLength != other.fTotalLength) {
- return false;
- }
- if (fVersion != other.fVersion) {
- return false;
- }
- return true;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4;
-
-/**
- * Interface that lists constants related to Internet Protocol v4.
- *
- * See http://en.wikipedia.org/wiki/IPv4#Packet_structure.
- *
- * @author Vincent Perot
- */
-public interface IPv4Values {
-
- /** Size in bytes of an IP address */
- int IP_ADDRESS_SIZE = 4;
-
- /** Size in bytes of a default IPv4 packet header */
- int DEFAULT_HEADER_LENGTH = 5;
-
- /** Size in bytes of a block of data. Used to convert data block to bytes */
- int BLOCK_SIZE = 4;
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.protocol;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.pcap;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
-
-/**
- * Class that extends the {@link ProtocolEndpoint} class. It represents the endpoint at
- * a Pcap level.
- *
- * @author Vincent Perot
- */
-public class PcapEndpoint extends ProtocolEndpoint {
-
- /**
- * Constructor of the {@link PcapEndpoint} class. It takes a packet to get
- * its endpoint. Since every packet has two endpoints (source and
- * destination), the isSourceEndpoint parameter is used to specify which
- * endpoint to take.
- *
- * @param packet
- * The packet that contains the endpoints.
- * @param isSourceEndpoint
- * Whether to take the source or the destination endpoint of the
- * packet.
- */
- public PcapEndpoint(PcapPacket packet, boolean isSourceEndpoint) {
- super(packet, isSourceEndpoint);
- }
-
- @Override
- public int hashCode() {
- return 0;
- }
-
- @Override
- public String toString() {
- return EMPTY_STRING;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof PcapEndpoint)) {
- return false;
- }
-
- PcapEndpoint other = (PcapEndpoint) obj;
-
- // Check above layers.
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint != null) {
- return endpoint.equals(other.getParentEndpoint());
- }
- return true;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.pcap;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIPacket;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFileValues;
-import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
-import org.eclipse.linuxtools.internal.pcap.core.util.LinkTypeHelper;
-import org.eclipse.linuxtools.internal.pcap.core.util.PcapTimestampScale;
-
-import com.google.common.collect.ImmutableMap;
-
-/**
- * Class that represents a Pcap packet. This is the highest level of
- * encapsulation.
- *
- * @author Vincent Perot
- */
-public class PcapPacket extends Packet {
-
- private static final int TIMESTAMP_MICROSECOND_MAX = 1000000;
- private static final int TIMESTAMP_NANOSECOND_MAX = 1000000000;
-
- private final @Nullable Packet fChildPacket;
- private final @Nullable ByteBuffer fPayload;
-
- private final long fTimestamp; // In microseconds
- private final long fIncludedLength;
- private final long fOriginalLength;
- private final long fPacketIndex;
-
- private @Nullable PcapEndpoint fSourceEndpoint;
- private @Nullable PcapEndpoint fDestinationEndpoint;
-
- private @Nullable ImmutableMap<String, String> fFields;
-
- /**
- * Constructor of the Pcap Packet class.
- *
- * @param file
- * The file that contains this packet.
- * @param parent
- * The parent packet of this packet (the encapsulating packet).
- * @param header
- * The header of the packet.
- * @param payload
- * The payload of this packet.
- * @param index
- * The index of the packet in the file.
- * @throws BadPacketException
- * Thrown when the Packet is erroneous.
- */
- public PcapPacket(PcapFile file, @Nullable Packet parent, ByteBuffer header, @Nullable ByteBuffer payload, long index) throws BadPacketException {
- super(file, parent, PcapProtocol.PCAP);
-
- if (header.array().length < PcapFileValues.PACKET_HEADER_SIZE) {
- fChildPacket = null;
- throw new BadPacketException("The Pcap packet header is too small."); //$NON-NLS-1$
- }
-
- // The endpoints are lazy loaded. They are defined in the get*Endpoint()
- // methods.
- fSourceEndpoint = null;
- fDestinationEndpoint = null;
-
- fFields = null;
-
- fPacketIndex = index;
-
- // PcapPacket header in File endian
- header.order(getPcapFile().getByteOrder());
- header.position(0);
- long timestampMostSignificant = ConversionHelper.unsignedIntToLong(header.getInt());
- long timestampLeastSignificant = ConversionHelper.unsignedIntToLong(header.getInt());
-
- switch (getTimestampScale()) {
- case MICROSECOND:
- if (timestampLeastSignificant > TIMESTAMP_MICROSECOND_MAX) {
- fChildPacket = null;
- throw new BadPacketException("The timestamp is erroneous."); //$NON-NLS-1$
- }
- fTimestamp = TIMESTAMP_MICROSECOND_MAX * timestampMostSignificant + timestampLeastSignificant;
- break;
- case NANOSECOND:
- if (timestampLeastSignificant > TIMESTAMP_NANOSECOND_MAX) {
- fChildPacket = null;
- throw new BadPacketException("The timestamp is erroneous."); //$NON-NLS-1$
- }
- fTimestamp = TIMESTAMP_NANOSECOND_MAX * timestampMostSignificant + timestampLeastSignificant;
- break;
- default:
- throw new IllegalArgumentException("The timestamp precision is not valid!"); //$NON-NLS-1$
- }
-
- fIncludedLength = ConversionHelper.unsignedIntToLong(header.getInt());
- fOriginalLength = ConversionHelper.unsignedIntToLong(header.getInt());
-
- // Set up payload
- final ByteBuffer pcapPacket = payload;
- if (pcapPacket == null) {
- fChildPacket = null;
- fPayload = null;
- return;
- }
-
- pcapPacket.order(ByteOrder.BIG_ENDIAN);
- pcapPacket.position(0);
- fPayload = pcapPacket;
-
- // Find Child Packet
- fChildPacket = findChildPacket();
-
- }
-
- @Override
- public @Nullable Packet getChildPacket() {
- return fChildPacket;
- }
-
- @Override
- public @Nullable ByteBuffer getPayload() {
- return fPayload;
- }
-
- /**
- * Getter method that returns the timestamp of this packet, in microseconds/nanoseconds
- * relative to epoch.
- *
- * @return The timestamp of the packet.
- */
- public long getTimestamp() {
- return fTimestamp;
- }
-
- /**
- * Getter method that returns the length in bytes of the packet that was
- * included in the {@link PcapFile}.
- *
- * @return The included length of the packet.
- */
- public long getIncludedLength() {
- return fIncludedLength;
- }
-
- /**
- * Getter method that returns the original length in bytes of the packet.
- *
- * @return The included length of the packet.
- */
- public long getOriginalLength() {
- return fOriginalLength;
- }
-
- /**
- * Method that indicates if this packet was truncated at capture time.
- *
- * @return Whether the packet is truncated or not.
- */
- public boolean isTruncated() {
- return fIncludedLength != fOriginalLength;
- }
-
- /**
- * Getter method that returns the index of the packet.
- *
- * @return The index of the packet.
- */
- public long getIndex() {
- return fPacketIndex;
- }
-
- @Override
- public String toString() {
- // TODO Decide if first capture is 0 or 1. Right now, it is 0.
- String string = getProtocol().getName() + " " + fPacketIndex + //$NON-NLS-1$
- ": " + fOriginalLength + " bytes on wire, " + //$NON-NLS-1$ //$NON-NLS-2$
- fIncludedLength + " bytes captured.\nArrival time: " + //$NON-NLS-1$
- ConversionHelper.toGMTTime(fTimestamp, getTimestampScale()) + "\n"; //$NON-NLS-1$
-
- final Packet child = fChildPacket;
- if (child != null) {
- return string + child.toString();
- }
- return string;
- }
-
- /**
- * {@inheritDoc}
- *
- * See http://www.tcpdump.org/linktypes.html
- */
- @Override
- protected @Nullable Packet findChildPacket() throws BadPacketException {
- @Nullable
- ByteBuffer payload = fPayload;
- if (payload == null) {
- return null;
- }
-
- switch ((int) getPcapFile().getDataLinkType()) {
- case LinkTypeHelper.LINKTYPE_ETHERNET:
- return new EthernetIIPacket(getPcapFile(), this, payload);
- default: // TODO add more protocols
- return new UnknownPacket(getPcapFile(), this, payload);
- }
- }
-
- @Override
- public boolean validate() {
- // Not yet implemented. ATM, we consider that all packets are valid.
- // This is the case for all packets.
- // TODO Implement it.
- return true;
- }
-
- @Override
- public PcapEndpoint getSourceEndpoint() {
- @Nullable PcapEndpoint endpoint = fSourceEndpoint;
- if (endpoint == null) {
- endpoint = new PcapEndpoint(this, true);
- }
- fSourceEndpoint = endpoint;
- return fSourceEndpoint;
- }
-
- @Override
- public PcapEndpoint getDestinationEndpoint() {
- @Nullable
- PcapEndpoint endpoint = fDestinationEndpoint;
-
- if (endpoint == null) {
- endpoint = new PcapEndpoint(this, false);
- }
- fDestinationEndpoint = endpoint;
- return fDestinationEndpoint;
- }
-
- // TODO handle plural form correctly
- // TODO microsec
- @Override
- public Map<String, String> getFields() {
- ImmutableMap<String, String> map = fFields;
- if (map == null) {
- @SuppressWarnings("null")
- @NonNull ImmutableMap<String, String> newMap = ImmutableMap.<String, String> builder()
- .put("Frame", String.valueOf(fPacketIndex)) //$NON-NLS-1$
- .put("Frame Length", String.valueOf(fOriginalLength) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
- .put("Capture Length", String.valueOf(fIncludedLength) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
- .put("Capture Time", ConversionHelper.toGMTTime(fTimestamp, getTimestampScale())) //$NON-NLS-1$
- .build();
- fFields = newMap;
- return newMap;
- }
- return map;
- }
-
- @Override
- public String getLocalSummaryString() {
- return "Frame " + fPacketIndex + ": " + fOriginalLength + " bytes on wire, " + fIncludedLength + " bytes captured"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
- }
-
- @Override
- protected String getSignificationString() {
- return "New Frame: " + fOriginalLength + " bytes on wire"; //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
-
- Packet child = fChildPacket;
- if (child == null) {
- result = prime * result;
- } else {
- result = prime * result + child.hashCode();
- }
-
- result = prime * result + (int) (fIncludedLength ^ (fIncludedLength >>> 32));
- result = prime * result + (int) (fOriginalLength ^ (fOriginalLength >>> 32));
- result = prime * result + (int) (fPacketIndex ^ (fPacketIndex >>> 32));
-
- ByteBuffer payload = fPayload;
- if (payload == null) {
- result = prime * result;
- } else {
- result = prime * result + payload.hashCode();
- }
-
- result = prime * result + (int) (fTimestamp ^ (fTimestamp >>> 32));
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- PcapPacket other = (PcapPacket) obj;
- final Packet child = fChildPacket;
- if (child != null) {
- if (!child.equals(other.fChildPacket)) {
- return false;
- }
- } else {
- if (other.fChildPacket != null) {
- return false;
- }
- }
-
- if (fIncludedLength != other.fIncludedLength) {
- return false;
- }
- if (fOriginalLength != other.fOriginalLength) {
- return false;
- }
- if (fPacketIndex != other.fPacketIndex) {
- return false;
- }
- final ByteBuffer payload = fPayload;
- if (payload != null) {
- if (!payload.equals(other.fPayload)) {
- return false;
- }
- } else {
- if (other.fPayload != null) {
- return false;
- }
- }
-
- if (fTimestamp != other.fTimestamp) {
- return false;
- }
- return true;
- }
-
- /**
- * Getter method that returns the Timestamp precision of the packet.
- *
- * @return the Timestamp precision.
- */
- public PcapTimestampScale getTimestampScale() {
- return getPcapFile().getTimestampPrecision();
- }
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.protocol.pcap;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.tcp;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
-
-/**
- * Class that extends the {@link ProtocolEndpoint} class. It represents the
- * endpoint at a TCP level.
- *
- * @author Vincent Perot
- */
-public class TCPEndpoint extends ProtocolEndpoint {
-
- private final int fPort;
-
- /**
- * Constructor of the {@link TCPEndpoint} class. It takes a packet to get
- * its endpoint. Since every packet has two endpoints (source and
- * destination), the isSourceEndpoint parameter is used to specify which
- * endpoint to take.
- *
- * @param packet
- * The packet that contains the endpoints.
- * @param isSourceEndpoint
- * Whether to take the source or the destination endpoint of the
- * packet.
- */
- public TCPEndpoint(TCPPacket packet, boolean isSourceEndpoint) {
- super(packet, isSourceEndpoint);
- fPort = isSourceEndpoint ? packet.getSourcePort() : packet.getDestinationPort();
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint == null) {
- result = 0;
- } else {
- result = endpoint.hashCode();
- }
- result = prime * result + fPort;
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof TCPEndpoint)) {
- return false;
- }
-
- TCPEndpoint other = (TCPEndpoint) obj;
-
- // Check on layer
- boolean localEquals = (fPort == other.fPort);
- if (!localEquals) {
- return false;
- }
-
- // Check above layers.
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint != null) {
- return endpoint.equals(other.getParentEndpoint());
- }
- return true;
- }
-
- @Override
- public String toString() {
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint == null) {
- @SuppressWarnings("null")
- @NonNull
- String ret = String.valueOf(fPort);
- return ret;
- }
- return endpoint.toString() + '/' + fPort;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.tcp;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMap.Builder;
-
-/**
- * Class that represents a TCP packet.
- *
- * @author Vincent Perot
- */
-public class TCPPacket extends Packet {
-
- private final @Nullable Packet fChildPacket;
- private final @Nullable ByteBuffer fPayload;
-
- private final int fSourcePort;
- private final int fDestinationPort;
- private final long fSequenceNumber;
- private final long fAcknowledgmentNumber;
- private final int fDataOffset; // in 4 bytes block
- private final byte fReservedField;
- private final boolean fNSFlag;
- private final boolean fCWRFlag;
- private final boolean fECEFlag;
- private final boolean fURGFlag;
- private final boolean fACKFlag;
- private final boolean fPSHFlag;
- private final boolean fRSTFlag;
- private final boolean fSYNFlag;
- private final boolean fFINFlag;
- private final int fWindowSize;
- private final int fChecksum;
- private final int fUrgentPointer;
- private final @Nullable byte[] fOptions; // TODO Interpret options.
-
- private @Nullable TCPEndpoint fSourceEndpoint;
- private @Nullable TCPEndpoint fDestinationEndpoint;
-
- private @Nullable ImmutableMap<String, String> fFields;
-
- /**
- * Constructor of the TCP Packet class.
- *
- * @param file
- * The file that contains this packet.
- * @param parent
- * The parent packet of this packet (the encapsulating packet).
- * @param packet
- * The entire packet (header and payload).
- * @throws BadPacketException
- * Thrown when the packet is erroneous.
- */
- public TCPPacket(PcapFile file, @Nullable Packet parent, ByteBuffer packet) throws BadPacketException {
- super(file, parent, PcapProtocol.TCP);
-
- // The endpoints are lazy loaded. They are defined in the get*Endpoint()
- // methods.
- fSourceEndpoint = null;
- fDestinationEndpoint = null;
-
- fFields = null;
-
- packet.order(ByteOrder.BIG_ENDIAN);
- packet.position(0);
-
- fSourcePort = ConversionHelper.unsignedShortToInt(packet.getShort());
- fDestinationPort = ConversionHelper.unsignedShortToInt(packet.getShort());
- fSequenceNumber = ConversionHelper.unsignedIntToLong(packet.getInt());
- fAcknowledgmentNumber = ConversionHelper.unsignedIntToLong(packet.getInt());
-
- byte storage = packet.get();
- fDataOffset = ((storage & 0b11110000) >>> 4) & 0x000000FF;
- fReservedField = (byte) ((storage & 0b00001110) >>> 1);
- fNSFlag = isBitSet(storage, 0);
-
- storage = packet.get();
- fCWRFlag = isBitSet(storage, 7);
- fECEFlag = isBitSet(storage, 6);
- fURGFlag = isBitSet(storage, 5);
- fACKFlag = isBitSet(storage, 4);
- fPSHFlag = isBitSet(storage, 3);
- fRSTFlag = isBitSet(storage, 2);
- fSYNFlag = isBitSet(storage, 1);
- fFINFlag = isBitSet(storage, 0);
-
- fWindowSize = ConversionHelper.unsignedShortToInt(packet.getShort());
- fChecksum = ConversionHelper.unsignedShortToInt(packet.getShort());
- fUrgentPointer = ConversionHelper.unsignedShortToInt(packet.getShort());
-
- // Get options if any
- if (fDataOffset > TCPValues.DEFAULT_HEADER_LENGTH) {
- fOptions = new byte[(fDataOffset - TCPValues.DEFAULT_HEADER_LENGTH) * TCPValues.BLOCK_SIZE];
- packet.get(fOptions);
- } else {
- fOptions = null;
- }
-
- // Get payload if any.
- if (packet.array().length - packet.position() > 0) {
- byte[] array = new byte[packet.array().length - packet.position()];
- packet.get(array);
- ByteBuffer payload = ByteBuffer.wrap(array);
- payload.order(ByteOrder.BIG_ENDIAN);
- payload.position(0);
- fPayload = payload;
- } else {
- fPayload = null;
- }
-
- // find child packet
- fChildPacket = findChildPacket();
-
- }
-
- @Override
- public @Nullable Packet getChildPacket() {
- return fChildPacket;
- }
-
- @Override
- public @Nullable ByteBuffer getPayload() {
- return fPayload;
- }
-
- /**
- * {@inheritDoc}
- *
- * See http://www.iana.org/assignments/service-names-port-numbers/service-
- * names-port-numbers.xhtml or
- * http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
- */
- @Override
- protected @Nullable Packet findChildPacket() throws BadPacketException {
- // TODO implement further protocols and update this
- ByteBuffer payload = fPayload;
- if (payload == null) {
- return null;
- }
-
- return new UnknownPacket(getPcapFile(), this, payload);
- }
-
- @Override
- public String toString() {
- final ByteBuffer payload = fPayload;
- int length = 0;
- if (payload != null) {
- length = payload.array().length;
- }
-
- String flagString = ""; // TODO Finish it. Im just too lazy. //$NON-NLS-1$
- String string = getProtocol().getName() + ", Source Port: " + fSourcePort + ", Destination Port: " + fDestinationPort + //$NON-NLS-1$ //$NON-NLS-2$
- "\nSequence Number: " + fSequenceNumber + ", Acknowledgment Number: " + fAcknowledgmentNumber + //$NON-NLS-1$ //$NON-NLS-2$
- "\nHeader length: " + fDataOffset * TCPValues.BLOCK_SIZE + " bytes, Data length: " + length + //$NON-NLS-1$ //$NON-NLS-2$
- "\n" + flagString + "Window size value: " + fWindowSize + ", Urgent Pointer: " + String.format("%s%04x", "0x", fUrgentPointer) + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
- "\nChecksum: " + String.format("%s%04x", "0x", fChecksum) + "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
- final Packet child = fChildPacket;
- if (child != null) {
- return string + child.toString();
- }
- return string;
- }
-
- /**
- * Getter method that returns the TCP Source Port.
- *
- * @return The source Port.
- */
- public int getSourcePort() {
- return fSourcePort;
- }
-
- /**
- * Getter method that returns the TCP Destination Port.
- *
- * @return The destination Port.
- */
- public int getDestinationPort() {
- return fDestinationPort;
- }
-
- /**
- * Getter method that returns the Sequence Number. The sequence number has a
- * dual role:
- * <ul>
- * <li>If the SYN flag is set (1), then this is the initial sequence number.
- * The sequence number of the actual first data byte and the acknowledged
- * number in the corresponding ACK are then this sequence number plus 1.</li>
- * <li>If the SYN flag is clear (0), then this is the accumulated sequence
- * number of the first data byte of this segment for the current session.</li>
- * </ul>
- *
- * Source: http://en.wikipedia.org/wiki/Transmission_Control_Protocol
- *
- * @return The Sequence Number.
- */
- public long getSequenceNumber() {
- return fSequenceNumber;
- }
-
- /**
- * Getter method that returns the Acknowledgment Number.
- *
- * If the ACK flag is set then the value of this field is the next sequence
- * number that the receiver is expecting. This acknowledges receipt of all
- * prior bytes (if any). The first ACK sent by each end acknowledges the
- * other end's initial sequence number itself, but no data.
- *
- * Source: http://en.wikipedia.org/wiki/Transmission_Control_Protocol
- *
- * @return The Acknowledgment Number.
- */
- public long getAcknowledgmentNumber() {
- return fAcknowledgmentNumber;
- }
-
- /**
- * Getter method that returns the size of the TCP header in 4 bytes data
- * block. The minimum size is 5 words and the maximum is 15 words.
- *
- * @return The Data Offset.
- */
- public int getDataOffset() {
- return fDataOffset;
- }
-
- /**
- * Getter method that returns the Reserved field. This field is for future
- * use and should always be zero. In this library, it is used as a mean to
- * verify the validity of a TCP packet.
- *
- * @return The Reserved Field.
- */
- public byte getReservedField() {
- return fReservedField;
- }
-
- /**
- * Getter method that returns the state of the NS flag.
- *
- * @return The state of the NS flag.
- */
- public boolean isNSFlagSet() {
- return fNSFlag;
- }
-
- /**
- * Getter method that returns the state of the CWR flag.
- *
- * @return The state of the CWR flag.
- */
- public boolean isCongestionWindowReducedFlagSet() {
- return fCWRFlag;
- }
-
- /**
- * Getter method that returns the state of the ECE flag.
- *
- * @return The state of the ECE flag.
- */
- public boolean isECNEchoFlagSet() {
- return fECEFlag;
- }
-
- /**
- * Getter method that returns the state of the URG flag.
- *
- * @return The state of the URG flag.
- */
- public boolean isUrgentFlagSet() {
- return fURGFlag;
- }
-
- /**
- * Getter method that returns the state of the ACK flag.
- *
- * @return The state of the ACK flag.
- */
- public boolean isAcknowledgeFlagSet() {
- return fACKFlag;
- }
-
- /**
- * Getter method that returns the state of the PSH flag.
- *
- * @return The state of the PSH flag.
- */
- public boolean isPushFlagSet() {
- return fPSHFlag;
- }
-
- /**
- * Getter method that returns the state of the RST flag.
- *
- * @return The state of the RST flag.
- */
- public boolean isResetFlagSet() {
- return fRSTFlag;
- }
-
- /**
- * Getter method that returns the state of the SYN flag.
- *
- * @return The state of the SYN flag.
- */
- public boolean isSynchronizationFlagSet() {
- return fSYNFlag;
- }
-
- /**
- * Getter method that returns the state of the FIN flag.
- *
- * @return The state of the FIN flag.
- */
- public boolean isFinalFlagSet() {
- return fFINFlag;
- }
-
- /**
- * Getter method that returns the size of the windows, in windows size unit
- * (by default, bytes), that the sender of this packet is willing to
- * receive.
- *
- * @return The Window Size.
- */
- public int getWindowSize() {
- return fWindowSize;
- }
-
- /**
- * Getter method that returns the checksum of this packet. This checksum may
- * be wrong if the packet is erroneous.
- *
- * @return The data and header checksum.
- */
- public int getChecksum() {
- return fChecksum;
- }
-
- /**
- * Getter method that returns the Urgent Pointer. If the URG flag is set,
- * this field is an offset from the sequence number indicating the last
- * urgent data byte.
- *
- * @return The Urgent Pointer.
- */
- public int getUrgentPointer() {
- return fUrgentPointer;
- }
-
- /**
- * Getter method that returns the options. This method returns null if no
- * options are present.
- *
- * @return The options of the packet.
- */
- public @Nullable byte[] getOptions() {
- byte[] options = fOptions;
- if (options == null) {
- return null;
- }
- return Arrays.copyOf(options, options.length);
- }
-
- @Override
- public boolean validate() {
- // Not yet implemented. ATM, we consider that all packets are valid.
- // This is the case for all packets.
- // TODO Implement it.
- return true;
- }
-
- @Override
- public TCPEndpoint getSourceEndpoint() {
- @Nullable
- TCPEndpoint endpoint = fSourceEndpoint;
- if (endpoint == null) {
- endpoint = new TCPEndpoint(this, true);
- }
- fSourceEndpoint = endpoint;
- return fSourceEndpoint;
- }
-
- @Override
- public TCPEndpoint getDestinationEndpoint() {
- @Nullable
- TCPEndpoint endpoint = fDestinationEndpoint;
-
- if (endpoint == null) {
- endpoint = new TCPEndpoint(this, false);
- }
- fDestinationEndpoint = endpoint;
- return fDestinationEndpoint;
- }
-
- @Override
- public Map<String, String> getFields() {
- ImmutableMap<String, String> map = fFields;
- if (map == null) {
- Builder<String, String> builder = ImmutableMap.<String, String> builder()
- .put("Source Port", String.valueOf(fSourcePort)) //$NON-NLS-1$
- .put("Destination Port", String.valueOf(fDestinationPort)) //$NON-NLS-1$
- .put("Sequence Number", String.valueOf(fSequenceNumber)) //$NON-NLS-1$
- .put("Acknowledgement Number", String.valueOf(fAcknowledgmentNumber)) //$NON-NLS-1$
- .put("Length", String.valueOf(fDataOffset * TCPValues.BLOCK_SIZE) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
- .put("ECN-Nonce Flag", String.valueOf(fNSFlag)) //$NON-NLS-1$
- .put("Congestion Window Reduced Flag", String.valueOf(fCWRFlag)) //$NON-NLS-1$
- .put("ECN-Echo Flag", String.valueOf(fECEFlag)) //$NON-NLS-1$
- .put("Urgent Flag", String.valueOf(fURGFlag)) //$NON-NLS-1$
- .put("ACK Flag", String.valueOf(fACKFlag)) //$NON-NLS-1$
- .put("PSH Flag", String.valueOf(fPSHFlag)) //$NON-NLS-1$
- .put("RST Flag", String.valueOf(fRSTFlag)) //$NON-NLS-1$
- .put("SYN Flag", String.valueOf(fSYNFlag)) //$NON-NLS-1$
- .put("FIN Flag", String.valueOf(fFINFlag)) //$NON-NLS-1$
- .put("Window Size Value", String.valueOf(fWindowSize)) //$NON-NLS-1$
- .put("Checksum", String.format("%s%04x", "0x", fChecksum)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- .put("Urgent Pointer", String.format("%s%04x", "0x", fUrgentPointer)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- byte[] options = fOptions;
- if (options == null) {
- builder.put("Options", EMPTY_STRING); //$NON-NLS-1$
- } else {
- builder.put("Options", ConversionHelper.bytesToHex(options, true)); //$NON-NLS-1$
-
- }
- @SuppressWarnings("null")
- @NonNull ImmutableMap<String, String> newMap = builder.build();
- fFields = newMap;
- return newMap;
- }
- return map;
- }
-
- @Override
- public String getLocalSummaryString() {
- return "Src Port: " + fSourcePort + ", Dst Port: " + fDestinationPort + //$NON-NLS-1$ //$NON-NLS-2$
- ", Seq: " + fSequenceNumber + ", Ack: " + fAcknowledgmentNumber + //$NON-NLS-1$ //$NON-NLS-2$
- ", Len: " + (fDataOffset * TCPValues.BLOCK_SIZE); //$NON-NLS-1$ }
- }
-
- @Override
- protected String getSignificationString() {
- StringBuilder sb = new StringBuilder();
- sb.append(fSourcePort)
- .append(" > ") //$NON-NLS-1$
- .append(fDestinationPort);
-
- if (!(generateFlagString().equals(EMPTY_STRING))) {
- sb.append(' ')
- .append('[')
- .append(generateFlagString())
- .append(']');
- }
- sb.append(" Seq=") //$NON-NLS-1$
- .append(fSequenceNumber);
-
- if (fACKFlag) {
- sb.append(" Ack=") //$NON-NLS-1$
- .append(fAcknowledgmentNumber);
- }
-
- sb.append(" Len=") //$NON-NLS-1$
- .append((fDataOffset * TCPValues.BLOCK_SIZE));
-
- String string = sb.toString();
- if (string == null) {
- return EMPTY_STRING;
- }
- return string;
- }
-
- private String generateFlagString() {
- StringBuilder sb = new StringBuilder();
- boolean start = true;
-
- if (fSYNFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("SYN"); //$NON-NLS-1$
- start = false;
- }
- if (fACKFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("ACK"); //$NON-NLS-1$
- start = false;
- }
- if (fFINFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("FIN"); //$NON-NLS-1$
- start = false;
- }
- if (fRSTFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("RST"); //$NON-NLS-1$
- start = false;
- }
- if (fPSHFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("PSH"); //$NON-NLS-1$
- start = false;
- }
- if (fURGFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("URG"); //$NON-NLS-1$
- start = false;
- }
- if (fNSFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("NS"); //$NON-NLS-1$
- start = false;
- }
- if (fCWRFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("CWR"); //$NON-NLS-1$
- start = false;
- }
- if (fECEFlag) {
- if (!start) {
- sb.append(", "); //$NON-NLS-1$
- }
- sb.append("ECE"); //$NON-NLS-1$
- start = false;
- }
- String string = sb.toString();
- if (string == null) {
- return EMPTY_STRING;
- }
- return string;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + (fACKFlag ? 1231 : 1237);
- result = prime * result + (int) (fAcknowledgmentNumber ^ (fAcknowledgmentNumber >>> 32));
- result = prime * result + (fCWRFlag ? 1231 : 1237);
- result = prime * result + fChecksum;
- final Packet child = fChildPacket;
- if (child != null) {
- result = prime * result + child.hashCode();
- } else {
- result = prime * result;
- }
- result = prime * result + fDataOffset;
- result = prime * result + fDestinationPort;
- result = prime * result + (fECEFlag ? 1231 : 1237);
- result = prime * result + (fFINFlag ? 1231 : 1237);
- result = prime * result + (fNSFlag ? 1231 : 1237);
- result = prime * result + Arrays.hashCode(fOptions);
- result = prime * result + (fPSHFlag ? 1231 : 1237);
- final ByteBuffer payload = fPayload;
- if (payload != null) {
- result = prime * result + payload.hashCode();
- } else {
- result = prime * result;
- }
- result = prime * result + (fRSTFlag ? 1231 : 1237);
- result = prime * result + fReservedField;
- result = prime * result + (fSYNFlag ? 1231 : 1237);
- result = prime * result + (int) (fSequenceNumber ^ (fSequenceNumber >>> 32));
- result = prime * result + fSourcePort;
- result = prime * result + (fURGFlag ? 1231 : 1237);
- result = prime * result + fUrgentPointer;
- result = prime * result + fWindowSize;
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- TCPPacket other = (TCPPacket) obj;
- if (fACKFlag != other.fACKFlag) {
- return false;
- }
- if (fAcknowledgmentNumber != other.fAcknowledgmentNumber) {
- return false;
- }
- if (fCWRFlag != other.fCWRFlag) {
- return false;
- }
- if (fChecksum != other.fChecksum) {
- return false;
- }
- final Packet child = fChildPacket;
- if (child != null) {
- if (!child.equals(other.fChildPacket)) {
- return false;
- }
- } else {
- if (other.fChildPacket != null) {
- return false;
- }
- }
-
- if (fDataOffset != other.fDataOffset) {
- return false;
- }
- if (fDestinationPort != other.fDestinationPort) {
- return false;
- }
- if (fECEFlag != other.fECEFlag) {
- return false;
- }
- if (fFINFlag != other.fFINFlag) {
- return false;
- }
- if (fNSFlag != other.fNSFlag) {
- return false;
- }
- if (!Arrays.equals(fOptions, other.fOptions)) {
- return false;
- }
- if (fPSHFlag != other.fPSHFlag) {
- return false;
- }
- final ByteBuffer fPayload2 = fPayload;
- if (fPayload2 != null) {
- if (!fPayload2.equals(other.fPayload)) {
- return false;
- }
- } else {
- if (other.fPayload != null) {
- return false;
- }
- }
- if (fRSTFlag != other.fRSTFlag) {
- return false;
- }
- if (fReservedField != other.fReservedField) {
- return false;
- }
- if (fSYNFlag != other.fSYNFlag) {
- return false;
- }
- if (fSequenceNumber != other.fSequenceNumber) {
- return false;
- }
- if (fSourcePort != other.fSourcePort) {
- return false;
- }
- if (fURGFlag != other.fURGFlag) {
- return false;
- }
- if (fUrgentPointer != other.fUrgentPointer) {
- return false;
- }
- if (fWindowSize != other.fWindowSize) {
- return false;
- }
- return true;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.tcp;
-
-/**
- * Interface that lists constants related to TCP.
- *
- * See http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure.
- *
- * @author Vincent Perot
- */
-public interface TCPValues {
-
- /** Size in bytes of a default TCP packet header */
- int DEFAULT_HEADER_LENGTH = 5;
-
- /** Size in bytes of a block of data. Used to convert data block to bytes. */
- int BLOCK_SIZE = 4;
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.protocol.tcp;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.udp;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
-
-/**
- * Class that extends the ProtocolEndpoint class. It represents the endpoint at
- * an UDP level.
- *
- * @author Vincent Perot
- */
-public class UDPEndpoint extends ProtocolEndpoint {
-
- private final int fPort;
-
- /**
- * Constructor of the {@link UDPEndpoint} class. It takes a packet to get
- * its endpoint. Since every packet has two endpoints (source and
- * destination), the isSourceEndpoint parameter is used to specify which
- * endpoint to take.
- *
- * @param packet
- * The packet that contains the endpoints.
- * @param isSourceEndpoint
- * Whether to take the source or the destination endpoint of the
- * packet.
- */
- public UDPEndpoint(UDPPacket packet, boolean isSourceEndpoint) {
- super(packet, isSourceEndpoint);
- fPort = isSourceEndpoint ? packet.getSourcePort() : packet.getDestinationPort();
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint == null) {
- result = 0;
- } else {
- result = endpoint.hashCode();
- }
- result = prime * result + fPort;
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof UDPEndpoint)) {
- return false;
- }
-
- UDPEndpoint other = (UDPEndpoint) obj;
-
- // Check on layer
- boolean localEquals = (fPort == other.fPort);
- if (!localEquals) {
- return false;
- }
-
- // Check above layers.
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint != null) {
- return endpoint.equals(other.getParentEndpoint());
- }
- return true;
- }
-
- @Override
- public String toString() {
- ProtocolEndpoint endpoint = getParentEndpoint();
- if (endpoint == null) {
- @SuppressWarnings("null")
- @NonNull String ret = String.valueOf(fPort);
- return ret;
- }
- return endpoint.toString() + '/' + fPort;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.udp;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
-
-import com.google.common.collect.ImmutableMap;
-
-/**
- * Class that represents a UDP packet.
- *
- * @author Vincent Perot
- */
-public class UDPPacket extends Packet {
-
- private final @Nullable Packet fChildPacket;
- private final @Nullable ByteBuffer fPayload;
-
- private final int fSourcePort;
- private final int fDestinationPort;
- private final int fTotalLength;
- private final int fChecksum;
-
- private @Nullable UDPEndpoint fSourceEndpoint;
- private @Nullable UDPEndpoint fDestinationEndpoint;
-
- private @Nullable ImmutableMap<String, String> fFields;
-
- /**
- * Constructor of the UDP Packet class.
- *
- * @param file
- * The file that contains this packet.
- * @param parent
- * The parent packet of this packet (the encapsulating packet).
- * @param packet
- * The entire packet (header and payload).
- * @throws BadPacketException
- * Thrown when the packet is erroneous.
- */
- public UDPPacket(PcapFile file, @Nullable Packet parent, ByteBuffer packet) throws BadPacketException {
- super(file, parent, PcapProtocol.UDP);
-
- // The endpoints are lazy loaded. They are defined in the get*Endpoint()
- // methods.
- fSourceEndpoint = null;
- fDestinationEndpoint = null;
-
- fFields = null;
-
- packet.order(ByteOrder.BIG_ENDIAN);
- packet.position(0);
-
- fSourcePort = ConversionHelper.unsignedShortToInt(packet.getShort());
- fDestinationPort = ConversionHelper.unsignedShortToInt(packet.getShort());
- fTotalLength = ConversionHelper.unsignedShortToInt(packet.getShort());
- fChecksum = ConversionHelper.unsignedShortToInt(packet.getShort());
-
- if (packet.array().length - packet.position() > 0) {
- byte[] array = new byte[packet.array().length - packet.position()];
- packet.get(array);
-
- ByteBuffer payload = ByteBuffer.wrap(array);
- payload.order(ByteOrder.BIG_ENDIAN);
- payload.position(0);
- fPayload = payload;
- } else {
- fPayload = null;
- }
-
- // Find child
- fChildPacket = findChildPacket();
-
- }
-
- @Override
- public @Nullable Packet getChildPacket() {
- return fChildPacket;
- }
-
- @Override
- public @Nullable ByteBuffer getPayload() {
- return fPayload;
- }
-
- /**
- * {@inheritDoc}
- *
- * See http://www.iana.org/assignments/service-names-port-numbers/service-
- * names-port-numbers.xhtml or
- * http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
- */
- @Override
- protected @Nullable Packet findChildPacket() throws BadPacketException {
- // TODO implement further protocols and update this
- ByteBuffer payload = fPayload;
- if (payload == null) {
- return null;
- }
-
- return new UnknownPacket(getPcapFile(), this, payload);
- }
-
- @Override
- public String toString() {
- String string = getProtocol().getName() + ", Source Port: " + fSourcePort + ", Destination Port: " + fDestinationPort + //$NON-NLS-1$ //$NON-NLS-2$
- ", Length: " + fTotalLength + ", Checksum: " + fChecksum + "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- final Packet child = fChildPacket;
- if (child != null) {
- return string + child.toString();
- }
- return string;
- }
-
- /**
- * Getter method that returns the UDP Source Port.
- *
- * @return The source Port.
- */
- public int getSourcePort() {
- return fSourcePort;
- }
-
- /**
- * Getter method that returns the UDP Destination Port.
- *
- * @return The destination Port.
- */
- public int getDestinationPort() {
- return fDestinationPort;
- }
-
- /**
- * Getter method that returns the total length of the packet in bytes. The
- * values it can take go from 8 to 65,515.
- *
- * @return The total length of the packet in bytes.
- */
- public int getTotalLength() {
- return fTotalLength;
- }
-
- /**
- * Getter method that returns the checksum (on header and payload). If the
- * transmitter does not use this field, it is set to zero. This checksum
- * might be wrong if the packet is erroneous.
- *
- * @return The checksum received from the packet.
- */
- public int getChecksum() {
- return fChecksum;
- }
-
- @Override
- public boolean validate() {
- // Not yet implemented. ATM, we consider that all packets are valid.
- // This is the case for all packets.
- // TODO Implement it.
- return true;
- }
-
- @Override
- public UDPEndpoint getSourceEndpoint() {
- @Nullable
- UDPEndpoint endpoint = fSourceEndpoint;
- if (endpoint == null) {
- endpoint = new UDPEndpoint(this, true);
- }
- fSourceEndpoint = endpoint;
- return fSourceEndpoint;
- }
-
- @Override
- public UDPEndpoint getDestinationEndpoint() {
- @Nullable UDPEndpoint endpoint = fDestinationEndpoint;
- if (endpoint == null) {
- endpoint = new UDPEndpoint(this, false);
- }
- fDestinationEndpoint = endpoint;
- return fDestinationEndpoint;
- }
-
- @Override
- public Map<String, String> getFields() {
- ImmutableMap<String, String> map = fFields;
- if (map == null) {
- @SuppressWarnings("null")
- @NonNull ImmutableMap<String, String> newMap = ImmutableMap.<String, String> builder()
- .put("Source Port", String.valueOf(fSourcePort)) //$NON-NLS-1$
- .put("Destination Port", String.valueOf(fDestinationPort)) //$NON-NLS-1$
- .put("Length", String.valueOf(fTotalLength) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
- .put("Checksum", String.format("%s%04x", "0x", fChecksum)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- .build();
- fFields = newMap;
- return newMap;
- }
- return map;
- }
-
- @Override
- public String getLocalSummaryString() {
- return "Src Port: " + fSourcePort + ", Dst Port: " + fDestinationPort; //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- @Override
- protected String getSignificationString() {
- return "Source Port: " + fSourcePort + ", Destination Port: " + fDestinationPort; //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + fChecksum;
- final Packet child = fChildPacket;
- if (child != null) {
- result = prime * result + child.hashCode();
- } else {
- result = prime * result;
- }
- result = prime * result + fDestinationPort;
- final ByteBuffer payload = fPayload;
- if (payload != null) {
- result = prime * result + payload.hashCode();
- } else {
- result = prime * result;
- }
- result = prime * result + fSourcePort;
- result = prime * result + fTotalLength;
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- UDPPacket other = (UDPPacket) obj;
- if (fChecksum != other.fChecksum) {
- return false;
- }
- final Packet child = fChildPacket;
- if (child != null) {
- if (!child.equals(other.fChildPacket)) {
- return false;
- }
- } else {
- if (other.fChildPacket != null) {
- return false;
- }
- }
- if (fDestinationPort != other.fDestinationPort) {
- return false;
- }
- final ByteBuffer payload = fPayload;
- if (payload != null) {
- if (!payload.equals(other.fPayload)) {
- return false;
- }
- } else {
- if (other.fPayload != null) {
- return false;
- }
- }
- if (fSourcePort != other.fSourcePort) {
- return false;
- }
- if (fTotalLength != other.fTotalLength) {
- return false;
- }
- return true;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.protocol.udp;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.unknown;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
-
-/**
- * Class that extends the {@link ProtocolEndpoint} class. It represents the
- * endpoint for a protocol that is unknown.
- *
- * @author Vincent Perot
- */
-public class UnknownEndpoint extends ProtocolEndpoint {
-
- /**
- * Constructor of the {@link UnknownEndpoint} class. It takes a packet to
- * get its endpoint. Since every packet has two endpoints (source and
- * destination), the isSourceEndpoint parameter is used to specify which
- * endpoint to take.
- *
- * @param packet
- * The packet that contains the endpoints.
- * @param isSourceEndpoint
- * Whether to take the source or the destination endpoint of the
- * packet.
- */
- public UnknownEndpoint(UnknownPacket packet, boolean isSourceEndpoint) {
- super(packet, isSourceEndpoint);
- }
-
- @Override
- public int hashCode() {
- return 0;
- }
-
- @Override
- public String toString() {
- return EMPTY_STRING;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- return false;
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.protocol.unknown;
-
-import java.io.UnsupportedEncodingException;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMap.Builder;
-
-/**
- * Class that represents an Unknown packet. It is possible to get such a packet
- * if the protocol has not been implemented in this library or if the parent
- * packet was invalid (in certain cases only). The header of such a packet is
- * inexistent.
- *
- * @author Vincent Perot
- */
-public class UnknownPacket extends Packet {
-
- private final @Nullable Packet fChildPacket;
- private final ByteBuffer fPayload;
-
- private @Nullable UnknownEndpoint fSourceEndpoint;
- private @Nullable UnknownEndpoint fDestinationEndpoint;
-
- private @Nullable ImmutableMap<String, String> fFields;
-
- /**
- * Constructor of an Unknown Packet object.
- *
- * @param file
- * The file to which this packet belongs.
- * @param parent
- * The parent packet of this packet.
- * @param packet
- * The entire packet (header and payload).
- */
- public UnknownPacket(PcapFile file, @Nullable Packet parent, ByteBuffer packet) {
- super(file, parent, PcapProtocol.UNKNOWN);
-
- // The endpoints are lazy loaded. They are defined in the get*Endpoint()
- // methods.
- fSourceEndpoint = null;
- fDestinationEndpoint = null;
-
- fFields = null;
-
- // Header is not used. All data go into payload.
- fPayload = packet;
-
- fChildPacket = findChildPacket();
- }
-
- @Override
- public @Nullable Packet getChildPacket() {
- return fChildPacket;
- }
-
- @Override
- public @Nullable ByteBuffer getPayload() {
- return fPayload;
- }
-
- @Override
- protected @Nullable Packet findChildPacket() {
- return null;
- }
-
- @Override
- public String toString() {
- @SuppressWarnings("null")
- @NonNull byte[] array = fPayload.array();
- String string = "Payload: " + ConversionHelper.bytesToHex(array, true); //$NON-NLS-1$
- final Packet child = fChildPacket;
- if (child != null) {
- return string + child.toString();
- }
- return string;
- }
-
- @Override
- public boolean validate() {
- // Not yet implemented. ATM, we consider that all packets are valid.
- // This is the case for all packets.
- // TODO Implement it.
- return true;
- }
-
- @Override
- public UnknownEndpoint getSourceEndpoint() {
- @Nullable UnknownEndpoint endpoint = fSourceEndpoint;
- if (endpoint == null) {
- endpoint = new UnknownEndpoint(this, true);
- }
- fSourceEndpoint = endpoint;
- return fSourceEndpoint;
- }
-
- @Override
- public UnknownEndpoint getDestinationEndpoint() {
- @Nullable UnknownEndpoint endpoint = fDestinationEndpoint;
- if (endpoint == null) {
- endpoint = new UnknownEndpoint(this, false);
- }
- fDestinationEndpoint = endpoint;
- return fDestinationEndpoint;
- }
-
- @Override
- public Map<String, String> getFields() {
- ImmutableMap<String, String> map = fFields;
- if (map == null) {
- @SuppressWarnings("null")
- @NonNull byte[] array = fPayload.array();
-
- Builder<String, String> builder = ImmutableMap.<String, String> builder()
- .put("Binary", ConversionHelper.bytesToHex(array, true)); //$NON-NLS-1$
- try {
- String s = new String(array, "UTF-8"); //$NON-NLS-1$
- builder.put("Character", s); //$NON-NLS-1$
- } catch (UnsupportedEncodingException e) {
- // Do nothing. The string won't be added to the map anyway.
- }
- @SuppressWarnings("null")
- @NonNull ImmutableMap<String, String> newMap = builder.build();
- fFields = newMap;
- return newMap;
- }
- return map;
- }
-
- @Override
- public String getLocalSummaryString() {
- return "Len: " + fPayload.array().length + " bytes"; //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- @Override
- protected String getSignificationString() {
- return "Data: " + fPayload.array().length + " bytes"; //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- @Override
- public Packet getMostEcapsulatedPacket() {
- Packet packet = this.getParentPacket();
- if (packet == null) {
- return this;
- }
- return packet;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- final Packet child = fChildPacket;
- if (child != null) {
- result = prime * result + ((fChildPacket == null) ? 0 : child.hashCode());
- } else {
- result = prime * result;
- }
- result = prime * result + fPayload.hashCode();
- return result;
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- UnknownPacket other = (UnknownPacket) obj;
- final Packet child = fChildPacket;
- if (child != null) {
- if (!child.equals(other.fChildPacket)) {
- return false;
- }
- } else {
- if (other.fChildPacket != null) {
- return false;
- }
- }
-
- if (!fPayload.equals(other.fPayload)) {
- return false;
- }
- return true;
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.protocol.unknown;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.stream;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpointPair;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
-
-import com.google.common.math.DoubleMath;
-
-// TODO decide if default modifier a good idea. This allows only the
-// stream builder to call that method (and any class that is added to this
-// package). This effectively makes the stream read-only.
-
-/**
- * Class that represents a packet stream, which is a collection of packets that
- * share the same endpoints. The endpoints of a packet are protocol-dependent.
- * For example, a TCP stream is a collection of packets that share the same MAC
- * address, IP address, and Port couple.
- *
- * @author Vincent Perot
- */
-public class PacketStream {
-
- private static final double SECOND_TO_NANOSECOND = 1000000000.0;
- private static final double DELTA = 0.000000001;
- private final PcapProtocol fProtocol;
- private final int fId;
- private final ProtocolEndpointPair fEndpointPair;
-
- private long fNbPacketsAtoB;
- private long fNbPacketsBtoA;
- private long fNbBytesAtoB;
- private long fNbBytesBtoA;
- private long fStartTime;
- private long fEndTime;
-
- /**
- * Constructor of a packet stream.
- *
- * @param protocol
- * The protocol of the packets of the stream. This is needed
- * because the definition of a stream is protocol-dependent.
- * @param id
- * The id of this stream.
- * @param endpointPair
- * The common endpoints of the packets in this stream.
- */
- PacketStream(PcapProtocol protocol, int id, ProtocolEndpointPair endpointPair) {
- fProtocol = protocol;
- fId = id;
- fEndpointPair = endpointPair;
- fNbPacketsAtoB = 0;
- fNbPacketsBtoA = 0;
- fNbBytesAtoB = 0;
- fNbBytesBtoA = 0;
- fStartTime = Long.MAX_VALUE;
- fEndTime = Long.MIN_VALUE;
- }
-
- /**
- * Add a packet to the stream.
- *
- * @param packet
- * The packet that must be added.
- */
- synchronized void add(PcapPacket packet) {
-
- Packet newPacket = packet.getPacket(fProtocol);
- if (newPacket == null) {
- return;
- }
-
- // Update packet and byte number
- if (fEndpointPair.getFirstEndpoint().equals(newPacket.getSourceEndpoint()) &&
- fEndpointPair.getSecondEndpoint().equals(newPacket.getDestinationEndpoint())) {
- fNbPacketsAtoB++;
- fNbBytesAtoB += packet.getOriginalLength();
- } else if (fEndpointPair.getFirstEndpoint().equals(newPacket.getDestinationEndpoint()) &&
- fEndpointPair.getSecondEndpoint().equals(newPacket.getSourceEndpoint())) {
- fNbPacketsBtoA++;
- fNbBytesBtoA += packet.getOriginalLength();
- } else {
- throw new IllegalStateException();
- }
-
- // Update start and stop time
- // Stream timestamp is ALWAYS in nanoseconds.
- long timestamp;
- switch (packet.getTimestampScale()) {
- case MICROSECOND:
- timestamp = packet.getTimestamp() * 1000;
- break;
- case NANOSECOND:
- timestamp = packet.getTimestamp();
- break;
- default:
- throw new IllegalArgumentException("The timestamp precision is not valid!"); //$NON-NLS-1$
- }
- fStartTime = Math.min(fStartTime, timestamp);
- fEndTime = Math.max(fEndTime, timestamp);
- }
-
- /**
- * Get the Protocol of this stream.
- *
- * @return The protocol of this stream.
- */
- public PcapProtocol getProtocol() {
- return fProtocol;
- }
-
- /**
- * Method that returns the non-unique ID of this stream.
- *
- * @return the non-unique ID of this stream.
- */
- public int getID() {
- return fId;
- }
-
- /**
- * Method that returns the unique ID of this stream.
- *
- * @return the unique ID of this stream.
- */
- public String getUniqueID() {
- return fProtocol.getShortName() + '.' + fId;
- }
-
- /**
- * Method that returns the endpoint pair of the stream.
- *
- * @return The endpoint pair of the stream.
- */
- public ProtocolEndpointPair getEndpointPair() {
- return fEndpointPair;
- }
-
- // TODO return also the endpoint set.
- @Override
- public synchronized String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("Stream " + getUniqueID() + ", Number of Packets: " + getNbPackets() + "\n"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-
- @SuppressWarnings("null")
- @NonNull String string = sb.toString();
- return string;
-
- }
-
- /**
- * Get the number of packets going from the first endpoint to the second.
- *
- * @return The number of packets from A to B.
- */
- public synchronized long getNbPacketsAtoB() {
- return fNbPacketsAtoB;
- }
-
- /**
- * Get the number of packets going from the second endpoint to the first.
- *
- * @return The number of packets from B to A.
- */
- public synchronized long getNbPacketsBtoA() {
- return fNbPacketsBtoA;
- }
-
- /**
- * Get the total number of packets in this stream.
- *
- * @return The total number of packets.
- */
- public synchronized long getNbPackets() {
- return fNbPacketsAtoB + fNbPacketsBtoA;
- }
-
- /**
- * Get the number of bytes going from the first endpoint to the second.
- *
- * @return The number of bytes from A to B.
- */
- public synchronized long getNbBytesAtoB() {
- return fNbBytesAtoB;
- }
-
- /**
- * Get the number of bytes going from the second endpoint to the first.
- *
- * @return The number of bytes from B to A.
- */
- public synchronized long getNbBytesBtoA() {
- return fNbBytesBtoA;
- }
-
- /**
- * Get the total number of bytes in this stream.
- *
- * @return The total number of bytes.
- */
- public synchronized long getNbBytes() {
- return fNbBytesAtoB + fNbBytesBtoA;
- }
-
- /**
- * Get the start time of this stream, in nanoseconds relative to epoch.
- *
- * @return The start time.
- */
- public synchronized long getStartTime() {
- return fStartTime;
- }
-
- /**
- * Get the stop time of this stream, in nanoseconds relative to epoch.
- *
- * @return The stop time.
- */
- public synchronized long getStopTime() {
- return fEndTime;
- }
-
- /**
- * Get the duration of this stream, in seconds
- *
- * @return The duration of this stream.
- */
- public synchronized double getDuration() {
- return (fEndTime - fStartTime) / SECOND_TO_NANOSECOND;
- }
-
- /**
- * Get the the average byte per second from A to B.
- *
- * @return the average byte per second from A to B.
- */
- public synchronized double getBPSAtoB() {
- if (DoubleMath.fuzzyEquals(getDuration(), 0, DELTA)) {
- return 0;
- }
- return fNbBytesAtoB / getDuration();
- }
-
- /**
- * Get the the average byte per second from B to A.
- *
- * @return the average byte per second from B to A.
- */
- public synchronized double getBPSBtoA() {
- if (DoubleMath.fuzzyEquals(getDuration(), 0, DELTA)) {
- return 0;
- }
- return fNbBytesBtoA / getDuration();
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.stream;
-
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
-import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpointPair;
-import org.eclipse.linuxtools.internal.pcap.core.filter.IPacketFilter;
-import org.eclipse.linuxtools.internal.pcap.core.filter.PacketFilterByProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
-import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
-import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
-
-/**
- * Class that parse an entire pcap file to build the different streams.
- *
- * @author Vincent Perot
- */
-public class PacketStreamBuilder {
-
- private final IPacketFilter fPacketFilter;
- private final PcapProtocol fProtocol;
-
- private final Map<Integer, PacketStream> fStreams;
- private final Map<ProtocolEndpointPair, Integer> fIDs;
- private int fCurrentId;
-
- /**
- * Main constructor.
- *
- * @param protocol
- * The protocol of the builder.
- */
- public PacketStreamBuilder(PcapProtocol protocol) {
- fCurrentId = 0;
- fProtocol = protocol;
- fPacketFilter = new PacketFilterByProtocol(protocol);
- fStreams = new HashMap<>();
- fIDs = new HashMap<>();
- }
-
- /**
- * Method that returns a particular stream based on its ID.
- *
- * @param id
- * The ID of the stream.
- * @return The stream that has the specified ID.
- */
- public synchronized @Nullable PacketStream getStream(int id) {
- return fStreams.get(id);
- }
-
- /**
- * Method that returns a particular stream based on its endpoints. It
- * returns null if no corresponding stream is found.
- *
- * @param endpointA
- * The first endpoint of the stream.
- * @param endpointB
- * The second endpoint of the stream.
- *
- * @return The stream that has the specified endpoints. Return Null if no
- * stream is found between the two endpoints.
- */
- public synchronized @Nullable PacketStream getStream(ProtocolEndpoint endpointA, ProtocolEndpoint endpointB) {
- ProtocolEndpointPair set = new ProtocolEndpointPair(endpointA, endpointB);
- int id = fIDs.get(set);
- return fStreams.get(id);
- }
-
- /**
- * Method that returns all the streams at the specified protocol level.
- *
- * @return The streams as a list.
- */
- public synchronized Iterable<PacketStream> getStreams() {
- Iterable<PacketStream> iterable = new LinkedList<>(fStreams.values());
- return iterable;
- }
-
- /**
- * Method that is called when the filter accepts a packet. This methods add
- * the packet to a stream based on its characteristics.
- *
- * @param packet
- * The packet to be added.
- */
- public synchronized void addPacketToStream(PcapPacket packet) {
- if (fPacketFilter.accepts(packet)) {
- @Nullable Packet newPacket = packet.getPacket(fProtocol);
- if (newPacket == null) {
- return;
- }
- ProtocolEndpointPair endpointSet = new ProtocolEndpointPair(newPacket);
- if (!fIDs.containsKey(endpointSet)) {
- fIDs.put(endpointSet, fCurrentId);
- fStreams.put(fCurrentId, new PacketStream(fProtocol, fCurrentId, endpointSet));
- fStreams.get(fCurrentId).add(packet);
- fCurrentId++;
- } else {
- Integer id = fIDs.get(endpointSet);
- fStreams.get(id).add(packet);
- }
- }
- return;
- }
-
- /**
- * Getter method for the protocol of the stream builder.
- *
- * @return The protocol.
- */
- public PcapProtocol getProtocol() {
- return fProtocol;
- }
-
- /**
- * Method that clears the builder.
- */
- public void clear() {
- fStreams.clear();
- fIDs.clear();
- fCurrentId = 0;
- }
-
- /**
- * Method that returns the number of streams built.
- *
- * @return The number of streams built.
- */
- public synchronized int getNbStreams() {
- return fStreams.size();
- }
-
- /**
- * Method that parse an entire file and build the streams contained in the
- * file.
- *
- * @param filePath
- * The file path.
- * @throws IOException
- * When an IO error occurs.
- * @throws BadPcapFileException
- * When the PcapFile is not valid.
- */
- public synchronized void parsePcapFile(Path filePath) throws IOException, BadPcapFileException {
- try (PcapFile pcapFile = new PcapFile(filePath);) {
- while (pcapFile.hasNextPacket()) { // not eof
- PcapPacket packet;
- try {
- packet = pcapFile.parseNextPacket();
- if (packet == null) {
- return;
- }
- addPacketToStream(packet);
- } catch (BadPacketException e) {
- // Ignore packet. Do nothing.
- }
- }
- }
-
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.stream;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.trace;
-
-/**
- * Exception that is thrown when the Pcap file is not valid.
- *
- * @author Vincent Perot
- */
-public class BadPcapFileException extends Exception {
-
- private static final long serialVersionUID = 8228512814116052260L;
-
- /**
- * Default constructor with no message.
- */
- public BadPcapFileException() {
- super();
- }
-
- /**
- * Constructor with an attached message.
- *
- * @param message
- * The message attached to this exception
- */
- public BadPcapFileException(String message) {
- super(message);
- }
-
- /**
- * Re-throw an exception into this type.
- *
- * @param e
- * The previous Exception we caught
- */
- public BadPcapFileException(Exception e) {
- super(e);
- }
-
- /**
- * Constructor with an attached message and re-throw an exception into this
- * type.
- *
- * @param message
- * The message attached to this exception
- * @param exception
- * The previous Exception caught
- */
- public BadPcapFileException(String message, Throwable exception) {
- super(message, exception);
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.trace;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.channels.SeekableByteChannel;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.TreeMap;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
-import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
-import org.eclipse.linuxtools.internal.pcap.core.util.PcapTimestampScale;
-
-/**
- * Class that allows the interaction with a pcap file.
- *
- * @author Vincent Perot
- */
-public class PcapFile implements Closeable {
-
- // TODO add pcapng support.
- // TODO Make parsing faster by buffering the data.
-
- private final Path fPcapFilePath;
- private final ByteOrder fByteOrder;
- private final SeekableByteChannel fFileChannel;
- private final PcapTimestampScale fTimestampPrecision;
-
- private final int fMajorVersion;
- private final int fMinorVersion;
- private final long fTimeAccuracy;
- private final long fTimeZoneCorrection;
- private final long fSnapshotLength;
- private final long fDataLinkType;
-
- private final TreeMap<Long, Long> fFileIndex;
-
- private long fCurrentRank;
- private long fTotalNumberPackets;
-
- /**
- * Constructor of the PcapFile Class.
- *
- * @param filePath
- * The path to the pcap file.
- *
- * @throws BadPcapFileException
- * Thrown if the Pcap File is not valid.
- * @throws IOException
- * Thrown if there is an IO error while reading the file.
- */
- public PcapFile(Path filePath) throws BadPcapFileException, IOException {
-
- fFileIndex = new TreeMap<>();
- fCurrentRank = 0;
- fTotalNumberPackets = -1;
- fPcapFilePath = filePath;
-
- // Check file validity
- if (Files.notExists(fPcapFilePath) || !Files.isRegularFile(fPcapFilePath) ||
- Files.size(fPcapFilePath) < PcapFileValues.GLOBAL_HEADER_SIZE) {
- throw new BadPcapFileException("Bad Pcap File."); //$NON-NLS-1$
- }
-
- if (!Files.isReadable(fPcapFilePath)) {
- throw new BadPcapFileException("File is not readable."); //$NON-NLS-1$
- }
-
- // File is not empty. Try to open.
- @SuppressWarnings("null")
- @NonNull SeekableByteChannel channel = Files.newByteChannel(fPcapFilePath);
- fFileChannel = channel;
-
- // Parse the global header.
- // Read the magic number (4 bytes) from the input stream
- // and determine the mode (big endian or little endian)
- ByteBuffer globalHeader = ByteBuffer.allocate(PcapFileValues.GLOBAL_HEADER_SIZE);
- globalHeader.clear();
- fFileChannel.read(globalHeader);
- globalHeader.flip();
- int magicNumber = globalHeader.getInt();
-
- @SuppressWarnings("null")
- @NonNull ByteOrder be = ByteOrder.BIG_ENDIAN;
- @SuppressWarnings("null")
- @NonNull ByteOrder le = ByteOrder.LITTLE_ENDIAN;
-
- switch (magicNumber) {
- case PcapFileValues.MAGIC_BIG_ENDIAN_MICRO: // file is big endian
- fByteOrder = be;
- fTimestampPrecision = PcapTimestampScale.MICROSECOND;
- break;
- case PcapFileValues.MAGIC_LITTLE_ENDIAN_MICRO: // file is little endian
- fByteOrder = le;
- fTimestampPrecision = PcapTimestampScale.MICROSECOND;
- break;
- case PcapFileValues.MAGIC_BIG_ENDIAN_NANO: // file is big endian
- fByteOrder = be;
- fTimestampPrecision = PcapTimestampScale.NANOSECOND;
- break;
- case PcapFileValues.MAGIC_LITTLE_ENDIAN_NANO: // file is little endian
- fByteOrder = le;
- fTimestampPrecision = PcapTimestampScale.NANOSECOND;
- break;
- default:
- this.close();
- throw new BadPcapFileException(String.format("%08x", magicNumber) + " is not a known magic number."); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- // Put the rest of the buffer in file endian.
- globalHeader.order(fByteOrder);
-
- // Initialization of global header fields.
- fMajorVersion = ConversionHelper.unsignedShortToInt(globalHeader.getShort());
- fMinorVersion = ConversionHelper.unsignedShortToInt(globalHeader.getShort());
- fTimeAccuracy = ConversionHelper.unsignedIntToLong(globalHeader.getInt());
- fTimeZoneCorrection = ConversionHelper.unsignedIntToLong(globalHeader.getInt());
- fSnapshotLength = ConversionHelper.unsignedIntToLong(globalHeader.getInt());
- fDataLinkType = ConversionHelper.unsignedIntToLong(globalHeader.getInt());
-
- fFileIndex.put(fCurrentRank, fFileChannel.position());
-
- }
-
- /**
- * Method that allows the parsing of a packet at the current position.
- *
- * @return The parsed Pcap Packet.
- * @throws IOException
- * Thrown when there is an error while reading the file.
- * @throws BadPcapFileException
- * Thrown when a packet header is invalid.
- * @throws BadPacketException
- * Thrown when the packet is erroneous.
- */
- public synchronized @Nullable PcapPacket parseNextPacket() throws IOException, BadPcapFileException, BadPacketException {
-
- // Parse the packet header
- if (fFileChannel.size() - fFileChannel.position() == 0) {
- return null;
- }
- if (fFileChannel.size() - fFileChannel.position() < PcapFileValues.PACKET_HEADER_SIZE) {
- throw new BadPcapFileException("A pcap header is invalid."); //$NON-NLS-1$
- }
-
- ByteBuffer pcapPacketHeader = ByteBuffer.allocate(PcapFileValues.PACKET_HEADER_SIZE);
- pcapPacketHeader.clear();
- pcapPacketHeader.order(fByteOrder);
-
- fFileChannel.read(pcapPacketHeader);
-
- pcapPacketHeader.flip();
- pcapPacketHeader.position(PcapFileValues.INCLUDED_LENGTH_POSITION);
- long includedPacketLength = ConversionHelper.unsignedIntToLong(pcapPacketHeader.getInt());
-
- if (fFileChannel.size() - fFileChannel.position() < includedPacketLength) {
- throw new BadPcapFileException("A packet header is invalid."); //$NON-NLS-1$
- }
-
- if (includedPacketLength > Integer.MAX_VALUE) {
- throw new BadPacketException("Packets that are bigger than 2^31-1 bytes are not supported."); //$NON-NLS-1$
- }
-
- ByteBuffer pcapPacketData = ByteBuffer.allocate((int) includedPacketLength);
- pcapPacketData.clear();
- pcapPacketHeader.order(ByteOrder.BIG_ENDIAN); // Not really needed.
- fFileChannel.read(pcapPacketData);
-
- pcapPacketData.flip();
-
- fFileIndex.put(++fCurrentRank, fFileChannel.position());
-
- return new PcapPacket(this, null, pcapPacketHeader, pcapPacketData, fCurrentRank - 1);
-
- }
-
- /**
- * Method that allows to skip a packet at the current position.
- *
- * @throws IOException
- * Thrown when there is an error while reading the file.
- * @throws BadPcapFileException
- * Thrown when a packet header is invalid.
- */
- public synchronized void skipNextPacket() throws IOException, BadPcapFileException {
-
- // Parse the packet header
- if (fFileChannel.size() - fFileChannel.position() == 0) {
- return;
- }
- if (fFileChannel.size() - fFileChannel.position() < PcapFileValues.PACKET_HEADER_SIZE) {
- throw new BadPcapFileException("A pcap header is invalid."); //$NON-NLS-1$
- }
-
- ByteBuffer pcapPacketHeader = ByteBuffer.allocate(PcapFileValues.PACKET_HEADER_SIZE);
- pcapPacketHeader.clear();
- pcapPacketHeader.order(fByteOrder);
-
- fFileChannel.read(pcapPacketHeader);
-
- pcapPacketHeader.flip();
- pcapPacketHeader.position(PcapFileValues.INCLUDED_LENGTH_POSITION);
- long includedPacketLength = ConversionHelper.unsignedIntToLong(pcapPacketHeader.getInt());
-
- if (fFileChannel.size() - fFileChannel.position() < includedPacketLength) {
- throw new BadPcapFileException("A packet header is invalid."); //$NON-NLS-1$
- }
-
- fFileChannel.position(fFileChannel.position() + includedPacketLength);
-
- fFileIndex.put(++fCurrentRank, fFileChannel.position());
-
- }
-
- /**
- * Method that moves the position to the specified rank.
- *
- * @param rank
- * The rank of the packet.
- *
- * @throws IOException
- * Thrown when there is an error while reading the file.
- * @throws BadPcapFileException
- * Thrown when a packet header is invalid.
- */
- public synchronized void seekPacket(long rank) throws IOException, BadPcapFileException {
-
- // Verify argument
- if (rank < 0) {
- throw new IllegalArgumentException();
- }
-
- Long positionInBytes = fFileIndex.get(rank);
-
- if (positionInBytes != null) {
- // Index is known. Move to position.
- fFileChannel.position(positionInBytes.longValue());
- fCurrentRank = rank;
- } else {
- // Index is unknown. Find the corresponding position.
- // Find closest index
- fCurrentRank = fFileIndex.floorKey(rank);
- // skip until wanted packet is found
- do {
- skipNextPacket();
- } while (fCurrentRank != rank && hasNextPacket());
- }
- }
-
- /**
- * Method that indicates if there are packets remaining to read. It is an
- * end of file indicator.
- *
- * @return Whether the pcap still has packets or not.
- * @throws IOException
- * If some IO error occurs.
- */
- public synchronized boolean hasNextPacket() throws IOException {
- return ((fFileChannel.size() - fFileChannel.position()) > 0);
- }
-
- /**
- * Getter method for the Byte Order of the file.
- *
- * @return The byte Order of the file.
- */
- public ByteOrder getByteOrder() {
- return fByteOrder;
- }
-
- /**
- * Getter method for the Major Version of the file.
- *
- * @return The Major Version of the file.
- */
- public int getMajorVersion() {
- return fMajorVersion;
- }
-
- /**
- * Getter method for the Minor Version of the file.
- *
- * @return The Minor Version of the file.
- */
- public int getMinorVersion() {
- return fMinorVersion;
- }
-
- /**
- * Getter method for the time accuracy of the file.
- *
- * @return The time accuracy of the file.
- */
- public long getTimeAccuracy() {
- return fTimeAccuracy;
- }
-
- /**
- * Getter method for the time zone correction of the file.
- *
- * @return The time zone correction of the file.
- */
- public long getTimeZoneCorrection() {
- return fTimeZoneCorrection;
- }
-
- /**
- * Getter method for the snapshot length of the file.
- *
- * @return The snapshot length of the file.
- */
- public long getSnapLength() {
- return fSnapshotLength;
- }
-
- /**
- * Getter method for the datalink type of the file. This parameter is used
- * to determine higher-level protocols (Ethernet, WLAN, SLL).
- *
- * @return The datalink type of the file.
- */
- public long getDataLinkType() {
- return fDataLinkType;
- }
-
- /**
- * Getter method for the path of the file.
- *
- * @return The path of the file.
- */
- public Path getPath() {
- return fPcapFilePath;
- }
-
- /**
- * Method that returns the total number of packets in the file.
- *
- * @return The total number of packets.
- * @throws IOException
- * Thrown when some IO error occurs.
- * @throws BadPcapFileException
- * Thrown when a packet header is invalid.
- */
- public synchronized long getTotalNbPackets() throws IOException, BadPcapFileException {
- if (fTotalNumberPackets == -1) {
- long rank = fCurrentRank;
- fCurrentRank = fFileIndex.floorKey(rank);
-
- // skip until end of file.
- while (hasNextPacket()) {
- skipNextPacket();
- }
- fTotalNumberPackets = fCurrentRank;
- fCurrentRank = rank;
- seekPacket(rank);
- }
- return fTotalNumberPackets;
- }
-
- /**
- * Getter method that returns the current rank in the file (the packet
- * number).
- *
- * @return The current rank.
- */
- public synchronized long getCurrentRank() {
- return fCurrentRank;
- }
-
- /**
- * Getter method that returns the timestamp precision of the file.
- *
- * @return The the timestamp precision of the file.
- */
- public PcapTimestampScale getTimestampPrecision() {
- return fTimestampPrecision;
- }
-
- @Override
- public void close() throws IOException {
- fFileChannel.close();
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.trace;
-
-/**
- * Interface that lists constants related to a Pcap File.
- *
- * See http://wiki.wireshark.org/Development/LibpcapFileFormat.
- *
- * @author Vincent Perot
- */
-public interface PcapFileValues {
-
- /** Number used to determine the endianness and precision of the file */
- int MAGIC_BIG_ENDIAN_MICRO = 0xa1b2c3d4;
-
- /** Number used to determine the endianness and precision of the file */
- int MAGIC_LITTLE_ENDIAN_MICRO = 0xd4c3b2a1;
-
- /** Number used to determine the endianness and precision of the file */
- int MAGIC_BIG_ENDIAN_NANO = 0xa1b23c4d;
-
- /** Number used to determine the endianness and precision of the file */
- int MAGIC_LITTLE_ENDIAN_NANO = 0x4d3cb2a1;
-
- /** Size in bytes of a Pcap file global header */
- int GLOBAL_HEADER_SIZE = 24;
-
- /** Size in bytes of a Pcap packet header */
- int PACKET_HEADER_SIZE = 16;
-
- /** Position in bytes in the packet header of the packet's length */
- int INCLUDED_LENGTH_POSITION = 8;
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.trace;
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.util;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIValues;
-
-/**
- * Class for helping with the conversion of data.
- *
- * @author Vincent Perot
- */
-public final class ConversionHelper {
-
- @SuppressWarnings("null")
- private static final @NonNull char[] HEX_ARRAY = "0123456789abcdef".toCharArray(); //$NON-NLS-1$
- private static final String EMPTY_STRING = ""; //$NON-NLS-1$
- private static final String DEFAULT_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS"; //$NON-NLS-1$
- private static final DateFormat DATE_FORMATTER = new SimpleDateFormat(DEFAULT_TIME_PATTERN);
-
- private ConversionHelper() {
- }
-
- /**
- * Generate an integer from an unsigned byte.
- *
- * @param n
- * the unsigned byte.
- * @return the integer representing the unsigned value.
- */
- public static int unsignedByteToInt(byte n) {
- return n & 0x000000FF;
- }
-
- /**
- * Generate an integer from an unsigned short.
- *
- * @param n
- * the unsigned short.
- * @return the integer representing the unsigned value.
- */
- public static int unsignedShortToInt(short n) {
- return n & 0x0000FFFF;
- }
-
- /**
- * Generate a long from an unsigned integer.
- *
- * @param n
- * the unsigned integer.
- * @return the long representing the unsigned value.
- */
- public static long unsignedIntToLong(int n) {
- return n & 0x00000000FFFFFFFFL;
- }
-
- /**
- * Generate an hex number from a byte array.
- *
- * @param bytes
- * The array of bytes.
- * @param spaced
- * Whether there must be a space between each byte or not.
- * @return the hex as a string.
- */
- public static String bytesToHex(byte[] bytes, boolean spaced) {
- // No need to check for character encoding since bytes represents a
- // number.
-
- if (bytes.length == 0) {
- return EMPTY_STRING;
- }
-
- char[] hexChars = spaced ? new char[bytes.length * 3 - 1] : new char[bytes.length * 2];
- int delta = spaced ? 3 : 2;
- char separator = ' ';
-
- for (int j = 0; j < bytes.length; j++) {
-
- int v = bytes[j] & 0xFF;
- hexChars[j * delta] = HEX_ARRAY[v >>> 4];
- hexChars[j * delta + 1] = HEX_ARRAY[v & 0x0F];
-
- if (spaced && (j != bytes.length - 1)) {
- hexChars[j * delta + 2] = separator;
- }
- }
- return new String(hexChars);
- }
-
- // TODO Add little endian support
- /**
- * Generate a string representing the MAC address.
- *
- * @param mac
- * The MAC address as a byte array.
- * @return The string representing the MAC address.
- */
- public static String toMacAddress(byte[] mac) {
-
- if (mac.length != EthernetIIValues.MAC_ADDRESS_SIZE) {
- throw new IllegalArgumentException();
- }
- char separator = ':';
- return String.format("%02x", mac[0]) + separator + //$NON-NLS-1$
- String.format("%02x", mac[1]) + separator + //$NON-NLS-1$
- String.format("%02x", mac[2]) + separator + //$NON-NLS-1$
- String.format("%02x", mac[3]) + separator + //$NON-NLS-1$
- String.format("%02x", mac[4]) + separator + //$NON-NLS-1$
- String.format("%02x", mac[5]); //$NON-NLS-1$
-
- }
-
- // TODO support non GMT time.
-
- /**
- * Convert a timestamp into a date.
- *
- * @param ts
- * The timestamp. It represents the time since Epoch in
- * microseconds.
- * @param scale
- * The scale of the timestamp.
- * @return The date as a string.
- */
- public static String toGMTTime(long ts, PcapTimestampScale scale) {
- long timestamp;
- switch (scale) {
- case MICROSECOND:
- timestamp = ts * 1000;
- break;
- case NANOSECOND:
- timestamp = ts;
- break;
- default:
- throw new IllegalArgumentException("The timestamp precision is not valid!"); //$NON-NLS-1$
- }
- return format(timestamp);
- }
-
- /**
- * Format the timestamp to a string.
- *
- * @param value
- * the timestamp value to format (in ns)
- * @return the formatted timestamp
- */
- private static String format(long value) {
- // Split the timestamp value into its sub-components
- long date = value / 1000000; // milliseconds since epoch
- long cs = Math.abs((value % 1000000) / 1000); // microseconds
- long ns = Math.abs(value % 1000); // nanoseconds
-
- Date dateObject = new Date(date);
-
- StringBuilder sb = new StringBuilder(DATE_FORMATTER.format(dateObject));
- sb.append('.')
- .append(String.format("%03d", cs)) //$NON-NLS-1$
- .append('.')
- .append(String.format("%03d", ns)); //$NON-NLS-1$
-
- String string = sb.toString();
- if (string == null) {
- return EMPTY_STRING;
- }
- return string;
-
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.util;
-
-// TODO finish this
-// TODO maybe match it to protocol instead of string.
-
-/**
- * Helper that is used to help mapping a certain ethertype to a particular
- * protocol (i.e. IPv4). This is used when finding the child packet of an
- * Ethernet packet, for instance.
- *
- * See http://en.wikipedia.org/wiki/EtherType
- *
- * @author Vincent Perot
- */
-public final class EthertypeHelper {
-
- /** EtherType IPv4 */
- public static final int ETHERTYPE_IPV4 = 0x0800;
-
- /** EtherType ARP */
- public static final int ETHERTYPE_ARP = 0x0806;
-
- /** EtherType Wake-On-LAN */
- public static final int ETHERTYPE_WAKE_ON_LAN = 0x0842;
-
- /** EtherType TRILL */
- public static final int ETHERTYPE_TRILL = 0x22F3;
-
- /** EtherType DECnet Phase IV */
- public static final int ETHERTYPE_DECNET_PHASE_IV = 0x6003;
-
- private EthertypeHelper() {}
-
- /**
- * Method that matches the ethertype as a number, to a protocol as a string.
- *
- * @param ethertype
- * The Ethertype as an int.
- * @return The protocol as a string.
- */
- public static String toString(int ethertype) {
- switch (ethertype) {
- case ETHERTYPE_IPV4:
- return "Internet Protocol Version 4"; //$NON-NLS-1$
- case ETHERTYPE_ARP:
- return "Address Resolution Protocol"; //$NON-NLS-1$
- case ETHERTYPE_WAKE_ON_LAN:
- return "Wake-on-LAN"; //$NON-NLS-1$
- case ETHERTYPE_TRILL:
- return "IETF TRILL Protocol"; //$NON-NLS-1$
- case ETHERTYPE_DECNET_PHASE_IV:
- return "DECnet Phase IV"; //$NON-NLS-1$
- default:
- return "Unknown"; //$NON-NLS-1$
- }
- }
-
- /**
- * Convert an ethertype (int) into its string representation. This allows
- * the mapping of ethertype to the real protocol name.
- *
- * @param type
- * The Ethertype to convert.
- * @return The Ethertype as a string.
- */
- public static String toEtherType(int type) {
- return toString(type) + " (0x" + String.format("%04x", type) + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.util;
-
-import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
-
-// TODO finish this
-// TODO maybe match it to protocol instead of string.
-
-/**
- * Helper that is used to help mapping a certain protocol number to a particular
- * protocol (i.e. TCP). This is used when finding the child packet of an IPv4
- * packet, for instance.
- *
- * See http://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
- *
- * @author Vincent Perot
- */
-public final class IPProtocolNumberHelper {
-
- /** Protocol Number ICMP */
- public static final int PROTOCOL_NUMBER_ICMP = 1;
-
- /** Protocol Number IGMP */
- public static final int PROTOCOL_NUMBER_IGMP = 2;
-
- /** Protocol Number TCP */
- public static final int PROTOCOL_NUMBER_TCP = 6;
-
- /** Protocol Number UDP */
- public static final int PROTOCOL_NUMBER_UDP = 17;
-
- /** Protocol Number Encapsulated IPv6 */
- public static final int PROTOCOL_NUMBER_ENCAP_IPV6 = 41;
-
- /** Protocol Number OSPF */
- public static final int PROTOCOL_NUMBER_OSPF = 89;
-
- /** Protocol Number SCTP */
- public static final int PROTOCOL_NUMBER_SCTP = 132;
-
- private IPProtocolNumberHelper() {}
-
- /**
- * Method that match the protocol number to a protocol as a string.
- *
- * @param protocolNumber
- * The protocol number as an int.
- * @return The protocol as a string.
- */
- public static String toString(int protocolNumber) {
- switch (protocolNumber) {
- case PROTOCOL_NUMBER_ICMP:
- return "ICMP"; //$NON-NLS-1$
- case PROTOCOL_NUMBER_IGMP:
- return "IGMP"; //$NON-NLS-1$
- case PROTOCOL_NUMBER_TCP:
- return PcapProtocol.TCP.getName();
- case PROTOCOL_NUMBER_UDP:
- return PcapProtocol.UDP.getName();
- case PROTOCOL_NUMBER_ENCAP_IPV6:
- return "IPv6"; //$NON-NLS-1$
- case PROTOCOL_NUMBER_OSPF:
- return "OSPF"; //$NON-NLS-1$
- case PROTOCOL_NUMBER_SCTP:
- return "SCTP"; //$NON-NLS-1$
- default:
- return "Unknown"; //$NON-NLS-1$
- }
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.util;
-
-// TODO finish this
-// TODO map to protocol instead of string? that would make more sense imo.
-
-/**
- * Helper that is used to help mapping a certain linktype to a particular
- * protocol (i.e. ethernet).
- *
- * See http://www.tcpdump.org/linktypes.html
- *
- * @author Vincent Perot
- */
-public final class LinkTypeHelper {
-
- /** Linktype Null */
- public static final int LINKTYPE_NULL = 0;
-
- /** Linktype Ethernet II */
- public static final int LINKTYPE_ETHERNET = 1;
-
- /** Linktype AX25 */
- public static final int LINKTYPE_AX25 = 3;
-
- /** Linktype IEEE802.5 */
- public static final int LINKTYPE_IEEE802_5 = 6;
-
- /** Linktype Raw */
- public static final int LINKTYPE_RAW = 101;
-
- /** Linktype IEEE802.11 */
- public static final int LINKTYPE_IEEE802_11 = 105;
-
- /** Linktype Linux SLL */
- public static final int LINKTYPE_LINUX_SLL = 113;
-
- private LinkTypeHelper() {}
-
- /**
- * Method that match the linktype as an int to a protocol as a string.
- *
- * @param linkType
- * The linkType as an int.
- * @return The protocol as a string.
- */
- public static String toString(int linkType) {
- switch (linkType) {
- case LINKTYPE_NULL:
- return "null"; //$NON-NLS-1$
- case LINKTYPE_ETHERNET:
- return "ethernet"; //$NON-NLS-1$
- case LINKTYPE_AX25:
- return "ax25"; //$NON-NLS-1$
- case LINKTYPE_IEEE802_5:
- return "ieee802.5"; //$NON-NLS-1$
- case LINKTYPE_RAW:
- return "raw"; //$NON-NLS-1$
- case LINKTYPE_IEEE802_11:
- return "ieee802.11"; //$NON-NLS-1$
- case LINKTYPE_LINUX_SLL:
- return "linux_sll"; //$NON-NLS-1$
- default:
- return "unknown"; //$NON-NLS-1$
- }
- }
-
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Vincent Perot - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.internal.pcap.core.util;
-
-/**
- * Enum for the different time precision for pcap files.
- *
- * @author Vincent Perot
- */
-public enum PcapTimestampScale {
-
- /** Microsecond Pcap */
- MICROSECOND,
- /** Nanosecond Pcap */
- NANOSECOND
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ericsson - Initial API and implementation
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.linuxtools.internal.pcap.core.util;
\ No newline at end of file
Require-Bundle: org.junit;bundle-version="4.0.0",
org.eclipse.core.runtime,
org.eclipse.core.resources,
- org.eclipse.linuxtools.pcap.core;bundle-version="1.0.0",
- org.eclipse.linuxtools.pcap.core.tests;bundle-version="1.0.0",
+ org.eclipse.tracecompass.pcap.core;bundle-version="1.0.0",
+ org.eclipse.tracecompass.pcap.core.tests;bundle-version="1.0.0",
org.eclipse.linuxtools.tmf.core;bundle-version="3.1.0",
org.eclipse.linuxtools.tmf.core.tests;bundle-version="3.1.0",
org.eclipse.linuxtools.tmf.pcap.core;bundle-version="1.0.0"
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.core.resources,
org.eclipse.linuxtools.tmf.core;bundle-version="3.1.0",
- org.eclipse.linuxtools.pcap.core;bundle-version="1.0.0"
+ org.eclipse.tracecompass.pcap.core;bundle-version="1.0.0"
Export-Package: org.eclipse.linuxtools.internal.tmf.pcap.core;x-internal:=true,
org.eclipse.linuxtools.internal.tmf.pcap.core.analysis;x-friends:="org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.ui",
org.eclipse.linuxtools.internal.tmf.pcap.core.event;x-friends:="org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.ui",
<import plugin="org.eclipse.linuxtools.tmf.core" version="3.1.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.linuxtools.tmf.ui" version="3.1.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.linuxtools.tmf.pcap.core" version="1.0.0" match="greaterOrEqual"/>
- <import plugin="org.eclipse.linuxtools.pcap.core" version="1.0.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.tracecompass.pcap.core" version="1.0.0" match="greaterOrEqual"/>
</requires>
<plugin
- id="org.eclipse.linuxtools.pcap.core"
+ id="org.eclipse.tracecompass.pcap.core"
download-size="0"
install-size="0"
version="0.0.0"/>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="perf"/>
+ <classpathentry kind="src" path="shared"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.tracecompass.pcap.core.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
--- /dev/null
+eclipse.preferences.version=1
+line.separator=\n
--- /dev/null
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=enabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=error
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.deprecation=error
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=error
+org.eclipse.jdt.core.compiler.problem.emptyStatement=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=error
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=error
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=error
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=error
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=error
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=enabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=error
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=error
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=error
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=disabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=disabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=error
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
+org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=250
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
--- /dev/null
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_tmf-style
+formatter_settings_version=12
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=false
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=false
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
--- /dev/null
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_JAVADOC_TAG=Warning
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+MISSING_EE_DESCRIPTIONS=Ignore
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
--- /dev/null
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-Vendor: %Bundle-Vendor
+Bundle-Version: 1.0.0.qualifier
+Bundle-Localization: plugin
+Bundle-SymbolicName: org.eclipse.tracecompass.pcap.core.tests;singleton:=true
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.junit;bundle-version="4.0.0",
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.tracecompass.pcap.core;bundle-version="1.0.0"
+Export-Package: org.eclipse.linuxtools.pcap.core.tests,
+ org.eclipse.linuxtools.pcap.core.tests.file;x-internal:=true,
+ org.eclipse.linuxtools.pcap.core.tests.packet;x-internal:=true,
+ org.eclipse.linuxtools.pcap.core.tests.perf,
+ org.eclipse.linuxtools.pcap.core.tests.perf.trace;x-internal:=true,
+ org.eclipse.linuxtools.pcap.core.tests.protocol;x-internal:=true,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.ethernet2;x-internal:=true,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.ipv4;x-internal:=true,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.pcap;x-internal:=true,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.tcp;x-internal:=true,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.udp;x-internal:=true,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.unknown;x-internal:=true,
+ org.eclipse.linuxtools.pcap.core.tests.shared;x-friends:="org.eclipse.linuxtools.tmf.pcap.core.tests",
+ org.eclipse.linuxtools.pcap.core.tests.stream;x-internal:=true
+Import-Package: com.google.common.collect,
+ org.eclipse.test.performance
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
--- /dev/null
+###############################################################################
+# Copyright (c) 2014 Ericsson
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Ericsson - Initial API and implementation
+###############################################################################
+
+source.. = src/,\
+ perf/,\
+ shared/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.properties
+src.includes = about.html
+additional.bundles = org.eclipse.jdt.annotation
+jars.extra.classpath = platform:/plugin/org.eclipse.jdt.annotation
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial implementation and API
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.perf;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Run all performance test suites.
+ *
+ * @author Vincent Perot
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ org.eclipse.linuxtools.pcap.core.tests.perf.trace.AllTests.class
+})
+public class AllPerfTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.perf.trace;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ PcapReadBenchmark.class,
+ PcapSeekBenchmark.class
+})
+public class AllTests {
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.perf.trace;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.eclipse.test.performance.Dimension;
+import org.eclipse.test.performance.Performance;
+import org.eclipse.test.performance.PerformanceMeter;
+import org.junit.Test;
+
+/**
+ * Benchmark of the Pcap parser for reading a trace. Note: We should get a
+ * bigger trace. One that has WAYYYY more events since this current trace is
+ * just parsed too fast.
+ *
+ * @author Vincent Perot
+ */
+public class PcapReadBenchmark {
+
+ private static final String TEST_SUITE_NAME = "Pcap Read Benchmark";
+ private static final String TEST_ID = "org.eclipse.linuxtools#" + TEST_SUITE_NAME;
+ private static final int LOOP_COUNT = 25;
+ private static final int RUN_BETWEEN_COMMIT_COUNT = 15;
+
+ /**
+ * Benchmark reading the pcap trace
+ */
+ @Test
+ public void testPcapTrace() {
+ readTrace(PcapTestTrace.BENCHMARK_TRACE, "trace-pcap", true);
+ }
+
+ private static void readTrace(PcapTestTrace testTrace, String testName, boolean inGlobalSummary) {
+ assumeTrue(testTrace.exists());
+
+ Performance perf = Performance.getDefault();
+ PerformanceMeter pm = perf.createPerformanceMeter(TEST_ID + '#' + testName);
+ perf.tagAsSummary(pm, TEST_SUITE_NAME + ':' + testName, Dimension.CPU_TIME);
+
+ if (inGlobalSummary) {
+ perf.tagAsGlobalSummary(pm, TEST_SUITE_NAME + ':' + testName, Dimension.CPU_TIME);
+ }
+
+ for (int loop = 0; loop < LOOP_COUNT; loop++) {
+ pm.start();
+ try (PcapFile trace = testTrace.getTrace();) {
+ for (int i = 0; i < RUN_BETWEEN_COMMIT_COUNT; i++) {
+ trace.seekPacket(0);
+ while (trace.hasNextPacket()) {
+ Packet packet = trace.parseNextPacket();
+ if (packet == null) {
+ fail("Test failed at iteration " + loop + '.' + i + ", at packet " + trace.getCurrentRank());
+ return;
+ }
+ /* Do something with the packet because we are awesome */
+ packet.getPayload();
+ }
+ }
+ } catch (IOException | BadPcapFileException | BadPacketException e) {
+ fail("Test failed at iteration " + loop + ':' + e.getMessage());
+ }
+ pm.stop();
+ }
+ pm.commit();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.perf.trace;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.eclipse.test.performance.Dimension;
+import org.eclipse.test.performance.Performance;
+import org.eclipse.test.performance.PerformanceMeter;
+import org.junit.Test;
+
+/**
+ * Tests for performance regressions of the pcap reader. It only tests the pcap
+ * reader, not tmf. <br>
+ * This test runs in 3 passes.
+ * <ul>
+ * <li>first it opens a trace</li>
+ * <li>then it reads the trace completely</li>
+ * <li>then it randomly (seeded) seeks NB_SEEKS locations in the trace and reads
+ * one event at each position.</li>
+ * </ul>
+ * <li>Note: We should make more seeks, since the current number is just too
+ * fast.</li>
+ *
+ * @author Vincent Perot
+ */
+public class PcapSeekBenchmark {
+
+ private static final Random RND = new Random(1000);
+
+ private static final int LOOP_COUNT = 25;
+ private static final int NB_SEEKS = 1000000;
+ private static final String TEST_SUITE_NAME = "Pcap Read & Seek Benchmark (" + NB_SEEKS + " seeks)";
+ private static final String TEST_ID = "org.eclipse.linuxtools#" + TEST_SUITE_NAME;
+
+ /**
+ * Run the benchmark scenario for the pcap trace.
+ */
+ @Test
+ public void testPcapTrace() {
+ readAndSeekTrace(PcapTestTrace.BENCHMARK_TRACE, "trace-pcap", true);
+ }
+
+ private static void readAndSeekTrace(PcapTestTrace testTrace, String testName, boolean inGlobalSummary) {
+ assumeTrue(testTrace.exists());
+
+ Performance perf = Performance.getDefault();
+ PerformanceMeter pm = perf.createPerformanceMeter(TEST_ID + '#' + testName);
+ perf.tagAsSummary(pm, TEST_SUITE_NAME + ':' + testName, Dimension.CPU_TIME);
+
+ if (inGlobalSummary) {
+ perf.tagAsGlobalSummary(pm, TEST_SUITE_NAME + ':' + testName, Dimension.CPU_TIME);
+ }
+
+ for (int loop = 0; loop < LOOP_COUNT; loop++) {
+ try (PcapFile trace = testTrace.getTrace()) {
+ trace.seekPacket(0);
+
+ /* Read the whole trace to find out the number of packets */
+ long nbPackets = trace.getTotalNbPackets();
+
+ /* Generate the timestamps we will seek to */
+ List<Long> seekTimestamps = new LinkedList<>();
+ final long range = nbPackets;
+ for (int i = 0; i < NB_SEEKS; i++) {
+ long rank = (RND.nextLong() % range);
+ if (rank < 0) {
+ // This is needed since modulus can return a negative
+ // number.
+ rank += range;
+ }
+ seekTimestamps.add(rank);
+ }
+
+ /* Benchmark seeking to the generated timestamps */
+ pm.start();
+ for (Long rank : seekTimestamps) {
+ trace.seekPacket(rank);
+ trace.parseNextPacket();
+ }
+ pm.stop();
+
+ } catch (IOException | BadPcapFileException | BadPacketException e) {
+ /* Should not happen if assumeTrue() passed above */
+ fail("Test failed at iteration " + loop + ':' + e.getMessage());
+ }
+ }
+ pm.commit();
+ }
+}
--- /dev/null
+###############################################################################
+# Copyright (c) 2014 Ericsson
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Ericsson - Initial API and implementation
+###############################################################################
+
+Bundle-Vendor = Eclipse Trace Compass
+Bundle-Name = Trace Compass Pcap Parser Core Tests Plug-in
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2014, Ericsson
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>org.eclipse.tracecompass</artifactId>
+ <groupId>org.eclipse.tracecompass</groupId>
+ <version>3.2.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>org.eclipse.tracecompass.pcap.core.tests</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>eclipse-test-plugin</packaging>
+
+ <name>Trace Compass Pcap Parser Core Tests Plug-in</name>
+
+ <!-- Do not download the test traces if "maven.test.skip" is set -->
+ <profiles>
+ <profile>
+ <id>download-traces</id>
+ <activation>
+ <property>
+ <name>!maven.test.skip</name>
+ </property>
+ </activation>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>prepare</id>
+ <phase>pre-integration-test</phase>
+ <configuration>
+ <target>
+ <ant antfile="get-traces.xml" dir="rsc" />
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-surefire-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <testSuite>org.eclipse.tracecompass.pcap.core.tests</testSuite>
+ <testClass>org.eclipse.linuxtools.pcap.core.tests.AllPcapCoreTests</testClass>
+ <useUIHarness>false</useUIHarness>
+ <useUIThread>false</useUIThread>
+ <product>org.eclipse.platform.ide</product>
+ </configuration>
+ </plugin>
+
+ <!-- We don't use the ant file to clean because of http://jira.codehaus.org/browse/MANTRUN-78 -->
+ <plugin>
+ <artifactId>maven-clean-plugin</artifactId>
+ <version>2.5</version>
+ <executions>
+ <execution>
+ <id>clean-traces</id>
+ <phase>clean</phase>
+ <configuration>
+ <filesets>
+ <fileset>
+ <directory>rsc</directory>
+ <includes>
+ <include>*.zip</include>
+ <include>*.pcap</include>
+ <include>*.cap</include>
+ <include>*.tar*</include>
+ </includes>
+ <excludes>
+ <exclude>*.xml</exclude>
+ <exclude>*.sh</exclude>
+ </excludes>
+ </fileset>
+ <fileset><directory>rsc/kernel</directory></fileset>
+ </filesets>
+ </configuration>
+ <goals>
+ <goal>clean</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+
+ <groupId>org.eclipse.tracecompass</groupId>
+</project>
--- /dev/null
+*.zip
+*.pcap
+*.cap
+*.tar*
+/kernel
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ Copyright (C) 2013, Red Hat, Inc. and others
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+-->
+<!--
+Most traces are taken from the Wireshark website and are available under the GNU General Public License.
+http://wiki.wireshark.org/SampleCaptures
+-->
+
+<project name="Extract Traces" default="main" >
+
+<target name="main">
+ <echo message="Attempting to download test traces"/>
+ <get ignoreerrors="true" maxtime="20" dest="Short_LittleEndian.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/1/18/Short_LittleEndian.pcap.zip" />
+ <get ignoreerrors="true" maxtime="20" dest="Short_BigEndian.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/2/25/Short_BigEndian.pcap.zip" />
+ <get ignoreerrors="true" maxtime="20" dest="MostlyUDP.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/6/64/MostlyUDP.pcap.zip" />
+ <get ignoreerrors="true" maxtime="20" dest="MostlyTCP.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/8/8d/MostlyTCP.pcap.zip" />
+ <get ignoreerrors="true" maxtime="20" dest="EmptyPcap.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/c/c1/EmptyPcap.pcap.zip" />
+ <get ignoreerrors="true" maxtime="20" dest="BadPcapFile.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/5/5e/BadPcapFile.pcap.zip" />
+ <get ignoreerrors="true" maxtime="60" dest="BenchmarkTrace.pcap.zip" skipexisting="true" src="http://wiki.eclipse.org/images/1/12/BenchmarkTrace.pcap.zip" />
+ <get ignoreerrors="true" maxtime="20" dest="sample-ctf-trace-20120412.tar.bz2" skipexisting="true" src="http://lttng.org/files/samples/sample-ctf-trace-20120412.tar.bz2"/>
+ <condition property="testSuiteExists">
+ <and>
+ <available file="pcap-testsuite" type="dir"/>
+ </and>
+ </condition>
+ <condition property="tracesExist">
+ <and>
+ <available file="Short_LittleEndian.pcap.zip"/>
+ <available file="Short_BigEndian.pcap.zip"/>
+ <available file="MostlyUDP.pcap.zip"/>
+ <available file="MostlyTCP.pcap.zip"/>
+ <available file="EmptyPcap.pcap.zip"/>
+ <available file="BadPcapFile.pcap.zip"/>
+ <available file="BenchmarkTrace.pcap.zip"/>
+ <available file="sample-ctf-trace-20120412.tar.bz2"/>
+ </and>
+ </condition>
+ <antcall target="extractTraces"/>
+</target>
+
+<target name="extractTraces" if="tracesExist">
+ <unzip src="Short_LittleEndian.pcap.zip" dest="." />
+ <unzip src="Short_BigEndian.pcap.zip" dest="." />
+ <unzip src="MostlyUDP.pcap.zip" dest="." />
+ <unzip src="MostlyTCP.pcap.zip" dest="." />
+ <unzip src="EmptyPcap.pcap.zip" dest="." />
+ <unzip src="BadPcapFile.pcap.zip" dest="." />
+ <unzip src="BenchmarkTrace.pcap.zip" dest="." />
+ <bunzip2 src="sample-ctf-trace-20120412.tar.bz2"/>
+ <untar src="sample-ctf-trace-20120412.tar" dest="." />
+ <echo message="Traces extracted successfully"/>
+</target>
+</project>
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.shared;
+
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+
+/**
+ * Here is the list of the available test traces for the Pcap parser.
+ *
+ * @author Vincent Perot
+ */
+public enum PcapTestTrace {
+
+ /** A bad pcap file. */
+ BAD_PCAPFILE("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "BadPcapFile.pcap"),
+
+ /** A Valid Pcap that is empty. */
+ EMPTY_PCAP("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "EmptyPcap.pcap"),
+
+ /** A Pcap that mostly contains TCP packets. */
+ MOSTLY_TCP("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "mostlyTCP.pcap"),
+
+ /** A Pcap that mostly contains UDP packets. */
+ MOSTLY_UDP("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "mostlyUDP.pcap"),
+
+ /** A big-endian trace that contains two packets. */
+ SHORT_BIG_ENDIAN("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "Short_BigEndian.pcap"),
+
+ /** A little-endian trace that contains two packets. */
+ SHORT_LITTLE_ENDIAN("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "Short_LittleEndian.pcap"),
+
+ /** A large trace for benchmarking. */
+ BENCHMARK_TRACE("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "benchmarkTrace.pcap"),
+
+ /** A Kernel trace directory. */
+ KERNEL_DIRECTORY("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "kernel"),
+
+ /** A Kernel trace file. */
+ KERNEL_TRACE("..", "org.eclipse.linuxtools.pcap.core.tests", "rsc", "kernel", "channel0_0");
+
+ private final @NonNull Path fPath;
+
+ private PcapTestTrace(@NonNull String first, String... more) {
+ @SuppressWarnings("null")
+ @NonNull Path path = FileSystems.getDefault().getPath(first, more);
+ fPath = path;
+ }
+
+ /** @return The path to the test trace */
+ public @NonNull Path getPath() {
+ return fPath;
+ }
+
+ /**
+ * Get a Pcap Trace instance of a test trace. Make sure to call
+ * {@link #exists()} before calling this!
+ *
+ * @return The PcapFile object
+ * @throws IOException
+ * Thrown when some IO error occurs.
+ * @throws BadPcapFileException
+ * Thrown when the file is not a valid Pcap File.
+ */
+ public PcapFile getTrace() throws BadPcapFileException, IOException {
+ return new PcapFile(fPath);
+ }
+
+ /**
+ * Check if this test trace actually exists on disk.
+ *
+ * @return If the trace exists
+ */
+ public boolean exists() {
+ if (Files.notExists(fPath)) {
+ return false;
+ }
+ return true;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Master test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ org.eclipse.linuxtools.pcap.core.tests.file.AllTests.class,
+ org.eclipse.linuxtools.pcap.core.tests.packet.AllTests.class,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.AllTests.class,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.ethernet2.AllTests.class,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.ipv4.AllTests.class,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.pcap.AllTests.class,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.tcp.AllTests.class,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.udp.AllTests.class,
+ org.eclipse.linuxtools.pcap.core.tests.protocol.unknown.AllTests.class,
+ org.eclipse.linuxtools.pcap.core.tests.stream.AllTests.class
+})
+public class AllPcapCoreTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.file;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * File test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ PcapFileOpenTest.class,
+ PcapFileOpenFailTest.class,
+ PcapFileReadTest.class,
+ PcapFileEndiannessTest.class
+})
+public class AllTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.file;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.nio.ByteOrder;
+import java.nio.file.Path;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Test;
+
+/**
+ * JUnit Class that tests whether the Pcap parser can read both big endian and
+ * little endian files.
+ *
+ * @author Vincent Perot
+ */
+public class PcapFileEndiannessTest {
+
+ /**
+ * Test that verify that two files with different endianness contain the
+ * same packets.
+ *
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ * @throws BadPacketException
+ * Thrown when a packet is erroneous. Fails the test.
+ */
+ @Test
+ public void EndiannessTest() throws IOException, BadPcapFileException, BadPacketException {
+ PcapTestTrace trace = PcapTestTrace.SHORT_LITTLE_ENDIAN;
+ assumeTrue(trace.exists());
+ Path path1 = trace.getPath();
+
+ trace = PcapTestTrace.SHORT_LITTLE_ENDIAN;
+ assumeTrue(trace.exists());
+ Path path2 = PcapTestTrace.SHORT_BIG_ENDIAN.getPath();
+
+ try (PcapFile littleEndian = new PcapFile(path1);
+ PcapFile bigEndian = new PcapFile(path2);) {
+ assertEquals(ByteOrder.BIG_ENDIAN, bigEndian.getByteOrder());
+ assertEquals(ByteOrder.LITTLE_ENDIAN, littleEndian.getByteOrder());
+ while (littleEndian.hasNextPacket() && bigEndian.hasNextPacket()) {
+ assertEquals(littleEndian.parseNextPacket(), bigEndian.parseNextPacket());
+ }
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.file;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Test;
+
+/**
+ * JUnit Class that tests the opening of non-valid pcap files.
+ *
+ * @author Vincent Perot
+ */
+public class PcapFileOpenFailTest {
+
+ /**
+ * Test that tries to open a pcap with a bad magic number
+ *
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ */
+ @Test
+ public void FileOpenBadPcapTest() throws IOException {
+ PcapTestTrace trace = PcapTestTrace.BAD_PCAPFILE;
+ assumeTrue(trace.exists());
+
+ try (PcapFile file = new PcapFile(trace.getPath());) {
+ fail("The pcap was accepted even though the magic number is invalid!");
+ } catch (BadPcapFileException e) {
+ assertEquals("c3d4a1b2 is not a known magic number.", e.getMessage());
+ }
+ }
+
+ /**
+ * Test that tries to open a non-pcap binary file
+ *
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ */
+ @Test
+ public void FileOpenBinaryFile() throws IOException {
+ PcapTestTrace trace = PcapTestTrace.KERNEL_TRACE;
+ assumeTrue(trace.exists());
+
+ try (PcapFile file = new PcapFile(trace.getPath());) {
+ fail("The file was accepted even though it is not a pcap file!");
+ } catch (BadPcapFileException e) {
+ assertEquals("c11ffcc1 is not a known magic number.", e.getMessage());
+ }
+ }
+
+ /**
+ * Test that tries to open a directory
+ *
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ */
+ @Test
+ public void FileOpenDirectory() throws IOException {
+ PcapTestTrace trace = PcapTestTrace.KERNEL_DIRECTORY;
+ assumeTrue(trace.exists());
+
+ try (PcapFile file = new PcapFile(trace.getPath());) {
+ fail("The file was accepted even though it is not a pcap file!");
+ } catch (BadPcapFileException e) {
+ assertEquals("Bad Pcap File.", e.getMessage());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.file;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.nio.ByteOrder;
+
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Test;
+
+/**
+ * JUnit Class that tests the opening of valid pcap files.
+ *
+ * @author Vincent Perot
+ */
+public class PcapFileOpenTest {
+
+ /**
+ * Test that verify that an empty pcap file is properly opened and that the
+ * file properties are correct.
+ *
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ */
+ @Test
+ public void FileOpenEmptyTest() throws IOException, BadPcapFileException {
+
+ PcapTestTrace trace = PcapTestTrace.EMPTY_PCAP;
+ assumeTrue(trace.exists());
+
+ try (PcapFile file = new PcapFile(trace.getPath());) {
+ assertEquals(PcapTestTrace.EMPTY_PCAP.getPath(), file.getPath());
+ assertEquals(2, file.getMajorVersion());
+ assertEquals(4, file.getMinorVersion());
+ assertEquals(1, file.getDataLinkType());
+ assertEquals(65535, file.getSnapLength());
+ assertEquals(0, file.getTimeAccuracy());
+ assertEquals(0, file.getTimeZoneCorrection());
+ assertEquals(ByteOrder.LITTLE_ENDIAN, file.getByteOrder());
+
+ assertEquals(0, file.getTotalNbPackets());
+
+ }
+ }
+
+ /**
+ * Test that verify that an non-empty pcap file is properly opened and that
+ * the file properties are correct.
+ *
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ */
+
+ @Test
+ public void FileOpenTest() throws IOException, BadPcapFileException {
+
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
+ assumeTrue(trace.exists());
+
+ try (PcapFile file = new PcapFile(trace.getPath());) {
+ assertEquals(PcapTestTrace.MOSTLY_TCP.getPath(), file.getPath());
+ assertEquals(2, file.getMajorVersion());
+ assertEquals(4, file.getMinorVersion());
+ assertEquals(1, file.getDataLinkType());
+ assertEquals(65535, file.getSnapLength());
+ assertEquals(0, file.getTimeAccuracy());
+ assertEquals(0, file.getTimeZoneCorrection());
+ assertEquals(ByteOrder.LITTLE_ENDIAN, file.getByteOrder());
+
+ assertEquals(43, file.getTotalNbPackets());
+
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.file;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Test;
+
+/**
+ * JUnit Class that tests if packets are read without error.
+ *
+ * @author Vincent Perot
+ */
+public class PcapFileReadTest {
+
+ /**
+ * Test that verify that packets are well read and that no error happens in
+ * file index.
+ *
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ * @throws BadPacketException
+ * Thrown when a packet is erroneous. Fails the test.
+ */
+ @Test
+ public void FileReadTest() throws IOException, BadPcapFileException, BadPacketException {
+
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_UDP;
+ assumeTrue(trace.exists());
+
+ try (PcapFile file = new PcapFile(trace.getPath());) {
+
+ PcapPacket packet = file.parseNextPacket();
+ if (packet == null) {
+ fail("FileReadTest() failed!");
+ return;
+ }
+
+ assertEquals(1, file.getCurrentRank());
+ // Verify Pcap packet.
+ assertEquals(file, packet.getPcapFile());
+ assertEquals(PcapProtocol.PCAP, packet.getProtocol());
+ assertEquals(0, packet.getIndex());
+ assertEquals(1120469540839312L, packet.getTimestamp());
+ assertEquals(92, packet.getOriginalLength());
+ assertEquals(92, packet.getIncludedLength());
+ assertEquals(false, packet.isTruncated());
+ assertEquals(true, packet.validate());
+ // Verify Ethernet Packet
+ if (!packet.hasProtocol(PcapProtocol.ETHERNET_II)) {
+ fail("Packet doesn't have ethernet!");
+ }
+ // Verify IPv4 Packet
+ if (!packet.hasProtocol(PcapProtocol.IPV4)) {
+ fail("Packet doesn't have IPv4!");
+ }
+ // Verify UDP Packet
+ if (!packet.hasProtocol(PcapProtocol.UDP)) {
+ fail("Packet doesn't have UDP!");
+ }
+ // Verify Unknown Packet
+ if (!packet.hasProtocol(PcapProtocol.UNKNOWN)) {
+ fail("Packet doesn't have payload!");
+ }
+
+ // Parse a "random" packet
+ file.seekPacket(58);
+ packet = file.parseNextPacket();
+ if (packet == null) {
+ fail("FileReadTest() failed!");
+ return;
+ }
+
+ // Verify Pcap packet.
+ assertEquals(file, packet.getPcapFile());
+ assertEquals(PcapProtocol.PCAP, packet.getProtocol());
+ assertEquals(58, packet.getIndex());
+ assertEquals(1120469635045415L, packet.getTimestamp());
+ assertEquals(113, packet.getOriginalLength());
+ assertEquals(113, packet.getIncludedLength());
+ assertEquals(false, packet.isTruncated());
+ assertEquals(true, packet.validate());
+ // Verify Ethernet Packet
+ if (!packet.hasProtocol(PcapProtocol.ETHERNET_II)) {
+ fail("Packet doesn't have ethernet!");
+ }
+ // Verify IPv4 Packet
+ if (!packet.hasProtocol(PcapProtocol.IPV4)) {
+ fail("Packet doesn't have IPv4!");
+ }
+ // Verify TCP Packet
+ if (!packet.hasProtocol(PcapProtocol.TCP)) {
+ fail("Packet doesn't have TCP!");
+ }
+ // Verify Unknown Packet
+ if (!packet.hasProtocol(PcapProtocol.UNKNOWN)) {
+ fail("Packet doesn't have payload!");
+ }
+
+ // Skip packet
+ file.skipNextPacket();
+ assertEquals(60, file.getCurrentRank());
+
+ // Parse outside of file.
+ file.seekPacket(99999999);
+ assertEquals(file.getTotalNbPackets(), file.getCurrentRank());
+ file.skipNextPacket(); // Should be a no-op
+ assertEquals(file.getTotalNbPackets(), file.getCurrentRank());
+ packet = file.parseNextPacket();
+ assertNull(packet);
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.packet;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Generic Packet test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ PacketTest.class,
+ BadPacketTest.class
+})
+public class AllTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.packet;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * JUnit Class that tests if BadPacketExceptions are thrown correctly.
+ *
+ * @author Vincent Perot
+ */
+public class BadPacketTest {
+
+ private ByteBuffer fEthernetPacket;
+
+ /**
+ * Initialize the packet.
+ */
+ @Before
+ public void initialize() {
+ fEthernetPacket = ByteBuffer.allocate(8);
+ fEthernetPacket.order(ByteOrder.BIG_ENDIAN);
+
+ // This packet is erroneous. It contains 8 bytes while the minimum is 14
+ // bytes for an Ethernet II packet.
+
+ // Destination MAC - 6 bytes
+ fEthernetPacket.put((byte) 0x34);
+ fEthernetPacket.put((byte) 0x67);
+ fEthernetPacket.put((byte) 0x0C);
+ fEthernetPacket.put((byte) 0xD2);
+ fEthernetPacket.put((byte) 0x91);
+ fEthernetPacket.put((byte) 0x51);
+
+ // Source MAC - 2 bytes
+ fEthernetPacket.put((byte) 0x10);
+ fEthernetPacket.put((byte) 0xF8);
+
+ fEthernetPacket.flip();
+
+ }
+
+ /**
+ * Test that verify if a BadPacketException is correctly thrown (when a
+ * packet is erroneous).
+ *
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ * @throws BadPacketException
+ * Thrown when a packet is erroneous. Expected from the test.
+ */
+ @Test(expected = BadPacketException.class)
+ public void PacketExceptionTest() throws BadPacketException, IOException, BadPcapFileException {
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
+ assumeTrue(trace.exists());
+ try (PcapFile dummy = new PcapFile(trace.getPath())) {
+ ByteBuffer packet = fEthernetPacket;
+ if (packet != null) {
+ new EthernetIIPacket(dummy, null, packet);
+ }
+ fail("PacketExceptionTest has failed!");
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.packet;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * JUnit Class that tests the generic Packet class and its method.
+ *
+ * @author Vincent Perot
+ */
+public class PacketTest {
+
+ private ByteBuffer fEthernetPacket;
+
+ /**
+ * Initialize the packet.
+ */
+ @Before
+ public void initialize() {
+ fEthernetPacket = ByteBuffer.allocate(15);
+ fEthernetPacket.order(ByteOrder.BIG_ENDIAN);
+
+ // Destination MAC - 6 bytes
+ fEthernetPacket.put((byte) 0x34);
+ fEthernetPacket.put((byte) 0x67);
+ fEthernetPacket.put((byte) 0x0C);
+ fEthernetPacket.put((byte) 0xD2);
+ fEthernetPacket.put((byte) 0x91);
+ fEthernetPacket.put((byte) 0x51);
+
+ // Source MAC - 6 bytes
+ fEthernetPacket.put((byte) 0x10);
+ fEthernetPacket.put((byte) 0xF8);
+ fEthernetPacket.put((byte) 0x82);
+ fEthernetPacket.put((byte) 0xB3);
+ fEthernetPacket.put((byte) 0x44);
+ fEthernetPacket.put((byte) 0x78);
+
+ // Ethertype - 2 bytes
+ fEthernetPacket.put((byte) 0xA2);
+ fEthernetPacket.put((byte) 0x56);
+
+ // Payload - 1 byte
+ fEthernetPacket.put((byte) 0xA6);
+
+ fEthernetPacket.flip();
+
+ }
+
+ /**
+ * Test that verify the correctness of the Packet's methods.
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ * @throws BadPacketException
+ * Thrown when a packet is erroneous. Fails the test.
+ */
+ @Test
+ public void GenericPacketTest() throws BadPacketException, IOException, BadPcapFileException {
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
+ assumeTrue(trace.exists());
+ try (PcapFile dummy = new PcapFile(trace.getPath())) {
+ ByteBuffer byteBuffer = fEthernetPacket;
+ if (byteBuffer == null) {
+ fail("GenericPacketTest has failed!");
+ return;
+ }
+
+ Packet packet = new EthernetIIPacket(dummy, null, byteBuffer);
+ assertTrue(packet.hasProtocol(PcapProtocol.ETHERNET_II));
+ assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
+ assertFalse(packet.hasProtocol(PcapProtocol.TCP));
+ assertEquals(PcapProtocol.ETHERNET_II, packet.getProtocol());
+
+ assertEquals(packet, packet.getPacket(PcapProtocol.ETHERNET_II));
+ assertNull(packet.getPacket(PcapProtocol.TCP));
+ assertEquals(packet.getChildPacket(), packet.getPacket(PcapProtocol.UNKNOWN));
+ assertEquals(packet.getPacket(PcapProtocol.ETHERNET_II), packet.getMostEcapsulatedPacket());
+
+ assertNull(packet.getParentPacket());
+ assertFalse(packet.getPcapFile().equals(null));
+
+ Packet child = packet.getChildPacket();
+ if (child == null) {
+ fail("GenericPacketTest has failed!");
+ return;
+ }
+ assertEquals(packet.getPayload(), child.getPayload());
+ assertEquals(packet.getGlobalSummaryString(), "Source MAC: 10:f8:82:b3:44:78 , Destination MAC: 34:67:0c:d2:91:51");
+
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Protocol test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ ProtocolTest.class
+})
+public class AllTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.junit.Test;
+
+/**
+ * JUnit Class that tests whether protocol operation are happening without
+ * error.
+ *
+ * @author Vincent Perot
+ */
+public class ProtocolTest {
+
+ /**
+ * Test that verify if the protocol attributes are as expected.
+ */
+ @Test
+ public void TestProtocolAttributes() {
+ assertEquals(PcapProtocol.PCAP.getName(), "Packet Capture");
+ assertEquals(PcapProtocol.PCAP.getShortName(), "pcap");
+ assertEquals(PcapProtocol.PCAP.getLayer(), PcapProtocol.Layer.LAYER_0);
+ }
+
+ /**
+ * Test that verify if the protocol getter methods are working properly.
+ */
+ @Test
+ public void TestgetProtocols() {
+ List<PcapProtocol> manualListLayer = new ArrayList<>();
+ for (PcapProtocol.Layer layer : PcapProtocol.Layer.values()) {
+ assertNotNull(layer);
+ Collection<PcapProtocol> listLayer = PcapProtocol.getProtocolsOnLayer(layer);
+
+ manualListLayer.clear();
+ switch (layer) {
+ case LAYER_0:
+ manualListLayer.add(PcapProtocol.PCAP);
+ break;
+ case LAYER_1:
+ break;
+ case LAYER_2:
+ manualListLayer.add(PcapProtocol.ETHERNET_II);
+ break;
+ case LAYER_3:
+ manualListLayer.add(PcapProtocol.IPV4);
+ break;
+ case LAYER_4:
+ manualListLayer.add(PcapProtocol.TCP);
+ manualListLayer.add(PcapProtocol.UDP);
+ break;
+ case LAYER_5:
+ break;
+ case LAYER_6:
+ break;
+ case LAYER_7:
+ manualListLayer.add(PcapProtocol.UNKNOWN);
+ break;
+ default:
+ fail("Illegal layer value!");
+ }
+ assertEquals(manualListLayer, listLayer);
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.ethernet2;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Ethernet II test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ EthernetIIPacketTest.class
+})
+public class AllTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.ethernet2;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIEndpoint;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIPacket;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIValues;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * JUnit Class that tests the EthernetIIPacket class and its method.
+ *
+ * @author Vincent Perot
+ */
+public class EthernetIIPacketTest {
+
+ private static final Map<String, String> EXPECTED_FIELDS = ImmutableMap.of(
+ "Source MAC Address", "10:f8:82:b3:44:78",
+ "Destination MAC Address", "34:67:0c:d2:91:51",
+ "Ethertype", "Unknown (0xa256)"
+ );
+
+ private static final String EXPECTED_TOSTRING =
+ "Ethernet II, Source: 10:f8:82:b3:44:78, Destination: 34:67:0c:d2:91:51, Type: Unknown (0xa256)\nPayload: a6";
+
+ private ByteBuffer fPacket;
+
+ /**
+ * Initialize the packet.
+ */
+ @Before
+ public void initialize() {
+ fPacket = ByteBuffer.allocate(15);
+ fPacket.order(ByteOrder.BIG_ENDIAN);
+
+ // Destination MAC - 6 bytes
+ fPacket.put((byte) 0x34);
+ fPacket.put((byte) 0x67);
+ fPacket.put((byte) 0x0C);
+ fPacket.put((byte) 0xD2);
+ fPacket.put((byte) 0x91);
+ fPacket.put((byte) 0x51);
+
+ // Source MAC - 6 bytes
+ fPacket.put((byte) 0x10);
+ fPacket.put((byte) 0xF8);
+ fPacket.put((byte) 0x82);
+ fPacket.put((byte) 0xB3);
+ fPacket.put((byte) 0x44);
+ fPacket.put((byte) 0x78);
+
+ // Ethertype - 2 bytes
+ fPacket.put((byte) 0xA2);
+ fPacket.put((byte) 0x56);
+
+ // Payload - 1 byte
+ fPacket.put((byte) 0xA6);
+
+ fPacket.flip();
+ }
+
+ /**
+ * Test that verify the correctness of the EthernetIIPacket's methods.
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ * @throws BadPacketException
+ * Thrown when a packet is erroneous. Fails the test.
+ */
+ @Test
+ public void CompleteEthernetIIPacketTest() throws IOException, BadPcapFileException, BadPacketException {
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
+ assumeTrue(trace.exists());
+ try (PcapFile dummy = new PcapFile(trace.getPath())) {
+ ByteBuffer byteBuffer = fPacket;
+ if (byteBuffer == null) {
+ fail("CompleteEthernetIIPacketTest has failed!");
+ return;
+ }
+ EthernetIIPacket packet = new EthernetIIPacket(dummy, null, byteBuffer);
+
+ // Protocol Testing
+ assertEquals(PcapProtocol.ETHERNET_II, packet.getProtocol());
+ assertTrue(packet.hasProtocol(PcapProtocol.ETHERNET_II));
+ assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
+ assertFalse(packet.hasProtocol(PcapProtocol.TCP));
+
+ // Abstract methods Testing
+ assertTrue(packet.validate());
+ assertEquals(-653947816, packet.hashCode());
+ assertFalse(packet.equals(null));
+ assertEquals(new EthernetIIPacket(dummy, null, byteBuffer), packet);
+
+ assertEquals(EXPECTED_FIELDS, packet.getFields());
+ assertEquals(EXPECTED_TOSTRING, packet.toString());
+ assertEquals("Src: 10:f8:82:b3:44:78 , Dst: 34:67:0c:d2:91:51", packet.getLocalSummaryString());
+ assertEquals("Source MAC: 10:f8:82:b3:44:78 , Destination MAC: 34:67:0c:d2:91:51", packet.getGlobalSummaryString());
+
+ assertEquals(new EthernetIIEndpoint(packet, true), packet.getSourceEndpoint());
+ assertEquals(new EthernetIIEndpoint(packet, false), packet.getDestinationEndpoint());
+
+ fPacket.position(14);
+ byte[] payload = new byte[1];
+ fPacket.get(payload);
+ assertEquals(ByteBuffer.wrap(payload), packet.getPayload());
+
+ // Packet-specific methods Testing
+ assertTrue(Arrays.equals(packet.getSourceMacAddress(), Arrays.copyOfRange(fPacket.array(), EthernetIIValues.MAC_ADDRESS_SIZE, EthernetIIValues.MAC_ADDRESS_SIZE + EthernetIIValues.MAC_ADDRESS_SIZE)));
+ assertTrue(Arrays.equals(packet.getDestinationMacAddress(), Arrays.copyOfRange(fPacket.array(), 0, 0 + EthernetIIValues.MAC_ADDRESS_SIZE)));
+ assertEquals(0xA256, packet.getEthertype());
+
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.ipv4;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * IPv4 test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ IPv4PacketTest.class
+})
+public class AllTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.ipv4;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4.IPv4Endpoint;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4.IPv4Packet;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * JUnit Class that tests the IPv4Packet class and its method.
+ *
+ * @author Vincent Perot
+ */
+public class IPv4PacketTest {
+
+ private static final Map<String, String> EXPECTED_FIELDS;
+ static {
+ EXPECTED_FIELDS = new LinkedHashMap<>();
+ EXPECTED_FIELDS.put("Version", "4");
+ EXPECTED_FIELDS.put("Header Length", "24 bytes");
+ EXPECTED_FIELDS.put("Differentiated Services Field", "0x26");
+ EXPECTED_FIELDS.put("Explicit Congestion Notification", "0x02");
+ EXPECTED_FIELDS.put("Total Length", "255 bytes");
+ EXPECTED_FIELDS.put("Identification", "0x0ff0");
+ EXPECTED_FIELDS.put("Don't Fragment Flag", "false");
+ EXPECTED_FIELDS.put("More Fragment Flag", "false");
+ EXPECTED_FIELDS.put("Fragment Offset", "7905");
+ EXPECTED_FIELDS.put("Time to live", "160");
+ EXPECTED_FIELDS.put("Protocol", "Unknown (254)");
+ EXPECTED_FIELDS.put("Checksum", "0x3344");
+ EXPECTED_FIELDS.put("Source IP Address", "192.168.1.0");
+ EXPECTED_FIELDS.put("Destination IP Address", "193.169.2.1");
+ EXPECTED_FIELDS.put("Options", "a2 56 a2 56");
+ }
+
+ private static final String EXPECTED_TOSTRING;
+ static {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Internet Protocol Version 4, Source: 192.168.1.0, Destination: 193.169.2.1\n");
+ sb.append("Version: 4, Identification: 0x0ff0, Header Length: 24 bytes, Total Length: 255 bytes\n");
+ sb.append("Differentiated Services Code Point: 0x26; Explicit Congestion Notification: 0x02\n");
+ sb.append("Flags: 0x00 (Don't have more fragments), Fragment Offset: 7905\n");
+ sb.append("Time to live: 160\n");
+ sb.append("Protocol: 254\n");
+ sb.append("Header Checksum: 0x3344\n");
+ sb.append("Payload: a6");
+
+ EXPECTED_TOSTRING = sb.toString();
+ }
+
+ private ByteBuffer fPacket;
+
+ /**
+ * Initialize the packet.
+ */
+ @Before
+ public void initialize() {
+ fPacket = ByteBuffer.allocate(25);
+ fPacket.order(ByteOrder.BIG_ENDIAN);
+
+ // Version + IHL
+ fPacket.put((byte) 0x46);
+
+ // DSCP + ECN
+ fPacket.put((byte) 0x9A);
+
+ // Total length - this is randomly chosen so that we verify that the
+ // packet handles wrong total length.
+ fPacket.put((byte) 0x00);
+ fPacket.put((byte) 0xFF);
+
+ // Identification
+ fPacket.put((byte) 0x0F);
+ fPacket.put((byte) 0xF0);
+
+ // Flags + Fragment Offset
+ fPacket.put((byte) 0x1E);
+ fPacket.put((byte) 0xE1);
+
+ // Time to live
+ fPacket.put((byte) 0xA0);
+
+ // Protocol - Unknown
+ fPacket.put((byte) 0xFE);
+
+ // Header checksum - chosen randomly
+ fPacket.put((byte) 0x33);
+ fPacket.put((byte) 0x44);
+
+ // Source IP - 4 bytes
+ fPacket.put((byte) 192);
+ fPacket.put((byte) 168);
+ fPacket.put((byte) 1);
+ fPacket.put((byte) 0);
+
+ // Destination IP - 4 bytes
+ fPacket.put((byte) 193);
+ fPacket.put((byte) 169);
+ fPacket.put((byte) 2);
+ fPacket.put((byte) 1);
+
+ // Options - 4 bytes
+ fPacket.put((byte) 0xA2);
+ fPacket.put((byte) 0x56);
+ fPacket.put((byte) 0xA2);
+ fPacket.put((byte) 0x56);
+
+ // Payload - 1 byte
+ fPacket.put((byte) 0xA6);
+
+ fPacket.flip();
+ }
+
+ /**
+ * Test that verify the correctness of the IPv4Packet's methods.
+ *
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ * @throws BadPacketException
+ * Thrown when a packet is erroneous. Fails the test.
+ */
+ @Test
+ public void CompleteIPv4PacketTest() throws IOException, BadPcapFileException, BadPacketException {
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
+ assumeTrue(trace.exists());
+ try (PcapFile dummy = new PcapFile(trace.getPath())) {
+ ByteBuffer byteBuffer = fPacket;
+ if (byteBuffer == null) {
+ fail("CompleteIPv4PacketTest has failed!");
+ return;
+ }
+ IPv4Packet packet = new IPv4Packet(dummy, null, byteBuffer);
+
+ // Protocol Testing
+ assertEquals(PcapProtocol.IPV4, packet.getProtocol());
+ assertTrue(packet.hasProtocol(PcapProtocol.IPV4));
+ assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
+ assertFalse(packet.hasProtocol(PcapProtocol.TCP));
+
+ // Abstract methods Testing
+ assertTrue(packet.validate());
+ assertEquals(-222021887, packet.hashCode());
+ assertFalse(packet.equals(null));
+ assertEquals(new IPv4Packet(dummy, null, byteBuffer), packet);
+
+ assertEquals(EXPECTED_FIELDS, packet.getFields());
+ assertEquals(EXPECTED_TOSTRING, packet.toString());
+ assertEquals("Src: 192.168.1.0 , Dst: 193.169.2.1", packet.getLocalSummaryString());
+ assertEquals("192.168.1.0 > 193.169.2.1 Id=4080 Len=1", packet.getGlobalSummaryString());
+
+ assertEquals(new IPv4Endpoint(packet, true), packet.getSourceEndpoint());
+ assertEquals(new IPv4Endpoint(packet, false), packet.getDestinationEndpoint());
+
+ fPacket.position(24);
+ byte[] payload = new byte[1];
+ fPacket.get(payload);
+ assertEquals(ByteBuffer.wrap(payload), packet.getPayload());
+
+ // Packet-specific methods Testing
+ assertEquals(InetAddress.getByAddress(Arrays.copyOfRange(fPacket.array(), 12, 16)), packet.getSourceIpAddress());
+ assertEquals(InetAddress.getByAddress(Arrays.copyOfRange(fPacket.array(), 16, 20)), packet.getDestinationIpAddress());
+ assertTrue(Arrays.equals(packet.getOptions(), Arrays.copyOfRange(fPacket.array(), 20, 24)));
+ assertEquals(4, packet.getVersion());
+ assertEquals(24, packet.getHeaderLength());
+ assertEquals(0x26, packet.getDSCP());
+ assertEquals(0x02, packet.getExplicitCongestionNotification());
+ assertEquals(255, packet.getTotalLength());
+ assertEquals(0x0FF0, packet.getIdentification());
+ assertFalse(packet.getReservedFlag());
+ assertFalse(packet.getDontFragmentFlag());
+ assertFalse(packet.getHasMoreFragment());
+ assertEquals(7905, packet.getFragmentOffset());
+ assertEquals(160, packet.getTimeToLive());
+ assertEquals(0xFE, packet.getIpDatagramProtocol());
+ assertEquals(0x3344, packet.getHeaderChecksum());
+
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.pcap;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Pcap test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ PcapPacketTest.class
+})
+public class AllTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.pcap;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Map;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapEndpoint;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * JUnit Class that tests the PcapPacket class and its method.
+ *
+ * @author Vincent Perot
+ */
+public class PcapPacketTest {
+
+ private static final Map<String, String> EXPECTED_FIELDS = ImmutableMap.of(
+ "Frame", "36",
+ "Frame Length", "75 bytes",
+ "Capture Length", "75 bytes",
+ "Capture Time", "2005-07-04 05:33:52.829.277.000"
+ );
+
+ private static final String EXPECTED_TOSTRING;
+ static {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Packet Capture 36: 75 bytes on wire, 75 bytes captured.\n");
+ sb.append("Arrival time: 2005-07-04 05:33:52.829.277.000\n");
+ sb.append("Ethernet II, Source: 00:e0:ed:01:6e:bd, Destination: 00:30:54:00:34:56, Type: Internet Protocol Version 4 (0x0800)\n");
+ sb.append("Internet Protocol Version 4, Source: 192.168.1.2, Destination: 192.168.1.1\n");
+ sb.append("Version: 4, Identification: 0x69aa, Header Length: 20 bytes, Total Length: 61 bytes\n");
+ sb.append("Differentiated Services Code Point: 0x00; Explicit Congestion Notification: 0x00\n");
+ sb.append("Flags: 0x00 (Don't have more fragments), Fragment Offset: 0\n");
+ sb.append("Time to live: 128\n");
+ sb.append("Protocol: 17\n");
+ sb.append("Header Checksum: 0x4db2\n");
+ sb.append("User Datagram Protocol, Source Port: 2719, Destination Port: 53, Length: 41, Checksum: 19038\n");
+ sb.append("Payload: ed d4 01 00 00 01 00 00 00 00 00 00 03 66 74 70 07 65 63 69 74 65 6c 65 03 63 6f 6d 00 00 01 00 01");
+
+ EXPECTED_TOSTRING = sb.toString();
+ }
+
+ private ByteBuffer fPayload;
+
+ /**
+ * Initialize the payload.
+ */
+ @Before
+ public void initialize() {
+ fPayload = ByteBuffer.allocate(75);
+ fPayload.order(ByteOrder.BIG_ENDIAN);
+
+ // Values copied from wireshark
+
+ // Bytes 0x01-0x10
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x30);
+ fPayload.put((byte) 0x54);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x34);
+ fPayload.put((byte) 0x56);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0xE0);
+ fPayload.put((byte) 0xED);
+ fPayload.put((byte) 0x01);
+ fPayload.put((byte) 0x6E);
+ fPayload.put((byte) 0xBD);
+ fPayload.put((byte) 0x08);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x45);
+ fPayload.put((byte) 0x00);
+
+ // Bytes 0x11-0x20
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x3D);
+ fPayload.put((byte) 0x69);
+ fPayload.put((byte) 0xAA);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x80);
+ fPayload.put((byte) 0x11);
+ fPayload.put((byte) 0x4D);
+ fPayload.put((byte) 0xB2);
+ fPayload.put((byte) 0xC0);
+ fPayload.put((byte) 0xA8);
+ fPayload.put((byte) 0x01);
+ fPayload.put((byte) 0x02);
+ fPayload.put((byte) 0xC0);
+ fPayload.put((byte) 0xA8);
+
+ // Bytes 0x21-0x30
+ fPayload.put((byte) 0x01);
+ fPayload.put((byte) 0x01);
+ fPayload.put((byte) 0x0A);
+ fPayload.put((byte) 0x9F);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x35);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x29);
+ fPayload.put((byte) 0x4A);
+ fPayload.put((byte) 0x5E);
+ fPayload.put((byte) 0xED);
+ fPayload.put((byte) 0xd4);
+ fPayload.put((byte) 0x01);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x01);
+
+ // Bytes 0x31-0x40
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x03);
+ fPayload.put((byte) 0x66);
+ fPayload.put((byte) 0x74);
+ fPayload.put((byte) 0x70);
+ fPayload.put((byte) 0x07);
+ fPayload.put((byte) 0x65);
+ fPayload.put((byte) 0x63);
+ fPayload.put((byte) 0x69);
+ fPayload.put((byte) 0x74);
+ fPayload.put((byte) 0x65);
+
+ // Bytes 0x41-0x4B
+ fPayload.put((byte) 0x6C);
+ fPayload.put((byte) 0x65);
+ fPayload.put((byte) 0x03);
+ fPayload.put((byte) 0x63);
+ fPayload.put((byte) 0x6F);
+ fPayload.put((byte) 0x6D);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x01);
+ fPayload.put((byte) 0x00);
+ fPayload.put((byte) 0x01);
+
+ fPayload.flip();
+ }
+
+ /**
+ * Test that verify the correctness of the PcapPacket's methods.
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ * @throws BadPacketException
+ * Thrown when a packet is erroneous. Fails the test.
+ */
+ @Test
+ public void CompletePcapPacketTest() throws IOException, BadPcapFileException, BadPacketException {
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_UDP;
+ assumeTrue(trace.exists());
+ try (PcapFile file = new PcapFile(trace.getPath());) {
+
+ file.seekPacket(36);
+ PcapPacket packet = file.parseNextPacket();
+ if (packet == null) {
+ fail("CompletePcapPacketTest has failed!");
+ return;
+ }
+ // Protocol Testing
+ assertEquals(PcapProtocol.PCAP, packet.getProtocol());
+ assertTrue(packet.hasProtocol(PcapProtocol.PCAP));
+ assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
+ assertFalse(packet.hasProtocol(PcapProtocol.TCP));
+
+ // Abstract methods Testing
+ assertTrue(packet.validate());
+ assertEquals(86567859, packet.hashCode());
+ assertFalse(packet.equals(null));
+ assertFalse(packet.equals(file.parseNextPacket()));
+
+ assertEquals(EXPECTED_FIELDS, packet.getFields());
+ assertEquals(EXPECTED_TOSTRING, packet.toString());
+ assertEquals("Frame 36: 75 bytes on wire, 75 bytes captured", packet.getLocalSummaryString());
+ assertEquals("Source Port: 2719, Destination Port: 53", packet.getGlobalSummaryString());
+
+ assertEquals(new PcapEndpoint(packet, true), packet.getSourceEndpoint());
+ assertEquals(new PcapEndpoint(packet, false), packet.getDestinationEndpoint());
+
+ ByteBuffer payload = packet.getPayload();
+ if (payload == null) {
+ fail("CompletePcapPacketTest has failed!");
+ return;
+ }
+ assertEquals(fPayload, payload.flip());
+
+ // Packet-specific methods Testing
+ assertEquals(36, packet.getIndex());
+ assertEquals(75, packet.getOriginalLength());
+ assertEquals(75, packet.getIncludedLength());
+ assertEquals(1120469632829277L, packet.getTimestamp());
+ assertFalse(packet.isTruncated());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.tcp;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * TCP test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ TCPPacketTest.class
+})
+public class AllTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.tcp;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.tcp.TCPEndpoint;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.tcp.TCPPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * JUnit Class that tests the TCPPacket class and its method.
+ *
+ * @author Vincent Perot
+ */
+public class TCPPacketTest {
+
+ private static final Map<String, String> EXPECTED_FIELDS;
+ static {
+ EXPECTED_FIELDS = new LinkedHashMap<>();
+ EXPECTED_FIELDS.put("Source Port", "18057");
+ EXPECTED_FIELDS.put("Destination Port", "39611");
+ EXPECTED_FIELDS.put("Sequence Number", "2575857510");
+ EXPECTED_FIELDS.put("Acknowledgement Number", "1430532898");
+ EXPECTED_FIELDS.put("Length", "24 bytes");
+ EXPECTED_FIELDS.put("ECN-Nonce Flag", "true");
+ EXPECTED_FIELDS.put("Congestion Window Reduced Flag", "false");
+ EXPECTED_FIELDS.put("ECN-Echo Flag", "true");
+ EXPECTED_FIELDS.put("Urgent Flag", "false");
+ EXPECTED_FIELDS.put("ACK Flag", "true");
+ EXPECTED_FIELDS.put("PSH Flag", "false");
+ EXPECTED_FIELDS.put("RST Flag", "true");
+ EXPECTED_FIELDS.put("SYN Flag", "false");
+ EXPECTED_FIELDS.put("FIN Flag", "true");
+ EXPECTED_FIELDS.put("Window Size Value", "4352");
+ EXPECTED_FIELDS.put("Checksum", "0xffee");
+ EXPECTED_FIELDS.put("Urgent Pointer", "0xddcc");
+ EXPECTED_FIELDS.put("Options", "ad da bc cb");
+ }
+
+ private static final String EXPECTED_TOSTRING;
+ static {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Transmission Control Protocol, Source Port: 18057, Destination Port: 39611\n");
+ sb.append("Sequence Number: 2575857510, Acknowledgment Number: 1430532898\n");
+ sb.append("Header length: 24 bytes, Data length: 4\n");
+ sb.append("Window size value: 4352, Urgent Pointer: 0xddcc\n");
+ sb.append("Checksum: 0xffee\n");
+ sb.append("Payload: 99 88 77 66");
+
+ EXPECTED_TOSTRING = sb.toString();
+ }
+
+ private ByteBuffer fPacket;
+
+ /**
+ * Initialize the packet.
+ */
+ @Before
+ public void initialize() {
+ fPacket = ByteBuffer.allocate(28);
+ fPacket.order(ByteOrder.BIG_ENDIAN);
+
+ // Source Port
+ fPacket.put((byte) 0x46);
+ fPacket.put((byte) 0x89);
+
+ // Destination Port
+ fPacket.put((byte) 0x9A);
+ fPacket.put((byte) 0xBB);
+
+ // Sequence Number
+ fPacket.put((byte) 0x99);
+ fPacket.put((byte) 0x88);
+ fPacket.put((byte) 0x77);
+ fPacket.put((byte) 0x66);
+
+ // Acknowledgment Number
+ fPacket.put((byte) 0x55);
+ fPacket.put((byte) 0x44);
+ fPacket.put((byte) 0x33);
+ fPacket.put((byte) 0x22);
+
+ // Data Offset + Reserved + NS
+ fPacket.put((byte) 0x61);
+
+ // Other flags
+ fPacket.put((byte) 0b01010101);
+
+ // Window Size
+ fPacket.put((byte) 0x11);
+ fPacket.put((byte) 0x00);
+
+ // Checksum
+ fPacket.put((byte) 0xFF);
+ fPacket.put((byte) 0xEE);
+
+ // Urgent Pointer
+ fPacket.put((byte) 0xDD);
+ fPacket.put((byte) 0xCC);
+
+ // Options - 4 bytes
+ fPacket.put((byte) 0xAD);
+ fPacket.put((byte) 0xDA);
+ fPacket.put((byte) 0xBC);
+ fPacket.put((byte) 0xCB);
+
+ // Payload - 4 bytes
+ fPacket.put((byte) 0x99);
+ fPacket.put((byte) 0x88);
+ fPacket.put((byte) 0x77);
+ fPacket.put((byte) 0x66);
+
+ fPacket.flip();
+ }
+
+ /**
+ * Test that verify the correctness of the TCPPacket's methods.
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ * @throws BadPacketException
+ * Thrown when a packet is erroneous. Fails the test.
+ */
+ @Test
+ public void CompleteTCPPacketTest() throws BadPacketException, IOException, BadPcapFileException {
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
+ assumeTrue(trace.exists());
+ try (PcapFile dummy = new PcapFile(trace.getPath())) {
+ ByteBuffer byteBuffer = fPacket;
+ if (byteBuffer == null) {
+ fail("CompleteTCPPacketTest has failed!");
+ return;
+ }
+ TCPPacket packet = new TCPPacket(dummy, null, byteBuffer);
+
+ // Protocol Testing
+ assertEquals(PcapProtocol.TCP, packet.getProtocol());
+ assertTrue(packet.hasProtocol(PcapProtocol.TCP));
+ assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
+ assertFalse(packet.hasProtocol(PcapProtocol.IPV4));
+
+ // Abstract methods Testing
+ assertTrue(packet.validate());
+ assertEquals(-677046102, packet.hashCode());
+ assertFalse(packet.equals(null));
+ assertEquals(new TCPPacket(dummy, null, byteBuffer), packet);
+
+ assertEquals(EXPECTED_FIELDS, packet.getFields());
+ assertEquals(EXPECTED_TOSTRING, packet.toString());
+ assertEquals("Src Port: 18057, Dst Port: 39611, Seq: 2575857510, Ack: 1430532898, Len: 24", packet.getLocalSummaryString());
+ assertEquals("18057 > 39611 [ACK, FIN, RST, NS, ECE] Seq=2575857510 Ack=1430532898 Len=24", packet.getGlobalSummaryString());
+
+ assertEquals(new TCPEndpoint(packet, true), packet.getSourceEndpoint());
+ assertEquals(new TCPEndpoint(packet, false), packet.getDestinationEndpoint());
+
+ fPacket.position(24);
+ byte[] payload = new byte[4];
+ fPacket.get(payload);
+ assertEquals(ByteBuffer.wrap(payload), packet.getPayload());
+
+ // Packet-specific methods Testing
+ assertEquals(0x4689, packet.getSourcePort());
+ assertEquals(0x9ABB, packet.getDestinationPort());
+ assertEquals(2575857510L, packet.getSequenceNumber());
+ assertEquals(1430532898L, packet.getAcknowledgmentNumber());
+ assertEquals(6, packet.getDataOffset());
+ assertEquals(0, packet.getReservedField());
+ assertEquals(true, packet.isNSFlagSet());
+ assertEquals(false, packet.isCongestionWindowReducedFlagSet());
+ assertEquals(true, packet.isECNEchoFlagSet());
+ assertEquals(false, packet.isUrgentFlagSet());
+ assertEquals(true, packet.isAcknowledgeFlagSet());
+ assertEquals(false, packet.isPushFlagSet());
+ assertEquals(true, packet.isResetFlagSet());
+ assertEquals(false, packet.isSynchronizationFlagSet());
+ assertEquals(true, packet.isFinalFlagSet());
+ assertEquals(4352, packet.getWindowSize());
+ assertEquals(65518, packet.getChecksum());
+ assertEquals(56780, packet.getUrgentPointer());
+ assertTrue(Arrays.equals(packet.getOptions(), Arrays.copyOfRange(fPacket.array(), 20, 24)));
+
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.udp;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * UDP test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ UDPPacketTest.class
+})
+public class AllTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.udp;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Map;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.udp.UDPEndpoint;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.udp.UDPPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * JUnit Class that tests the UDPPacket class and its method.
+ *
+ * @author Vincent Perot
+ */
+public class UDPPacketTest {
+
+ private static final Map<String, String> EXPECTED_FIELDS = ImmutableMap.of(
+ "Source Port", "18057",
+ "Destination Port", "39611",
+ "Length", "41452 bytes",
+ "Checksum", "0xfaaf"
+ );
+
+ private static final String EXPTECTED_TOSTRING;
+ static {
+ StringBuilder sb = new StringBuilder();
+ sb.append("User Datagram Protocol, Source Port: 18057, Destination Port: 39611, Length: 41452, Checksum: 64175\n");
+ sb.append("Payload: 99 88 77 66");
+
+ EXPTECTED_TOSTRING = sb.toString();
+ }
+
+ private ByteBuffer fPacket;
+
+ /**
+ * Initialize the packet.
+ */
+ @Before
+ public void initialize() {
+ fPacket = ByteBuffer.allocate(12);
+ fPacket.order(ByteOrder.BIG_ENDIAN);
+
+ // Source Port
+ fPacket.put((byte) 0x46);
+ fPacket.put((byte) 0x89);
+
+ // Destination Port
+ fPacket.put((byte) 0x9A);
+ fPacket.put((byte) 0xBB);
+
+ // Total length - this is randomly chosen so that we verify that the
+ // packet handles wrong total length.
+ fPacket.put((byte) 0xA1);
+ fPacket.put((byte) 0xEC);
+
+ // Checksum
+ fPacket.put((byte) 0xFA);
+ fPacket.put((byte) 0xAF);
+
+ // Payload - 4 bytes
+ fPacket.put((byte) 0x99);
+ fPacket.put((byte) 0x88);
+ fPacket.put((byte) 0x77);
+ fPacket.put((byte) 0x66);
+
+ fPacket.flip();
+ }
+
+ /**
+ * Test that verify the correctness of the UDPPacket's methods.
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ * @throws BadPacketException
+ * Thrown when a packet is erroneous. Fails the test.
+ */
+ @Test
+ public void CompleteUDPPacketTest() throws IOException, BadPcapFileException, BadPacketException {
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
+ assumeTrue(trace.exists());
+ try (PcapFile dummy = new PcapFile(trace.getPath())) {
+ ByteBuffer byteBuffer = fPacket;
+ if (byteBuffer == null) {
+ fail("CompleteUDPPacketTest has failed!");
+ return;
+ }
+ UDPPacket packet = new UDPPacket(dummy, null, byteBuffer);
+
+ // Protocol Testing
+ assertEquals(PcapProtocol.UDP, packet.getProtocol());
+ assertTrue(packet.hasProtocol(PcapProtocol.UDP));
+ assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
+ assertFalse(packet.hasProtocol(PcapProtocol.ETHERNET_II));
+
+ // Abstract methods Testing
+ assertTrue(packet.validate());
+ assertEquals(473000225, packet.hashCode());
+ assertFalse(packet.equals(null));
+ assertEquals(new UDPPacket(dummy, null, byteBuffer), packet);
+
+ assertEquals(EXPECTED_FIELDS, packet.getFields());
+ assertEquals(EXPTECTED_TOSTRING, packet.toString());
+ assertEquals("Src Port: 18057, Dst Port: 39611", packet.getLocalSummaryString());
+ assertEquals("Source Port: 18057, Destination Port: 39611", packet.getGlobalSummaryString());
+
+ assertEquals(new UDPEndpoint(packet, true), packet.getSourceEndpoint());
+ assertEquals(new UDPEndpoint(packet, false), packet.getDestinationEndpoint());
+
+ fPacket.position(8);
+ byte[] payload = new byte[4];
+ fPacket.get(payload);
+ assertEquals(ByteBuffer.wrap(payload), packet.getPayload());
+
+ // Packet-specific methods Testing
+ assertEquals(0x4689, packet.getSourcePort());
+ assertEquals(0x9ABB, packet.getDestinationPort());
+ assertEquals(0xA1EC, packet.getTotalLength());
+ assertEquals(0xFAAF, packet.getChecksum());
+
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.unknown;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Unknown test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ UnknownPacketTest.class
+})
+public class AllTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.protocol.unknown;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Map;
+
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownEndpoint;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * JUnit Class that tests the UnknownPacket class and its method.
+ *
+ * @author Vincent Perot
+ */
+public class UnknownPacketTest {
+
+ private static final Map<String, String> EXPECTED_FIELDS = ImmutableMap.of(
+ "Binary", "61",
+ "Character", "a"
+ );
+
+ private static final String fToString = "Payload: 61";
+
+ private ByteBuffer fPacket;
+
+ /**
+ * Initialize the packet.
+ */
+ @Before
+ public void initialize() {
+ fPacket = ByteBuffer.allocate(1);
+ fPacket.order(ByteOrder.BIG_ENDIAN);
+
+ // Payload - 1 byte
+ fPacket.put((byte) 97);
+
+ fPacket.flip();
+ }
+
+ /**
+ * Test that verify the correctness of the UnknownPacket's methods.
+ * @throws BadPcapFileException
+ * Thrown when the file is erroneous. Fails the test.
+ * @throws IOException
+ * Thrown when an IO error occurs. Fails the test.
+ */
+ @Test
+ public void CompleteUnknownPacketTest() throws IOException, BadPcapFileException {
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
+ assumeTrue(trace.exists());
+ try (PcapFile dummy = new PcapFile(trace.getPath())) {
+ ByteBuffer byteBuffer = fPacket;
+ if (byteBuffer == null) {
+ fail("CompleteUnknownPacketTest has failed!");
+ return;
+ }
+ UnknownPacket packet = new UnknownPacket(dummy, null, byteBuffer);
+
+ // Protocol Testing
+ assertEquals(PcapProtocol.UNKNOWN, packet.getProtocol());
+ assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
+ assertFalse(packet.hasProtocol(PcapProtocol.UDP));
+
+ // Abstract methods Testing
+ assertTrue(packet.validate());
+ assertEquals(1089, packet.hashCode());
+ assertFalse(packet.equals(null));
+ assertEquals(new UnknownPacket(dummy, null, byteBuffer), packet);
+
+ assertEquals(EXPECTED_FIELDS, packet.getFields());
+ assertEquals(fToString, packet.toString());
+ assertEquals("Len: 1 bytes", packet.getLocalSummaryString());
+ assertEquals("Data: 1 bytes", packet.getGlobalSummaryString());
+ // TODO take care of plural form.
+
+ // Unknown Endpoints are never equal!
+ assertFalse(packet.getSourceEndpoint().equals(new UnknownEndpoint(packet, true)));
+ assertFalse(packet.getDestinationEndpoint().equals(new UnknownEndpoint(packet, false)));
+
+ fPacket.position(0);
+ byte[] payload = new byte[1];
+ fPacket.get(payload);
+ ByteBuffer payloadBB = ByteBuffer.wrap(payload);
+ payloadBB.flip();
+
+ assertEquals(payloadBB, packet.getPayload());
+
+ // Packet-specific methods Testing
+ // None
+
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.stream;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Stream test suite
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ StreamBuildTest.class
+})
+public class AllTests {
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.pcap.core.tests.stream;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.stream.PacketStream;
+import org.eclipse.linuxtools.internal.pcap.core.stream.PacketStreamBuilder;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.pcap.core.tests.shared.PcapTestTrace;
+import org.junit.Test;
+
+/**
+ * JUnit Class that tests whether packet streams are built correctly.
+ *
+ * @author Vincent Perot
+ */
+public class StreamBuildTest {
+
+ private static final double DELTA = 0.001;
+
+ /**
+ * Test that verify that stream building is done correctly.
+ */
+ @Test
+ public void StreamBuildingTest() {
+ PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
+ assumeTrue(trace.exists());
+
+ try {
+ // Test Ethernet II stream
+ PacketStreamBuilder builder = new PacketStreamBuilder(PcapProtocol.ETHERNET_II);
+ builder.parsePcapFile(trace.getPath());
+ assertEquals(PcapProtocol.ETHERNET_II, builder.getProtocol());
+ // Should do one loop only, so hardcoded values are okay.
+ for (PacketStream stream : builder.getStreams()) {
+ assertEquals("Stream eth.0, Number of Packets: 43\n", stream.toString());
+ assertEquals(43, stream.getNbPackets());
+ assertEquals(25091, stream.getNbBytes());
+ assertEquals(20, stream.getNbPacketsAtoB());
+ assertEquals(2323, stream.getNbBytesAtoB());
+ assertEquals(23, stream.getNbPacketsBtoA());
+ assertEquals(22768, stream.getNbBytesBtoA());
+ assertEquals(1084443427311224000L, stream.getStartTime());
+ assertEquals(1084443457704928000L, stream.getStopTime());
+ assertEquals(30.393704, stream.getDuration(), DELTA);
+ assertEquals(76.43030280218561, stream.getBPSAtoB(), DELTA);
+ assertEquals(749.1025114938278, stream.getBPSBtoA(), DELTA);
+ }
+
+ // Test TCP streams and other constructor
+ builder = new PacketStreamBuilder(PcapProtocol.TCP);
+ builder.parsePcapFile(trace.getPath());
+ assertEquals(PcapProtocol.TCP, builder.getProtocol());
+
+ PacketStream stream = builder.getStream(0);
+ if (stream == null) {
+ fail("StreamBuildingTest has failed!");
+ return;
+ }
+ assertEquals(PcapProtocol.TCP, stream.getProtocol());
+ assertEquals(0, stream.getID());
+ assertEquals("tcp.0", stream.getUniqueID());
+ assertEquals(34, stream.getNbPackets());
+ assertEquals(20695, stream.getNbBytes());
+ assertEquals(16, stream.getNbPacketsAtoB());
+ assertEquals(1351, stream.getNbBytesAtoB());
+ assertEquals(18, stream.getNbPacketsBtoA());
+ assertEquals(19344, stream.getNbBytesBtoA());
+ assertEquals(1084443427311224000L, stream.getStartTime());
+ assertEquals(1084443457704928000L, stream.getStopTime());
+ assertEquals(30.393704, stream.getDuration(), DELTA);
+ assertEquals(44.449995301658525, stream.getBPSAtoB(), DELTA);
+ assertEquals(636.4476011216008, stream.getBPSBtoA(), DELTA);
+
+ stream = builder.getStream(1);
+ if (stream == null) {
+ fail("StreamBuildingTest has failed!");
+ return;
+ }
+ assertEquals(PcapProtocol.TCP, stream.getProtocol());
+ assertEquals(1, stream.getID());
+ assertEquals("tcp.1", stream.getUniqueID());
+ assertEquals(7, stream.getNbPackets());
+ assertEquals(4119, stream.getNbBytes());
+ assertEquals(3, stream.getNbPacketsAtoB());
+ assertEquals(883, stream.getNbBytesAtoB());
+ assertEquals(4, stream.getNbPacketsBtoA());
+ assertEquals(3236, stream.getNbBytesBtoA());
+ assertEquals(1084443430295515000L, stream.getStartTime());
+ assertEquals(1084443432088092000L, stream.getStopTime());
+ assertEquals(1.792577, stream.getDuration(), DELTA);
+ assertEquals(492.58692932019096, stream.getBPSAtoB(), DELTA);
+ assertEquals(1805.2223140205413, stream.getBPSBtoA(), DELTA);
+
+ builder.clear();
+ assertEquals(0, builder.getNbStreams());
+ } catch (IOException | BadPcapFileException e) {
+ fail("StreamBuildingTest has failed!");
+ }
+
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.tracecompass.pcap.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
--- /dev/null
+eclipse.preferences.version=1
+line.separator=\n
--- /dev/null
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=enabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=error
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.deprecation=error
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=error
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=error
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=error
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=error
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=error
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=enabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=error
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=disabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=disabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=error
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
+org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=250
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
--- /dev/null
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_tmf-style
+formatter_settings_version=12
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=false
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=false
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
--- /dev/null
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_JAVADOC_TAG=Warning
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+MISSING_EE_DESCRIPTIONS=Ignore
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
--- /dev/null
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=1
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-Vendor: %Bundle-Vendor
+Bundle-Version: 1.0.0.qualifier
+Bundle-Localization: plugin
+Bundle-SymbolicName: org.eclipse.tracecompass.pcap.core;singleton:=true
+Bundle-Activator: org.eclipse.linuxtools.internal.pcap.core.Activator
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources
+Export-Package: org.eclipse.linuxtools.internal.pcap.core;x-friends:="org.eclipse.tracecompass.pcap.core.tests",
+ org.eclipse.linuxtools.internal.pcap.core.endpoint;x-friends:="org.eclipse.linuxtools.tmf.pcap.core",
+ org.eclipse.linuxtools.internal.pcap.core.filter;x-internal:=true,
+ org.eclipse.linuxtools.internal.pcap.core.packet;x-friends:="org.eclipse.tracecompass.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
+ org.eclipse.linuxtools.internal.pcap.core.protocol;x-friends:="org.eclipse.tracecompass.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
+ org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2;x-friends:="org.eclipse.tracecompass.pcap.core.tests",
+ org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4;x-friends:="org.eclipse.tracecompass.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
+ org.eclipse.linuxtools.internal.pcap.core.protocol.pcap;x-friends:="org.eclipse.tracecompass.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
+ org.eclipse.linuxtools.internal.pcap.core.protocol.tcp;x-friends:="org.eclipse.tracecompass.pcap.core.tests",
+ org.eclipse.linuxtools.internal.pcap.core.protocol.udp;x-friends:="org.eclipse.tracecompass.pcap.core.tests",
+ org.eclipse.linuxtools.internal.pcap.core.protocol.unknown;x-friends:="org.eclipse.tracecompass.pcap.core.tests",
+ org.eclipse.linuxtools.internal.pcap.core.stream;x-friends:="org.eclipse.tracecompass.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
+ org.eclipse.linuxtools.internal.pcap.core.trace;x-friends:="org.eclipse.tracecompass.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core.tests,org.eclipse.linuxtools.tmf.pcap.core",
+ org.eclipse.linuxtools.internal.pcap.core.util;x-friends:="org.eclipse.linuxtools.tmf.pcap.core"
+Import-Package: com.google.common.collect,
+ com.google.common.math
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
--- /dev/null
+###############################################################################
+# Copyright (c) 2014 Ericsson
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Ericsson - Initial API and implementation
+###############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ plugin.properties,\
+ about.html,\
+ .
+src.includes = about.html
+additional.bundles = org.eclipse.jdt.annotation
+jars.extra.classpath = platform:/plugin/org.eclipse.jdt.annotation
--- /dev/null
+###############################################################################
+# Copyright (c) 2014 Ericsson
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Ericsson - Initial API and implementation
+###############################################################################
+
+Bundle-Vendor = Eclipse Trace Compass
+Bundle-Name = Trace Compass Pcap Parser Core Plug-in
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2014, Ericsson
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+-->
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>org.eclipse.tracecompass</artifactId>
+ <groupId>org.eclipse.tracecompass</groupId>
+ <version>3.2.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>org.eclipse.tracecompass.pcap.core</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+
+ <name>Trace Compass Pcap Parser Core Plug-in</name>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <groupId>org.eclipse.tracecompass</groupId>
+</project>
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.annotation.Nullable;
+import org.osgi.framework.BundleContext;
+
+/**
+ * <b><u>Activator</u></b>
+ * <p>
+ * The activator class controls the plug-in life cycle
+ */
+public final class Activator extends Plugin {
+
+ // ------------------------------------------------------------------------
+ // Attributes
+ // ------------------------------------------------------------------------
+
+ /**
+ * The plug-in ID
+ */
+ public static final String PLUGIN_ID = "org.eclipse.linuxtools.pcap.core"; //$NON-NLS-1$
+
+ /**
+ * The shared instance
+ */
+ private static @Nullable Activator plugin;
+
+ // ------------------------------------------------------------------------
+ // Constructors
+ // ------------------------------------------------------------------------
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ // ------------------------------------------------------------------------
+ // Accessors
+ // ------------------------------------------------------------------------
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static @Nullable Activator getDefault() {
+ return plugin;
+ }
+
+ // ------------------------------------------------------------------------
+ // Operators
+ // ------------------------------------------------------------------------
+
+ @Override
+ public void start(@Nullable BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(@Nullable BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Logs a message with severity INFO in the runtime log of the plug-in.
+ *
+ * @param message A message to log
+ */
+ public void logInfo(String message) {
+ getLog().log(new Status(IStatus.INFO, PLUGIN_ID, message));
+ }
+
+ /**
+ * Logs a message and exception with severity INFO in the runtime log of the plug-in.
+ *
+ * @param message A message to log
+ * @param exception A exception to log
+ */
+ public void logInfo(String message, Throwable exception) {
+ getLog().log(new Status(IStatus.INFO, PLUGIN_ID, message, exception));
+ }
+
+ /**
+ * Logs a message and exception with severity WARNING in the runtime log of the plug-in.
+ *
+ * @param message A message to log
+ */
+ public void logWarning(String message) {
+ getLog().log(new Status(IStatus.WARNING, PLUGIN_ID, message));
+ }
+
+ /**
+ * Logs a message and exception with severity WARNING in the runtime log of the plug-in.
+ *
+ * @param message A message to log
+ * @param exception A exception to log
+ */
+ public void logWarning(String message, Throwable exception) {
+ getLog().log(new Status(IStatus.WARNING, PLUGIN_ID, message, exception));
+ }
+
+ /**
+ * Logs a message and exception with severity ERROR in the runtime log of the plug-in.
+ *
+ * @param message A message to log
+ */
+ public void logError(String message) {
+ getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, message));
+ }
+
+ /**
+ * Logs a message and exception with severity ERROR in the runtime log of the plug-in.
+ *
+ * @param message A message to log
+ * @param exception A exception to log
+ */
+ public void logError(String message, Throwable exception) {
+ getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, message, exception));
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.endpoint;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+
+/**
+ * Abstract class that represents an endpoint. An endpoint is an address where a
+ * packet is received or sent. Therefore, it is protocol dependent. For
+ * instance, an Ethernet II endpoint is the MAC address. An Ipv4 endpoint is the
+ * combination of the MAC address and the IP address. This is useful for
+ * building packet streams.
+ *
+ * @author Vincent Perot
+ */
+public abstract class ProtocolEndpoint {
+
+ /**
+ * Empty string for child classes.
+ */
+ protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
+
+ /**
+ * The encapsulating endpoint. Much like packets, endpoints are
+ * encapsulated. The higher the layer of the packet protocol is, the more
+ * parents an endpoint will have.
+ */
+ private final @Nullable ProtocolEndpoint fParentEndpoint;
+
+ /**
+ * Constructor of the {@link ProtocolEndpoint} class. It takes a packet to
+ * get its endpoint. Since every packet has two endpoints (source and
+ * destination), the isSourceEndpoint parameter is used to specify which
+ * endpoint to take.
+ *
+ * @param packet
+ * The packet that contains the endpoints.
+ * @param isSourceEndpoint
+ * Whether to take the source or the destination endpoint of the
+ * packet.
+ */
+ public ProtocolEndpoint(Packet packet, boolean isSourceEndpoint) {
+ Packet parentPacket = packet.getParentPacket();
+ if (parentPacket == null) {
+ fParentEndpoint = null;
+ } else {
+ fParentEndpoint = isSourceEndpoint ?
+ parentPacket.getSourceEndpoint() :
+ parentPacket.getDestinationEndpoint();
+ }
+ }
+
+ /**
+ * Getter method that returns the parent endpoint.
+ *
+ * @return The parent endpoint.
+ */
+ public @Nullable ProtocolEndpoint getParentEndpoint() {
+ return fParentEndpoint;
+ }
+
+ @Override
+ public abstract int hashCode();
+
+ @Override
+ public abstract boolean equals(@Nullable Object obj);
+
+ @Override
+ public abstract String toString();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.endpoint;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+
+/**
+ * Class that represents a pair of endpoints. This is used to find a packet
+ * stream between to endpoints.
+ *
+ * @author Vincent Perot
+ */
+public class ProtocolEndpointPair {
+
+ private final ProtocolEndpoint fEndpointA;
+ private final ProtocolEndpoint fEndpointB;
+
+ /**
+ * Constructor of the class {@link ProtocolEndpointPair}. It constructs a
+ * {@link ProtocolEndpointPair} object from a packet.
+ *
+ * @param packet
+ * The packet that contains the endpoints.
+ */
+ public ProtocolEndpointPair(Packet packet) {
+ fEndpointA = packet.getSourceEndpoint();
+ fEndpointB = packet.getDestinationEndpoint();
+ }
+
+ /**
+ * Getter method that returns the first endpoint of the pair.
+ *
+ * @return The first endpoint.
+ */
+ public ProtocolEndpoint getFirstEndpoint() {
+ return fEndpointA;
+ }
+
+ /**
+ * Getter method that returns the second endpoint of the pair.
+ *
+ * @return The second endpoint.
+ */
+ public ProtocolEndpoint getSecondEndpoint() {
+ return fEndpointB;
+ }
+
+ /**
+ * Constructor of the class {@link ProtocolEndpointPair}. It constructs a
+ * {@link ProtocolEndpointPair} object from two endpoints.
+ *
+ * @param endpointA
+ * The first endpoint.
+ * @param endpointB
+ * The second endpoint.
+ */
+ public ProtocolEndpointPair(ProtocolEndpoint endpointA, ProtocolEndpoint endpointB) {
+ fEndpointA = endpointA;
+ fEndpointB = endpointB;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + fEndpointA.hashCode() * fEndpointB.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof ProtocolEndpointPair)) {
+ return false;
+ }
+ ProtocolEndpointPair other = (ProtocolEndpointPair) obj;
+
+ return (this.fEndpointA.equals(other.fEndpointA) && this.fEndpointB.equals(other.fEndpointB)) ||
+ (this.fEndpointA.equals(other.fEndpointB) && this.fEndpointB.equals(other.fEndpointA));
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.endpoint;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.filter;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+
+/**
+ * Interface used to filter the packets.
+ *
+ * @author Vincent Perot
+ */
+public interface IPacketFilter {
+
+ /**
+ * Accept a packet or not.
+ *
+ * @param packet
+ * the packet to accept or not
+ *
+ * @return The decision regarding the packet.
+ */
+ boolean accepts(Packet packet);
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.filter;
+
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+
+/**
+ * Class used to filter the packets by protocol. This is used, for instance, to
+ * build the packet streams.
+ *
+ * @author Vincent Perot
+ */
+public class PacketFilterByProtocol implements IPacketFilter {
+
+ private final PcapProtocol fProtocol;
+
+ /**
+ * Constructor of the PacketFilterByProtocol class.
+ *
+ * @param protocol
+ * The protocol that the incoming packets must contain.
+ */
+ public PacketFilterByProtocol(PcapProtocol protocol) {
+ fProtocol = protocol;
+ }
+
+ @Override
+ public boolean accepts(Packet packet) {
+ return packet.hasProtocol(fProtocol);
+ }
+
+ /**
+ * Getter method for the protocol of this filter.
+ *
+ * @return The protocol of this filter.
+ */
+ public PcapProtocol getProtocol() {
+ return fProtocol;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.filter;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.packet;
+
+/**
+ * Exception that is thrown when Packet is erroneous. This is different than an
+ * invalid packet. An invalid packet contains bad fields (such as bad checksum)
+ * and does not throw exceptions while an erroneous packet is a packet that is
+ * impossible to obtain. For instance, an erroneous packet can be smaller than
+ * the minimum required size. Erroneous packets throw BadPacketExceptions.
+ *
+ * @author Vincent Perot
+ */
+public class BadPacketException extends Exception {
+
+ private static final long serialVersionUID = 7071588720009577619L;
+
+ /**
+ * Default constructor with no message.
+ */
+ public BadPacketException() {
+ super();
+ }
+
+ /**
+ * Constructor with an attached message.
+ *
+ * @param message
+ * The message attached to this exception
+ */
+ public BadPacketException(String message) {
+ super(message);
+ }
+
+ /**
+ * Re-throw an exception into this type.
+ *
+ * @param e
+ * The previous Exception we caught
+ */
+ public BadPacketException(Exception e) {
+ super(e);
+ }
+
+ /**
+ * Constructor with an attached message and re-throw an exception into this
+ * type.
+ *
+ * @param message
+ * The message attached to this exception
+ * @param exception
+ * The previous Exception caught
+ */
+ public BadPacketException(String message, Throwable exception) {
+ super(message, exception);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.packet;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4.IPv4Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+
+// TODO For all packets, make checks on dimension.
+// TODO maybe add a invalid packet type?
+
+/**
+ * Abstract class that implements the methods that are common to every packets.
+ *
+ * @author Vincent Perot
+ */
+public abstract class Packet {
+
+ /** Empty string */
+ protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
+
+ /** The Pcap File to which this packet belong */
+ private final PcapFile fPcapFile;
+
+ /** The parent packet of this packet */
+ private final @Nullable Packet fParentPacket;
+
+ /** The protocol that this packet uses */
+ private final PcapProtocol fProtocol;
+
+ /**
+ * Constructor of the Packet Class.
+ *
+ * @param file
+ * The file to which this packet belongs.
+ * @param parent
+ * The parent packet of this packet.
+ * @param protocol
+ * The protocol of the packet.
+ */
+ public Packet(PcapFile file, @Nullable Packet parent, PcapProtocol protocol) {
+ fPcapFile = file;
+ fParentPacket = parent;
+ fProtocol = protocol;
+ }
+
+ /**
+ * Getter method for the Pcap File that contains this packet.
+ *
+ * @return The Pcap File.
+ */
+ public PcapFile getPcapFile() {
+ return fPcapFile;
+ }
+
+ /**
+ * Method that returns the parent (encapsulating) packet of this packet.
+ * This method returns null if the packet is a Pcap Packet (highest level of
+ * encapsulation).
+ *
+ * @return The parent packet.
+ */
+ public @Nullable Packet getParentPacket() {
+ return fParentPacket;
+ }
+
+ /**
+ * Method that returns the child (encapsulated) packet of this packet. This
+ * method returns null if the packet is at the lowest level of
+ * encapsulation.
+ *
+ * @return The child packet.
+ */
+ public abstract @Nullable Packet getChildPacket();
+
+ /**
+ * Getter method for the protocol of the packet.
+ *
+ * @return The protocol of the packet.
+ */
+ public PcapProtocol getProtocol() {
+ return fProtocol;
+ }
+
+ /**
+ * Getter method for the payload of the packet. Returns null if there is no
+ * payload.
+ *
+ * @return the payload of the packet.
+ */
+ public abstract @Nullable ByteBuffer getPayload();
+
+ /**
+ * Method that looks for the packet that respects the specified protocol. It
+ * will go through all the layers of encapsulation and return the wanted
+ * packet, or null if the protocol is not present.
+ *
+ * @param protocol
+ * The specified protocol.
+ * @return The packet that respects the protocol.
+ */
+ public final @Nullable Packet getPacket(PcapProtocol protocol) {
+
+ Packet wantedPacket = this;
+
+ while (wantedPacket != null) {
+ if (wantedPacket.getProtocol() == protocol) {
+ return wantedPacket;
+ }
+ wantedPacket = wantedPacket.getParentPacket();
+ }
+ wantedPacket = this.getChildPacket();
+
+ while (wantedPacket != null) {
+ if (wantedPacket.getProtocol() == protocol) {
+ return wantedPacket;
+ }
+ wantedPacket = wantedPacket.getChildPacket();
+ }
+
+ return null;
+ }
+
+ /**
+ * Method that looks if the protocol is contained in the packet, or in one
+ * of the encapsulating/encapsulated packet. It will go through all the
+ * layers of encapsulation and return true if it finds the specified
+ * protocol, and false otherwise. *
+ *
+ * @param protocol
+ * The specified protocol.
+ * @return The presence of the protocol.
+ */
+ public final boolean hasProtocol(PcapProtocol protocol) {
+
+ // TODO Verify inputs
+ Packet wantedPacket = this;
+
+ while (wantedPacket != null) {
+ if (wantedPacket.getProtocol() == protocol) {
+ return true;
+ }
+ wantedPacket = wantedPacket.getParentPacket();
+ }
+ wantedPacket = this.getChildPacket();
+
+ while (wantedPacket != null) {
+ if (wantedPacket.getProtocol() == protocol) {
+ return true;
+ }
+ wantedPacket = wantedPacket.getChildPacket();
+ }
+
+ return false;
+ }
+
+ /**
+ * Method that returns the most encapsulated packet possible. If the global
+ * packet contains the protocol Unknown, it will stop at the packet just
+ * before this protocol. This is because the {@link UnknownPacket} can be
+ * considered as plain payload.
+ *
+ * @return The most encapsulated packet.
+ */
+ public Packet getMostEcapsulatedPacket() {
+ @NonNull Packet packet = this;
+ while (packet.getProtocol() != PcapProtocol.UNKNOWN) {
+ Packet childPacket = packet.getChildPacket();
+ if (childPacket == null || childPacket.getProtocol() == PcapProtocol.UNKNOWN) {
+ break;
+ }
+ packet = childPacket;
+ }
+ return packet;
+ }
+
+ /**
+ * Method that look at the validity of the different fields (such as
+ * checksum). This is protocol dependent and is used to identify bad
+ * packets.
+ *
+ * @return The validity of the packet.
+ */
+ public abstract boolean validate();
+
+ /**
+ * Internal method that is used to find the child packet. This is protocol
+ * dependent and must be implemented by each packet class.
+ *
+ * @return The child packet.
+ * @throws BadPacketException
+ * Thrown when the packet is erroneous.
+ */
+ protected abstract @Nullable Packet findChildPacket() throws BadPacketException;
+
+ /**
+ * This method returns the source endpoint of this packet. The endpoint is
+ * equivalent to the address of this packet, and is protocol dependent. For
+ * instance, a UDP endpoint is the combination of the MAC address, the IP
+ * address and the port number.
+ *
+ * @return The source endpoint of this packet.
+ */
+ public abstract ProtocolEndpoint getSourceEndpoint();
+
+ /**
+ * This method returns the destination endpoint of this packet. The endpoint
+ * is equivalent to the address of this packet, and is protocol dependent.
+ * For instance, a UDP endpoint is the combination of the MAC address, the
+ * IP address and the port number.
+ *
+ * @return The destination endpoint of this packet.
+ */
+ public abstract ProtocolEndpoint getDestinationEndpoint();
+
+ /**
+ * Method that returns all the fields of the packet as a Map<Field ID, Field
+ * Value>. All child classes of {@link Packet} must implement this method.
+ *
+ * @return All the packet fields as a map.
+ */
+ public abstract Map<String, String> getFields();
+
+ /**
+ * Method that returns a short summary of the local packet, such as the most
+ * useful information.
+ *
+ * For instance, a possible summary string of an {@link IPv4Packet} can be:
+ * "Src: 192.168.0.1, Dst: 192.168.1.12".
+ *
+ * @return A short summary of the local packet, as a string.
+ */
+ public abstract String getLocalSummaryString();
+
+ /**
+ * Method that returns the local meaning of a packet, based on its fields.
+ *
+ * For instance, a possible signification of an ARP packet can be:
+ * "Who has 192.168.1.12? Tell 192.168.0.1".
+ *
+ * @return The local meaning of the packet, as a string.
+ */
+ protected abstract String getSignificationString();
+
+ /**
+ * Method that returns the global meaning of the packet. As such, it will
+ * look for the most relevant packet and display its signification.
+ *
+ * For instance, a possible signification of an ARP packet can be:
+ * "Who has 192.168.1.12? Tell 192.168.0.1".
+ *
+ * @return The meaning of the global packet, as a string.
+ */
+ public final String getGlobalSummaryString() {
+ Packet packet = this.getMostEcapsulatedPacket();
+ return packet.getSignificationString();
+ }
+
+ @Override
+ public abstract boolean equals(@Nullable Object obj);
+
+ @Override
+ public abstract int hashCode();
+
+ /**
+ * Method that is used by child packet classes to verify if a bit is set.
+ *
+ * @param value
+ * the byte containing the flags.
+ * @param bit
+ * the bit index.
+ * @return Whether the bit is set or not.
+ */
+ protected static final boolean isBitSet(byte value, int bit) {
+ if (bit < 0 || bit > 7) {
+ throw new IllegalArgumentException("The byte index is not valid!"); //$NON-NLS-1$
+ }
+ return ((value >>> bit & 0b1) == 0b1);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.packet;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Enumeration used for describing the different known protocols.
+ *
+ * @author Vincent Perot
+ */
+public enum PcapProtocol {
+
+ // Layer 0
+ /**
+ * The Pcap Protocol is not a real protocol but is used as an helper to
+ * generate Pcap packets.
+ */
+ PCAP("Packet Capture", "pcap", Layer.LAYER_0, false), //$NON-NLS-1$ //$NON-NLS-2$
+
+ // Layer 1
+ // Should always be empty.
+
+ // Layer 2
+ /**
+ * The description of the Ethernet II Protocol.
+ */
+ ETHERNET_II("Ethernet II", "eth", Layer.LAYER_2, true), //$NON-NLS-1$ //$NON-NLS-2$
+
+ // Layer 3
+ /**
+ * The description of the Internet Protocol Version 4.
+ */
+ IPV4("Internet Protocol Version 4", "ipv4", Layer.LAYER_3, true), //$NON-NLS-1$ //$NON-NLS-2$
+
+ // Layer 4
+ /**
+ * The description of the Transmission Control Protocol.
+ */
+ TCP("Transmission Control Protocol", "tcp", Layer.LAYER_4, true), //$NON-NLS-1$ //$NON-NLS-2$
+ /**
+ * The description of the User Datagram Protocol.
+ */
+ UDP("User Datagram Protocol", "udp", Layer.LAYER_4, true), //$NON-NLS-1$ //$NON-NLS-2$
+
+ // Layer 5
+
+ // Layer 6
+
+ // Layer 7
+ /**
+ * This protocol is used as an helper if the protocol of a packet is not
+ * recognized. Since all its data goes into payload, it can also be seen as
+ * a "payload packet". This is considered to be on layer 7 since its always
+ * the most encapsulated packet if present.
+ */
+ UNKNOWN("Payload", "???", Layer.LAYER_7, false); //$NON-NLS-1$ //$NON-NLS-2$
+
+
+ /**
+ * Enum that lists constants related to protocols/layers.
+ *
+ * See http://en.wikipedia.org/wiki/OSI_model#Description_of_OSI_layers.
+ *
+ * @author Vincent Perot
+ */
+ public static enum Layer {
+
+ /**
+ * Layer 0. This layer is not an OSI layer but is used as an helper to store
+ * the pseudo-protocol PCAP.
+ */
+ LAYER_0,
+
+ /** Layer 1 of the OSI model */
+ LAYER_1,
+
+ /** Layer 2 of the OSI model */
+ LAYER_2,
+
+ /** Layer 3 of the OSI model */
+ LAYER_3,
+
+ /** Layer 4 of the OSI model */
+ LAYER_4,
+
+ /** Layer 5 of the OSI model */
+ LAYER_5,
+
+ /** Layer 6 of the OSI model */
+ LAYER_6,
+
+ /** Layer 7 of the OSI model */
+ LAYER_7;
+ }
+
+
+ // Fields
+ private final String fName;
+ private final String fShortName;
+ private final Layer fLayer;
+ private final boolean fSupportsStream;
+
+ private PcapProtocol(String name, String shortName, Layer layer, boolean supportsStream) {
+ fName = name;
+ fShortName = shortName;
+ fLayer = layer;
+ fSupportsStream = supportsStream;
+ }
+
+ /**
+ * Getter method for the long name of the protocol.
+ *
+ * @return The long name of the protocol, as a string.
+ */
+ public String getName() {
+ return fName;
+ }
+
+ /**
+ * Getter method for the short name of the protocol.
+ *
+ * @return The short name of the protocol, as a string.
+ */
+ public String getShortName() {
+ return fShortName;
+ }
+
+ /**
+ * Getter method for the OSI layer of the protocol.
+ *
+ * @return The layer of the protocol.
+ */
+ public Layer getLayer() {
+ return fLayer;
+ }
+
+ /**
+ * Getter method that indicates if the protocol supports streams.
+ *
+ * @return Whether the protocol supports streams or not.
+ */
+ public boolean supportsStream() {
+ return fSupportsStream;
+ }
+
+ // TODO make an immutable list that holds this data instead of computing it
+ // everytime.
+
+ /**
+ * Method that returns a list of all the protocols included in a certain OSI
+ * layer.
+ *
+ * @param layer
+ * The layer of the protocols.
+ * @return The protocols on that layer.
+ */
+ public static Collection<PcapProtocol> getProtocolsOnLayer(Layer layer) {
+ List<PcapProtocol> protocolsOnLayer = new ArrayList<>();
+ for (PcapProtocol p : PcapProtocol.values()) {
+ if (p.getLayer() == layer) {
+ protocolsOnLayer.add(p);
+ }
+ }
+ return protocolsOnLayer;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2;
+
+import java.util.Arrays;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
+import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
+
+/**
+ * Class that extends the {@link ProtocolEndpoint} class. It represents the
+ * endpoint at an Ethernet II level.
+ *
+ * @author Vincent Perot
+ */
+public class EthernetIIEndpoint extends ProtocolEndpoint {
+
+ private final byte[] fMacAddress;
+
+ /**
+ * Constructor of the {@link EthernetIIEndpoint} class. It takes a packet to
+ * get its endpoint. Since every packet has two endpoints (source and
+ * destination), the isSourceEndpoint parameter is used to specify which
+ * endpoint to take.
+ *
+ * @param packet
+ * The packet that contains the endpoints.
+ * @param isSourceEndpoint
+ * Whether to take the source or the destination endpoint of the
+ * packet.
+ */
+ public EthernetIIEndpoint(EthernetIIPacket packet, boolean isSourceEndpoint) {
+ super(packet, isSourceEndpoint);
+ fMacAddress = isSourceEndpoint ? packet.getSourceMacAddress() : packet.getDestinationMacAddress();
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint == null) {
+ result = 0;
+ } else {
+ result = endpoint.hashCode();
+ }
+ result = prime * result + Arrays.hashCode(fMacAddress);
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof EthernetIIEndpoint)) {
+ return false;
+ }
+
+ EthernetIIEndpoint other = (EthernetIIEndpoint) obj;
+
+ // Check on layer
+ boolean localEquals = Arrays.equals(fMacAddress, other.fMacAddress);
+ if (!localEquals) {
+ return false;
+ }
+
+ // Check above layers.
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint != null) {
+ return endpoint.equals(other.getParentEndpoint());
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint == null) {
+ return ConversionHelper.toMacAddress(fMacAddress);
+ }
+ return (endpoint.toString().equals(EMPTY_STRING) ?
+ ConversionHelper.toMacAddress(fMacAddress) :
+ endpoint.toString() + '/' + ConversionHelper.toMacAddress(fMacAddress));
+
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4.IPv4Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
+import org.eclipse.linuxtools.internal.pcap.core.util.EthertypeHelper;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Class that represents an Ethernet II packet. This should be called an
+ * Ethernet frame, but in order to keep the nomenclature consistent, this is
+ * called a packet.
+ *
+ * @author Vincent Perot
+ */
+public class EthernetIIPacket extends Packet {
+
+ private final @Nullable Packet fChildPacket;
+ private final @Nullable ByteBuffer fPayload;
+
+ /* We store MAC addresses as byte arrays since
+ * there is no standard java class to store them. */
+ private final byte[] fSourceMacAddress;
+ private final byte[] fDestinationMacAddress;
+
+ private final int fType;
+
+ private @Nullable EthernetIIEndpoint fSourceEndpoint;
+ private @Nullable EthernetIIEndpoint fDestinationEndpoint;
+
+ private @Nullable ImmutableMap<String, String> fFields;
+
+ /**
+ * Constructor of the Ethernet Packet class.
+ *
+ * @param file
+ * The file that contains this packet.
+ * @param parent
+ * The parent packet of this packet (the encapsulating packet).
+ * @param packet
+ * The entire packet (header and payload).
+ * @throws BadPacketException
+ * Thrown when the packet is erroneous.
+ */
+ public EthernetIIPacket(PcapFile file, @Nullable Packet parent, ByteBuffer packet) throws BadPacketException {
+ super(file, parent, PcapProtocol.ETHERNET_II);
+
+ if (packet.array().length <= EthernetIIValues.ETHERNET_II_MIN_SIZE) {
+ throw new BadPacketException("An Ethernet II packet can't be smaller than 14 bytes."); //$NON-NLS-1$
+ }
+
+ // The endpoints are lazy loaded. They are defined in the get*Endpoint()
+ // methods.
+ fSourceEndpoint = null;
+ fDestinationEndpoint = null;
+
+ fFields = null;
+
+ fDestinationMacAddress = new byte[EthernetIIValues.MAC_ADDRESS_SIZE];
+ fSourceMacAddress = new byte[EthernetIIValues.MAC_ADDRESS_SIZE];
+ packet.order(ByteOrder.BIG_ENDIAN);
+ packet.position(0);
+ packet.get(fDestinationMacAddress);
+ packet.get(fSourceMacAddress);
+ fType = ConversionHelper.unsignedShortToInt(packet.getShort());
+
+ // Get payload if it exists.
+ if (packet.array().length - packet.position() > 0) {
+ byte[] array = new byte[packet.array().length - packet.position()];
+ packet.get(array);
+ ByteBuffer payload = ByteBuffer.wrap(array);
+ if (payload != null) {
+ payload.order(ByteOrder.BIG_ENDIAN);
+ payload.position(0);
+ }
+ fPayload = payload;
+
+ } else {
+ fPayload = null;
+ }
+
+ // Find child
+ fChildPacket = findChildPacket();
+
+ }
+
+ @Override
+ public @Nullable Packet getChildPacket() {
+ return fChildPacket;
+ }
+
+ @Override
+ public @Nullable ByteBuffer getPayload() {
+ return fPayload;
+ }
+
+ /**
+ * Getter method for the source MAC Address.
+ *
+ * @return The source MAC address.
+ */
+ public byte[] getSourceMacAddress() {
+ @SuppressWarnings("null")
+ @NonNull byte[] mac = Arrays.copyOf(fSourceMacAddress, fSourceMacAddress.length);
+ return mac;
+ }
+
+ /**
+ * Getter method for the destination MAC Address.
+ *
+ * @return The destination MAC address.
+ */
+ public byte[] getDestinationMacAddress() {
+ @SuppressWarnings("null")
+ @NonNull byte[] mac = Arrays.copyOf(fDestinationMacAddress, fDestinationMacAddress.length);
+ return mac;
+ }
+
+ /**
+ * Getter method for Ethertype. See
+ * http://standards.ieee.org/develop/regauth/ethertype/eth.txt
+ *
+ * @return The Ethertype. This is used to determine the child packet..
+ */
+ public int getEthertype() {
+ return fType;
+ }
+
+ @Override
+ protected @Nullable Packet findChildPacket() throws BadPacketException {
+ // TODO Add more protocols.
+ ByteBuffer payload = fPayload;
+ if (payload == null) {
+ return null;
+ }
+ switch (fType) {
+ case EthertypeHelper.ETHERTYPE_IPV4:
+ return new IPv4Packet(getPcapFile(), this, payload);
+ default:
+ return new UnknownPacket(getPcapFile(), this, payload);
+ }
+ }
+
+ @Override
+ public String toString() {
+ String string = getProtocol().getName() + ", Source: " + ConversionHelper.toMacAddress(fSourceMacAddress) + //$NON-NLS-1$
+ ", Destination: " + ConversionHelper.toMacAddress(fDestinationMacAddress) + ", Type: " + //$NON-NLS-1$ //$NON-NLS-2$
+ EthertypeHelper.toEtherType(fType) + "\n"; //$NON-NLS-1$
+ final Packet child = fChildPacket;
+ if (child != null) {
+ return string + child.toString();
+ }
+ return string;
+ }
+
+ @Override
+ public boolean validate() {
+ // Not yet implemented. ATM, we consider that all packets are valid.
+ // This is the case for all packets.
+ // TODO Implement it.
+ return true;
+ }
+
+ @Override
+ public EthernetIIEndpoint getSourceEndpoint() {
+ @Nullable EthernetIIEndpoint endpoint = fSourceEndpoint;
+ if (endpoint == null) {
+ endpoint = new EthernetIIEndpoint(this, true);
+ }
+ fSourceEndpoint = endpoint;
+ return fSourceEndpoint;
+ }
+
+ @Override
+ public EthernetIIEndpoint getDestinationEndpoint() {
+ @Nullable EthernetIIEndpoint endpoint = fDestinationEndpoint;
+
+ if (endpoint == null) {
+ endpoint = new EthernetIIEndpoint(this, false);
+ }
+ fDestinationEndpoint = endpoint;
+ return fDestinationEndpoint;
+ }
+
+ @Override
+ public Map<String, String> getFields() {
+ ImmutableMap<String, String> map = fFields;
+ if (map == null) {
+ @SuppressWarnings("null")
+ @NonNull ImmutableMap<String, String> newMap = ImmutableMap.<String, String> builder()
+ .put("Source MAC Address", ConversionHelper.toMacAddress(fSourceMacAddress)) //$NON-NLS-1$
+ .put("Destination MAC Address", ConversionHelper.toMacAddress(fDestinationMacAddress)) //$NON-NLS-1$
+ .put("Ethertype", String.valueOf(EthertypeHelper.toEtherType(fType))) //$NON-NLS-1$
+ .build();
+ fFields = newMap;
+ return newMap;
+ }
+ return map;
+ }
+
+ @Override
+ public String getLocalSummaryString() {
+ return "Src: " + ConversionHelper.toMacAddress(fSourceMacAddress) + " , Dst: " + ConversionHelper.toMacAddress(fDestinationMacAddress); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ protected String getSignificationString() {
+ return "Source MAC: " + ConversionHelper.toMacAddress(fSourceMacAddress) + " , Destination MAC: " + ConversionHelper.toMacAddress(fDestinationMacAddress); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ final Packet child = fChildPacket;
+ if (child != null) {
+ result = prime * result + child.hashCode();
+ } else {
+ result = prime * result;
+ }
+ result = prime * result + Arrays.hashCode(fDestinationMacAddress);
+ final ByteBuffer payload = fPayload;
+ if (payload != null) {
+ result = prime * result + payload.hashCode();
+ } else {
+ result = prime * result;
+ }
+ result = prime * result + Arrays.hashCode(fSourceMacAddress);
+ result = prime * result + fType;
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ EthernetIIPacket other = (EthernetIIPacket) obj;
+ if (fChildPacket == null) {
+ if (other.fChildPacket != null) {
+ return false;
+ }
+ } else {
+ final Packet child = fChildPacket;
+ if (child != null) {
+ if (!child.equals(other.fChildPacket)) {
+ return false;
+ }
+ } else {
+ if (other.fChildPacket != null) {
+ return false;
+ }
+ }
+ }
+ if (!Arrays.equals(fDestinationMacAddress, other.fDestinationMacAddress)) {
+ return false;
+ }
+ if (fPayload == null) {
+ if (other.fPayload != null) {
+ return false;
+ }
+ } else {
+ final ByteBuffer payload = fPayload;
+ if (payload != null) {
+ if (!payload.equals(other.fPayload)) {
+ return false;
+ }
+ } else {
+ if (other.fPayload != null) {
+ return false;
+ }
+ }
+ }
+ if (!Arrays.equals(fSourceMacAddress, other.fSourceMacAddress)) {
+ return false;
+ }
+ if (fType != other.fType) {
+ return false;
+ }
+ return true;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2;
+
+/**
+ * Interface that lists constants related to Ethernet II.
+ *
+ * See http://en.wikipedia.org/wiki/Ethernet_frame#Ethernet_II.
+ *
+ * @author Vincent Perot
+ */
+public interface EthernetIIValues {
+
+ /** Size in bytes of a MAC address */
+ int MAC_ADDRESS_SIZE = 6;
+
+ /** Size in bytes of the ethertype field */
+ int ETHERTYPE_SIZE = 4;
+
+ /** Size in bytes of the CRC checksum */
+ int CRC_CHECKSUM_SIZE = 4;
+
+ /** Maximum size in bytes of a entire Ethernet II Frame */
+ int ETHERNET_II_MAX_SIZE = 1518;
+
+ /** Minimum size in bytes of a entire Ethernet II Frame */
+ int ETHERNET_II_MIN_SIZE = 14;
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4;
+
+import java.net.Inet4Address;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
+
+/**
+ * Class that extends the {@link ProtocolEndpoint} class. It represents the
+ * endpoint at an IPv4 level.
+ *
+ * @author Vincent Perot
+ */
+public class IPv4Endpoint extends ProtocolEndpoint {
+
+ private final Inet4Address fIPAddress;
+
+ /**
+ * Constructor of the {@link IPv4Endpoint} class. It takes a packet to get
+ * its endpoint. Since every packet has two endpoints (source and
+ * destination), the isSourceEndpoint parameter is used to specify which
+ * endpoint to take.
+ *
+ * @param packet
+ * The packet that contains the endpoints.
+ * @param isSourceEndpoint
+ * Whether to take the source or the destination endpoint of the
+ * packet.
+ */
+ public IPv4Endpoint(IPv4Packet packet, boolean isSourceEndpoint) {
+ super(packet, isSourceEndpoint);
+ fIPAddress = isSourceEndpoint ? packet.getSourceIpAddress() : packet.getDestinationIpAddress();
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint == null) {
+ result = 0;
+ } else {
+ result = endpoint.hashCode();
+ }
+
+ result = prime * result + fIPAddress.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof IPv4Endpoint)) {
+ return false;
+ }
+
+ IPv4Endpoint other = (IPv4Endpoint) obj;
+
+ // Check on layer
+ boolean localEquals = fIPAddress.equals(other.fIPAddress);
+ if (!localEquals) {
+ return false;
+ }
+
+ // Check above layers.
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint != null) {
+ return endpoint.equals(other.getParentEndpoint());
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint == null) {
+ @SuppressWarnings("null")
+ @NonNull String ret = fIPAddress.getHostAddress();
+ return ret;
+ }
+ return endpoint.toString() + '/' + fIPAddress.getHostAddress();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.tcp.TCPPacket;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.udp.UDPPacket;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
+import org.eclipse.linuxtools.internal.pcap.core.util.IPProtocolNumberHelper;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
+
+/**
+ * Class that represents an Ethernet II packet.
+ *
+ * @author Vincent Perot
+ */
+public class IPv4Packet extends Packet {
+
+ private final @Nullable Packet fChildPacket;
+ private final @Nullable ByteBuffer fPayload;
+
+ private final int fVersion;
+ private final int fInternetHeaderLength; // in 4 bytes blocks
+ private final int fDSCP;
+ private final int fExplicitCongestionNotification;
+ private final int fTotalLength; // in bytes
+ private final int fIdentification;
+ private final boolean fReservedFlag;
+ private final boolean fDontFragmentFlag;
+ private final boolean fMoreFragmentFlag;
+ private final int fFragmentOffset;
+ private final int fTimeToLive;
+ private final int fIpDatagramProtocol;
+ private final int fHeaderChecksum;
+ private final Inet4Address fSourceIpAddress;
+ private final Inet4Address fDestinationIpAddress;
+ private final @Nullable byte[] fOptions;
+
+ private @Nullable IPv4Endpoint fSourceEndpoint;
+ private @Nullable IPv4Endpoint fDestinationEndpoint;
+
+ private @Nullable ImmutableMap<String, String> fFields;
+
+ // TODO Interpret options. See
+ // http://www.iana.org/assignments/ip-parameters/ip-parameters.xhtml
+
+ /**
+ * Constructor of the IPv4 Packet class.
+ *
+ * @param file
+ * The file that contains this packet.
+ * @param parent
+ * The parent packet of this packet (the encapsulating packet).
+ * @param packet
+ * The entire packet (header and payload).
+ * @throws BadPacketException
+ * Thrown when the packet is erroneous.
+ */
+ public IPv4Packet(PcapFile file, @Nullable Packet parent, ByteBuffer packet) throws BadPacketException {
+ super(file, parent, PcapProtocol.IPV4);
+
+ // The endpoints are lazy loaded. They are defined in the get*Endpoint()
+ // methods.
+ fSourceEndpoint = null;
+ fDestinationEndpoint = null;
+
+ fFields = null;
+
+ packet.order(ByteOrder.BIG_ENDIAN);
+ packet.position(0);
+
+ byte storage = packet.get();
+ fVersion = ((storage & 0xF0) >> 4) & 0x000000FF;
+ fInternetHeaderLength = storage & 0x0F;
+
+ storage = packet.get();
+ fDSCP = ((storage & 0b11111100) >> 2) & 0x000000FF;
+ fExplicitCongestionNotification = storage & 0b00000011;
+
+ fTotalLength = ConversionHelper.unsignedShortToInt(packet.getShort());
+ fIdentification = ConversionHelper.unsignedShortToInt(packet.getShort());
+
+ storage = packet.get();
+ fReservedFlag = isBitSet(storage, 7);
+ fDontFragmentFlag = isBitSet(storage, 6);
+ fMoreFragmentFlag = isBitSet(storage, 5);
+ int msb = ((storage & 0b00011111) << 8);
+ int lsb = ConversionHelper.unsignedByteToInt(packet.get());
+ fFragmentOffset = msb + lsb;
+
+ fTimeToLive = ConversionHelper.unsignedByteToInt(packet.get());
+ fIpDatagramProtocol = ConversionHelper.unsignedByteToInt(packet.get());
+ fHeaderChecksum = ConversionHelper.unsignedShortToInt(packet.getShort());
+
+ byte[] source = new byte[IPv4Values.IP_ADDRESS_SIZE];
+ byte[] destination = new byte[IPv4Values.IP_ADDRESS_SIZE];
+ packet.get(source);
+ packet.get(destination);
+
+ try {
+ @SuppressWarnings("null")
+ @NonNull Inet4Address sourceIP = (Inet4Address) InetAddress.getByAddress(source);
+ @SuppressWarnings("null")
+ @NonNull Inet4Address destinationIP = (Inet4Address) InetAddress.getByAddress(destination);
+ fSourceIpAddress = sourceIP;
+ fDestinationIpAddress = destinationIP;
+ } catch (UnknownHostException e) {
+ throw new BadPacketException("The IP Address size is not valid!"); //$NON-NLS-1$
+ }
+
+ // Get options if there are any
+ if (fInternetHeaderLength > IPv4Values.DEFAULT_HEADER_LENGTH) {
+ fOptions = new byte[(fInternetHeaderLength - IPv4Values.DEFAULT_HEADER_LENGTH) * IPv4Values.BLOCK_SIZE];
+ packet.get(fOptions);
+ } else {
+ fOptions = null;
+ }
+
+ // Get payload if any.
+ if (packet.array().length - packet.position() > 0) {
+ byte[] array = new byte[packet.array().length - packet.position()];
+ packet.get(array);
+ ByteBuffer payload = ByteBuffer.wrap(array);
+ payload.order(ByteOrder.BIG_ENDIAN);
+ payload.position(0);
+ fPayload = payload;
+ } else {
+ fPayload = null;
+ }
+
+ // Find child
+ fChildPacket = findChildPacket();
+
+ }
+
+ @Override
+ public @Nullable Packet getChildPacket() {
+ return fChildPacket;
+ }
+
+ @Override
+ public @Nullable ByteBuffer getPayload() {
+ return fPayload;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * See http://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
+ */
+ @Override
+ protected @Nullable Packet findChildPacket() throws BadPacketException {
+ // TODO Implement more protocols
+ ByteBuffer payload = fPayload;
+ if (payload == null) {
+ return null;
+ }
+
+ switch (fIpDatagramProtocol) {
+ case IPProtocolNumberHelper.PROTOCOL_NUMBER_TCP:
+ return new TCPPacket(getPcapFile(), this, payload);
+ case IPProtocolNumberHelper.PROTOCOL_NUMBER_UDP:
+ return new UDPPacket(getPcapFile(), this, payload);
+ default:
+ return new UnknownPacket(getPcapFile(), this, payload);
+ }
+
+ }
+
+ @Override
+ public String toString() {
+ // Generate flagString
+ // This is very ugly.
+ String flagString = null;
+
+ if (fReservedFlag && fDontFragmentFlag && fMoreFragmentFlag) { // 111
+ flagString = "Flags: 0x07 (Invalid)"; //$NON-NLS-1$
+ } else if (fReservedFlag && fDontFragmentFlag && !fMoreFragmentFlag) { // 110
+ flagString = "Flags: 0x06 (Invalid)"; //$NON-NLS-1$
+ } else if (fReservedFlag && !fDontFragmentFlag && fMoreFragmentFlag) { // 101
+ flagString = "Flags: 0x05 (Invalid)"; //$NON-NLS-1$
+ } else if (fReservedFlag && !fDontFragmentFlag && !fMoreFragmentFlag) { // 100
+ flagString = "Flags: 0x04 (Invalid)"; //$NON-NLS-1$
+ } else if (!fReservedFlag && fDontFragmentFlag && fMoreFragmentFlag) { // 011
+ flagString = "Flags: 0x03 (Invalid)"; //$NON-NLS-1$
+ } else if (!fReservedFlag && fDontFragmentFlag && !fMoreFragmentFlag) { // 010
+ flagString = "Flags: 0x02 (Don't fragment)"; //$NON-NLS-1$
+ } else if (!fReservedFlag && !fDontFragmentFlag && fMoreFragmentFlag) { // 001
+ flagString = "Flags: 0x01 (More fragments)"; //$NON-NLS-1$
+ } else if (!fReservedFlag && !fDontFragmentFlag && !fMoreFragmentFlag) { // 000
+ flagString = "Flags: 0x00 (Don't have more fragments)"; //$NON-NLS-1$
+ }
+
+ flagString += ", Fragment Offset: " + fFragmentOffset; //$NON-NLS-1$
+
+ // Generate checksum string
+ // TODO calculate the expected checksum from packet
+ String checksumString = "Header Checksum: " + String.format("%s%04x", "0x", fHeaderChecksum); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+
+ String string = getProtocol().getName() + ", Source: " + fSourceIpAddress.getHostAddress() + ", Destination: " + fDestinationIpAddress.getHostAddress() + //$NON-NLS-1$ //$NON-NLS-2$
+ "\nVersion: " + fVersion + ", Identification: " + String.format("%s%04x", "0x", fIdentification) + ", Header Length: " + getHeaderLength() + " bytes, Total Length: " + getTotalLength() + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+ " bytes\nDifferentiated Services Code Point: " + String.format("%s%02x", "0x", fDSCP) + "; Explicit Congestion Notification: " + String.format("%s%02x", "0x", fExplicitCongestionNotification) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+ + "\n" + flagString + "\nTime to live: " + fTimeToLive + //$NON-NLS-1$ //$NON-NLS-2$
+ "\nProtocol: " + fIpDatagramProtocol + "\n" //$NON-NLS-1$ //$NON-NLS-2$
+ + checksumString + "\n"; //$NON-NLS-1$
+ final Packet child = fChildPacket;
+ if (child != null) {
+ return string + child.toString();
+ }
+ return string;
+ }
+
+ /**
+ * Getter method that returns the version of the IP protocol used. This
+ * should always be set to 4 as IPv6 has its own class.
+ *
+ * @return The version of the IP used.
+ */
+ public int getVersion() {
+ return fVersion;
+ }
+
+ /**
+ * Getter method that returns the header length in bytes. In the IPv4
+ * packet, this is specified in 4-bytes data block. By default, this method
+ * returns 20 if there are no options present. Otherwise, it will return a
+ * higher number.
+ *
+ * @return The header length in bytes.
+ */
+ public int getHeaderLength() {
+ return fInternetHeaderLength * IPv4Values.BLOCK_SIZE;
+ }
+
+ /**
+ * Getter method that returns the Differentiated Services Code Point (a.k.a.
+ * the Type of Service). This is useful for some technologies that require
+ * real-time data exchange.
+ *
+ * @return The DSCP
+ */
+ public int getDSCP() {
+ return fDSCP;
+ }
+
+ /**
+ * Getter method that returns the Explicit Congestion Notification (ECN).
+ * This allows end-to-end communication without dropping packets.
+ *
+ * @return The ECN.
+ */
+ public int getExplicitCongestionNotification() {
+ return fExplicitCongestionNotification;
+ }
+
+ /**
+ * Getter method to retrieve the length of the entire packet, in bytes. This
+ * number is according to the packet, and might not be true if the packet is
+ * erroneous.
+ *
+ * @return The total length (packet and payload) in bytes.
+ */
+ public int getTotalLength() {
+ return fTotalLength;
+ }
+
+ /**
+ * Getter method to retrieve the Identification. This is a field that is
+ * used to uniquely identify the packets, thus allowing the reconstruction
+ * of fragmented IP packets.
+ *
+ * @return The packet identification.
+ */
+ public int getIdentification() {
+ return fIdentification;
+ }
+
+ /**
+ * Getter method that returns the state of the Reserved flag. This must
+ * always be zero.
+ *
+ * @return The state of the Reserved flag.
+ */
+ public boolean getReservedFlag() {
+ return fReservedFlag;
+ }
+
+ /**
+ * Getter method that indicates if the packet can be fragmented or not.
+ *
+ * @return Whether the packet can be fragmented or not.
+ */
+ public boolean getDontFragmentFlag() {
+ return fDontFragmentFlag;
+ }
+
+ /**
+ * Getter method that indicates if the packet has more fragments or not.
+ *
+ * @return Whether the packet has more fragments or not.
+ */
+ public boolean getHasMoreFragment() {
+ return fMoreFragmentFlag;
+ }
+
+ /**
+ * Getter method that specify the offset of a particular fragment relative
+ * to the original unfragmented packet, in 8-bytes blocks. *
+ *
+ * @return The fragment offset.
+ */
+ public int getFragmentOffset() {
+ return fFragmentOffset;
+ }
+
+ /**
+ * Getter method that returns the time to live in seconds. In practice, this
+ * is a hop count. This is used to prevent packets from persisting.
+ *
+ * @return The time left to live for the packet.
+ */
+ public int getTimeToLive() {
+ return fTimeToLive;
+ }
+
+ /**
+ * Getter method that returns the encapsulated protocol.
+ *
+ * See http://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
+ *
+ * @return The encapsulated protocol.
+ */
+ public int getIpDatagramProtocol() {
+ return fIpDatagramProtocol;
+ }
+
+ /**
+ * Getter method that returns the checksum, according to the packet. This
+ * checksum might be wrong if the packet is erroneous.
+ *
+ * @return The header checksum.
+ */
+ public int getHeaderChecksum() {
+ return fHeaderChecksum;
+ }
+
+ /**
+ * Getter method that returns the source IP address.
+ *
+ * @return The source IP address, as a byte array in big-endian.
+ */
+ public Inet4Address getSourceIpAddress() {
+ return fSourceIpAddress;
+ }
+
+ /**
+ * Getter method that returns the destination IP address.
+ *
+ * @return The destination IP address, as a byte array in big-endian.
+ */
+ public Inet4Address getDestinationIpAddress() {
+ return fDestinationIpAddress;
+ }
+
+ /**
+ * Getter method that returns the options. This method returns null if no
+ * options are present.
+ *
+ * @return The options of the packet.
+ */
+ public @Nullable byte[] getOptions() {
+ final byte[] options = fOptions;
+ if (options == null) {
+ return null;
+ }
+ return Arrays.copyOf(options, options.length);
+ }
+
+ @Override
+ public boolean validate() {
+ // Not yet implemented. ATM, we consider that all packets are valid.
+ // This is the case for all packets.
+ // TODO Implement it.
+ return true;
+ }
+
+ @Override
+ public IPv4Endpoint getSourceEndpoint() {
+ @Nullable
+ IPv4Endpoint endpoint = fSourceEndpoint;
+ if (endpoint == null) {
+ endpoint = new IPv4Endpoint(this, true);
+ }
+ fSourceEndpoint = endpoint;
+ return fSourceEndpoint;
+ }
+
+ @Override
+ public IPv4Endpoint getDestinationEndpoint() {
+ @Nullable
+ IPv4Endpoint endpoint = fDestinationEndpoint;
+
+ if (endpoint == null) {
+ endpoint = new IPv4Endpoint(this, false);
+ }
+ fDestinationEndpoint = endpoint;
+ return fDestinationEndpoint;
+ }
+
+ @Override
+ public Map<String, String> getFields() {
+ ImmutableMap<String, String> map = fFields;
+ if (map == null) {
+ Builder<String, String> builder = ImmutableMap.<String, String> builder()
+ .put("Version", String.valueOf(fVersion)) //$NON-NLS-1$
+ .put("Header Length", String.valueOf(getHeaderLength()) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
+ .put("Differentiated Services Field", String.format("%s%02x", "0x", fDSCP)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ .put("Explicit Congestion Notification", String.format("%s%02x", "0x", fExplicitCongestionNotification)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ .put("Total Length", String.valueOf(fTotalLength) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
+ .put("Identification", String.format("%s%04x", "0x", fIdentification)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ .put("Don't Fragment Flag", String.valueOf(fDontFragmentFlag)) //$NON-NLS-1$
+ .put("More Fragment Flag", String.valueOf(fMoreFragmentFlag)) //$NON-NLS-1$
+ .put("Fragment Offset", String.valueOf(fFragmentOffset)) //$NON-NLS-1$
+ .put("Time to live", String.valueOf(fTimeToLive)) //$NON-NLS-1$
+ .put("Protocol", IPProtocolNumberHelper.toString(fIpDatagramProtocol) + " (" + String.valueOf(fIpDatagramProtocol) + ")") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ .put("Checksum", String.format("%s%04x", "0x", fHeaderChecksum)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ .put("Source IP Address", fSourceIpAddress.getHostAddress()) //$NON-NLS-1$
+ .put("Destination IP Address", fDestinationIpAddress.getHostAddress()); //$NON-NLS-1$
+ byte[] options = fOptions;
+ if (options == null) {
+ builder.put("Options", EMPTY_STRING); //$NON-NLS-1$
+ } else {
+ builder.put("Options", ConversionHelper.bytesToHex(options, true)); //$NON-NLS-1$
+
+ }
+ @SuppressWarnings("null")
+ @NonNull
+ ImmutableMap<String, String> newMap = builder.build();
+ fFields = newMap;
+ return newMap;
+ }
+ return map;
+ }
+
+ @Override
+ public String getLocalSummaryString() {
+ return "Src: " + fSourceIpAddress.getHostAddress() + " , Dst: " + fDestinationIpAddress.getHostAddress(); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ protected String getSignificationString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(fSourceIpAddress.getHostAddress())
+ .append(" > ") //$NON-NLS-1$
+ .append(fDestinationIpAddress.getHostAddress());
+
+ String flags = generateFlagString();
+ if (!(flags.equals(""))) { //$NON-NLS-1$
+ sb.append(' ')
+ .append('[')
+ .append(flags)
+ .append(']');
+ }
+ sb.append(" Id=") //$NON-NLS-1$
+ .append(fIdentification);
+
+ final ByteBuffer payload = fPayload;
+ if (payload != null) {
+ sb.append(" Len=") //$NON-NLS-1$
+ .append(payload.array().length);
+ } else {
+ sb.append(" Len=0"); //$NON-NLS-1$
+ }
+ String string = sb.toString();
+ if (string == null) {
+ return EMPTY_STRING;
+ }
+ return string;
+ }
+
+ private String generateFlagString() {
+ StringBuilder sb = new StringBuilder();
+ boolean start = true;
+
+ if (fDontFragmentFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("DF"); //$NON-NLS-1$
+ start = false;
+ }
+ if (fMoreFragmentFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("MF"); //$NON-NLS-1$
+ start = false;
+ }
+ String string = sb.toString();
+ if (string == null) {
+ return EMPTY_STRING;
+ }
+ return string;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ final Packet child = fChildPacket;
+ if (child != null) {
+ result = prime * result + child.hashCode();
+ } else {
+ result = prime * result;
+ }
+ result = prime * result + fDSCP;
+ result = prime * result + fDestinationIpAddress.hashCode();
+ result = prime * result + (fDontFragmentFlag ? 1231 : 1237);
+ result = prime * result + fExplicitCongestionNotification;
+ result = prime * result + fFragmentOffset;
+ result = prime * result + fHeaderChecksum;
+ result = prime * result + fIdentification;
+ result = prime * result + fInternetHeaderLength;
+ result = prime * result + fIpDatagramProtocol;
+ result = prime * result + (fMoreFragmentFlag ? 1231 : 1237);
+ result = prime * result + Arrays.hashCode(fOptions);
+ final ByteBuffer payload = fPayload;
+ if (payload != null) {
+ result = prime * result + payload.hashCode();
+ } else {
+ result = prime * result;
+ }
+ result = prime * result + (fReservedFlag ? 1231 : 1237);
+ result = prime * result + fSourceIpAddress.hashCode();
+ result = prime * result + fTimeToLive;
+ result = prime * result + fTotalLength;
+ result = prime * result + fVersion;
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ IPv4Packet other = (IPv4Packet) obj;
+ final Packet child = fChildPacket;
+ if (child != null) {
+ if (!child.equals(other.fChildPacket)) {
+ return false;
+ }
+ } else {
+ if (other.fChildPacket != null) {
+ return false;
+ }
+ }
+
+ if (fDSCP != other.fDSCP) {
+ return false;
+ }
+ if (!(fDestinationIpAddress.equals(other.fDestinationIpAddress))) {
+ return false;
+ }
+ if (fDontFragmentFlag != other.fDontFragmentFlag) {
+ return false;
+ }
+ if (fExplicitCongestionNotification != other.fExplicitCongestionNotification) {
+ return false;
+ }
+ if (fFragmentOffset != other.fFragmentOffset) {
+ return false;
+ }
+ if (fHeaderChecksum != other.fHeaderChecksum) {
+ return false;
+ }
+ if (fIdentification != other.fIdentification) {
+ return false;
+ }
+ if (fInternetHeaderLength != other.fInternetHeaderLength) {
+ return false;
+ }
+ if (fIpDatagramProtocol != other.fIpDatagramProtocol) {
+ return false;
+ }
+ if (fMoreFragmentFlag != other.fMoreFragmentFlag) {
+ return false;
+ }
+ if (!Arrays.equals(fOptions, other.fOptions)) {
+ return false;
+ }
+ final ByteBuffer payload = fPayload;
+ if (payload != null) {
+ if (!payload.equals(other.fPayload)) {
+ return false;
+ }
+ } else {
+ if (other.fPayload != null) {
+ return false;
+ }
+ }
+ if (fReservedFlag != other.fReservedFlag) {
+ return false;
+ }
+ if (!(fSourceIpAddress.equals(other.fSourceIpAddress))) {
+ return false;
+ }
+ if (fTimeToLive != other.fTimeToLive) {
+ return false;
+ }
+ if (fTotalLength != other.fTotalLength) {
+ return false;
+ }
+ if (fVersion != other.fVersion) {
+ return false;
+ }
+ return true;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4;
+
+/**
+ * Interface that lists constants related to Internet Protocol v4.
+ *
+ * See http://en.wikipedia.org/wiki/IPv4#Packet_structure.
+ *
+ * @author Vincent Perot
+ */
+public interface IPv4Values {
+
+ /** Size in bytes of an IP address */
+ int IP_ADDRESS_SIZE = 4;
+
+ /** Size in bytes of a default IPv4 packet header */
+ int DEFAULT_HEADER_LENGTH = 5;
+
+ /** Size in bytes of a block of data. Used to convert data block to bytes */
+ int BLOCK_SIZE = 4;
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.protocol.ipv4;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.protocol;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.pcap;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
+
+/**
+ * Class that extends the {@link ProtocolEndpoint} class. It represents the endpoint at
+ * a Pcap level.
+ *
+ * @author Vincent Perot
+ */
+public class PcapEndpoint extends ProtocolEndpoint {
+
+ /**
+ * Constructor of the {@link PcapEndpoint} class. It takes a packet to get
+ * its endpoint. Since every packet has two endpoints (source and
+ * destination), the isSourceEndpoint parameter is used to specify which
+ * endpoint to take.
+ *
+ * @param packet
+ * The packet that contains the endpoints.
+ * @param isSourceEndpoint
+ * Whether to take the source or the destination endpoint of the
+ * packet.
+ */
+ public PcapEndpoint(PcapPacket packet, boolean isSourceEndpoint) {
+ super(packet, isSourceEndpoint);
+ }
+
+ @Override
+ public int hashCode() {
+ return 0;
+ }
+
+ @Override
+ public String toString() {
+ return EMPTY_STRING;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof PcapEndpoint)) {
+ return false;
+ }
+
+ PcapEndpoint other = (PcapEndpoint) obj;
+
+ // Check above layers.
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint != null) {
+ return endpoint.equals(other.getParentEndpoint());
+ }
+ return true;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.pcap;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIPacket;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFileValues;
+import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
+import org.eclipse.linuxtools.internal.pcap.core.util.LinkTypeHelper;
+import org.eclipse.linuxtools.internal.pcap.core.util.PcapTimestampScale;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Class that represents a Pcap packet. This is the highest level of
+ * encapsulation.
+ *
+ * @author Vincent Perot
+ */
+public class PcapPacket extends Packet {
+
+ private static final int TIMESTAMP_MICROSECOND_MAX = 1000000;
+ private static final int TIMESTAMP_NANOSECOND_MAX = 1000000000;
+
+ private final @Nullable Packet fChildPacket;
+ private final @Nullable ByteBuffer fPayload;
+
+ private final long fTimestamp; // In microseconds
+ private final long fIncludedLength;
+ private final long fOriginalLength;
+ private final long fPacketIndex;
+
+ private @Nullable PcapEndpoint fSourceEndpoint;
+ private @Nullable PcapEndpoint fDestinationEndpoint;
+
+ private @Nullable ImmutableMap<String, String> fFields;
+
+ /**
+ * Constructor of the Pcap Packet class.
+ *
+ * @param file
+ * The file that contains this packet.
+ * @param parent
+ * The parent packet of this packet (the encapsulating packet).
+ * @param header
+ * The header of the packet.
+ * @param payload
+ * The payload of this packet.
+ * @param index
+ * The index of the packet in the file.
+ * @throws BadPacketException
+ * Thrown when the Packet is erroneous.
+ */
+ public PcapPacket(PcapFile file, @Nullable Packet parent, ByteBuffer header, @Nullable ByteBuffer payload, long index) throws BadPacketException {
+ super(file, parent, PcapProtocol.PCAP);
+
+ if (header.array().length < PcapFileValues.PACKET_HEADER_SIZE) {
+ fChildPacket = null;
+ throw new BadPacketException("The Pcap packet header is too small."); //$NON-NLS-1$
+ }
+
+ // The endpoints are lazy loaded. They are defined in the get*Endpoint()
+ // methods.
+ fSourceEndpoint = null;
+ fDestinationEndpoint = null;
+
+ fFields = null;
+
+ fPacketIndex = index;
+
+ // PcapPacket header in File endian
+ header.order(getPcapFile().getByteOrder());
+ header.position(0);
+ long timestampMostSignificant = ConversionHelper.unsignedIntToLong(header.getInt());
+ long timestampLeastSignificant = ConversionHelper.unsignedIntToLong(header.getInt());
+
+ switch (getTimestampScale()) {
+ case MICROSECOND:
+ if (timestampLeastSignificant > TIMESTAMP_MICROSECOND_MAX) {
+ fChildPacket = null;
+ throw new BadPacketException("The timestamp is erroneous."); //$NON-NLS-1$
+ }
+ fTimestamp = TIMESTAMP_MICROSECOND_MAX * timestampMostSignificant + timestampLeastSignificant;
+ break;
+ case NANOSECOND:
+ if (timestampLeastSignificant > TIMESTAMP_NANOSECOND_MAX) {
+ fChildPacket = null;
+ throw new BadPacketException("The timestamp is erroneous."); //$NON-NLS-1$
+ }
+ fTimestamp = TIMESTAMP_NANOSECOND_MAX * timestampMostSignificant + timestampLeastSignificant;
+ break;
+ default:
+ throw new IllegalArgumentException("The timestamp precision is not valid!"); //$NON-NLS-1$
+ }
+
+ fIncludedLength = ConversionHelper.unsignedIntToLong(header.getInt());
+ fOriginalLength = ConversionHelper.unsignedIntToLong(header.getInt());
+
+ // Set up payload
+ final ByteBuffer pcapPacket = payload;
+ if (pcapPacket == null) {
+ fChildPacket = null;
+ fPayload = null;
+ return;
+ }
+
+ pcapPacket.order(ByteOrder.BIG_ENDIAN);
+ pcapPacket.position(0);
+ fPayload = pcapPacket;
+
+ // Find Child Packet
+ fChildPacket = findChildPacket();
+
+ }
+
+ @Override
+ public @Nullable Packet getChildPacket() {
+ return fChildPacket;
+ }
+
+ @Override
+ public @Nullable ByteBuffer getPayload() {
+ return fPayload;
+ }
+
+ /**
+ * Getter method that returns the timestamp of this packet, in microseconds/nanoseconds
+ * relative to epoch.
+ *
+ * @return The timestamp of the packet.
+ */
+ public long getTimestamp() {
+ return fTimestamp;
+ }
+
+ /**
+ * Getter method that returns the length in bytes of the packet that was
+ * included in the {@link PcapFile}.
+ *
+ * @return The included length of the packet.
+ */
+ public long getIncludedLength() {
+ return fIncludedLength;
+ }
+
+ /**
+ * Getter method that returns the original length in bytes of the packet.
+ *
+ * @return The included length of the packet.
+ */
+ public long getOriginalLength() {
+ return fOriginalLength;
+ }
+
+ /**
+ * Method that indicates if this packet was truncated at capture time.
+ *
+ * @return Whether the packet is truncated or not.
+ */
+ public boolean isTruncated() {
+ return fIncludedLength != fOriginalLength;
+ }
+
+ /**
+ * Getter method that returns the index of the packet.
+ *
+ * @return The index of the packet.
+ */
+ public long getIndex() {
+ return fPacketIndex;
+ }
+
+ @Override
+ public String toString() {
+ // TODO Decide if first capture is 0 or 1. Right now, it is 0.
+ String string = getProtocol().getName() + " " + fPacketIndex + //$NON-NLS-1$
+ ": " + fOriginalLength + " bytes on wire, " + //$NON-NLS-1$ //$NON-NLS-2$
+ fIncludedLength + " bytes captured.\nArrival time: " + //$NON-NLS-1$
+ ConversionHelper.toGMTTime(fTimestamp, getTimestampScale()) + "\n"; //$NON-NLS-1$
+
+ final Packet child = fChildPacket;
+ if (child != null) {
+ return string + child.toString();
+ }
+ return string;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * See http://www.tcpdump.org/linktypes.html
+ */
+ @Override
+ protected @Nullable Packet findChildPacket() throws BadPacketException {
+ @Nullable
+ ByteBuffer payload = fPayload;
+ if (payload == null) {
+ return null;
+ }
+
+ switch ((int) getPcapFile().getDataLinkType()) {
+ case LinkTypeHelper.LINKTYPE_ETHERNET:
+ return new EthernetIIPacket(getPcapFile(), this, payload);
+ default: // TODO add more protocols
+ return new UnknownPacket(getPcapFile(), this, payload);
+ }
+ }
+
+ @Override
+ public boolean validate() {
+ // Not yet implemented. ATM, we consider that all packets are valid.
+ // This is the case for all packets.
+ // TODO Implement it.
+ return true;
+ }
+
+ @Override
+ public PcapEndpoint getSourceEndpoint() {
+ @Nullable PcapEndpoint endpoint = fSourceEndpoint;
+ if (endpoint == null) {
+ endpoint = new PcapEndpoint(this, true);
+ }
+ fSourceEndpoint = endpoint;
+ return fSourceEndpoint;
+ }
+
+ @Override
+ public PcapEndpoint getDestinationEndpoint() {
+ @Nullable
+ PcapEndpoint endpoint = fDestinationEndpoint;
+
+ if (endpoint == null) {
+ endpoint = new PcapEndpoint(this, false);
+ }
+ fDestinationEndpoint = endpoint;
+ return fDestinationEndpoint;
+ }
+
+ // TODO handle plural form correctly
+ // TODO microsec
+ @Override
+ public Map<String, String> getFields() {
+ ImmutableMap<String, String> map = fFields;
+ if (map == null) {
+ @SuppressWarnings("null")
+ @NonNull ImmutableMap<String, String> newMap = ImmutableMap.<String, String> builder()
+ .put("Frame", String.valueOf(fPacketIndex)) //$NON-NLS-1$
+ .put("Frame Length", String.valueOf(fOriginalLength) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
+ .put("Capture Length", String.valueOf(fIncludedLength) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
+ .put("Capture Time", ConversionHelper.toGMTTime(fTimestamp, getTimestampScale())) //$NON-NLS-1$
+ .build();
+ fFields = newMap;
+ return newMap;
+ }
+ return map;
+ }
+
+ @Override
+ public String getLocalSummaryString() {
+ return "Frame " + fPacketIndex + ": " + fOriginalLength + " bytes on wire, " + fIncludedLength + " bytes captured"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ }
+
+ @Override
+ protected String getSignificationString() {
+ return "New Frame: " + fOriginalLength + " bytes on wire"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+
+ Packet child = fChildPacket;
+ if (child == null) {
+ result = prime * result;
+ } else {
+ result = prime * result + child.hashCode();
+ }
+
+ result = prime * result + (int) (fIncludedLength ^ (fIncludedLength >>> 32));
+ result = prime * result + (int) (fOriginalLength ^ (fOriginalLength >>> 32));
+ result = prime * result + (int) (fPacketIndex ^ (fPacketIndex >>> 32));
+
+ ByteBuffer payload = fPayload;
+ if (payload == null) {
+ result = prime * result;
+ } else {
+ result = prime * result + payload.hashCode();
+ }
+
+ result = prime * result + (int) (fTimestamp ^ (fTimestamp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ PcapPacket other = (PcapPacket) obj;
+ final Packet child = fChildPacket;
+ if (child != null) {
+ if (!child.equals(other.fChildPacket)) {
+ return false;
+ }
+ } else {
+ if (other.fChildPacket != null) {
+ return false;
+ }
+ }
+
+ if (fIncludedLength != other.fIncludedLength) {
+ return false;
+ }
+ if (fOriginalLength != other.fOriginalLength) {
+ return false;
+ }
+ if (fPacketIndex != other.fPacketIndex) {
+ return false;
+ }
+ final ByteBuffer payload = fPayload;
+ if (payload != null) {
+ if (!payload.equals(other.fPayload)) {
+ return false;
+ }
+ } else {
+ if (other.fPayload != null) {
+ return false;
+ }
+ }
+
+ if (fTimestamp != other.fTimestamp) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Getter method that returns the Timestamp precision of the packet.
+ *
+ * @return the Timestamp precision.
+ */
+ public PcapTimestampScale getTimestampScale() {
+ return getPcapFile().getTimestampPrecision();
+ }
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.protocol.pcap;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.tcp;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
+
+/**
+ * Class that extends the {@link ProtocolEndpoint} class. It represents the
+ * endpoint at a TCP level.
+ *
+ * @author Vincent Perot
+ */
+public class TCPEndpoint extends ProtocolEndpoint {
+
+ private final int fPort;
+
+ /**
+ * Constructor of the {@link TCPEndpoint} class. It takes a packet to get
+ * its endpoint. Since every packet has two endpoints (source and
+ * destination), the isSourceEndpoint parameter is used to specify which
+ * endpoint to take.
+ *
+ * @param packet
+ * The packet that contains the endpoints.
+ * @param isSourceEndpoint
+ * Whether to take the source or the destination endpoint of the
+ * packet.
+ */
+ public TCPEndpoint(TCPPacket packet, boolean isSourceEndpoint) {
+ super(packet, isSourceEndpoint);
+ fPort = isSourceEndpoint ? packet.getSourcePort() : packet.getDestinationPort();
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint == null) {
+ result = 0;
+ } else {
+ result = endpoint.hashCode();
+ }
+ result = prime * result + fPort;
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof TCPEndpoint)) {
+ return false;
+ }
+
+ TCPEndpoint other = (TCPEndpoint) obj;
+
+ // Check on layer
+ boolean localEquals = (fPort == other.fPort);
+ if (!localEquals) {
+ return false;
+ }
+
+ // Check above layers.
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint != null) {
+ return endpoint.equals(other.getParentEndpoint());
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint == null) {
+ @SuppressWarnings("null")
+ @NonNull
+ String ret = String.valueOf(fPort);
+ return ret;
+ }
+ return endpoint.toString() + '/' + fPort;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.tcp;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
+
+/**
+ * Class that represents a TCP packet.
+ *
+ * @author Vincent Perot
+ */
+public class TCPPacket extends Packet {
+
+ private final @Nullable Packet fChildPacket;
+ private final @Nullable ByteBuffer fPayload;
+
+ private final int fSourcePort;
+ private final int fDestinationPort;
+ private final long fSequenceNumber;
+ private final long fAcknowledgmentNumber;
+ private final int fDataOffset; // in 4 bytes block
+ private final byte fReservedField;
+ private final boolean fNSFlag;
+ private final boolean fCWRFlag;
+ private final boolean fECEFlag;
+ private final boolean fURGFlag;
+ private final boolean fACKFlag;
+ private final boolean fPSHFlag;
+ private final boolean fRSTFlag;
+ private final boolean fSYNFlag;
+ private final boolean fFINFlag;
+ private final int fWindowSize;
+ private final int fChecksum;
+ private final int fUrgentPointer;
+ private final @Nullable byte[] fOptions; // TODO Interpret options.
+
+ private @Nullable TCPEndpoint fSourceEndpoint;
+ private @Nullable TCPEndpoint fDestinationEndpoint;
+
+ private @Nullable ImmutableMap<String, String> fFields;
+
+ /**
+ * Constructor of the TCP Packet class.
+ *
+ * @param file
+ * The file that contains this packet.
+ * @param parent
+ * The parent packet of this packet (the encapsulating packet).
+ * @param packet
+ * The entire packet (header and payload).
+ * @throws BadPacketException
+ * Thrown when the packet is erroneous.
+ */
+ public TCPPacket(PcapFile file, @Nullable Packet parent, ByteBuffer packet) throws BadPacketException {
+ super(file, parent, PcapProtocol.TCP);
+
+ // The endpoints are lazy loaded. They are defined in the get*Endpoint()
+ // methods.
+ fSourceEndpoint = null;
+ fDestinationEndpoint = null;
+
+ fFields = null;
+
+ packet.order(ByteOrder.BIG_ENDIAN);
+ packet.position(0);
+
+ fSourcePort = ConversionHelper.unsignedShortToInt(packet.getShort());
+ fDestinationPort = ConversionHelper.unsignedShortToInt(packet.getShort());
+ fSequenceNumber = ConversionHelper.unsignedIntToLong(packet.getInt());
+ fAcknowledgmentNumber = ConversionHelper.unsignedIntToLong(packet.getInt());
+
+ byte storage = packet.get();
+ fDataOffset = ((storage & 0b11110000) >>> 4) & 0x000000FF;
+ fReservedField = (byte) ((storage & 0b00001110) >>> 1);
+ fNSFlag = isBitSet(storage, 0);
+
+ storage = packet.get();
+ fCWRFlag = isBitSet(storage, 7);
+ fECEFlag = isBitSet(storage, 6);
+ fURGFlag = isBitSet(storage, 5);
+ fACKFlag = isBitSet(storage, 4);
+ fPSHFlag = isBitSet(storage, 3);
+ fRSTFlag = isBitSet(storage, 2);
+ fSYNFlag = isBitSet(storage, 1);
+ fFINFlag = isBitSet(storage, 0);
+
+ fWindowSize = ConversionHelper.unsignedShortToInt(packet.getShort());
+ fChecksum = ConversionHelper.unsignedShortToInt(packet.getShort());
+ fUrgentPointer = ConversionHelper.unsignedShortToInt(packet.getShort());
+
+ // Get options if any
+ if (fDataOffset > TCPValues.DEFAULT_HEADER_LENGTH) {
+ fOptions = new byte[(fDataOffset - TCPValues.DEFAULT_HEADER_LENGTH) * TCPValues.BLOCK_SIZE];
+ packet.get(fOptions);
+ } else {
+ fOptions = null;
+ }
+
+ // Get payload if any.
+ if (packet.array().length - packet.position() > 0) {
+ byte[] array = new byte[packet.array().length - packet.position()];
+ packet.get(array);
+ ByteBuffer payload = ByteBuffer.wrap(array);
+ payload.order(ByteOrder.BIG_ENDIAN);
+ payload.position(0);
+ fPayload = payload;
+ } else {
+ fPayload = null;
+ }
+
+ // find child packet
+ fChildPacket = findChildPacket();
+
+ }
+
+ @Override
+ public @Nullable Packet getChildPacket() {
+ return fChildPacket;
+ }
+
+ @Override
+ public @Nullable ByteBuffer getPayload() {
+ return fPayload;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * See http://www.iana.org/assignments/service-names-port-numbers/service-
+ * names-port-numbers.xhtml or
+ * http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
+ */
+ @Override
+ protected @Nullable Packet findChildPacket() throws BadPacketException {
+ // TODO implement further protocols and update this
+ ByteBuffer payload = fPayload;
+ if (payload == null) {
+ return null;
+ }
+
+ return new UnknownPacket(getPcapFile(), this, payload);
+ }
+
+ @Override
+ public String toString() {
+ final ByteBuffer payload = fPayload;
+ int length = 0;
+ if (payload != null) {
+ length = payload.array().length;
+ }
+
+ String flagString = ""; // TODO Finish it. Im just too lazy. //$NON-NLS-1$
+ String string = getProtocol().getName() + ", Source Port: " + fSourcePort + ", Destination Port: " + fDestinationPort + //$NON-NLS-1$ //$NON-NLS-2$
+ "\nSequence Number: " + fSequenceNumber + ", Acknowledgment Number: " + fAcknowledgmentNumber + //$NON-NLS-1$ //$NON-NLS-2$
+ "\nHeader length: " + fDataOffset * TCPValues.BLOCK_SIZE + " bytes, Data length: " + length + //$NON-NLS-1$ //$NON-NLS-2$
+ "\n" + flagString + "Window size value: " + fWindowSize + ", Urgent Pointer: " + String.format("%s%04x", "0x", fUrgentPointer) + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ "\nChecksum: " + String.format("%s%04x", "0x", fChecksum) + "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ final Packet child = fChildPacket;
+ if (child != null) {
+ return string + child.toString();
+ }
+ return string;
+ }
+
+ /**
+ * Getter method that returns the TCP Source Port.
+ *
+ * @return The source Port.
+ */
+ public int getSourcePort() {
+ return fSourcePort;
+ }
+
+ /**
+ * Getter method that returns the TCP Destination Port.
+ *
+ * @return The destination Port.
+ */
+ public int getDestinationPort() {
+ return fDestinationPort;
+ }
+
+ /**
+ * Getter method that returns the Sequence Number. The sequence number has a
+ * dual role:
+ * <ul>
+ * <li>If the SYN flag is set (1), then this is the initial sequence number.
+ * The sequence number of the actual first data byte and the acknowledged
+ * number in the corresponding ACK are then this sequence number plus 1.</li>
+ * <li>If the SYN flag is clear (0), then this is the accumulated sequence
+ * number of the first data byte of this segment for the current session.</li>
+ * </ul>
+ *
+ * Source: http://en.wikipedia.org/wiki/Transmission_Control_Protocol
+ *
+ * @return The Sequence Number.
+ */
+ public long getSequenceNumber() {
+ return fSequenceNumber;
+ }
+
+ /**
+ * Getter method that returns the Acknowledgment Number.
+ *
+ * If the ACK flag is set then the value of this field is the next sequence
+ * number that the receiver is expecting. This acknowledges receipt of all
+ * prior bytes (if any). The first ACK sent by each end acknowledges the
+ * other end's initial sequence number itself, but no data.
+ *
+ * Source: http://en.wikipedia.org/wiki/Transmission_Control_Protocol
+ *
+ * @return The Acknowledgment Number.
+ */
+ public long getAcknowledgmentNumber() {
+ return fAcknowledgmentNumber;
+ }
+
+ /**
+ * Getter method that returns the size of the TCP header in 4 bytes data
+ * block. The minimum size is 5 words and the maximum is 15 words.
+ *
+ * @return The Data Offset.
+ */
+ public int getDataOffset() {
+ return fDataOffset;
+ }
+
+ /**
+ * Getter method that returns the Reserved field. This field is for future
+ * use and should always be zero. In this library, it is used as a mean to
+ * verify the validity of a TCP packet.
+ *
+ * @return The Reserved Field.
+ */
+ public byte getReservedField() {
+ return fReservedField;
+ }
+
+ /**
+ * Getter method that returns the state of the NS flag.
+ *
+ * @return The state of the NS flag.
+ */
+ public boolean isNSFlagSet() {
+ return fNSFlag;
+ }
+
+ /**
+ * Getter method that returns the state of the CWR flag.
+ *
+ * @return The state of the CWR flag.
+ */
+ public boolean isCongestionWindowReducedFlagSet() {
+ return fCWRFlag;
+ }
+
+ /**
+ * Getter method that returns the state of the ECE flag.
+ *
+ * @return The state of the ECE flag.
+ */
+ public boolean isECNEchoFlagSet() {
+ return fECEFlag;
+ }
+
+ /**
+ * Getter method that returns the state of the URG flag.
+ *
+ * @return The state of the URG flag.
+ */
+ public boolean isUrgentFlagSet() {
+ return fURGFlag;
+ }
+
+ /**
+ * Getter method that returns the state of the ACK flag.
+ *
+ * @return The state of the ACK flag.
+ */
+ public boolean isAcknowledgeFlagSet() {
+ return fACKFlag;
+ }
+
+ /**
+ * Getter method that returns the state of the PSH flag.
+ *
+ * @return The state of the PSH flag.
+ */
+ public boolean isPushFlagSet() {
+ return fPSHFlag;
+ }
+
+ /**
+ * Getter method that returns the state of the RST flag.
+ *
+ * @return The state of the RST flag.
+ */
+ public boolean isResetFlagSet() {
+ return fRSTFlag;
+ }
+
+ /**
+ * Getter method that returns the state of the SYN flag.
+ *
+ * @return The state of the SYN flag.
+ */
+ public boolean isSynchronizationFlagSet() {
+ return fSYNFlag;
+ }
+
+ /**
+ * Getter method that returns the state of the FIN flag.
+ *
+ * @return The state of the FIN flag.
+ */
+ public boolean isFinalFlagSet() {
+ return fFINFlag;
+ }
+
+ /**
+ * Getter method that returns the size of the windows, in windows size unit
+ * (by default, bytes), that the sender of this packet is willing to
+ * receive.
+ *
+ * @return The Window Size.
+ */
+ public int getWindowSize() {
+ return fWindowSize;
+ }
+
+ /**
+ * Getter method that returns the checksum of this packet. This checksum may
+ * be wrong if the packet is erroneous.
+ *
+ * @return The data and header checksum.
+ */
+ public int getChecksum() {
+ return fChecksum;
+ }
+
+ /**
+ * Getter method that returns the Urgent Pointer. If the URG flag is set,
+ * this field is an offset from the sequence number indicating the last
+ * urgent data byte.
+ *
+ * @return The Urgent Pointer.
+ */
+ public int getUrgentPointer() {
+ return fUrgentPointer;
+ }
+
+ /**
+ * Getter method that returns the options. This method returns null if no
+ * options are present.
+ *
+ * @return The options of the packet.
+ */
+ public @Nullable byte[] getOptions() {
+ byte[] options = fOptions;
+ if (options == null) {
+ return null;
+ }
+ return Arrays.copyOf(options, options.length);
+ }
+
+ @Override
+ public boolean validate() {
+ // Not yet implemented. ATM, we consider that all packets are valid.
+ // This is the case for all packets.
+ // TODO Implement it.
+ return true;
+ }
+
+ @Override
+ public TCPEndpoint getSourceEndpoint() {
+ @Nullable
+ TCPEndpoint endpoint = fSourceEndpoint;
+ if (endpoint == null) {
+ endpoint = new TCPEndpoint(this, true);
+ }
+ fSourceEndpoint = endpoint;
+ return fSourceEndpoint;
+ }
+
+ @Override
+ public TCPEndpoint getDestinationEndpoint() {
+ @Nullable
+ TCPEndpoint endpoint = fDestinationEndpoint;
+
+ if (endpoint == null) {
+ endpoint = new TCPEndpoint(this, false);
+ }
+ fDestinationEndpoint = endpoint;
+ return fDestinationEndpoint;
+ }
+
+ @Override
+ public Map<String, String> getFields() {
+ ImmutableMap<String, String> map = fFields;
+ if (map == null) {
+ Builder<String, String> builder = ImmutableMap.<String, String> builder()
+ .put("Source Port", String.valueOf(fSourcePort)) //$NON-NLS-1$
+ .put("Destination Port", String.valueOf(fDestinationPort)) //$NON-NLS-1$
+ .put("Sequence Number", String.valueOf(fSequenceNumber)) //$NON-NLS-1$
+ .put("Acknowledgement Number", String.valueOf(fAcknowledgmentNumber)) //$NON-NLS-1$
+ .put("Length", String.valueOf(fDataOffset * TCPValues.BLOCK_SIZE) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
+ .put("ECN-Nonce Flag", String.valueOf(fNSFlag)) //$NON-NLS-1$
+ .put("Congestion Window Reduced Flag", String.valueOf(fCWRFlag)) //$NON-NLS-1$
+ .put("ECN-Echo Flag", String.valueOf(fECEFlag)) //$NON-NLS-1$
+ .put("Urgent Flag", String.valueOf(fURGFlag)) //$NON-NLS-1$
+ .put("ACK Flag", String.valueOf(fACKFlag)) //$NON-NLS-1$
+ .put("PSH Flag", String.valueOf(fPSHFlag)) //$NON-NLS-1$
+ .put("RST Flag", String.valueOf(fRSTFlag)) //$NON-NLS-1$
+ .put("SYN Flag", String.valueOf(fSYNFlag)) //$NON-NLS-1$
+ .put("FIN Flag", String.valueOf(fFINFlag)) //$NON-NLS-1$
+ .put("Window Size Value", String.valueOf(fWindowSize)) //$NON-NLS-1$
+ .put("Checksum", String.format("%s%04x", "0x", fChecksum)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ .put("Urgent Pointer", String.format("%s%04x", "0x", fUrgentPointer)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ byte[] options = fOptions;
+ if (options == null) {
+ builder.put("Options", EMPTY_STRING); //$NON-NLS-1$
+ } else {
+ builder.put("Options", ConversionHelper.bytesToHex(options, true)); //$NON-NLS-1$
+
+ }
+ @SuppressWarnings("null")
+ @NonNull ImmutableMap<String, String> newMap = builder.build();
+ fFields = newMap;
+ return newMap;
+ }
+ return map;
+ }
+
+ @Override
+ public String getLocalSummaryString() {
+ return "Src Port: " + fSourcePort + ", Dst Port: " + fDestinationPort + //$NON-NLS-1$ //$NON-NLS-2$
+ ", Seq: " + fSequenceNumber + ", Ack: " + fAcknowledgmentNumber + //$NON-NLS-1$ //$NON-NLS-2$
+ ", Len: " + (fDataOffset * TCPValues.BLOCK_SIZE); //$NON-NLS-1$ }
+ }
+
+ @Override
+ protected String getSignificationString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(fSourcePort)
+ .append(" > ") //$NON-NLS-1$
+ .append(fDestinationPort);
+
+ if (!(generateFlagString().equals(EMPTY_STRING))) {
+ sb.append(' ')
+ .append('[')
+ .append(generateFlagString())
+ .append(']');
+ }
+ sb.append(" Seq=") //$NON-NLS-1$
+ .append(fSequenceNumber);
+
+ if (fACKFlag) {
+ sb.append(" Ack=") //$NON-NLS-1$
+ .append(fAcknowledgmentNumber);
+ }
+
+ sb.append(" Len=") //$NON-NLS-1$
+ .append((fDataOffset * TCPValues.BLOCK_SIZE));
+
+ String string = sb.toString();
+ if (string == null) {
+ return EMPTY_STRING;
+ }
+ return string;
+ }
+
+ private String generateFlagString() {
+ StringBuilder sb = new StringBuilder();
+ boolean start = true;
+
+ if (fSYNFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("SYN"); //$NON-NLS-1$
+ start = false;
+ }
+ if (fACKFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("ACK"); //$NON-NLS-1$
+ start = false;
+ }
+ if (fFINFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("FIN"); //$NON-NLS-1$
+ start = false;
+ }
+ if (fRSTFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("RST"); //$NON-NLS-1$
+ start = false;
+ }
+ if (fPSHFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("PSH"); //$NON-NLS-1$
+ start = false;
+ }
+ if (fURGFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("URG"); //$NON-NLS-1$
+ start = false;
+ }
+ if (fNSFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("NS"); //$NON-NLS-1$
+ start = false;
+ }
+ if (fCWRFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("CWR"); //$NON-NLS-1$
+ start = false;
+ }
+ if (fECEFlag) {
+ if (!start) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append("ECE"); //$NON-NLS-1$
+ start = false;
+ }
+ String string = sb.toString();
+ if (string == null) {
+ return EMPTY_STRING;
+ }
+ return string;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (fACKFlag ? 1231 : 1237);
+ result = prime * result + (int) (fAcknowledgmentNumber ^ (fAcknowledgmentNumber >>> 32));
+ result = prime * result + (fCWRFlag ? 1231 : 1237);
+ result = prime * result + fChecksum;
+ final Packet child = fChildPacket;
+ if (child != null) {
+ result = prime * result + child.hashCode();
+ } else {
+ result = prime * result;
+ }
+ result = prime * result + fDataOffset;
+ result = prime * result + fDestinationPort;
+ result = prime * result + (fECEFlag ? 1231 : 1237);
+ result = prime * result + (fFINFlag ? 1231 : 1237);
+ result = prime * result + (fNSFlag ? 1231 : 1237);
+ result = prime * result + Arrays.hashCode(fOptions);
+ result = prime * result + (fPSHFlag ? 1231 : 1237);
+ final ByteBuffer payload = fPayload;
+ if (payload != null) {
+ result = prime * result + payload.hashCode();
+ } else {
+ result = prime * result;
+ }
+ result = prime * result + (fRSTFlag ? 1231 : 1237);
+ result = prime * result + fReservedField;
+ result = prime * result + (fSYNFlag ? 1231 : 1237);
+ result = prime * result + (int) (fSequenceNumber ^ (fSequenceNumber >>> 32));
+ result = prime * result + fSourcePort;
+ result = prime * result + (fURGFlag ? 1231 : 1237);
+ result = prime * result + fUrgentPointer;
+ result = prime * result + fWindowSize;
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TCPPacket other = (TCPPacket) obj;
+ if (fACKFlag != other.fACKFlag) {
+ return false;
+ }
+ if (fAcknowledgmentNumber != other.fAcknowledgmentNumber) {
+ return false;
+ }
+ if (fCWRFlag != other.fCWRFlag) {
+ return false;
+ }
+ if (fChecksum != other.fChecksum) {
+ return false;
+ }
+ final Packet child = fChildPacket;
+ if (child != null) {
+ if (!child.equals(other.fChildPacket)) {
+ return false;
+ }
+ } else {
+ if (other.fChildPacket != null) {
+ return false;
+ }
+ }
+
+ if (fDataOffset != other.fDataOffset) {
+ return false;
+ }
+ if (fDestinationPort != other.fDestinationPort) {
+ return false;
+ }
+ if (fECEFlag != other.fECEFlag) {
+ return false;
+ }
+ if (fFINFlag != other.fFINFlag) {
+ return false;
+ }
+ if (fNSFlag != other.fNSFlag) {
+ return false;
+ }
+ if (!Arrays.equals(fOptions, other.fOptions)) {
+ return false;
+ }
+ if (fPSHFlag != other.fPSHFlag) {
+ return false;
+ }
+ final ByteBuffer fPayload2 = fPayload;
+ if (fPayload2 != null) {
+ if (!fPayload2.equals(other.fPayload)) {
+ return false;
+ }
+ } else {
+ if (other.fPayload != null) {
+ return false;
+ }
+ }
+ if (fRSTFlag != other.fRSTFlag) {
+ return false;
+ }
+ if (fReservedField != other.fReservedField) {
+ return false;
+ }
+ if (fSYNFlag != other.fSYNFlag) {
+ return false;
+ }
+ if (fSequenceNumber != other.fSequenceNumber) {
+ return false;
+ }
+ if (fSourcePort != other.fSourcePort) {
+ return false;
+ }
+ if (fURGFlag != other.fURGFlag) {
+ return false;
+ }
+ if (fUrgentPointer != other.fUrgentPointer) {
+ return false;
+ }
+ if (fWindowSize != other.fWindowSize) {
+ return false;
+ }
+ return true;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.tcp;
+
+/**
+ * Interface that lists constants related to TCP.
+ *
+ * See http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure.
+ *
+ * @author Vincent Perot
+ */
+public interface TCPValues {
+
+ /** Size in bytes of a default TCP packet header */
+ int DEFAULT_HEADER_LENGTH = 5;
+
+ /** Size in bytes of a block of data. Used to convert data block to bytes. */
+ int BLOCK_SIZE = 4;
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.protocol.tcp;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.udp;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
+
+/**
+ * Class that extends the ProtocolEndpoint class. It represents the endpoint at
+ * an UDP level.
+ *
+ * @author Vincent Perot
+ */
+public class UDPEndpoint extends ProtocolEndpoint {
+
+ private final int fPort;
+
+ /**
+ * Constructor of the {@link UDPEndpoint} class. It takes a packet to get
+ * its endpoint. Since every packet has two endpoints (source and
+ * destination), the isSourceEndpoint parameter is used to specify which
+ * endpoint to take.
+ *
+ * @param packet
+ * The packet that contains the endpoints.
+ * @param isSourceEndpoint
+ * Whether to take the source or the destination endpoint of the
+ * packet.
+ */
+ public UDPEndpoint(UDPPacket packet, boolean isSourceEndpoint) {
+ super(packet, isSourceEndpoint);
+ fPort = isSourceEndpoint ? packet.getSourcePort() : packet.getDestinationPort();
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint == null) {
+ result = 0;
+ } else {
+ result = endpoint.hashCode();
+ }
+ result = prime * result + fPort;
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof UDPEndpoint)) {
+ return false;
+ }
+
+ UDPEndpoint other = (UDPEndpoint) obj;
+
+ // Check on layer
+ boolean localEquals = (fPort == other.fPort);
+ if (!localEquals) {
+ return false;
+ }
+
+ // Check above layers.
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint != null) {
+ return endpoint.equals(other.getParentEndpoint());
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ ProtocolEndpoint endpoint = getParentEndpoint();
+ if (endpoint == null) {
+ @SuppressWarnings("null")
+ @NonNull String ret = String.valueOf(fPort);
+ return ret;
+ }
+ return endpoint.toString() + '/' + fPort;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.udp;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.unknown.UnknownPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Class that represents a UDP packet.
+ *
+ * @author Vincent Perot
+ */
+public class UDPPacket extends Packet {
+
+ private final @Nullable Packet fChildPacket;
+ private final @Nullable ByteBuffer fPayload;
+
+ private final int fSourcePort;
+ private final int fDestinationPort;
+ private final int fTotalLength;
+ private final int fChecksum;
+
+ private @Nullable UDPEndpoint fSourceEndpoint;
+ private @Nullable UDPEndpoint fDestinationEndpoint;
+
+ private @Nullable ImmutableMap<String, String> fFields;
+
+ /**
+ * Constructor of the UDP Packet class.
+ *
+ * @param file
+ * The file that contains this packet.
+ * @param parent
+ * The parent packet of this packet (the encapsulating packet).
+ * @param packet
+ * The entire packet (header and payload).
+ * @throws BadPacketException
+ * Thrown when the packet is erroneous.
+ */
+ public UDPPacket(PcapFile file, @Nullable Packet parent, ByteBuffer packet) throws BadPacketException {
+ super(file, parent, PcapProtocol.UDP);
+
+ // The endpoints are lazy loaded. They are defined in the get*Endpoint()
+ // methods.
+ fSourceEndpoint = null;
+ fDestinationEndpoint = null;
+
+ fFields = null;
+
+ packet.order(ByteOrder.BIG_ENDIAN);
+ packet.position(0);
+
+ fSourcePort = ConversionHelper.unsignedShortToInt(packet.getShort());
+ fDestinationPort = ConversionHelper.unsignedShortToInt(packet.getShort());
+ fTotalLength = ConversionHelper.unsignedShortToInt(packet.getShort());
+ fChecksum = ConversionHelper.unsignedShortToInt(packet.getShort());
+
+ if (packet.array().length - packet.position() > 0) {
+ byte[] array = new byte[packet.array().length - packet.position()];
+ packet.get(array);
+
+ ByteBuffer payload = ByteBuffer.wrap(array);
+ payload.order(ByteOrder.BIG_ENDIAN);
+ payload.position(0);
+ fPayload = payload;
+ } else {
+ fPayload = null;
+ }
+
+ // Find child
+ fChildPacket = findChildPacket();
+
+ }
+
+ @Override
+ public @Nullable Packet getChildPacket() {
+ return fChildPacket;
+ }
+
+ @Override
+ public @Nullable ByteBuffer getPayload() {
+ return fPayload;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * See http://www.iana.org/assignments/service-names-port-numbers/service-
+ * names-port-numbers.xhtml or
+ * http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
+ */
+ @Override
+ protected @Nullable Packet findChildPacket() throws BadPacketException {
+ // TODO implement further protocols and update this
+ ByteBuffer payload = fPayload;
+ if (payload == null) {
+ return null;
+ }
+
+ return new UnknownPacket(getPcapFile(), this, payload);
+ }
+
+ @Override
+ public String toString() {
+ String string = getProtocol().getName() + ", Source Port: " + fSourcePort + ", Destination Port: " + fDestinationPort + //$NON-NLS-1$ //$NON-NLS-2$
+ ", Length: " + fTotalLength + ", Checksum: " + fChecksum + "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ final Packet child = fChildPacket;
+ if (child != null) {
+ return string + child.toString();
+ }
+ return string;
+ }
+
+ /**
+ * Getter method that returns the UDP Source Port.
+ *
+ * @return The source Port.
+ */
+ public int getSourcePort() {
+ return fSourcePort;
+ }
+
+ /**
+ * Getter method that returns the UDP Destination Port.
+ *
+ * @return The destination Port.
+ */
+ public int getDestinationPort() {
+ return fDestinationPort;
+ }
+
+ /**
+ * Getter method that returns the total length of the packet in bytes. The
+ * values it can take go from 8 to 65,515.
+ *
+ * @return The total length of the packet in bytes.
+ */
+ public int getTotalLength() {
+ return fTotalLength;
+ }
+
+ /**
+ * Getter method that returns the checksum (on header and payload). If the
+ * transmitter does not use this field, it is set to zero. This checksum
+ * might be wrong if the packet is erroneous.
+ *
+ * @return The checksum received from the packet.
+ */
+ public int getChecksum() {
+ return fChecksum;
+ }
+
+ @Override
+ public boolean validate() {
+ // Not yet implemented. ATM, we consider that all packets are valid.
+ // This is the case for all packets.
+ // TODO Implement it.
+ return true;
+ }
+
+ @Override
+ public UDPEndpoint getSourceEndpoint() {
+ @Nullable
+ UDPEndpoint endpoint = fSourceEndpoint;
+ if (endpoint == null) {
+ endpoint = new UDPEndpoint(this, true);
+ }
+ fSourceEndpoint = endpoint;
+ return fSourceEndpoint;
+ }
+
+ @Override
+ public UDPEndpoint getDestinationEndpoint() {
+ @Nullable UDPEndpoint endpoint = fDestinationEndpoint;
+ if (endpoint == null) {
+ endpoint = new UDPEndpoint(this, false);
+ }
+ fDestinationEndpoint = endpoint;
+ return fDestinationEndpoint;
+ }
+
+ @Override
+ public Map<String, String> getFields() {
+ ImmutableMap<String, String> map = fFields;
+ if (map == null) {
+ @SuppressWarnings("null")
+ @NonNull ImmutableMap<String, String> newMap = ImmutableMap.<String, String> builder()
+ .put("Source Port", String.valueOf(fSourcePort)) //$NON-NLS-1$
+ .put("Destination Port", String.valueOf(fDestinationPort)) //$NON-NLS-1$
+ .put("Length", String.valueOf(fTotalLength) + " bytes") //$NON-NLS-1$ //$NON-NLS-2$
+ .put("Checksum", String.format("%s%04x", "0x", fChecksum)) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ .build();
+ fFields = newMap;
+ return newMap;
+ }
+ return map;
+ }
+
+ @Override
+ public String getLocalSummaryString() {
+ return "Src Port: " + fSourcePort + ", Dst Port: " + fDestinationPort; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ protected String getSignificationString() {
+ return "Source Port: " + fSourcePort + ", Destination Port: " + fDestinationPort; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + fChecksum;
+ final Packet child = fChildPacket;
+ if (child != null) {
+ result = prime * result + child.hashCode();
+ } else {
+ result = prime * result;
+ }
+ result = prime * result + fDestinationPort;
+ final ByteBuffer payload = fPayload;
+ if (payload != null) {
+ result = prime * result + payload.hashCode();
+ } else {
+ result = prime * result;
+ }
+ result = prime * result + fSourcePort;
+ result = prime * result + fTotalLength;
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ UDPPacket other = (UDPPacket) obj;
+ if (fChecksum != other.fChecksum) {
+ return false;
+ }
+ final Packet child = fChildPacket;
+ if (child != null) {
+ if (!child.equals(other.fChildPacket)) {
+ return false;
+ }
+ } else {
+ if (other.fChildPacket != null) {
+ return false;
+ }
+ }
+ if (fDestinationPort != other.fDestinationPort) {
+ return false;
+ }
+ final ByteBuffer payload = fPayload;
+ if (payload != null) {
+ if (!payload.equals(other.fPayload)) {
+ return false;
+ }
+ } else {
+ if (other.fPayload != null) {
+ return false;
+ }
+ }
+ if (fSourcePort != other.fSourcePort) {
+ return false;
+ }
+ if (fTotalLength != other.fTotalLength) {
+ return false;
+ }
+ return true;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.protocol.udp;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.unknown;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
+
+/**
+ * Class that extends the {@link ProtocolEndpoint} class. It represents the
+ * endpoint for a protocol that is unknown.
+ *
+ * @author Vincent Perot
+ */
+public class UnknownEndpoint extends ProtocolEndpoint {
+
+ /**
+ * Constructor of the {@link UnknownEndpoint} class. It takes a packet to
+ * get its endpoint. Since every packet has two endpoints (source and
+ * destination), the isSourceEndpoint parameter is used to specify which
+ * endpoint to take.
+ *
+ * @param packet
+ * The packet that contains the endpoints.
+ * @param isSourceEndpoint
+ * Whether to take the source or the destination endpoint of the
+ * packet.
+ */
+ public UnknownEndpoint(UnknownPacket packet, boolean isSourceEndpoint) {
+ super(packet, isSourceEndpoint);
+ }
+
+ @Override
+ public int hashCode() {
+ return 0;
+ }
+
+ @Override
+ public String toString() {
+ return EMPTY_STRING;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ return false;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.protocol.unknown;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
+
+/**
+ * Class that represents an Unknown packet. It is possible to get such a packet
+ * if the protocol has not been implemented in this library or if the parent
+ * packet was invalid (in certain cases only). The header of such a packet is
+ * inexistent.
+ *
+ * @author Vincent Perot
+ */
+public class UnknownPacket extends Packet {
+
+ private final @Nullable Packet fChildPacket;
+ private final ByteBuffer fPayload;
+
+ private @Nullable UnknownEndpoint fSourceEndpoint;
+ private @Nullable UnknownEndpoint fDestinationEndpoint;
+
+ private @Nullable ImmutableMap<String, String> fFields;
+
+ /**
+ * Constructor of an Unknown Packet object.
+ *
+ * @param file
+ * The file to which this packet belongs.
+ * @param parent
+ * The parent packet of this packet.
+ * @param packet
+ * The entire packet (header and payload).
+ */
+ public UnknownPacket(PcapFile file, @Nullable Packet parent, ByteBuffer packet) {
+ super(file, parent, PcapProtocol.UNKNOWN);
+
+ // The endpoints are lazy loaded. They are defined in the get*Endpoint()
+ // methods.
+ fSourceEndpoint = null;
+ fDestinationEndpoint = null;
+
+ fFields = null;
+
+ // Header is not used. All data go into payload.
+ fPayload = packet;
+
+ fChildPacket = findChildPacket();
+ }
+
+ @Override
+ public @Nullable Packet getChildPacket() {
+ return fChildPacket;
+ }
+
+ @Override
+ public @Nullable ByteBuffer getPayload() {
+ return fPayload;
+ }
+
+ @Override
+ protected @Nullable Packet findChildPacket() {
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ @SuppressWarnings("null")
+ @NonNull byte[] array = fPayload.array();
+ String string = "Payload: " + ConversionHelper.bytesToHex(array, true); //$NON-NLS-1$
+ final Packet child = fChildPacket;
+ if (child != null) {
+ return string + child.toString();
+ }
+ return string;
+ }
+
+ @Override
+ public boolean validate() {
+ // Not yet implemented. ATM, we consider that all packets are valid.
+ // This is the case for all packets.
+ // TODO Implement it.
+ return true;
+ }
+
+ @Override
+ public UnknownEndpoint getSourceEndpoint() {
+ @Nullable UnknownEndpoint endpoint = fSourceEndpoint;
+ if (endpoint == null) {
+ endpoint = new UnknownEndpoint(this, true);
+ }
+ fSourceEndpoint = endpoint;
+ return fSourceEndpoint;
+ }
+
+ @Override
+ public UnknownEndpoint getDestinationEndpoint() {
+ @Nullable UnknownEndpoint endpoint = fDestinationEndpoint;
+ if (endpoint == null) {
+ endpoint = new UnknownEndpoint(this, false);
+ }
+ fDestinationEndpoint = endpoint;
+ return fDestinationEndpoint;
+ }
+
+ @Override
+ public Map<String, String> getFields() {
+ ImmutableMap<String, String> map = fFields;
+ if (map == null) {
+ @SuppressWarnings("null")
+ @NonNull byte[] array = fPayload.array();
+
+ Builder<String, String> builder = ImmutableMap.<String, String> builder()
+ .put("Binary", ConversionHelper.bytesToHex(array, true)); //$NON-NLS-1$
+ try {
+ String s = new String(array, "UTF-8"); //$NON-NLS-1$
+ builder.put("Character", s); //$NON-NLS-1$
+ } catch (UnsupportedEncodingException e) {
+ // Do nothing. The string won't be added to the map anyway.
+ }
+ @SuppressWarnings("null")
+ @NonNull ImmutableMap<String, String> newMap = builder.build();
+ fFields = newMap;
+ return newMap;
+ }
+ return map;
+ }
+
+ @Override
+ public String getLocalSummaryString() {
+ return "Len: " + fPayload.array().length + " bytes"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ protected String getSignificationString() {
+ return "Data: " + fPayload.array().length + " bytes"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public Packet getMostEcapsulatedPacket() {
+ Packet packet = this.getParentPacket();
+ if (packet == null) {
+ return this;
+ }
+ return packet;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ final Packet child = fChildPacket;
+ if (child != null) {
+ result = prime * result + ((fChildPacket == null) ? 0 : child.hashCode());
+ } else {
+ result = prime * result;
+ }
+ result = prime * result + fPayload.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ UnknownPacket other = (UnknownPacket) obj;
+ final Packet child = fChildPacket;
+ if (child != null) {
+ if (!child.equals(other.fChildPacket)) {
+ return false;
+ }
+ } else {
+ if (other.fChildPacket != null) {
+ return false;
+ }
+ }
+
+ if (!fPayload.equals(other.fPayload)) {
+ return false;
+ }
+ return true;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.protocol.unknown;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.stream;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpointPair;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
+
+import com.google.common.math.DoubleMath;
+
+// TODO decide if default modifier a good idea. This allows only the
+// stream builder to call that method (and any class that is added to this
+// package). This effectively makes the stream read-only.
+
+/**
+ * Class that represents a packet stream, which is a collection of packets that
+ * share the same endpoints. The endpoints of a packet are protocol-dependent.
+ * For example, a TCP stream is a collection of packets that share the same MAC
+ * address, IP address, and Port couple.
+ *
+ * @author Vincent Perot
+ */
+public class PacketStream {
+
+ private static final double SECOND_TO_NANOSECOND = 1000000000.0;
+ private static final double DELTA = 0.000000001;
+ private final PcapProtocol fProtocol;
+ private final int fId;
+ private final ProtocolEndpointPair fEndpointPair;
+
+ private long fNbPacketsAtoB;
+ private long fNbPacketsBtoA;
+ private long fNbBytesAtoB;
+ private long fNbBytesBtoA;
+ private long fStartTime;
+ private long fEndTime;
+
+ /**
+ * Constructor of a packet stream.
+ *
+ * @param protocol
+ * The protocol of the packets of the stream. This is needed
+ * because the definition of a stream is protocol-dependent.
+ * @param id
+ * The id of this stream.
+ * @param endpointPair
+ * The common endpoints of the packets in this stream.
+ */
+ PacketStream(PcapProtocol protocol, int id, ProtocolEndpointPair endpointPair) {
+ fProtocol = protocol;
+ fId = id;
+ fEndpointPair = endpointPair;
+ fNbPacketsAtoB = 0;
+ fNbPacketsBtoA = 0;
+ fNbBytesAtoB = 0;
+ fNbBytesBtoA = 0;
+ fStartTime = Long.MAX_VALUE;
+ fEndTime = Long.MIN_VALUE;
+ }
+
+ /**
+ * Add a packet to the stream.
+ *
+ * @param packet
+ * The packet that must be added.
+ */
+ synchronized void add(PcapPacket packet) {
+
+ Packet newPacket = packet.getPacket(fProtocol);
+ if (newPacket == null) {
+ return;
+ }
+
+ // Update packet and byte number
+ if (fEndpointPair.getFirstEndpoint().equals(newPacket.getSourceEndpoint()) &&
+ fEndpointPair.getSecondEndpoint().equals(newPacket.getDestinationEndpoint())) {
+ fNbPacketsAtoB++;
+ fNbBytesAtoB += packet.getOriginalLength();
+ } else if (fEndpointPair.getFirstEndpoint().equals(newPacket.getDestinationEndpoint()) &&
+ fEndpointPair.getSecondEndpoint().equals(newPacket.getSourceEndpoint())) {
+ fNbPacketsBtoA++;
+ fNbBytesBtoA += packet.getOriginalLength();
+ } else {
+ throw new IllegalStateException();
+ }
+
+ // Update start and stop time
+ // Stream timestamp is ALWAYS in nanoseconds.
+ long timestamp;
+ switch (packet.getTimestampScale()) {
+ case MICROSECOND:
+ timestamp = packet.getTimestamp() * 1000;
+ break;
+ case NANOSECOND:
+ timestamp = packet.getTimestamp();
+ break;
+ default:
+ throw new IllegalArgumentException("The timestamp precision is not valid!"); //$NON-NLS-1$
+ }
+ fStartTime = Math.min(fStartTime, timestamp);
+ fEndTime = Math.max(fEndTime, timestamp);
+ }
+
+ /**
+ * Get the Protocol of this stream.
+ *
+ * @return The protocol of this stream.
+ */
+ public PcapProtocol getProtocol() {
+ return fProtocol;
+ }
+
+ /**
+ * Method that returns the non-unique ID of this stream.
+ *
+ * @return the non-unique ID of this stream.
+ */
+ public int getID() {
+ return fId;
+ }
+
+ /**
+ * Method that returns the unique ID of this stream.
+ *
+ * @return the unique ID of this stream.
+ */
+ public String getUniqueID() {
+ return fProtocol.getShortName() + '.' + fId;
+ }
+
+ /**
+ * Method that returns the endpoint pair of the stream.
+ *
+ * @return The endpoint pair of the stream.
+ */
+ public ProtocolEndpointPair getEndpointPair() {
+ return fEndpointPair;
+ }
+
+ // TODO return also the endpoint set.
+ @Override
+ public synchronized String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Stream " + getUniqueID() + ", Number of Packets: " + getNbPackets() + "\n"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+
+ @SuppressWarnings("null")
+ @NonNull String string = sb.toString();
+ return string;
+
+ }
+
+ /**
+ * Get the number of packets going from the first endpoint to the second.
+ *
+ * @return The number of packets from A to B.
+ */
+ public synchronized long getNbPacketsAtoB() {
+ return fNbPacketsAtoB;
+ }
+
+ /**
+ * Get the number of packets going from the second endpoint to the first.
+ *
+ * @return The number of packets from B to A.
+ */
+ public synchronized long getNbPacketsBtoA() {
+ return fNbPacketsBtoA;
+ }
+
+ /**
+ * Get the total number of packets in this stream.
+ *
+ * @return The total number of packets.
+ */
+ public synchronized long getNbPackets() {
+ return fNbPacketsAtoB + fNbPacketsBtoA;
+ }
+
+ /**
+ * Get the number of bytes going from the first endpoint to the second.
+ *
+ * @return The number of bytes from A to B.
+ */
+ public synchronized long getNbBytesAtoB() {
+ return fNbBytesAtoB;
+ }
+
+ /**
+ * Get the number of bytes going from the second endpoint to the first.
+ *
+ * @return The number of bytes from B to A.
+ */
+ public synchronized long getNbBytesBtoA() {
+ return fNbBytesBtoA;
+ }
+
+ /**
+ * Get the total number of bytes in this stream.
+ *
+ * @return The total number of bytes.
+ */
+ public synchronized long getNbBytes() {
+ return fNbBytesAtoB + fNbBytesBtoA;
+ }
+
+ /**
+ * Get the start time of this stream, in nanoseconds relative to epoch.
+ *
+ * @return The start time.
+ */
+ public synchronized long getStartTime() {
+ return fStartTime;
+ }
+
+ /**
+ * Get the stop time of this stream, in nanoseconds relative to epoch.
+ *
+ * @return The stop time.
+ */
+ public synchronized long getStopTime() {
+ return fEndTime;
+ }
+
+ /**
+ * Get the duration of this stream, in seconds
+ *
+ * @return The duration of this stream.
+ */
+ public synchronized double getDuration() {
+ return (fEndTime - fStartTime) / SECOND_TO_NANOSECOND;
+ }
+
+ /**
+ * Get the the average byte per second from A to B.
+ *
+ * @return the average byte per second from A to B.
+ */
+ public synchronized double getBPSAtoB() {
+ if (DoubleMath.fuzzyEquals(getDuration(), 0, DELTA)) {
+ return 0;
+ }
+ return fNbBytesAtoB / getDuration();
+ }
+
+ /**
+ * Get the the average byte per second from B to A.
+ *
+ * @return the average byte per second from B to A.
+ */
+ public synchronized double getBPSBtoA() {
+ if (DoubleMath.fuzzyEquals(getDuration(), 0, DELTA)) {
+ return 0;
+ }
+ return fNbBytesBtoA / getDuration();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.stream;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpoint;
+import org.eclipse.linuxtools.internal.pcap.core.endpoint.ProtocolEndpointPair;
+import org.eclipse.linuxtools.internal.pcap.core.filter.IPacketFilter;
+import org.eclipse.linuxtools.internal.pcap.core.filter.PacketFilterByProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
+import org.eclipse.linuxtools.internal.pcap.core.trace.BadPcapFileException;
+import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
+
+/**
+ * Class that parse an entire pcap file to build the different streams.
+ *
+ * @author Vincent Perot
+ */
+public class PacketStreamBuilder {
+
+ private final IPacketFilter fPacketFilter;
+ private final PcapProtocol fProtocol;
+
+ private final Map<Integer, PacketStream> fStreams;
+ private final Map<ProtocolEndpointPair, Integer> fIDs;
+ private int fCurrentId;
+
+ /**
+ * Main constructor.
+ *
+ * @param protocol
+ * The protocol of the builder.
+ */
+ public PacketStreamBuilder(PcapProtocol protocol) {
+ fCurrentId = 0;
+ fProtocol = protocol;
+ fPacketFilter = new PacketFilterByProtocol(protocol);
+ fStreams = new HashMap<>();
+ fIDs = new HashMap<>();
+ }
+
+ /**
+ * Method that returns a particular stream based on its ID.
+ *
+ * @param id
+ * The ID of the stream.
+ * @return The stream that has the specified ID.
+ */
+ public synchronized @Nullable PacketStream getStream(int id) {
+ return fStreams.get(id);
+ }
+
+ /**
+ * Method that returns a particular stream based on its endpoints. It
+ * returns null if no corresponding stream is found.
+ *
+ * @param endpointA
+ * The first endpoint of the stream.
+ * @param endpointB
+ * The second endpoint of the stream.
+ *
+ * @return The stream that has the specified endpoints. Return Null if no
+ * stream is found between the two endpoints.
+ */
+ public synchronized @Nullable PacketStream getStream(ProtocolEndpoint endpointA, ProtocolEndpoint endpointB) {
+ ProtocolEndpointPair set = new ProtocolEndpointPair(endpointA, endpointB);
+ int id = fIDs.get(set);
+ return fStreams.get(id);
+ }
+
+ /**
+ * Method that returns all the streams at the specified protocol level.
+ *
+ * @return The streams as a list.
+ */
+ public synchronized Iterable<PacketStream> getStreams() {
+ Iterable<PacketStream> iterable = new LinkedList<>(fStreams.values());
+ return iterable;
+ }
+
+ /**
+ * Method that is called when the filter accepts a packet. This methods add
+ * the packet to a stream based on its characteristics.
+ *
+ * @param packet
+ * The packet to be added.
+ */
+ public synchronized void addPacketToStream(PcapPacket packet) {
+ if (fPacketFilter.accepts(packet)) {
+ @Nullable Packet newPacket = packet.getPacket(fProtocol);
+ if (newPacket == null) {
+ return;
+ }
+ ProtocolEndpointPair endpointSet = new ProtocolEndpointPair(newPacket);
+ if (!fIDs.containsKey(endpointSet)) {
+ fIDs.put(endpointSet, fCurrentId);
+ fStreams.put(fCurrentId, new PacketStream(fProtocol, fCurrentId, endpointSet));
+ fStreams.get(fCurrentId).add(packet);
+ fCurrentId++;
+ } else {
+ Integer id = fIDs.get(endpointSet);
+ fStreams.get(id).add(packet);
+ }
+ }
+ return;
+ }
+
+ /**
+ * Getter method for the protocol of the stream builder.
+ *
+ * @return The protocol.
+ */
+ public PcapProtocol getProtocol() {
+ return fProtocol;
+ }
+
+ /**
+ * Method that clears the builder.
+ */
+ public void clear() {
+ fStreams.clear();
+ fIDs.clear();
+ fCurrentId = 0;
+ }
+
+ /**
+ * Method that returns the number of streams built.
+ *
+ * @return The number of streams built.
+ */
+ public synchronized int getNbStreams() {
+ return fStreams.size();
+ }
+
+ /**
+ * Method that parse an entire file and build the streams contained in the
+ * file.
+ *
+ * @param filePath
+ * The file path.
+ * @throws IOException
+ * When an IO error occurs.
+ * @throws BadPcapFileException
+ * When the PcapFile is not valid.
+ */
+ public synchronized void parsePcapFile(Path filePath) throws IOException, BadPcapFileException {
+ try (PcapFile pcapFile = new PcapFile(filePath);) {
+ while (pcapFile.hasNextPacket()) { // not eof
+ PcapPacket packet;
+ try {
+ packet = pcapFile.parseNextPacket();
+ if (packet == null) {
+ return;
+ }
+ addPacketToStream(packet);
+ } catch (BadPacketException e) {
+ // Ignore packet. Do nothing.
+ }
+ }
+ }
+
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.stream;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.trace;
+
+/**
+ * Exception that is thrown when the Pcap file is not valid.
+ *
+ * @author Vincent Perot
+ */
+public class BadPcapFileException extends Exception {
+
+ private static final long serialVersionUID = 8228512814116052260L;
+
+ /**
+ * Default constructor with no message.
+ */
+ public BadPcapFileException() {
+ super();
+ }
+
+ /**
+ * Constructor with an attached message.
+ *
+ * @param message
+ * The message attached to this exception
+ */
+ public BadPcapFileException(String message) {
+ super(message);
+ }
+
+ /**
+ * Re-throw an exception into this type.
+ *
+ * @param e
+ * The previous Exception we caught
+ */
+ public BadPcapFileException(Exception e) {
+ super(e);
+ }
+
+ /**
+ * Constructor with an attached message and re-throw an exception into this
+ * type.
+ *
+ * @param message
+ * The message attached to this exception
+ * @param exception
+ * The previous Exception caught
+ */
+ public BadPcapFileException(String message, Throwable exception) {
+ super(message, exception);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.trace;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.channels.SeekableByteChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.TreeMap;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.linuxtools.internal.pcap.core.packet.BadPacketException;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
+import org.eclipse.linuxtools.internal.pcap.core.util.ConversionHelper;
+import org.eclipse.linuxtools.internal.pcap.core.util.PcapTimestampScale;
+
+/**
+ * Class that allows the interaction with a pcap file.
+ *
+ * @author Vincent Perot
+ */
+public class PcapFile implements Closeable {
+
+ // TODO add pcapng support.
+ // TODO Make parsing faster by buffering the data.
+
+ private final Path fPcapFilePath;
+ private final ByteOrder fByteOrder;
+ private final SeekableByteChannel fFileChannel;
+ private final PcapTimestampScale fTimestampPrecision;
+
+ private final int fMajorVersion;
+ private final int fMinorVersion;
+ private final long fTimeAccuracy;
+ private final long fTimeZoneCorrection;
+ private final long fSnapshotLength;
+ private final long fDataLinkType;
+
+ private final TreeMap<Long, Long> fFileIndex;
+
+ private long fCurrentRank;
+ private long fTotalNumberPackets;
+
+ /**
+ * Constructor of the PcapFile Class.
+ *
+ * @param filePath
+ * The path to the pcap file.
+ *
+ * @throws BadPcapFileException
+ * Thrown if the Pcap File is not valid.
+ * @throws IOException
+ * Thrown if there is an IO error while reading the file.
+ */
+ public PcapFile(Path filePath) throws BadPcapFileException, IOException {
+
+ fFileIndex = new TreeMap<>();
+ fCurrentRank = 0;
+ fTotalNumberPackets = -1;
+ fPcapFilePath = filePath;
+
+ // Check file validity
+ if (Files.notExists(fPcapFilePath) || !Files.isRegularFile(fPcapFilePath) ||
+ Files.size(fPcapFilePath) < PcapFileValues.GLOBAL_HEADER_SIZE) {
+ throw new BadPcapFileException("Bad Pcap File."); //$NON-NLS-1$
+ }
+
+ if (!Files.isReadable(fPcapFilePath)) {
+ throw new BadPcapFileException("File is not readable."); //$NON-NLS-1$
+ }
+
+ // File is not empty. Try to open.
+ @SuppressWarnings("null")
+ @NonNull SeekableByteChannel channel = Files.newByteChannel(fPcapFilePath);
+ fFileChannel = channel;
+
+ // Parse the global header.
+ // Read the magic number (4 bytes) from the input stream
+ // and determine the mode (big endian or little endian)
+ ByteBuffer globalHeader = ByteBuffer.allocate(PcapFileValues.GLOBAL_HEADER_SIZE);
+ globalHeader.clear();
+ fFileChannel.read(globalHeader);
+ globalHeader.flip();
+ int magicNumber = globalHeader.getInt();
+
+ @SuppressWarnings("null")
+ @NonNull ByteOrder be = ByteOrder.BIG_ENDIAN;
+ @SuppressWarnings("null")
+ @NonNull ByteOrder le = ByteOrder.LITTLE_ENDIAN;
+
+ switch (magicNumber) {
+ case PcapFileValues.MAGIC_BIG_ENDIAN_MICRO: // file is big endian
+ fByteOrder = be;
+ fTimestampPrecision = PcapTimestampScale.MICROSECOND;
+ break;
+ case PcapFileValues.MAGIC_LITTLE_ENDIAN_MICRO: // file is little endian
+ fByteOrder = le;
+ fTimestampPrecision = PcapTimestampScale.MICROSECOND;
+ break;
+ case PcapFileValues.MAGIC_BIG_ENDIAN_NANO: // file is big endian
+ fByteOrder = be;
+ fTimestampPrecision = PcapTimestampScale.NANOSECOND;
+ break;
+ case PcapFileValues.MAGIC_LITTLE_ENDIAN_NANO: // file is little endian
+ fByteOrder = le;
+ fTimestampPrecision = PcapTimestampScale.NANOSECOND;
+ break;
+ default:
+ this.close();
+ throw new BadPcapFileException(String.format("%08x", magicNumber) + " is not a known magic number."); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ // Put the rest of the buffer in file endian.
+ globalHeader.order(fByteOrder);
+
+ // Initialization of global header fields.
+ fMajorVersion = ConversionHelper.unsignedShortToInt(globalHeader.getShort());
+ fMinorVersion = ConversionHelper.unsignedShortToInt(globalHeader.getShort());
+ fTimeAccuracy = ConversionHelper.unsignedIntToLong(globalHeader.getInt());
+ fTimeZoneCorrection = ConversionHelper.unsignedIntToLong(globalHeader.getInt());
+ fSnapshotLength = ConversionHelper.unsignedIntToLong(globalHeader.getInt());
+ fDataLinkType = ConversionHelper.unsignedIntToLong(globalHeader.getInt());
+
+ fFileIndex.put(fCurrentRank, fFileChannel.position());
+
+ }
+
+ /**
+ * Method that allows the parsing of a packet at the current position.
+ *
+ * @return The parsed Pcap Packet.
+ * @throws IOException
+ * Thrown when there is an error while reading the file.
+ * @throws BadPcapFileException
+ * Thrown when a packet header is invalid.
+ * @throws BadPacketException
+ * Thrown when the packet is erroneous.
+ */
+ public synchronized @Nullable PcapPacket parseNextPacket() throws IOException, BadPcapFileException, BadPacketException {
+
+ // Parse the packet header
+ if (fFileChannel.size() - fFileChannel.position() == 0) {
+ return null;
+ }
+ if (fFileChannel.size() - fFileChannel.position() < PcapFileValues.PACKET_HEADER_SIZE) {
+ throw new BadPcapFileException("A pcap header is invalid."); //$NON-NLS-1$
+ }
+
+ ByteBuffer pcapPacketHeader = ByteBuffer.allocate(PcapFileValues.PACKET_HEADER_SIZE);
+ pcapPacketHeader.clear();
+ pcapPacketHeader.order(fByteOrder);
+
+ fFileChannel.read(pcapPacketHeader);
+
+ pcapPacketHeader.flip();
+ pcapPacketHeader.position(PcapFileValues.INCLUDED_LENGTH_POSITION);
+ long includedPacketLength = ConversionHelper.unsignedIntToLong(pcapPacketHeader.getInt());
+
+ if (fFileChannel.size() - fFileChannel.position() < includedPacketLength) {
+ throw new BadPcapFileException("A packet header is invalid."); //$NON-NLS-1$
+ }
+
+ if (includedPacketLength > Integer.MAX_VALUE) {
+ throw new BadPacketException("Packets that are bigger than 2^31-1 bytes are not supported."); //$NON-NLS-1$
+ }
+
+ ByteBuffer pcapPacketData = ByteBuffer.allocate((int) includedPacketLength);
+ pcapPacketData.clear();
+ pcapPacketHeader.order(ByteOrder.BIG_ENDIAN); // Not really needed.
+ fFileChannel.read(pcapPacketData);
+
+ pcapPacketData.flip();
+
+ fFileIndex.put(++fCurrentRank, fFileChannel.position());
+
+ return new PcapPacket(this, null, pcapPacketHeader, pcapPacketData, fCurrentRank - 1);
+
+ }
+
+ /**
+ * Method that allows to skip a packet at the current position.
+ *
+ * @throws IOException
+ * Thrown when there is an error while reading the file.
+ * @throws BadPcapFileException
+ * Thrown when a packet header is invalid.
+ */
+ public synchronized void skipNextPacket() throws IOException, BadPcapFileException {
+
+ // Parse the packet header
+ if (fFileChannel.size() - fFileChannel.position() == 0) {
+ return;
+ }
+ if (fFileChannel.size() - fFileChannel.position() < PcapFileValues.PACKET_HEADER_SIZE) {
+ throw new BadPcapFileException("A pcap header is invalid."); //$NON-NLS-1$
+ }
+
+ ByteBuffer pcapPacketHeader = ByteBuffer.allocate(PcapFileValues.PACKET_HEADER_SIZE);
+ pcapPacketHeader.clear();
+ pcapPacketHeader.order(fByteOrder);
+
+ fFileChannel.read(pcapPacketHeader);
+
+ pcapPacketHeader.flip();
+ pcapPacketHeader.position(PcapFileValues.INCLUDED_LENGTH_POSITION);
+ long includedPacketLength = ConversionHelper.unsignedIntToLong(pcapPacketHeader.getInt());
+
+ if (fFileChannel.size() - fFileChannel.position() < includedPacketLength) {
+ throw new BadPcapFileException("A packet header is invalid."); //$NON-NLS-1$
+ }
+
+ fFileChannel.position(fFileChannel.position() + includedPacketLength);
+
+ fFileIndex.put(++fCurrentRank, fFileChannel.position());
+
+ }
+
+ /**
+ * Method that moves the position to the specified rank.
+ *
+ * @param rank
+ * The rank of the packet.
+ *
+ * @throws IOException
+ * Thrown when there is an error while reading the file.
+ * @throws BadPcapFileException
+ * Thrown when a packet header is invalid.
+ */
+ public synchronized void seekPacket(long rank) throws IOException, BadPcapFileException {
+
+ // Verify argument
+ if (rank < 0) {
+ throw new IllegalArgumentException();
+ }
+
+ Long positionInBytes = fFileIndex.get(rank);
+
+ if (positionInBytes != null) {
+ // Index is known. Move to position.
+ fFileChannel.position(positionInBytes.longValue());
+ fCurrentRank = rank;
+ } else {
+ // Index is unknown. Find the corresponding position.
+ // Find closest index
+ fCurrentRank = fFileIndex.floorKey(rank);
+ // skip until wanted packet is found
+ do {
+ skipNextPacket();
+ } while (fCurrentRank != rank && hasNextPacket());
+ }
+ }
+
+ /**
+ * Method that indicates if there are packets remaining to read. It is an
+ * end of file indicator.
+ *
+ * @return Whether the pcap still has packets or not.
+ * @throws IOException
+ * If some IO error occurs.
+ */
+ public synchronized boolean hasNextPacket() throws IOException {
+ return ((fFileChannel.size() - fFileChannel.position()) > 0);
+ }
+
+ /**
+ * Getter method for the Byte Order of the file.
+ *
+ * @return The byte Order of the file.
+ */
+ public ByteOrder getByteOrder() {
+ return fByteOrder;
+ }
+
+ /**
+ * Getter method for the Major Version of the file.
+ *
+ * @return The Major Version of the file.
+ */
+ public int getMajorVersion() {
+ return fMajorVersion;
+ }
+
+ /**
+ * Getter method for the Minor Version of the file.
+ *
+ * @return The Minor Version of the file.
+ */
+ public int getMinorVersion() {
+ return fMinorVersion;
+ }
+
+ /**
+ * Getter method for the time accuracy of the file.
+ *
+ * @return The time accuracy of the file.
+ */
+ public long getTimeAccuracy() {
+ return fTimeAccuracy;
+ }
+
+ /**
+ * Getter method for the time zone correction of the file.
+ *
+ * @return The time zone correction of the file.
+ */
+ public long getTimeZoneCorrection() {
+ return fTimeZoneCorrection;
+ }
+
+ /**
+ * Getter method for the snapshot length of the file.
+ *
+ * @return The snapshot length of the file.
+ */
+ public long getSnapLength() {
+ return fSnapshotLength;
+ }
+
+ /**
+ * Getter method for the datalink type of the file. This parameter is used
+ * to determine higher-level protocols (Ethernet, WLAN, SLL).
+ *
+ * @return The datalink type of the file.
+ */
+ public long getDataLinkType() {
+ return fDataLinkType;
+ }
+
+ /**
+ * Getter method for the path of the file.
+ *
+ * @return The path of the file.
+ */
+ public Path getPath() {
+ return fPcapFilePath;
+ }
+
+ /**
+ * Method that returns the total number of packets in the file.
+ *
+ * @return The total number of packets.
+ * @throws IOException
+ * Thrown when some IO error occurs.
+ * @throws BadPcapFileException
+ * Thrown when a packet header is invalid.
+ */
+ public synchronized long getTotalNbPackets() throws IOException, BadPcapFileException {
+ if (fTotalNumberPackets == -1) {
+ long rank = fCurrentRank;
+ fCurrentRank = fFileIndex.floorKey(rank);
+
+ // skip until end of file.
+ while (hasNextPacket()) {
+ skipNextPacket();
+ }
+ fTotalNumberPackets = fCurrentRank;
+ fCurrentRank = rank;
+ seekPacket(rank);
+ }
+ return fTotalNumberPackets;
+ }
+
+ /**
+ * Getter method that returns the current rank in the file (the packet
+ * number).
+ *
+ * @return The current rank.
+ */
+ public synchronized long getCurrentRank() {
+ return fCurrentRank;
+ }
+
+ /**
+ * Getter method that returns the timestamp precision of the file.
+ *
+ * @return The the timestamp precision of the file.
+ */
+ public PcapTimestampScale getTimestampPrecision() {
+ return fTimestampPrecision;
+ }
+
+ @Override
+ public void close() throws IOException {
+ fFileChannel.close();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.trace;
+
+/**
+ * Interface that lists constants related to a Pcap File.
+ *
+ * See http://wiki.wireshark.org/Development/LibpcapFileFormat.
+ *
+ * @author Vincent Perot
+ */
+public interface PcapFileValues {
+
+ /** Number used to determine the endianness and precision of the file */
+ int MAGIC_BIG_ENDIAN_MICRO = 0xa1b2c3d4;
+
+ /** Number used to determine the endianness and precision of the file */
+ int MAGIC_LITTLE_ENDIAN_MICRO = 0xd4c3b2a1;
+
+ /** Number used to determine the endianness and precision of the file */
+ int MAGIC_BIG_ENDIAN_NANO = 0xa1b23c4d;
+
+ /** Number used to determine the endianness and precision of the file */
+ int MAGIC_LITTLE_ENDIAN_NANO = 0x4d3cb2a1;
+
+ /** Size in bytes of a Pcap file global header */
+ int GLOBAL_HEADER_SIZE = 24;
+
+ /** Size in bytes of a Pcap packet header */
+ int PACKET_HEADER_SIZE = 16;
+
+ /** Position in bytes in the packet header of the packet's length */
+ int INCLUDED_LENGTH_POSITION = 8;
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.trace;
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.util;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.linuxtools.internal.pcap.core.protocol.ethernet2.EthernetIIValues;
+
+/**
+ * Class for helping with the conversion of data.
+ *
+ * @author Vincent Perot
+ */
+public final class ConversionHelper {
+
+ @SuppressWarnings("null")
+ private static final @NonNull char[] HEX_ARRAY = "0123456789abcdef".toCharArray(); //$NON-NLS-1$
+ private static final String EMPTY_STRING = ""; //$NON-NLS-1$
+ private static final String DEFAULT_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS"; //$NON-NLS-1$
+ private static final DateFormat DATE_FORMATTER = new SimpleDateFormat(DEFAULT_TIME_PATTERN);
+
+ private ConversionHelper() {
+ }
+
+ /**
+ * Generate an integer from an unsigned byte.
+ *
+ * @param n
+ * the unsigned byte.
+ * @return the integer representing the unsigned value.
+ */
+ public static int unsignedByteToInt(byte n) {
+ return n & 0x000000FF;
+ }
+
+ /**
+ * Generate an integer from an unsigned short.
+ *
+ * @param n
+ * the unsigned short.
+ * @return the integer representing the unsigned value.
+ */
+ public static int unsignedShortToInt(short n) {
+ return n & 0x0000FFFF;
+ }
+
+ /**
+ * Generate a long from an unsigned integer.
+ *
+ * @param n
+ * the unsigned integer.
+ * @return the long representing the unsigned value.
+ */
+ public static long unsignedIntToLong(int n) {
+ return n & 0x00000000FFFFFFFFL;
+ }
+
+ /**
+ * Generate an hex number from a byte array.
+ *
+ * @param bytes
+ * The array of bytes.
+ * @param spaced
+ * Whether there must be a space between each byte or not.
+ * @return the hex as a string.
+ */
+ public static String bytesToHex(byte[] bytes, boolean spaced) {
+ // No need to check for character encoding since bytes represents a
+ // number.
+
+ if (bytes.length == 0) {
+ return EMPTY_STRING;
+ }
+
+ char[] hexChars = spaced ? new char[bytes.length * 3 - 1] : new char[bytes.length * 2];
+ int delta = spaced ? 3 : 2;
+ char separator = ' ';
+
+ for (int j = 0; j < bytes.length; j++) {
+
+ int v = bytes[j] & 0xFF;
+ hexChars[j * delta] = HEX_ARRAY[v >>> 4];
+ hexChars[j * delta + 1] = HEX_ARRAY[v & 0x0F];
+
+ if (spaced && (j != bytes.length - 1)) {
+ hexChars[j * delta + 2] = separator;
+ }
+ }
+ return new String(hexChars);
+ }
+
+ // TODO Add little endian support
+ /**
+ * Generate a string representing the MAC address.
+ *
+ * @param mac
+ * The MAC address as a byte array.
+ * @return The string representing the MAC address.
+ */
+ public static String toMacAddress(byte[] mac) {
+
+ if (mac.length != EthernetIIValues.MAC_ADDRESS_SIZE) {
+ throw new IllegalArgumentException();
+ }
+ char separator = ':';
+ return String.format("%02x", mac[0]) + separator + //$NON-NLS-1$
+ String.format("%02x", mac[1]) + separator + //$NON-NLS-1$
+ String.format("%02x", mac[2]) + separator + //$NON-NLS-1$
+ String.format("%02x", mac[3]) + separator + //$NON-NLS-1$
+ String.format("%02x", mac[4]) + separator + //$NON-NLS-1$
+ String.format("%02x", mac[5]); //$NON-NLS-1$
+
+ }
+
+ // TODO support non GMT time.
+
+ /**
+ * Convert a timestamp into a date.
+ *
+ * @param ts
+ * The timestamp. It represents the time since Epoch in
+ * microseconds.
+ * @param scale
+ * The scale of the timestamp.
+ * @return The date as a string.
+ */
+ public static String toGMTTime(long ts, PcapTimestampScale scale) {
+ long timestamp;
+ switch (scale) {
+ case MICROSECOND:
+ timestamp = ts * 1000;
+ break;
+ case NANOSECOND:
+ timestamp = ts;
+ break;
+ default:
+ throw new IllegalArgumentException("The timestamp precision is not valid!"); //$NON-NLS-1$
+ }
+ return format(timestamp);
+ }
+
+ /**
+ * Format the timestamp to a string.
+ *
+ * @param value
+ * the timestamp value to format (in ns)
+ * @return the formatted timestamp
+ */
+ private static String format(long value) {
+ // Split the timestamp value into its sub-components
+ long date = value / 1000000; // milliseconds since epoch
+ long cs = Math.abs((value % 1000000) / 1000); // microseconds
+ long ns = Math.abs(value % 1000); // nanoseconds
+
+ Date dateObject = new Date(date);
+
+ StringBuilder sb = new StringBuilder(DATE_FORMATTER.format(dateObject));
+ sb.append('.')
+ .append(String.format("%03d", cs)) //$NON-NLS-1$
+ .append('.')
+ .append(String.format("%03d", ns)); //$NON-NLS-1$
+
+ String string = sb.toString();
+ if (string == null) {
+ return EMPTY_STRING;
+ }
+ return string;
+
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.util;
+
+// TODO finish this
+// TODO maybe match it to protocol instead of string.
+
+/**
+ * Helper that is used to help mapping a certain ethertype to a particular
+ * protocol (i.e. IPv4). This is used when finding the child packet of an
+ * Ethernet packet, for instance.
+ *
+ * See http://en.wikipedia.org/wiki/EtherType
+ *
+ * @author Vincent Perot
+ */
+public final class EthertypeHelper {
+
+ /** EtherType IPv4 */
+ public static final int ETHERTYPE_IPV4 = 0x0800;
+
+ /** EtherType ARP */
+ public static final int ETHERTYPE_ARP = 0x0806;
+
+ /** EtherType Wake-On-LAN */
+ public static final int ETHERTYPE_WAKE_ON_LAN = 0x0842;
+
+ /** EtherType TRILL */
+ public static final int ETHERTYPE_TRILL = 0x22F3;
+
+ /** EtherType DECnet Phase IV */
+ public static final int ETHERTYPE_DECNET_PHASE_IV = 0x6003;
+
+ private EthertypeHelper() {}
+
+ /**
+ * Method that matches the ethertype as a number, to a protocol as a string.
+ *
+ * @param ethertype
+ * The Ethertype as an int.
+ * @return The protocol as a string.
+ */
+ public static String toString(int ethertype) {
+ switch (ethertype) {
+ case ETHERTYPE_IPV4:
+ return "Internet Protocol Version 4"; //$NON-NLS-1$
+ case ETHERTYPE_ARP:
+ return "Address Resolution Protocol"; //$NON-NLS-1$
+ case ETHERTYPE_WAKE_ON_LAN:
+ return "Wake-on-LAN"; //$NON-NLS-1$
+ case ETHERTYPE_TRILL:
+ return "IETF TRILL Protocol"; //$NON-NLS-1$
+ case ETHERTYPE_DECNET_PHASE_IV:
+ return "DECnet Phase IV"; //$NON-NLS-1$
+ default:
+ return "Unknown"; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Convert an ethertype (int) into its string representation. This allows
+ * the mapping of ethertype to the real protocol name.
+ *
+ * @param type
+ * The Ethertype to convert.
+ * @return The Ethertype as a string.
+ */
+ public static String toEtherType(int type) {
+ return toString(type) + " (0x" + String.format("%04x", type) + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.util;
+
+import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
+
+// TODO finish this
+// TODO maybe match it to protocol instead of string.
+
+/**
+ * Helper that is used to help mapping a certain protocol number to a particular
+ * protocol (i.e. TCP). This is used when finding the child packet of an IPv4
+ * packet, for instance.
+ *
+ * See http://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
+ *
+ * @author Vincent Perot
+ */
+public final class IPProtocolNumberHelper {
+
+ /** Protocol Number ICMP */
+ public static final int PROTOCOL_NUMBER_ICMP = 1;
+
+ /** Protocol Number IGMP */
+ public static final int PROTOCOL_NUMBER_IGMP = 2;
+
+ /** Protocol Number TCP */
+ public static final int PROTOCOL_NUMBER_TCP = 6;
+
+ /** Protocol Number UDP */
+ public static final int PROTOCOL_NUMBER_UDP = 17;
+
+ /** Protocol Number Encapsulated IPv6 */
+ public static final int PROTOCOL_NUMBER_ENCAP_IPV6 = 41;
+
+ /** Protocol Number OSPF */
+ public static final int PROTOCOL_NUMBER_OSPF = 89;
+
+ /** Protocol Number SCTP */
+ public static final int PROTOCOL_NUMBER_SCTP = 132;
+
+ private IPProtocolNumberHelper() {}
+
+ /**
+ * Method that match the protocol number to a protocol as a string.
+ *
+ * @param protocolNumber
+ * The protocol number as an int.
+ * @return The protocol as a string.
+ */
+ public static String toString(int protocolNumber) {
+ switch (protocolNumber) {
+ case PROTOCOL_NUMBER_ICMP:
+ return "ICMP"; //$NON-NLS-1$
+ case PROTOCOL_NUMBER_IGMP:
+ return "IGMP"; //$NON-NLS-1$
+ case PROTOCOL_NUMBER_TCP:
+ return PcapProtocol.TCP.getName();
+ case PROTOCOL_NUMBER_UDP:
+ return PcapProtocol.UDP.getName();
+ case PROTOCOL_NUMBER_ENCAP_IPV6:
+ return "IPv6"; //$NON-NLS-1$
+ case PROTOCOL_NUMBER_OSPF:
+ return "OSPF"; //$NON-NLS-1$
+ case PROTOCOL_NUMBER_SCTP:
+ return "SCTP"; //$NON-NLS-1$
+ default:
+ return "Unknown"; //$NON-NLS-1$
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.util;
+
+// TODO finish this
+// TODO map to protocol instead of string? that would make more sense imo.
+
+/**
+ * Helper that is used to help mapping a certain linktype to a particular
+ * protocol (i.e. ethernet).
+ *
+ * See http://www.tcpdump.org/linktypes.html
+ *
+ * @author Vincent Perot
+ */
+public final class LinkTypeHelper {
+
+ /** Linktype Null */
+ public static final int LINKTYPE_NULL = 0;
+
+ /** Linktype Ethernet II */
+ public static final int LINKTYPE_ETHERNET = 1;
+
+ /** Linktype AX25 */
+ public static final int LINKTYPE_AX25 = 3;
+
+ /** Linktype IEEE802.5 */
+ public static final int LINKTYPE_IEEE802_5 = 6;
+
+ /** Linktype Raw */
+ public static final int LINKTYPE_RAW = 101;
+
+ /** Linktype IEEE802.11 */
+ public static final int LINKTYPE_IEEE802_11 = 105;
+
+ /** Linktype Linux SLL */
+ public static final int LINKTYPE_LINUX_SLL = 113;
+
+ private LinkTypeHelper() {}
+
+ /**
+ * Method that match the linktype as an int to a protocol as a string.
+ *
+ * @param linkType
+ * The linkType as an int.
+ * @return The protocol as a string.
+ */
+ public static String toString(int linkType) {
+ switch (linkType) {
+ case LINKTYPE_NULL:
+ return "null"; //$NON-NLS-1$
+ case LINKTYPE_ETHERNET:
+ return "ethernet"; //$NON-NLS-1$
+ case LINKTYPE_AX25:
+ return "ax25"; //$NON-NLS-1$
+ case LINKTYPE_IEEE802_5:
+ return "ieee802.5"; //$NON-NLS-1$
+ case LINKTYPE_RAW:
+ return "raw"; //$NON-NLS-1$
+ case LINKTYPE_IEEE802_11:
+ return "ieee802.11"; //$NON-NLS-1$
+ case LINKTYPE_LINUX_SLL:
+ return "linux_sll"; //$NON-NLS-1$
+ default:
+ return "unknown"; //$NON-NLS-1$
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Vincent Perot - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.pcap.core.util;
+
+/**
+ * Enum for the different time precision for pcap files.
+ *
+ * @author Vincent Perot
+ */
+public enum PcapTimestampScale {
+
+ /** Microsecond Pcap */
+ MICROSECOND,
+ /** Nanosecond Pcap */
+ NANOSECOND
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.linuxtools.internal.pcap.core.util;
\ No newline at end of file
<module>org.eclipse.tracecompass.ctf.parser</module>
<module>org.eclipse.tracecompass.ctf.parser.tests</module>
- <module>org.eclipse.linuxtools.pcap.core</module>
- <module>org.eclipse.linuxtools.pcap.core.tests</module>
+ <module>org.eclipse.tracecompass.pcap.core</module>
+ <module>org.eclipse.tracecompass.pcap.core.tests</module>
<module>org.eclipse.linuxtools.statesystem.core</module>
<module>org.eclipse.linuxtools.statesystem.core.tests</module>