[VOL-3486] Generating unique DHCP TxId per service

Change-Id: I20b7d65ebe1d5ae7644aa0599571dc708e02e76f
diff --git a/internal/bbsim/responders/dhcp/dhcp.go b/internal/bbsim/responders/dhcp/dhcp.go
index 9b48c05..8ec3939 100644
--- a/internal/bbsim/responders/dhcp/dhcp.go
+++ b/internal/bbsim/responders/dhcp/dhcp.go
@@ -21,10 +21,6 @@
 	"encoding/hex"
 	"errors"
 	"fmt"
-	"net"
-	"reflect"
-	"strconv"
-
 	"github.com/google/gopacket"
 	"github.com/google/gopacket/layers"
 	"github.com/looplab/fsm"
@@ -32,6 +28,9 @@
 	bbsim "github.com/opencord/bbsim/internal/bbsim/types"
 	"github.com/opencord/voltha-protos/v3/go/openolt"
 	log "github.com/sirupsen/logrus"
+	"net"
+	"reflect"
+	"strconv"
 )
 
 var dhcpLogger = log.WithFields(log.Fields{
@@ -54,16 +53,25 @@
 	layers.DHCPOptNTPServers,
 }
 
-func createDefaultDHCPReq(oltId int, intfId uint32, onuId uint32, mac net.HardwareAddr) layers.DHCPv4 {
-	// NOTE we want to generate a unique XID, the easiest way is to concat the PON ID and the ONU ID
-	// we increment them by one otherwise:
-	// - OLT: 0 PON: 0 ONU: 62 = 062 -> 62
-	// - OLT: 0 PON: 6 ONU: 2 = 62 -> 62
-	xid, err := strconv.Atoi(fmt.Sprintf("%d%d%d", oltId+1, intfId+1, onuId+1))
+func macAddressToTxId(mac net.HardwareAddr) uint32 {
+
+	// NOTE we want to generate a unique XID,
+	// the easiest way is to transform the macAddress (already unique) into an integer
+	str := ""
+	for _, i := range mac {
+		str = str + fmt.Sprintf("%d", i)
+	}
+	xid, err := strconv.Atoi(str)
 	if err != nil {
 		log.Fatal("Can't generate unique XID for ONU")
 	}
 
+	return uint32(xid)
+}
+
+func createDefaultDHCPReq(mac net.HardwareAddr) layers.DHCPv4 {
+	xid := macAddressToTxId(mac)
+
 	return layers.DHCPv4{
 		Operation:    layers.DHCPOpRequest,
 		HardwareType: layers.LinkTypeEthernet,
@@ -96,8 +104,8 @@
 	return opts
 }
 
-func createDHCPDisc(oltId int, intfId uint32, onuId uint32, gemPort uint32, macAddress net.HardwareAddr) *layers.DHCPv4 {
-	dhcpLayer := createDefaultDHCPReq(oltId, intfId, onuId, macAddress)
+func createDHCPDisc(intfId uint32, onuId uint32, gemPort uint32, macAddress net.HardwareAddr) *layers.DHCPv4 {
+	dhcpLayer := createDefaultDHCPReq(macAddress)
 	defaultOpts := createDefaultOpts(intfId, onuId)
 	dhcpLayer.Options = append([]layers.DHCPOption{{
 		Type:   layers.DHCPOptMessageType,
@@ -116,8 +124,8 @@
 	return &dhcpLayer
 }
 
-func createDHCPReq(oltId int, intfId uint32, onuId uint32, macAddress net.HardwareAddr, offeredIp net.IP) *layers.DHCPv4 {
-	dhcpLayer := createDefaultDHCPReq(oltId, intfId, onuId, macAddress)
+func createDHCPReq(intfId uint32, onuId uint32, macAddress net.HardwareAddr, offeredIp net.IP) *layers.DHCPv4 {
+	dhcpLayer := createDefaultDHCPReq(macAddress)
 	defaultOpts := createDefaultOpts(intfId, onuId)
 
 	dhcpLayer.Options = append(defaultOpts, layers.DHCPOption{
@@ -265,10 +273,10 @@
 	return nil
 }
 
-func sendDHCPRequest(oltId int, ponPortId uint32, onuId uint32, serviceName string, serialNumber string, portNo uint32,
+func sendDHCPRequest(ponPortId uint32, onuId uint32, serviceName string, serialNumber string, portNo uint32,
 	cTag int, gemPortId uint32, onuStateMachine *fsm.FSM, onuHwAddress net.HardwareAddr,
 	offeredIp net.IP, pbit uint8, stream bbsim.Stream) error {
-	dhcp := createDHCPReq(oltId, ponPortId, onuId, onuHwAddress, offeredIp)
+	dhcp := createDHCPReq(ponPortId, onuId, onuHwAddress, offeredIp)
 	pkt, err := serializeDHCPPacket(ponPortId, onuId, cTag, onuHwAddress, dhcp, pbit)
 
 	if err != nil {
@@ -326,11 +334,11 @@
 	return nil
 }
 
-func SendDHCPDiscovery(oltId int, ponPortId uint32, onuId uint32, serviceName string, cTag int, gemPortId uint32,
+func SendDHCPDiscovery(ponPortId uint32, onuId uint32, serviceName string, cTag int, gemPortId uint32,
 	serialNumber string, portNo uint32, stateMachine *fsm.FSM, onuHwAddress net.HardwareAddr,
 	pbit uint8, stream bbsim.Stream) error {
 
-	dhcp := createDHCPDisc(oltId, ponPortId, onuId, gemPortId, onuHwAddress)
+	dhcp := createDHCPDisc(ponPortId, onuId, gemPortId, onuHwAddress)
 	pkt, err := serializeDHCPPacket(ponPortId, onuId, cTag, onuHwAddress, dhcp, pbit)
 
 	if err != nil {
@@ -385,7 +393,7 @@
 	return nil
 }
 
-func HandleNextPacket(oltId int, onuId uint32, ponPortId uint32, serviceName string, serialNumber string, portNo uint32,
+func HandleNextPacket(onuId uint32, ponPortId uint32, serviceName string, serialNumber string, portNo uint32,
 	cTag int, gemPortId uint32, onuHwAddress net.HardwareAddr, onuStateMachine *fsm.FSM,
 	pkt gopacket.Packet, pbit uint8, stream bbsim.Stream) error {
 
@@ -419,7 +427,7 @@
 	if dhcpLayer.Operation == layers.DHCPOpReply {
 		if dhcpMessageType == layers.DHCPMsgTypeOffer {
 			offeredIp := dhcpLayer.YourClientIP
-			if err := sendDHCPRequest(oltId, ponPortId, onuId, serviceName, serialNumber, portNo, cTag, gemPortId, onuStateMachine, onuHwAddress, offeredIp, pbit, stream); err != nil {
+			if err := sendDHCPRequest(ponPortId, onuId, serviceName, serialNumber, portNo, cTag, gemPortId, onuStateMachine, onuHwAddress, offeredIp, pbit, stream); err != nil {
 				dhcpLogger.WithFields(log.Fields{
 					"OnuId":       onuId,
 					"IntfId":      ponPortId,