VOL-1180: Enable ponsim to send packet-outs on NNI port.

This required adding the out_port metatdata to the message that
VOLTHA uses to send packets to ponsim, so that VOLTHA can tell
ponsim which port to send the packet out.

Also refactored packet-outs in ponsim so that they don't get run
through the forwarding pipeline, they just get sent out the port.
This is what happens in a normal openflow device.

Change-Id: Ic40ea730f061d82d2ecee33fb1a1f371d0ba73ef
diff --git a/ponsim/v2/core/ponsim_device.go b/ponsim/v2/core/ponsim_device.go
index 3fc52a5..9474432 100644
--- a/ponsim/v2/core/ponsim_device.go
+++ b/ponsim/v2/core/ponsim_device.go
@@ -108,35 +108,11 @@
 	o.Counter.CountRxFrame(port, len(common.GetEthernetLayer(frame).Payload))
 
 	if egressPort, egressFrame := o.processFrame(ctx, port, frame); egressFrame != nil {
-		forwarded := 0
-		links := o.links[int(egressPort)]
-
-		if int(egressPort) <= 2 && int(egressPort) > 0 {
-			o.Counter.CountTxFrame(int(egressPort), len(common.GetEthernetLayer(egressFrame).Payload))
-		}
-
-		for _, link := range links {
-			forwarded += 1
-
-			common.Logger().WithFields(logrus.Fields{
-				"device":      o,
-				"egressPort":  port,
-				"egressFrame": egressFrame,
-			}).Debug("Forwarding packet to link")
-
-			link.(func(int, gopacket.Packet))(int(egressPort), egressFrame)
-		}
-		if forwarded == 0 {
-			common.Logger().WithFields(logrus.Fields{
-				"device": o,
-				"port":   port,
-				"frame":  frame,
-			}).Warn("Nothing was forwarded")
-		}
+		o.SendOut(int(egressPort), egressFrame)
 	} else {
 		common.Logger().WithFields(logrus.Fields{
 			"device": o,
-			"port":   egressPort,
+			"port":   int(egressPort),
 			"frame":  egressFrame,
 		}).Error("Failed to properly process frame")
 	}
@@ -145,6 +121,45 @@
 }
 
 /*
+SendOut send a given frame out the given port
+*/
+func (o *PonSimDevice) SendOut(
+	egressPort int,
+	egressFrame gopacket.Packet,
+) {
+	common.Logger().WithFields(logrus.Fields{
+		"egressPort":  egressPort,
+		"egressFrame": egressFrame,
+	}).Debug("Sending packet out port")
+
+	forwarded := 0
+	links := o.links[egressPort]
+
+	if egressPort <= 2 && egressPort > 0 {
+		o.Counter.CountTxFrame(egressPort, len(common.GetEthernetLayer(egressFrame).Payload))
+	}
+
+	for _, link := range links {
+		forwarded++
+
+		common.Logger().WithFields(logrus.Fields{
+			"device":      o,
+			"egressPort":  egressPort,
+			"egressFrame": egressFrame,
+		}).Debug("Forwarding packet to link")
+
+		link.(func(int, gopacket.Packet))(egressPort, egressFrame)
+	}
+	if forwarded == 0 {
+		common.Logger().WithFields(logrus.Fields{
+			"device": o,
+			"egressPort":   egressPort,
+			"egressFrame":  egressFrame,
+		}).Warn("Nothing was forwarded")
+	}
+}
+
+/*
 connectNetworkInterfaces opens network interfaces for reading and/or writing packets
 */
 func (o *PonSimDevice) connectNetworkInterfaces() {