File: radiotap_test.go

package info (click to toggle)
golang-github-gopacket-gopacket 1.3.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,004 kB
  • sloc: sh: 301; python: 76; makefile: 10
file content (159 lines) | stat: -rw-r--r-- 6,402 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// Copyright 2012 Google, Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file in the root of the source
// tree.
package layers

import (
	"testing"

	"github.com/gopacket/gopacket"
)

// testPacketRadiotap0 is the packet:
//
//	09:34:34.799438 1.0 Mb/s 2412 MHz 11b -58dB signal antenna 7 Acknowledgment RA:88:1f:a1:ae:9d:cb
//	   0x0000:  0000 1200 2e48 0000 1002 6c09 a000 c607  .....H....l.....
//	   0x0010:  0000 d400 0000 881f a1ae 9dcb c630 4b4b  .............0KK
var testPacketRadiotap0 = []byte{
	0x00, 0x00, 0x12, 0x00, 0x2e, 0x48, 0x00, 0x00, 0x10, 0x02, 0x6c, 0x09, 0xa0, 0x00, 0xc6, 0x07,
	0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x88, 0x1f, 0xa1, 0xae, 0x9d, 0xcb, 0xc6, 0x30, 0x4b, 0x4b,
}

func TestPacketRadiotap0(t *testing.T) {
	p := gopacket.NewPacket(testPacketRadiotap0, LayerTypeRadioTap, gopacket.Default)
	if p.ErrorLayer() != nil {
		t.Error("Failed to decode packet:", p.ErrorLayer().Error())
	}
	checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11}, t)
	rt := p.Layer(LayerTypeRadioTap).(*RadioTap)
	if rt.ChannelFrequency != 2412 || rt.DBMAntennaSignal != -58 || rt.Antenna != 7 {
		t.Error("Radiotap decode error")
	}
	if rt.Rate != 2 { // 500Kbps unit
		t.Error("Radiotap Rate decode error")
	}
}
func BenchmarkDecodePacketRadiotap0(b *testing.B) {
	for i := 0; i < b.N; i++ {
		gopacket.NewPacket(testPacketRadiotap0, LayerTypeRadioTap, gopacket.NoCopy)
	}
}

// testPacketRadiotap1 is the packet:
//
//	05:24:21.380948 2412 MHz 11g -36dB signal antenna 5 65.0 Mb/s MCS 7 20 MHz lon GI
//		0x0000:  0000 1500 2a48 0800 1000 6c09 8004 dc05  ....*H....l.....
//		0x0010:  0000 0700 0748 112c 0000 3a9d aaf0 191c  .....H.,..:.....
//		0x0020:  aba7 f213 9d00 3a9d aaf0 1970 b2ee a9f1  ......:....p....
//		0x0030:  16                                       .
var testPacketRadiotap1 = []byte{
	0x00, 0x00, 0x15, 0x00, 0x2a, 0x48, 0x08, 0x00, 0x10, 0x00, 0x6c, 0x09, 0x80, 0x04, 0xdc, 0x05,
	0x00, 0x00, 0x07, 0x00, 0x07, 0x48, 0x11, 0x2c, 0x00, 0x00, 0x3a, 0x9d, 0xaa, 0xf0, 0x19, 0x1c,
	0xab, 0xa7, 0xf2, 0x13, 0x9d, 0x00, 0x3a, 0x9d, 0xaa, 0xf0, 0x19, 0x70, 0xb2, 0xee, 0xa9, 0xf1,
	0x16,
}

func TestPacketRadiotap1(t *testing.T) {
	p := gopacket.NewPacket(testPacketRadiotap1, LayerTypeRadioTap, gopacket.Default)
	if p.ErrorLayer() != nil {
		t.Error("Failed to decode packet:", p.ErrorLayer().Error())
	}
	checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11}, t)
	rt := p.Layer(LayerTypeRadioTap).(*RadioTap)
	if rt.ChannelFrequency != 2412 || rt.DBMAntennaSignal != -36 || rt.Antenna != 5 {
		t.Error("Radiotap decode error")
	}
	if !rt.MCS.Known.MCSIndex() || rt.MCS.MCS != 7 {
		t.Error("Radiotap MCS error")
	}
	if !rt.MCS.Known.Bandwidth() || rt.MCS.Flags.Bandwidth() != 0 {
		t.Error("Radiotap bandwidth error")
	}
	if !rt.MCS.Known.GuardInterval() || rt.MCS.Flags.ShortGI() {
		t.Error("Radiotap GI error")
	}
}
func BenchmarkDecodePacketRadiotap1(b *testing.B) {
	for i := 0; i < b.N; i++ {
		gopacket.NewPacket(testPacketRadiotap1, LayerTypeRadioTap, gopacket.NoCopy)
	}
}

// testPacketRadiotap2 is the packet:
//
//	09:34:34.799438 1.0 Mb/s 2412 MHz 11b -58dB signal antenna 7 Acknowledgment RA:88:1f:a1:ae:9d:cb
//	   0x0000:  0000 ff00 2e48 0000 1002 6c09 a000 c607  .....H....l.....
//	   0x0010:  0000 d400 0000 881f a1ae 9dcb c630 4b4b  .............0KK
//
// Test when the RadioTap size is too large, but still process the RadioTap
var testPacketRadiotap2 = []byte{
	0x00, 0x00, 0xff, 0x00, 0x2e, 0x48, 0x00, 0x00, 0x10, 0x02, 0x6c, 0x09, 0xa0, 0x00, 0xc6, 0x07,
	0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x88, 0x1f, 0xa1, 0xae, 0x9d, 0xcb, 0xc6, 0x30, 0x4b, 0x4b,
}

func TestPacketRadiotap2(t *testing.T) {
	p := gopacket.NewPacket(testPacketRadiotap2, LayerTypeRadioTap, gopacket.Default)
	if p.ErrorLayer() != nil {
		t.Error("Failed to decode packet:", p.ErrorLayer().Error())
	}
	checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap}, t)
	rt := p.Layer(LayerTypeRadioTap).(*RadioTap)
	if rt.ChannelFrequency != 2412 || rt.DBMAntennaSignal != -58 || rt.Antenna != 7 {
		t.Error("Radiotap decode error")
	}
	if rt.Rate != 2 { // 500Kbps unit
		t.Error("Radiotap Rate decode error")
	}
}

// testPacketRadiotap3 is a HE-SU packet with a timestamp field
var testPacketRadiotap3 = []byte{
	0x00, 0x00, 0x4c, 0x00, 0x2b, 0x40, 0xd0, 0xa0, 0x20, 0x08, 0x00, 0xa0, 0x20, 0x08, 0x00, 0x00,
	0x27, 0xd7, 0x74, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x14, 0x40, 0x01, 0xd8, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x4f, 0x22, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x27, 0xd7, 0x74, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfc, 0xc7, 0x72, 0x00,
	0xc0, 0x28, 0x00, 0x00, 0x92, 0x80, 0x02, 0x0e, 0xd0, 0x00, 0xd8, 0x01, 0x88, 0x41, 0x38, 0x00,
	0x5c, 0xe9, 0x31, 0xff, 0xc3, 0x29, 0x84, 0x7b, 0x57, 0xfb, 0x4d, 0x11, 0x5c, 0xe9, 0x31, 0xff,
	0xc3, 0x27, 0x40, 0x9d, 0x10, 0xb8, 0xd3, 0x49, 0x00, 0x20, 0x4b, 0x00, 0x00, 0x00, 0x95, 0xcd,
	0xbe, 0xfd, 0xa5, 0xd2, 0xc9, 0x60, 0xd7, 0x0a, 0xdf, 0x7f, 0x21, 0xca, 0x38, 0xc4, 0xd4, 0x66,
	0x4c, 0xe0, 0xda, 0xc0, 0x01, 0x8b, 0x2a, 0xc1, 0x7f, 0xbf, 0xb4, 0x5d, 0x8b, 0xdb, 0xba, 0x83,
	0x76, 0x2f, 0x79, 0xd0, 0xc3, 0xf7, 0x08, 0xf1, 0xc9, 0x36, 0xbf, 0xb3, 0x24, 0x2d, 0xc9, 0xe8,
	0x53, 0x93, 0x85, 0x91, 0xe3, 0xfb,
}

func TestPacketRadiotap3(t *testing.T) {
	p := gopacket.NewPacket(testPacketRadiotap3, LayerTypeRadioTap, gopacket.Default)
	if p.ErrorLayer() != nil {
		t.Error("Failed to decode packet:", p.ErrorLayer().Error())
	}
	checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap}, t)
	rt := p.Layer(LayerTypeRadioTap).(*RadioTap)

	if !rt.HE.Data1.DataMCSKnown() {
		t.Error("Radiotap HE Data1 MCS unknown")
	} else if rt.HE.Data3.DataMCS() != 8 {
		t.Error("Radiotap HE MCS error")
	}

	if !rt.HE.Data1.CodingKnown() {
		t.Error("Radiotap HE Data1 Coding unknown")
	} else if rt.HE.Data3.Coding() != RadiotapHECodingLDPC {
		t.Error("Radiotap HE Coding error")
	}

	if !rt.HE.Data1.BeamChangeKnown() {
		t.Error("Radiotap HE Data1 Beam Change unknown")
	} else if !rt.HE.Data3.BeamChange() {
		t.Error("Radiotap HE Beam Change error")
	}

	if rt.HE.Data5.DataBandwidth() != DataBandwidth80 {
		t.Error("Radiotap HE Bandwidth error")
	}

	if rt.HE.Data1.HE_PPDUFormat() != RadiotapHePpduFormatHE_SU {
		t.Error("Radiotap HE PPDU Format error")
	}
}