[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,