[VOL-2761][VOL-2905] Support for DT workflow

Change-Id: I9fe1fae20d3a5970a474a234aa3bde0f9110569e
diff --git a/internal/bbsim/devices/olt.go b/internal/bbsim/devices/olt.go
index 0d64a14..28ac5a1 100644
--- a/internal/bbsim/devices/olt.go
+++ b/internal/bbsim/devices/olt.go
@@ -33,7 +33,7 @@
 	"github.com/opencord/bbsim/internal/common"
 	omcisim "github.com/opencord/omci-sim"
 	"github.com/opencord/voltha-protos/v2/go/openolt"
-	tech_profile "github.com/opencord/voltha-protos/v2/go/tech_profile"
+	"github.com/opencord/voltha-protos/v2/go/tech_profile"
 	log "github.com/sirupsen/logrus"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
@@ -148,19 +148,43 @@
 	}
 
 	// create PON ports
-	availableCTag := options.BBSim.CTagInit
-	for i := 0; i < olt.NumPon; i++ {
-		p := CreatePonPort(&olt, uint32(i))
 
-		// create ONU devices
-		for j := 0; j < olt.NumOnuPerPon; j++ {
-			delay := time.Duration(olt.Delay*j) * time.Millisecond
-			o := CreateONU(&olt, *p, uint32(j+1), options.BBSim.STag, availableCTag, options.BBSim.EnableAuth, options.BBSim.EnableDhcp, delay, isMock)
-			p.Onus = append(p.Onus, o)
-			availableCTag = availableCTag + 1
+	if options.BBSim.STagAllocation == common.TagAllocationShared && options.BBSim.CTagAllocation == common.TagAllocationShared {
+		oltLogger.Fatalf("This configuration will result in duplicate C/S tags combination")
+	} else if options.BBSim.STagAllocation == common.TagAllocationUnique && options.BBSim.CTagAllocation == common.TagAllocationUnique {
+		oltLogger.Fatalf("This configuration is not supported yet")
+	} else if options.BBSim.STagAllocation == common.TagAllocationShared && options.BBSim.CTagAllocation == common.TagAllocationUnique {
+		// ATT case
+		availableCTag := options.BBSim.CTag
+		for i := 0; i < olt.NumPon; i++ {
+			p := CreatePonPort(&olt, uint32(i))
+
+			// create ONU devices
+			for j := 0; j < olt.NumOnuPerPon; j++ {
+				delay := time.Duration(olt.Delay*j) * time.Millisecond
+				o := CreateONU(&olt, *p, uint32(j+1), options.BBSim.STag, availableCTag, options.BBSim.EnableAuth, options.BBSim.EnableDhcp, delay, isMock)
+				p.Onus = append(p.Onus, o)
+				availableCTag = availableCTag + 1
+			}
+
+			olt.Pons = append(olt.Pons, p)
 		}
+	} else if options.BBSim.STagAllocation == common.TagAllocationUnique && options.BBSim.CTagAllocation == common.TagAllocationShared {
+		// DT case
+		availableSTag := options.BBSim.STag
+		for i := 0; i < olt.NumPon; i++ {
+			p := CreatePonPort(&olt, uint32(i))
 
-		olt.Pons = append(olt.Pons, p)
+			// create ONU devices
+			for j := 0; j < olt.NumOnuPerPon; j++ {
+				delay := time.Duration(olt.Delay*j) * time.Millisecond
+				o := CreateONU(&olt, *p, uint32(j+1), availableSTag, options.BBSim.CTag, options.BBSim.EnableAuth, options.BBSim.EnableDhcp, delay, isMock)
+				p.Onus = append(p.Onus, o)
+				availableSTag = availableSTag + 1
+			}
+
+			olt.Pons = append(olt.Pons, p)
+		}
 	}
 
 	if isMock != true {
@@ -1069,7 +1093,7 @@
 	pon, err := o.GetPonById(omci_msg.IntfId)
 	if err != nil {
 		oltLogger.WithFields(log.Fields{
-			"error": err,
+			"error":  err,
 			"onu_id": omci_msg.OnuId,
 			"pon_id": omci_msg.IntfId,
 		}).Error("pon ID not found")
@@ -1079,7 +1103,7 @@
 	onu, err := pon.GetOnuById(omci_msg.OnuId)
 	if err != nil {
 		oltLogger.WithFields(log.Fields{
-			"error": err,
+			"error":  err,
 			"onu_id": omci_msg.OnuId,
 			"pon_id": omci_msg.IntfId,
 		}).Error("onu ID not found")