[VOL-3610] implementing a fake DHCP server within BBSim
Change-Id: If291a0ca7f78909c3713ef0e6831e381304fc2c9
diff --git a/internal/bbsim/packetHandlers/filters.go b/internal/bbsim/packetHandlers/filters.go
index c46f87d..a930b1e 100644
--- a/internal/bbsim/packetHandlers/filters.go
+++ b/internal/bbsim/packetHandlers/filters.go
@@ -44,16 +44,14 @@
return false
}
-// return true if the packet is coming in the OLT from the NNI port
-// it uses the ack to check if the source is the one we assigned to the
-// dhcp server
+// return true if the packet is coming in the OLT from the DHCP Server
+// given that we only check DHCP packets we can use the Operation
+// Request are outgoing (toward the server)
+// Replies are incoming (toward the OLT)
func IsIncomingPacket(packet gopacket.Packet) bool {
- if ipLayer := packet.Layer(layers.LayerTypeIPv4); ipLayer != nil {
-
- ip, _ := ipLayer.(*layers.IPv4)
-
- // FIXME find a better way to filter outgoing packets
- if ip.SrcIP.Equal(net.ParseIP("192.168.254.1")) {
+ layerDHCP := packet.Layer(layers.LayerTypeDHCPv4)
+ if dhcp, ok := layerDHCP.(*layers.DHCPv4); ok {
+ if dhcp.Operation == layers.DHCPOpReply {
return true
}
}
diff --git a/internal/bbsim/packetHandlers/filters_test.go b/internal/bbsim/packetHandlers/filters_test.go
index c182e82..5be7db2 100644
--- a/internal/bbsim/packetHandlers/filters_test.go
+++ b/internal/bbsim/packetHandlers/filters_test.go
@@ -131,9 +131,8 @@
}
func Test_IsIncomingPacket_True(t *testing.T) {
- eth := &layers.IPv4{
- SrcIP: net.ParseIP("192.168.254.1"),
- DstIP: net.ParseIP("182.21.0.122"),
+ eth := &layers.DHCPv4{
+ Operation: layers.DHCPOpReply,
}
buffer := gopacket.NewSerializeBuffer()
@@ -143,16 +142,15 @@
t.Fatal(err)
}
- ethernetPkt := gopacket.NewPacket(buffer.Bytes(), layers.LayerTypeIPv4, gopacket.DecodeOptions{})
+ ethernetPkt := gopacket.NewPacket(buffer.Bytes(), layers.LayerTypeDHCPv4, gopacket.DecodeOptions{})
res := packetHandlers.IsIncomingPacket(ethernetPkt)
assert.Equal(t, res, true)
}
func Test_IsIncomingPacket_False(t *testing.T) {
- eth := &layers.IPv4{
- SrcIP: net.ParseIP("182.21.0.122"),
- DstIP: net.ParseIP("192.168.254.1"),
+ eth := &layers.DHCPv4{
+ Operation: layers.DHCPOpRequest,
}
buffer := gopacket.NewSerializeBuffer()
@@ -162,7 +160,7 @@
t.Fatal(err)
}
- ethernetPkt := gopacket.NewPacket(buffer.Bytes(), layers.LayerTypeIPv4, gopacket.DecodeOptions{})
+ ethernetPkt := gopacket.NewPacket(buffer.Bytes(), layers.LayerTypeDHCPv4, gopacket.DecodeOptions{})
res := packetHandlers.IsIncomingPacket(ethernetPkt)
assert.Equal(t, res, false)
diff --git a/internal/bbsim/packetHandlers/packet_tags.go b/internal/bbsim/packetHandlers/packet_tags.go
index 1ea7be7..90186a8 100644
--- a/internal/bbsim/packetHandlers/packet_tags.go
+++ b/internal/bbsim/packetHandlers/packet_tags.go
@@ -144,3 +144,21 @@
}
return dot1q.Priority, nil
}
+
+// godet inner and outer tag from a packet
+// TODO unit test
+func GetTagsFromPacket(pkt gopacket.Packet) (uint16, uint16, error) {
+ sTag, err := GetVlanTag(pkt)
+ if err != nil {
+ return 0, 0, err
+ }
+ singleTagPkt, err := PopSingleTag(pkt)
+ if err != nil {
+ return 0, 0, err
+ }
+ cTag, err := GetVlanTag(singleTagPkt)
+ if err != nil {
+ return 0, 0, err
+ }
+ return sTag, cTag, nil
+}