Make ponsim_olt work for asfvolt16_olt adapter.

This is the first commit where olt activate is tested.

Change-Id: Ifa3967d8650741db8feeeff1a271618408ea4da1
diff --git a/voltha/adapters/device_handler.py b/voltha/adapters/device_handler.py
index a3bc0a6..33bbd35 100644
--- a/voltha/adapters/device_handler.py
+++ b/voltha/adapters/device_handler.py
@@ -14,6 +14,8 @@
 # limitations under the License.
 #
 import structlog
+from scapy.layers.l2 import Ether, Dot1Q
+from voltha.registry import registry
 from voltha.protos.common_pb2 import OperStatus, ConnectStatus, AdminState
 
 class DeviceHandler(object):
@@ -41,6 +43,11 @@
 class OltDeviceHandler(DeviceHandler):
     def __init__(self, adapter, device_id):
         super(OltDeviceHandler, self).__init__(adapter, device_id)
+        self.filter = None
+
+    def __del__(self):
+        if self.io_port is not None:
+            registry('frameio').close_port(self.io_port)
 
     def disable(self):
         super(OltDeviceHandler, self).disable()
@@ -81,5 +88,45 @@
 
         self.log.info('deleted', device_id=self.device_id)
 
+    def activate_io_port(self):
+        if self.io_port is None:
+            self.log.info('registering-frameio')
+            self.io_port = registry('frameio').open_port(
+                self.interface, self.rcv_io, self.filter)
+
+    def deactivate_io_port(self):
+        io, self.io_port = self.io_port, None
+
+        if io is not None:
+            registry('frameio').close_port(io)
+
+    def rcv_io(self, port, frame):
+        self.log.info('received', iface_name=port.iface_name,
+                      frame_len=len(frame))
+        pkt = Ether(frame)
+        if pkt.haslayer(Dot1Q):
+            outer_shim = pkt.getlayer(Dot1Q)
+            if isinstance(outer_shim.payload, Dot1Q):
+                inner_shim = outer_shim.payload
+                cvid = inner_shim.vlan
+                logical_port = cvid
+                popped_frame = (
+                    Ether(src=pkt.src, dst=pkt.dst, type=inner_shim.type) /
+                    inner_shim.payload
+                )
+                kw = dict(
+                    logical_device_id=self.logical_device_id,
+                    logical_port_no=logical_port,
+                )
+                self.log.info('sending-packet-in', **kw)
+                self.adapter_agent.send_packet_in(
+                    packet=str(popped_frame), **kw)
+            '''
+            # TODO: handle non dot1q pkts
+            elif pkt.haslayer(Raw):
+                raw_data = json.loads(pkt.getlayer(Raw).load)
+                self.alarms.send_alarm(self, raw_data)
+            '''
+
 class OnuDeviceHandler(DeviceHandler):
     pass