|
1 | | -const PCAP_FCS = base64decode(""" |
2 | | -1MOyoQIABAAAAAAAAAAAAABAAAABAAAATHLDZMwhDABeAAAAXgAAAAEAXgByrQDXj6hWAQgARQAA |
| 1 | +const PCAP_FILE_HEADER = "TTyyoQIABAAAAAAAAAAAAAAGAAABAAAA" |
| 2 | + |
| 3 | +const PCAP_FCS = """ |
| 4 | +THLDZMwhDABeAAAAXgAAAAEAXgByrQDXj6hWAQgARQAA |
3 | 5 | TGk3QAD9Eag2wR1YZ+AAcq1KeuaZADhwtSAAyDL/////HxIFAHRgAwAMAQAAAAAAAAzrS61s+HUX |
4 | 6 | EADJMv////9OAAAAAAAAALygjcY= |
5 | | -""") |
| 7 | +""" |
6 | 8 |
|
7 | | -const PCAP_NOFCS = base64decode(""" |
8 | | -1MOyoQIABAAAAAAAAAAAAAAABAABAAAAablkZZ4hAgBiAAAAYgAAAAABIQIgTBjATYjFhQgARQAA |
| 9 | +const PCAP_NOFCS = """ |
| 10 | +ablkZZ4hAgBiAAAAYgAAAAABIQIgTBjATYjFhQgARQAA |
9 | 11 | VMmzQABAAVv6CksAZQpLAAEIANTpAAIAAWm5ZGUAAAAAlCECAAAAAAAQERITFBUWFxgZGhscHR4f |
10 | 12 | ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3 |
11 | | -""") |
| 13 | +""" |
12 | 14 |
|
13 | | -const PCAP_CORRUPT_FCS = base64decode(""" |
14 | | -1MOyoQIABAAAAAAAAAAAAABAAAABAAAATHLDZMwhDABeAAAAXgAAAAEAXgByrQDXj6hWAQgARQAA |
| 15 | +const PCAP_CORRUPT_FCS = """ |
| 16 | +THLDZMwhDABeAAAAXgAAAAEAXgByrQDXj6hWAQgARQAA |
15 | 17 | TGk3QAD9Eag2wR1YZ+AAcq1KeuaZADhwtSAAyDL/////HxIFAHRgAwAMAQAAAAAAAAzrS61s+HUX |
16 | 18 | EADJMv////9OAAAAAAAAALygjcg= |
17 | | -""") |
| 19 | +""" |
| 20 | + |
| 21 | +# Miniumum ethernet packet size (60 bytes without FCS) |
| 22 | +const PCAP_SMALL = """ |
| 23 | +Tq98Zs+xVzM8AAAAPAAAAAEAXgBynQDXj6hFQQgARQAA |
| 24 | +HrAOQAD9EV7swR1bGOAAcp3yuObOAAr2hcD4AAAAAAAAAAAAAAAAAAAAAA== |
| 25 | +""" |
| 26 | + |
| 27 | +# Non-IPv4 packet (ARP protocol) |
| 28 | +const PCAP_NONIP = """ |
| 29 | +8+/iZolNFC1AAAAAQAAAAAD2Y0DDvGQ/XwHjQwgGAAEI |
| 30 | +AAYEAAFkP18B40Na4gKMAAAAAAAAWuICgQAAAAAAAAAAAAAAAAAAAAAAAOr6Tyw= |
| 31 | +""" |
| 32 | + |
| 33 | +check_detect_fcs(packets; confirm_checksum=true) = |
| 34 | + pushfirst!(packets, PCAP_FILE_HEADER) |> |
| 35 | + join |> |
| 36 | + base64decode |> |
| 37 | + PcapBufferReader |> |
| 38 | + (x -> try_detect_fcs(x; confirm_checksum)) |
18 | 39 |
|
19 | 40 | @testset "pcap_has_fcs" begin |
20 | | - @test pcap_has_fcs(PcapBufferReader(PCAP_FCS)) |
21 | | - @test !pcap_has_fcs(PcapBufferReader(PCAP_NOFCS)) |
| 41 | + @test pcap_has_fcs(PcapBufferReader(base64decode(PCAP_FILE_HEADER * PCAP_FCS))) |
| 42 | + @test !pcap_has_fcs(PcapBufferReader(base64decode(PCAP_FILE_HEADER * PCAP_NOFCS))) |
| 43 | +end |
| 44 | + |
| 45 | +@testset "try_detect_fcs" begin |
| 46 | + @test check_detect_fcs([PCAP_NONIP]) == FCS_UNDETERMINED |
| 47 | + @test check_detect_fcs([PCAP_SMALL]) == FCS_UNDETERMINED |
| 48 | + @test check_detect_fcs([""]) == FCS_UNDETERMINED # empty pcap |
| 49 | + |
| 50 | + @test check_detect_fcs([PCAP_NONIP, PCAP_SMALL, PCAP_FCS]) == FCS_PRESENT |
| 51 | + @test check_detect_fcs([PCAP_NONIP, PCAP_SMALL, PCAP_NOFCS]) == FCS_ABSENT |
| 52 | + |
| 53 | + # Corrupt FCS packets will be ignored by default |
| 54 | + @test check_detect_fcs([PCAP_NONIP, PCAP_SMALL, PCAP_CORRUPT_FCS]) == FCS_UNDETERMINED |
| 55 | + # But corrupt FCS can be explicitly allowed |
| 56 | + @test check_detect_fcs([PCAP_NONIP, PCAP_SMALL, PCAP_CORRUPT_FCS]; confirm_checksum = false) == FCS_PRESENT |
| 57 | + |
| 58 | + # Make sure we skip corrupt frames if confirm_checksum is on |
| 59 | + @test check_detect_fcs([PCAP_NONIP, PCAP_SMALL, PCAP_CORRUPT_FCS, PCAP_FCS]) == FCS_PRESENT |
| 60 | + @test check_detect_fcs([PCAP_NONIP, PCAP_SMALL, PCAP_CORRUPT_FCS, PCAP_NOFCS]) == FCS_ABSENT |
22 | 61 | end |
23 | 62 |
|
24 | 63 | @testset "compute_fcs" begin |
25 | | - r_fcs = read(PcapBufferReader(PCAP_FCS)) |
| 64 | + r_fcs = read(PcapBufferReader(base64decode(PCAP_FILE_HEADER * PCAP_FCS))) |
26 | 65 | @test check_fcs(r_fcs) |
27 | | - r_no_fcs = read(PcapBufferReader(PCAP_CORRUPT_FCS)) |
| 66 | + r_no_fcs = read(PcapBufferReader(base64decode(PCAP_FILE_HEADER * PCAP_CORRUPT_FCS))) |
28 | 67 | @test !check_fcs(r_no_fcs) |
29 | 68 | end |
0 commit comments