blob: c76bfc03e3dfa381936fb739ea52c8a2140beba4 [file] [log] [blame]
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -07001/*
Joey Armstrong2c039362024-02-04 18:51:52 -05002 * Copyright 2018-2024 Open Networking Foundation (ONF) and the ONF Contributors
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -07003
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -070017package packetHandlers_test
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070018
19import (
Shrey Baid688b4242020-07-10 20:40:10 +053020 "net"
21 "testing"
22
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070023 "github.com/google/gopacket"
24 "github.com/google/gopacket/layers"
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -070025 "github.com/opencord/bbsim/internal/bbsim/packetHandlers"
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070026 "gotest.tools/assert"
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070027)
28
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070029func TestPushSingleTag(t *testing.T) {
30 rawBytes := []byte{10, 20, 30}
31 srcMac := net.HardwareAddr{0xff, 0xff, 0xff, 0xff, byte(1), byte(1)}
32 dstMac := net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
33
34 ethernetLayer := &layers.Ethernet{
35 SrcMAC: srcMac,
36 DstMAC: dstMac,
37 EthernetType: 0x8100,
38 }
39
40 buffer := gopacket.NewSerializeBuffer()
Shrey Baid688b4242020-07-10 20:40:10 +053041 _ = gopacket.SerializeLayers(
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070042 buffer,
43 gopacket.SerializeOptions{
44 FixLengths: false,
45 },
46 ethernetLayer,
47 gopacket.Payload(rawBytes),
48 )
49
50 untaggedPkt := gopacket.NewPacket(buffer.Bytes(), layers.LayerTypeEthernet, gopacket.Default)
Matteo Scandolo8d281372020-09-03 16:23:37 -070051
52 taggedPkt, err := packetHandlers.PushSingleTag(111, untaggedPkt, 7)
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070053 if err != nil {
54 t.Fail()
55 t.Logf("Error in PushSingleTag: %v", err)
56 }
57
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -070058 vlan, _ := packetHandlers.GetVlanTag(taggedPkt)
Matteo Scandolo8d281372020-09-03 16:23:37 -070059 pbit, _ := packetHandlers.GetPbit(taggedPkt)
60
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070061 assert.Equal(t, vlan, uint16(111))
Matteo Scandolo8d281372020-09-03 16:23:37 -070062 assert.Equal(t, pbit, uint8(7))
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070063}
64
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -070065func TestPushDoubleTag(t *testing.T) {
66 rawBytes := []byte{10, 20, 30}
67 srcMac := net.HardwareAddr{0xff, 0xff, 0xff, 0xff, byte(1), byte(1)}
68 dstMac := net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
69
70 ethernetLayer := &layers.Ethernet{
71 SrcMAC: srcMac,
72 DstMAC: dstMac,
73 EthernetType: 0x8100,
74 }
75
76 buffer := gopacket.NewSerializeBuffer()
Shrey Baid688b4242020-07-10 20:40:10 +053077 _ = gopacket.SerializeLayers(
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -070078 buffer,
79 gopacket.SerializeOptions{
80 FixLengths: false,
81 },
82 ethernetLayer,
83 gopacket.Payload(rawBytes),
84 )
85
86 untaggedPkt := gopacket.NewPacket(buffer.Bytes(), layers.LayerTypeEthernet, gopacket.Default)
Matteo Scandolo8d281372020-09-03 16:23:37 -070087 taggedPkt, err := packetHandlers.PushDoubleTag(900, 800, untaggedPkt, 0)
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -070088 if err != nil {
89 t.Fail()
90 t.Logf("Error in PushSingleTag: %v", err)
91 }
92
93 sTag, err := packetHandlers.GetVlanTag(taggedPkt)
94 if err != nil {
95 t.Fatalf(err.Error())
96 }
97 singleTagPkt, err := packetHandlers.PopSingleTag(taggedPkt)
98 if err != nil {
99 t.Fatalf(err.Error())
100 }
101 cTag, err := packetHandlers.GetVlanTag(singleTagPkt)
102 if err != nil {
103 t.Fatalf(err.Error())
104 }
105
106 assert.Equal(t, sTag, uint16(900))
107 assert.Equal(t, cTag, uint16(800))
108}
109
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -0700110func TestPopSingleTag(t *testing.T) {
111 rawBytes := []byte{10, 20, 30}
112 srcMac := net.HardwareAddr{0xff, 0xff, 0xff, 0xff, byte(1), byte(1)}
113 dstMac := net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
114
115 ethernetLayer := &layers.Ethernet{
116 SrcMAC: srcMac,
117 DstMAC: dstMac,
118 EthernetType: 0x8100,
119 }
120
121 dot1qLayer := &layers.Dot1Q{
122 Type: 0x8100,
123 VLANIdentifier: uint16(111),
124 }
125
126 buffer := gopacket.NewSerializeBuffer()
Shrey Baid688b4242020-07-10 20:40:10 +0530127 _ = gopacket.SerializeLayers(
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -0700128 buffer,
129 gopacket.SerializeOptions{
130 FixLengths: false,
131 },
132 ethernetLayer,
133 dot1qLayer,
134 gopacket.Payload(rawBytes),
135 )
136
137 untaggedPkt := gopacket.NewPacket(buffer.Bytes(), layers.LayerTypeEthernet, gopacket.Default)
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -0700138 taggedPkt, err := packetHandlers.PopSingleTag(untaggedPkt)
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -0700139 if err != nil {
140 t.Fail()
141 t.Logf("Error in PushSingleTag: %v", err)
142 }
143
Shrey Baid688b4242020-07-10 20:40:10 +0530144 vlan, _ := packetHandlers.GetVlanTag(taggedPkt)
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -0700145 assert.Equal(t, vlan, uint16(2580)) // FIXME where dows 2056 comes from??
146}
147
148func TestPopDoubleTag(t *testing.T) {
149 rawBytes := []byte{10, 20, 30}
150 srcMac := net.HardwareAddr{0xff, 0xff, 0xff, 0xff, byte(1), byte(1)}
151 dstMac := net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
152
153 ethernetLayer := &layers.Ethernet{
154 SrcMAC: srcMac,
155 DstMAC: dstMac,
156 EthernetType: 0x8100,
157 }
158
159 dot1qLayer := &layers.Dot1Q{
160 Type: 0x8100,
161 VLANIdentifier: uint16(111),
162 }
163
164 buffer := gopacket.NewSerializeBuffer()
Shrey Baid688b4242020-07-10 20:40:10 +0530165 _ = gopacket.SerializeLayers(
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -0700166 buffer,
167 gopacket.SerializeOptions{
168 FixLengths: false,
169 },
170 ethernetLayer,
171 dot1qLayer,
172 gopacket.Payload(rawBytes),
173 )
174
175 untaggedPkt := gopacket.NewPacket(buffer.Bytes(), layers.LayerTypeEthernet, gopacket.Default)
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -0700176 taggedPkt, err := packetHandlers.PopDoubleTag(untaggedPkt)
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -0700177 if err != nil {
178 t.Fail()
179 t.Logf("Error in PushSingleTag: %v", err)
180 }
181
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -0700182 vlan, err := packetHandlers.GetVlanTag(taggedPkt)
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -0700183 assert.Equal(t, vlan, uint16(0))
184 assert.Equal(t, err.Error(), "no-dot1q-layer-in-packet")
185}
Elia Battistonbed2d212022-02-02 16:23:31 +0100186
187func TestGetTagsFromPacket(t *testing.T) {
188 rawBytes := []byte{10, 20, 30}
189 srcMac := net.HardwareAddr{0xff, 0xff, 0xff, 0xff, byte(1), byte(1)}
190 dstMac := net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
191
192 ethernetLayer := &layers.Ethernet{
193 SrcMAC: srcMac,
194 DstMAC: dstMac,
195 EthernetType: 0x800,
196 }
197
198 buffer := gopacket.NewSerializeBuffer()
199 _ = gopacket.SerializeLayers(
200 buffer,
201 gopacket.SerializeOptions{
202 FixLengths: false,
203 },
204 ethernetLayer,
205 gopacket.Payload(rawBytes),
206 )
207 untaggedPkt := gopacket.NewPacket(buffer.Bytes(), layers.LayerTypeEthernet, gopacket.Default)
208 singleTaggedPkt, err := packetHandlers.PushSingleTag(111, untaggedPkt, 0)
209 assert.NilError(t, err)
210 doubleTaggedPkt, err := packetHandlers.PushDoubleTag(111, 222, untaggedPkt, 0)
211 assert.NilError(t, err)
212
213 _, _, err = packetHandlers.GetTagsFromPacket(untaggedPkt)
214 assert.Equal(t, err.Error(), "no-dot1q-layer-in-packet")
215
216 oTag, iTag, err := packetHandlers.GetTagsFromPacket(singleTaggedPkt)
217 assert.NilError(t, err)
218 assert.Equal(t, uint16(111), oTag)
219 assert.Equal(t, uint16(0), iTag)
220
221 oTag, iTag, err = packetHandlers.GetTagsFromPacket(doubleTaggedPkt)
222 assert.NilError(t, err)
223 assert.Equal(t, uint16(111), oTag)
224 assert.Equal(t, uint16(222), iTag)
225}