[VOL-2455] SingleTag applied to DHCP packets going to ONOS
Change-Id: I179cd024b2a6de1d096a40da9b96558ddc7a0fab
diff --git a/internal/bbsim/responders/dhcp/dhcp.go b/internal/bbsim/responders/dhcp/dhcp.go
index 8bcace6..c7db7eb 100644
--- a/internal/bbsim/responders/dhcp/dhcp.go
+++ b/internal/bbsim/responders/dhcp/dhcp.go
@@ -151,8 +151,9 @@
return &dhcpLayer
}
-func serializeDHCPPacket(intfId uint32, onuId uint32, srcMac net.HardwareAddr, dhcp *layers.DHCPv4) ([]byte, error) {
+func serializeDHCPPacket(intfId uint32, onuId uint32, cTag int, srcMac net.HardwareAddr, dhcp *layers.DHCPv4) ([]byte, error) {
buffer := gopacket.NewSerializeBuffer()
+
options := gopacket.SerializeOptions{
ComputeChecksums: true,
FixLengths: true,
@@ -180,11 +181,19 @@
udpLayer.SetNetworkLayerForChecksum(ipLayer)
if err := gopacket.SerializeLayers(buffer, options, ethernetLayer, ipLayer, udpLayer, dhcp); err != nil {
+ dhcpLogger.Error("SerializeLayers")
return nil, err
}
- bytes := buffer.Bytes()
- return bytes, nil
+ untaggedPkt := gopacket.NewPacket(buffer.Bytes(), layers.LayerTypeEthernet, gopacket.Default)
+
+ taggedPkt, err := packetHandlers.PushSingleTag(cTag, untaggedPkt)
+ if err != nil {
+ dhcpLogger.Error("TagPacket")
+ return nil, err
+ }
+
+ return gopacket.Payload(taggedPkt.Data()), nil
}
func GetDhcpLayer(pkt gopacket.Packet) (*layers.DHCPv4, error) {
@@ -257,9 +266,9 @@
return nil
}
-func sendDHCPRequest(ponPortId uint32, onuId uint32, serialNumber string, portNo uint32, onuStateMachine *fsm.FSM, onuHwAddress net.HardwareAddr, offeredIp net.IP, stream openolt.Openolt_EnableIndicationServer) error {
+func sendDHCPRequest(ponPortId uint32, onuId uint32, serialNumber string, portNo uint32, cTag int, onuStateMachine *fsm.FSM, onuHwAddress net.HardwareAddr, offeredIp net.IP, stream openolt.Openolt_EnableIndicationServer) error {
dhcp := createDHCPReq(ponPortId, onuId, onuHwAddress, offeredIp)
- pkt, err := serializeDHCPPacket(ponPortId, onuId, onuHwAddress, dhcp)
+ pkt, err := serializeDHCPPacket(ponPortId, onuId, cTag, onuHwAddress, dhcp)
if err != nil {
dhcpLogger.WithFields(log.Fields{
@@ -317,7 +326,8 @@
func SendDHCPDiscovery(ponPortId uint32, onuId uint32, serialNumber string, portNo uint32, onuStateMachine *fsm.FSM, onuHwAddress net.HardwareAddr, cTag int, stream bbsim.Stream) error {
dhcp := createDHCPDisc(ponPortId, onuId, onuHwAddress)
- pkt, err := serializeDHCPPacket(ponPortId, onuId, onuHwAddress, dhcp)
+ pkt, err := serializeDHCPPacket(ponPortId, onuId, cTag, onuHwAddress, dhcp)
+
if err != nil {
dhcpLogger.WithFields(log.Fields{
"OnuId": onuId,
@@ -396,7 +406,7 @@
if dhcpLayer.Operation == layers.DHCPOpReply {
if dhcpMessageType == layers.DHCPMsgTypeOffer {
offeredIp := dhcpLayer.YourClientIP
- if err := sendDHCPRequest(ponPortId, onuId, serialNumber, portNo, onuStateMachine, onuHwAddress, offeredIp, stream); err != nil {
+ if err := sendDHCPRequest(ponPortId, onuId, serialNumber, portNo, cTag, onuStateMachine, onuHwAddress, offeredIp, stream); err != nil {
dhcpLogger.WithFields(log.Fields{
"OnuId": onuId,
"IntfId": ponPortId,
@@ -450,12 +460,25 @@
// - outgouing: toward the DHCP
// - incoming: toward the ONU
isIncoming := packetHandlers.IsIncomingPacket(pkt)
- log.Tracef("Is Incoming: %t", isIncoming)
+ dhcpLogger.Tracef("Is Incoming: %t", isIncoming)
+
+ pkt, err := packetHandlers.PopSingleTag(pkt)
+ if err != nil {
+ dhcpLogger.WithFields(log.Fields{
+ "OnuId": onuId,
+ "IntfId": ponPortId,
+ "OnuSn": serialNumber,
+ "error": err,
+ }).Fatalf("Can't untag packet")
+ }
dhcpType, err := GetDhcpPacketType(pkt)
if err != nil {
- log.WithFields(log.Fields{
- "err": err,
+ dhcpLogger.WithFields(log.Fields{
+ "OnuId": onuId,
+ "IntfId": ponPortId,
+ "OnuSn": serialNumber,
+ "error": err,
}).Fatalf("Can't find DHCP type for packet")
}
@@ -473,7 +496,7 @@
}
if _, err := client.OnuPacketOut(context.Background(), &onuPacket); err != nil {
- log.WithFields(log.Fields{
+ dhcpLogger.WithFields(log.Fields{
"OnuId": onuId,
"IntfId": ponPortId,
"OnuSn": serialNumber,
@@ -482,7 +505,7 @@
}).Error("Failed to send DHCP packet to the ONU")
}
- log.WithFields(log.Fields{
+ dhcpLogger.WithFields(log.Fields{
"OnuId": onuId,
"IntfId": ponPortId,
"OnuSn": serialNumber,
@@ -492,7 +515,6 @@
"OnuMac": macAddress,
}).Infof("Sent DHCP packet to the ONU")
- // TODO: signal that the ONU has completed
dhcpLayer, _ := GetDhcpLayer(pkt)
dhcpMessageType, _ := GetDhcpMessageType(dhcpLayer)
if dhcpMessageType == layers.DHCPMsgTypeAck {
@@ -504,7 +526,13 @@
// NOTE do we need this in the HandleDHCP Packet?
doubleTaggedPkt, err := packetHandlers.PushDoubleTag(sTag, sTag, pkt)
if err != nil {
- log.Error("Failt to add double tag to packet")
+ dhcpLogger.WithFields(log.Fields{
+ "OnuId": onuId,
+ "IntfId": ponPortId,
+ "OnuSn": serialNumber,
+ "Type": dhcpType,
+ "error": err,
+ }).Error("Failed to add double tag to packet")
}
pkt := openolt.UplinkPacket{
@@ -512,7 +540,7 @@
Pkt: doubleTaggedPkt.Data(),
}
if _, err := client.UplinkPacketOut(context.Background(), &pkt); err != nil {
- log.WithFields(log.Fields{
+ dhcpLogger.WithFields(log.Fields{
"OnuId": onuId,
"IntfId": ponPortId,
"OnuSn": serialNumber,
@@ -520,7 +548,7 @@
"error": err,
}).Error("Failed to send DHCP packet out of the NNI Port")
}
- log.WithFields(log.Fields{
+ dhcpLogger.WithFields(log.Fields{
"OnuId": onuId,
"IntfId": ponPortId,
"OnuSn": serialNumber,