[SEBA-269] SIAB: DHCP packets not trapped to controller
[SEBA-341] Ponsim: Add secondary flows to OLT to trap c-tagged DHCP/EAPOL
[VOL-1301] Ponsim: Use innermost 802.1Q header for matching Ethernet type
[VOL-1302] Ponsim: Fix packet-out for QinQ-tagged packets

Change-Id: I1fcbcd793f477bd8d4f1df02098772465743ddd3
diff --git a/ponsim/v2/common/net_utils.go b/ponsim/v2/common/net_utils.go
index d203883..e9f66df 100644
--- a/ponsim/v2/common/net_utils.go
+++ b/ponsim/v2/common/net_utils.go
@@ -105,7 +105,18 @@
 	}
 	return dot1q
 }
-
+func GetLastDot1QLayer(frame gopacket.Packet) *layers.Dot1Q {
+	var dot1q *layers.Dot1Q
+	for _, layer := range frame.Layers() {
+		if layer.LayerType() == layers.LayerTypeDot1Q {
+			if adot1q, _ := layer.(*layers.Dot1Q); adot1q.NextLayerType() != layers.LayerTypeDot1Q {
+				dot1q = adot1q
+				break
+			}
+		}
+	}
+	return dot1q
+}
 func GetIpLayer(frame gopacket.Packet) *layers.IPv4 {
 	ip := &layers.IPv4{}
 	if ipLayer := frame.Layer(layers.LayerTypeIPv4); ipLayer != nil {
diff --git a/ponsim/v2/core/ponsim_device.go b/ponsim/v2/core/ponsim_device.go
index 9474432..4d2a857 100644
--- a/ponsim/v2/core/ponsim_device.go
+++ b/ponsim/v2/core/ponsim_device.go
@@ -413,7 +413,7 @@
 
 			case openflow_13.OxmOfbFieldTypes_OFPXMT_OFB_ETH_TYPE:
 				cmpType := uint32(common.GetEthernetLayer(frame).EthernetType)
-				if dot1q := common.GetDot1QLayer(frame); dot1q != nil {
+				if dot1q := common.GetLastDot1QLayer(frame); dot1q != nil {
 					cmpType = uint32(dot1q.Type)
 				}
 				if ofbfield.GetOfbField().GetEthType() != cmpType {
@@ -421,7 +421,7 @@
 						"device":   o,
 						"flow":     flow,
 						"expected": layers.EthernetType(ofbfield.GetOfbField().GetEthType()),
-						"actual":   common.GetEthernetLayer(frame).EthernetType,
+						"actual":   cmpType,
 					}).Warn("Frame type does not match")
 					return 0, nil
 				} else {
@@ -429,7 +429,7 @@
 						"device":   o,
 						"flow":     flow,
 						"expected": layers.EthernetType(ofbfield.GetOfbField().GetEthType()),
-						"actual":   common.GetEthernetLayer(frame).EthernetType,
+						"actual":   cmpType,
 					}).Debug("Frame type matches")
 				}
 				matchedMask |= ETH_TYPE