SEBA-758 send periodic port stats to voltha
SEBA-790 get flow, gemport, and tcont information through API
fix lint errors

Change-Id: I10909e1992eba71d8e54c976ccbcea8778e35539
diff --git a/flow/flow.go b/flow/flow.go
index f1d6e10..7e47db9 100644
--- a/flow/flow.go
+++ b/flow/flow.go
@@ -17,20 +17,28 @@
 package flow
 
 import (
+	"math/rand"
+	"time"
+
+	"github.com/google/gopacket"
 	"github.com/opencord/voltha-bbsim/common/logger"
+	"github.com/opencord/voltha-bbsim/device"
 	openolt "github.com/opencord/voltha-protos/go/openolt"
 	log "github.com/sirupsen/logrus"
 )
 
-var flowManager FlowManager
+var flowManager Manager
 
-// FlowManager interface for common methods of controller
-type FlowManager interface {
+// Manager interface for common methods of controller
+type Manager interface {
 	AddFlow(flow *openolt.Flow) error
 	DeleteFlow(flow *openolt.Flow) error
+	DeleteAllFlows() error
 	PortUp(portID uint32) error
 	PortDown(portID uint32) error
 	GetFlow(onuID uint32) ([]*openolt.Flow, error)
+	InitializePacketInStream(s openolt.Openolt_EnableIndicationServer)
+	PacketOut(packet gopacket.Packet, s string, u uint32) error
 }
 
 // DefaultFlowController empty struct
@@ -45,6 +53,11 @@
 	return
 }
 
+// InitializePacketInStream initializes the stream to send packets towards VOLTHA
+func InitializePacketInStream(s openolt.Openolt_EnableIndicationServer) {
+	flowManager.InitializePacketInStream(s)
+}
+
 // AddFlow abstracts actual implementation of flow addition
 func AddFlow(flow *openolt.Flow) error {
 	return flowManager.AddFlow(flow)
@@ -55,6 +68,11 @@
 	return flowManager.DeleteFlow(flow)
 }
 
+// DeleteAllFlows abstracts actual implementation of flow deletion
+func DeleteAllFlows() error {
+	return flowManager.DeleteAllFlows()
+}
+
 // PortUp abstracts actual implementation of port up
 func PortUp(portID uint32) error {
 	return flowManager.PortUp(portID)
@@ -65,8 +83,43 @@
 	return flowManager.PortDown(portID)
 }
 
+// PacketOut abstracts actual implementation of sending packet out
+func PacketOut(packet gopacket.Packet, intfType string, intfID uint32) error {
+	return flowManager.PacketOut(packet, intfType, intfID)
+}
+
+// GetPortStats return stats for specified interface
+func GetPortStats(portStats *device.PortStats) *openolt.PortStatistics {
+
+	// increment current packet count by random number
+	pkts := portStats.Packets + uint64((rand.Intn(50)+1)*10)
+	portStats.Packets = pkts
+	logger.Info("Packet count %d", portStats.Packets)
+
+	// fill all other stats based on packet count
+	nextPortStats := &openolt.PortStatistics{
+		RxBytes:        pkts * 64,
+		RxPackets:      pkts,
+		RxUcastPackets: pkts * 40 / 100,
+		RxMcastPackets: pkts * 30 / 100,
+		RxBcastPackets: pkts * 30 / 100,
+		RxErrorPackets: 0,
+		TxBytes:        pkts * 64,
+		TxPackets:      pkts,
+		TxUcastPackets: pkts * 40 / 100,
+		TxMcastPackets: pkts * 30 / 100,
+		TxBcastPackets: pkts * 30 / 100,
+		TxErrorPackets: 0,
+		RxCrcErrors:    0,
+		BipErrors:      0,
+		Timestamp:      uint32(time.Now().Unix()),
+	}
+
+	return nextPortStats
+}
+
 // InitializeDefaultFlowController method to initialize default controller
-func InitializeDefaultFlowController() FlowManager {
+func InitializeDefaultFlowController() Manager {
 	logger.Debug("Default controller initialized")
 	return new(DefaultFlowController)
 }
@@ -90,6 +143,12 @@
 	return nil
 }
 
+// DeleteAllFlows implemented for DefaultFlowController
+func (fc *DefaultFlowController) DeleteAllFlows() error {
+	logger.Debug("DeleteAllFlows invoked")
+	return nil
+}
+
 // GetFlow implemented for DefaultFlowController
 func (fc *DefaultFlowController) GetFlow(onuID uint32) ([]*openolt.Flow, error) {
 	return nil, nil
@@ -106,3 +165,14 @@
 	logger.Debug("PortDown invoked %d", portID)
 	return nil
 }
+
+// InitializePacketInStream implemented for DefaultFlowController
+func (fc *DefaultFlowController) InitializePacketInStream(s openolt.Openolt_EnableIndicationServer) {
+	logger.Debug("Initialize Openolt stream")
+}
+
+// PacketOut implemented for DefaultFlowController
+func (fc *DefaultFlowController) PacketOut(pkt gopacket.Packet, intfType string, intfID uint32) error {
+	logger.Debug("PacketOut invoked intfType: %s, intfID: %d", intfType, intfID)
+	return nil
+}