diff --git a/voltha/adapters/microsemi/PAS5211.py b/voltha/adapters/microsemi/PAS5211.py
index f845735..d0acc70 100644
--- a/voltha/adapters/microsemi/PAS5211.py
+++ b/voltha/adapters/microsemi/PAS5211.py
@@ -18,11 +18,13 @@
 """
 PAS5211 scapy structs used for interaction with Ruby
 """
+import struct
+
+
 from scapy.fields import LEShortField, Field, LEIntField, LESignedIntField, FieldLenField, FieldListField, PacketField, \
-    ByteField, StrFixedLenField, ConditionalField, StrField, MACField, LELongField
-from scapy.layers.l2 import Dot3, LLC
-from scapy.layers.inet import ARP
-from scapy.packet import Packet, bind_layers, split_layers
+    ByteField, StrFixedLenField, ConditionalField, StrField, MACField, LELongField, LenField
+from scapy.layers.l2 import DestMACField, ETHER_ANY, Ether
+from scapy.packet import Packet, bind_layers
 from scapy.utils import lhex
 from scapy.volatile import RandSInt
 from scapy.layers.ntp import XLEShortField
@@ -650,7 +652,8 @@
         LEShortField("activate", PON_ENABLE),
         LEShortField("alloc_id", None),
         LEIntField("type", None),
-        LEIntField("destination", None),
+        LEIntField("destination", None),  # Is this the CNI port
+                                          # if yes then values are 0-11 (for ruby)
         LEShortField("reserved", None)
     ]
 
@@ -684,8 +687,8 @@
     fields_desc = [
         LEShortField("port_id", None),
         LEIntField("pvid_config_enabled", None),
-        LEShortField("min_cos"),
-        LEShortField("max_cos"),
+        LEShortField("min_cos", None),
+        LEShortField("max_cos", None),
         LEIntField("de_bit", None),
         LEShortField("reserved", None)
     ]
@@ -718,7 +721,7 @@
     opcode = 7
     name = "PAS5211GetSnInfo"
     fields_desc = [
-        StrField("serial_number", None)
+        StrFixedLenField("serial_number", None, 8)
     ]
 
 
@@ -726,7 +729,7 @@
     opcode = 7
     name = "PAS5211GetSnInfoResponse"
     fields_desc = [
-        StrField("serial_number", None),
+        StrFixedLenField("serial_number", None, 8),
         LEShortField("found", None),
         LEShortField("type", None),
         LEShortField("onu_state", None),
@@ -747,10 +750,10 @@
     opcode = 116
     name = "PAS5211GetOnusRangeResponse"
     fields_desc = [
-        LELongField("min_distance", None),
-        LELongField("max_distance", None),
-        LELongField("actual_min_distance", None),
-        LELongField("actual_max_distance", None)
+        LEIntField("min_distance", None),
+        LEIntField("max_distance", None),
+        LEIntField("actual_min_distance", None),
+        LEIntField("actual_max_distance", None)
     ]
 
 
@@ -815,10 +818,40 @@
     ]
 
 
+class PAS5211Dot3(Packet):
+    name = "PAS5211Dot3"
+    fields_desc = [ DestMACField("dst"),
+                    MACField("src", ETHER_ANY),
+                    LenField("len", None, "H") ]
+
+    MIN_FRAME_SIZE = 60
+
+    def post_build(self, pkt, payload):
+        pkt += payload
+        size = ord(payload[4]) + (ord(payload[5]) << 8)
+        length = size + 6  # this is a idiosyncracy of the PASCOMM protocol
+        pkt = pkt[:12] + chr(length >> 8) + chr(length & 0xff) + pkt[14:]
+        padding = self.MIN_FRAME_SIZE - len(pkt)
+        if padding > 0:
+            pkt = pkt + ("\x00" * padding)
+        return pkt
+
+'''
+This is needed in order to force scapy to use PAS5211Dot3
+instead of the default Dot3 that the Ether class uses.
+'''
+@classmethod
+def PAS_dispatch_hook(cls, _pkt=None, *args, **kargs):
+    if _pkt and len(_pkt) >= 14:
+        if struct.unpack("!H", _pkt[12:14])[0] <= 1500:
+            return PAS5211Dot3
+    return cls
+
+Ether.dispatch_hook = PAS_dispatch_hook
+
 # bindings for messages received
 
-split_layers(Dot3, LLC)
-bind_layers(Dot3, PAS5211FrameHeader)
+bind_layers(PAS5211Dot3, PAS5211FrameHeader)
 bind_layers(PAS5211FrameHeader, PAS5211MsgHeader)
 
 bind_layers(PAS5211MsgHeader, PAS5211MsgGetProtocolVersion, opcode=0x3000 | 2)
@@ -876,7 +909,7 @@
 bind_layers(PAS5211MsgHeader, PAS5211MsgSetPortIdConfigResponse, opcode=0x2800 | 18)
 
 bind_layers(PAS5211MsgHeader, PAS5211MsgGetOnuIdByPortId, opcode=0x3000 | 196)
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetOnuIdByPortIdResponse, opcode=0x2800 | 18)
+bind_layers(PAS5211MsgHeader, PAS5211MsgGetOnuIdByPortIdResponse, opcode=0x2800 | 196)
 
 bind_layers(PAS5211MsgHeader, PAS5211SetVlanUplinkConfiguration, opcode=0x3000 | 39)
 bind_layers(PAS5211MsgHeader, PAS5211SetVlanUplinkConfigurationResponse, opcode=0x2800 | 39)
@@ -895,3 +928,24 @@
 bind_layers(PAS5211MsgHeader, PAS5211EventFrameReceived, opcode=0x2800 | 12, event_type=10)
 bind_layers(PAS5211MsgHeader, PAS5211EventDbaAlgorithm, opcode=0x2800 | 12, event_type=11)
 bind_layers(PAS5211MsgHeader, PAS5211Event, opcode=0x2800 | 12)
+
+
+class Display(object):
+    def __init__(self, pkts):
+        self.pkts = pkts
+
+    def show(self, seq):
+        self.pkts[seq].show()
+
+    def __getitem__(self, key):
+        self.show(key)
+
+
+if __name__ == '__main__':
+
+    from scapy.utils import rdpcap
+    import sys
+    import code
+    packets = rdpcap(sys.argv[1])
+    p = Display(packets)
+    code.interact(local=locals())
\ No newline at end of file
diff --git a/voltha/adapters/microsemi/pcaps/olt-with-onu.pcap b/voltha/adapters/microsemi/pcaps/olt-with-onu.pcap
new file mode 100644
index 0000000..54ec987
--- /dev/null
+++ b/voltha/adapters/microsemi/pcaps/olt-with-onu.pcap
Binary files differ
diff --git a/voltha/adapters/microsemi/sniff.py b/voltha/adapters/microsemi/sniff.py
deleted file mode 100755
index 576f74c..0000000
--- a/voltha/adapters/microsemi/sniff.py
+++ /dev/null
@@ -1,902 +0,0 @@
-#!/usr/bin/env python
-import code
-import sys
-from scapy.config import conf
-from scapy.data import ARPHDR_ETHER
-
-from scapy.fields import Field, lhex, MACField, LenField, LEShortField, \
-    LEIntField, LESignedIntField, FieldLenField, FieldListField, PacketField, \
-    ByteField, StrField, ConditionalField, StrFixedLenField, LELongField
-from scapy.layers.l2 import DestMACField, ETHER_ANY, LLC, Dot3
-from scapy.layers.ntp import XLEShortField
-from scapy.packet import Packet, bind_layers, split_layers
-from scapy.utils import rdpcap
-from scapy.volatile import RandSInt
-
-from voltha.extensions.omci.omci import OmciFrame
-
-
-src_mac = "68:05:ca:05:f2:ef"
-dst_mac = "00:0c:d5:00:01:00"
-
-
-# from enum PON_true_false_t
-PON_FALSE = 0
-PON_TRUE = 1
-
-# from enum PON_enable_disable_t
-PON_DISABLE = 0
-PON_ENABLE = 1
-
-# from enym PON_mac_t
-PON_MII = 0
-PON_GMII = 1
-PON_TBI = 2
-
-PON_POLARITY_ACTIVE_LOW = 0
-PON_POLARITY_ACTIVE_HIGH = 1
-
-PON_OPTICS_VOLTAGE_IF_UNDEFINED = 0
-PON_OPTICS_VOLTAGE_IF_CML = 1
-PON_OPTICS_VOLTAGE_IF_LVPECL = 2
-
-PON_SD_SOURCE_LASER_SD = 0
-PON_SD_SOURCE_BCDR_LOCK = 1
-PON_SD_SOURCE_BCDR_SD = 2
-
-PON_RESET_TYPE_DELAY_BASED = 0
-PON_RESET_TYPE_SINGLE_RESET = 1
-PON_RESET_TYPE_DOUBLE_RESET = 2
-
-PON_RESET_TYPE_NORMAL_START_BURST_BASED = 0
-PON_RESET_TYPE_NORMAL_END_BURST_BASED = 1
-
-PON_GPIO_LINE_0 = 0
-PON_GPIO_LINE_1 = 1
-PON_GPIO_LINE_2 = 2
-PON_GPIO_LINE_3 = 3
-PON_GPIO_LINE_4 = 4
-PON_GPIO_LINE_5 = 5
-PON_GPIO_LINE_6 = 6
-PON_GPIO_LINE_7 = 7
-def PON_EXT_GPIO_LINE(line):
-    return line + 8
-
-# from enum PON_alarm_t
-PON_ALARM_SOFTWARE_ERROR = 0
-PON_ALARM_LOS = 1
-PON_ALARM_LOSI = 2
-PON_ALARM_DOWI = 3
-PON_ALARM_LOFI = 4
-PON_ALARM_RDII = 5
-PON_ALARM_LOAMI = 6
-PON_ALARM_LCDGI = 7
-PON_ALARM_LOAI = 8
-PON_ALARM_SDI = 9
-PON_ALARM_SFI = 10
-PON_ALARM_PEE = 11
-PON_ALARM_DGI = 12
-PON_ALARM_LOKI = 13
-PON_ALARM_TIWI = 14
-PON_ALARM_TIA = 15
-PON_ALARM_VIRTUAL_SCOPE_ONU_LASER_ALWAYS_ON = 16
-PON_ALARM_VIRTUAL_SCOPE_ONU_SIGNAL_DEGRADATION = 17
-PON_ALARM_VIRTUAL_SCOPE_ONU_EOL = 18
-PON_ALARM_VIRTUAL_SCOPE_ONU_EOL_DATABASE_IS_FULL = 19
-PON_ALARM_AUTH_FAILED_IN_REGISTRATION_ID_MODE = 20
-PON_ALARM_SUFI = 21
-PON_ALARM_LAST_ALARM = 22
-
-# from enum PON_general_parameters_type_t
-PON_COMBINED_LOSI_LOFI 		            = 1000
-PON_TX_ENABLE_DEFAULT 		            = 1001
-
-# Enable or disable False queue full event from DBA
-PON_FALSE_Q_FULL_EVENT_MODE             = 1002
-
-# Set PID_AID_MISMATCH min silence period. 0 - disable, Else - period in secs
-PON_PID_AID_MISMATCH_MIN_SILENCE_PERIOD = 1003
-
-# Set if FW generate clear alarm. 0 - generate clear alarm, Else - don't
-# generate clear alarm
-PON_ENABLE_CLEAR_ALARM                  = 1004
-
-# Enable or disabl send assign alloc id ploam. 0 - disable, 1 - enable
-PON_ASSIGN_ALLOC_ID_PLOAM               = 1005
-
-# BIP error polling period, 200 - 65000, 0 - Disabled, Recommended: 5000
-# (default)
-PON_BIP_ERR_POLLING_PERIOD_MS           = 1006
-
-# Ignore SN when decatived 0 - consider SN (deactivate the onu if received
-# same SN when activated (default)	1 - Ignore
-PON_IGNORE_SN_WHEN_ACTIVE		        = 1007
-
-# 0xffffffff - Disabled (default). Any other value (0 - 0xfffe) indicates
-# that PA delay is enabled, with the specified delay value and included in
-# the US_OVERHEAD PLOAM
-PON_ONU_PRE_ASSIGNED_DELAY		        = 1008
-
-# Enable or disable DS fragmentation, 0 disable, 1 enable
-PON_DS_FRAGMENTATION			        = 1009
-
-# Set if fw report rei alarm when errors is 0, 0 disable (default), 1 enable
-PON_REI_ERRORS_REPORT_ALL		        = 1010
-
-# Set if igonre sfi deactivation, 0 disable (default), 1 enable
-PON_IGNORE_SFI_DEACTIVATION		        = 1011
-
-# Allows to override the allocation overhead set by optic-params
-# configuration. This configuration is only allowed when the the pon channel
-# is disabled
-PON_OVERRIDE_ALLOCATION_OVERHEAD	    = 1012
-
-# Optics timeline offset, -128-127, : this parameter is very sensitive and
-# requires coordination with PMC
-PON_OPTICS_TIMELINE_OFFSET	            = 1013
-
-# Last general meter
-PON_LAST_GENERAL_PARAMETER		        = PON_OPTICS_TIMELINE_OFFSET
-
-# from enum PON_dba_mode_t
-PON_DBA_MODE_NOT_LOADED                 = 0
-PON_DBA_MODE_LOADED_NOT_RUNNING         = 1
-PON_DBA_MODE_RUNNING                    = 2
-PON_DBA_MODE_LAST                       = 3
-
-# from enum type typedef enum PON_port_frame_destination_t
-PON_PORT_PON = 0
-PON_PORT_SYSTEM = 1
-
-# from enum PON_olt_hw_classification_t
-
-PON_OLT_HW_CLASSIFICATION_PAUSE                    = 0
-PON_OLT_HW_CLASSIFICATION_LINK_CONSTRAINT          = 1
-PON_OLT_HW_CLASSIFICATION_IGMP                     = 2
-PON_OLT_HW_CLASSIFICATION_MPCP                     = 3
-PON_OLT_HW_CLASSIFICATION_OAM                      = 4
-PON_OLT_HW_CLASSIFICATION_802_1X                   = 5
-PON_OLT_HW_CLASSIFICATION_PPPOE_DISCOVERY          = 6
-PON_OLT_HW_CLASSIFICATION_PPPOE_SESSION            = 7
-PON_OLT_HW_CLASSIFICATION_DHCP_V4                  = 8
-PON_OLT_HW_CLASSIFICATION_PIM                      = 9
-PON_OLT_HW_CLASSIFICATION_DHCP_V6                  = 10
-PON_OLT_HW_CLASSIFICATION_ICMP_V4                  = 11
-PON_OLT_HW_CLASSIFICATION_MLD                      = 12
-PON_OLT_HW_CLASSIFICATION_ARP                      = 13
-PON_OLT_HW_CLASSIFICATION_CONF_DA                  = 14
-PON_OLT_HW_CLASSIFICATION_CONF_RULE                = 15
-PON_OLT_HW_CLASSIFICATION_DA_EQ_SA                 = 16
-PON_OLT_HW_CLASSIFICATION_DA_EQ_MAC                = 17
-PON_OLT_HW_CLASSIFICATION_DA_EQ_SEC_MAC            = 18
-PON_OLT_HW_CLASSIFICATION_SA_EQ_MAC                = 19
-PON_OLT_HW_CLASSIFICATION_SA_EQ_SEC_MAC            = 20
-PON_OLT_HW_CLASSIFICATION_ETHERNET_MANAGEMENT      = 100
-PON_OLT_HW_CLASSIFICATION_IPV4_LOCAL_MULTICAST     = 101
-PON_OLT_HW_CLASSIFICATION_IPV4_MANAGEMENT          = 102
-PON_OLT_HW_CLASSIFICATION_ALL_IPV4_MULTICAST       = 103
-PON_OLT_HW_CLASSIFICATION_IPV6_LOCAL_MULTICAST     = 104
-PON_OLT_HW_CLASSIFICATION_IPV6_MANAGEMENT          = 105
-PON_OLT_HW_CLASSIFICATION_ALL_IPV6_MULTICAST       = 106
-PON_OLT_HW_CLASSIFICATION_OTHER			           = 107
-PON_OLT_HW_CLASSIFICATION_LAST_RULE                = 108
-
-
-class XLESignedIntField(Field):
-    def __init__(self, name, default):
-        Field.__init__(self, name, default, "<i")
-    def randval(self):
-        return RandSInt()
-    def i2repr(self, pkt, x):
-        return lhex(self.i2h(pkt, x))
-
-
-class LESignedShortField(Field):
-    def __init__(self, name, default):
-        Field.__init__(self, name, default, "<h")
-
-
-class PAS5211FrameHeader(Packet):
-    name = "PAS5211FrameHeader"
-    fields_desc = [
-        LEShortField("part", 1),
-        LEShortField("total_parts", 1),
-        LEShortField("size", 0),
-        XLESignedIntField("magic_number", 0x1234ABCD)
-    ]
-
-
-class PAS5211MsgHeader(Packet):
-    name = "PAS5211MsgHeader"
-    fields_desc = [
-        LEIntField("sequence_number", 0),
-        XLEShortField("opcode", 0),
-        LEShortField("event_type", 0),
-        LESignedShortField("channel_id", -1),
-        LESignedShortField("onu_id", -1),
-        LESignedIntField("onu_session_id", -1)
-    ]
-
-
-class PAS5211Msg(Packet):
-    opcode = "Must be filled by subclass"
-    pass
-
-
-class PAS5211MsgGetProtocolVersion(PAS5211Msg):
-    opcode = 2
-    name = "PAS5211MsgGetProtocolVersion"
-    fields_desc = [ ]
-
-
-class PAS5211MsgGetProtocolVersionResponse(PAS5211Msg):
-    name = "PAS5211MsgGetProtocolVersionResponse"
-    fields_desc = [
-        LEShortField("major_hardware_version", 0),
-        LEShortField("minor_hardware_version", 0),
-        LEShortField("major_pfi_version", 0),
-        LEShortField("minor_pfi_version", 0)
-    ]
-
-
-class PAS5211MsgGetOltVersion(PAS5211Msg):
-    opcode = 3
-    name = "PAS5211MsgGetOltVersion"
-    fields_desc = [ ]
-
-
-class PAS5211MsgGetOltVersionResponse(PAS5211Msg):
-    name = "PAS5211MsgGetOltVersionResponse"
-    fields_desc = [
-        LEShortField("major_firmware_version", 0),
-        LEShortField("minor_firmware_version", 0),
-        LEShortField("build_firmware_version", 0),
-        LEShortField("maintenance_firmware_version", 0),
-        LEShortField("major_hardware_version", 0),
-        LEShortField("minor_hardware_version", 0),
-        LEIntField("system_port_mac_type", 0),
-        FieldLenField("channels_supported", 0, fmt="<H"),
-        LEShortField("onus_supported_per_channel", 0),
-        LEShortField("ports_supported_per_channel", 0),
-        LEShortField("alloc_ids_supported_per_channel", 0),
-        FieldListField("critical_events_counter", [0, 0, 0, 0],
-                       LEIntField("entry", 0),
-                       count_from=lambda pkt: pkt.channels_supported),
-        FieldListField("non_critical_events_counter", [0, 0, 0, 0],
-                       LEIntField("entry", 0),
-                       count_from=lambda pkt: pkt.channels_supported)
-    ]
-
-
-class SnrBurstDelay(Packet):
-    name = "SnrBurstDelay"
-    fields_desc= [
-        LEShortField("timer_delay", None),
-        LEShortField("preamble_delay", None),
-        LEShortField("delimiter_delay", None),
-        LEShortField("burst_delay", None)
-    ]
-
-    def extract_padding(self, p):
-        return "", p
-
-class RngBurstDelay(Packet):
-    name = "SnrBurstDelay"
-    fields_desc= [
-        LEShortField("timer_delay", None),
-        LEShortField("preamble_delay", None),
-        LEShortField("delimiter_delay", None)
-    ]
-
-    def extract_padding(self, p):
-        return "", p
-
-
-class BurstTimingCtrl(Packet):
-    name = "BurstTimingCtrl"
-    fields_desc = [
-        PacketField("snr_burst_delay", None, SnrBurstDelay),
-        PacketField("rng_burst_delay", None, RngBurstDelay),
-        LEShortField("burst_delay_single", None),
-        LEShortField("burst_delay_double", None)
-
-    ]
-
-    def extract_padding(self, p):
-        return "", p
-
-
-class GeneralOpticsParams(Packet):
-    name = "GeneralOpticsParams"
-    fields_desc= [
-        ByteField("laser_reset_polarity", None),
-        ByteField("laser_sd_polarity", None),
-        ByteField("sd_source", None),
-        ByteField("sd_hold_snr_ranging", None),
-        ByteField("sd_hold_normal", None),
-        ByteField("reset_type_snr_ranging", None),
-        ByteField("reset_type_normal", None),
-        ByteField("laser_reset_enable", None),
-    ]
-
-    def extract_padding(self, p):
-        return "", p
-
-
-class ResetValues(Packet):
-    name = "ResetDataBurst"
-    fields_desc = [
-        ByteField("bcdr_reset_d2", None),
-        ByteField("bcdr_reset_d1", None),
-        ByteField("laser_reset_d2", None),
-        ByteField("laser_reset_d1", None)
-    ]
-
-    def extract_padding(self, p):
-        return "", p
-
-
-class DoubleResetValues(Packet):
-    name = "ResetDataBurst"
-    fields_desc = [
-        ByteField("bcdr_reset_d4", None),
-        ByteField("bcdr_reset_d3", None),
-        ByteField("laser_reset_d4", None),
-        ByteField("laser_reset_d3", None)
-    ]
-
-    def extract_padding(self, p):
-        return "", p
-
-
-class ResetTimingCtrl(Packet):
-    name = "ResetTimingCtrl"
-    fields_desc = [
-        PacketField("reset_data_burst", None, ResetValues),
-        PacketField("reset_snr_burst", None, ResetValues),
-        PacketField("reset_rng_burst", None, ResetValues),
-        PacketField("single_reset", None, ResetValues),
-        PacketField("double_reset", None, DoubleResetValues),
-    ]
-
-    def extract_padding(self, p):
-        return "", p
-
-
-class PreambleParams(Packet):
-    name = "PreambleParams"
-    fields_desc = [
-        ByteField("correlation_preamble_length", None),
-        ByteField("preamble_length_snr_rng", None),
-        ByteField("guard_time_data_mode", None),
-        ByteField("type1_size_data", None),
-        ByteField("type2_size_data", None),
-        ByteField("type3_size_data", None),
-        ByteField("type3_pattern", None),
-        ByteField("delimiter_size", None),
-        ByteField("delimiter_byte1", None),
-        ByteField("delimiter_byte2", None),
-        ByteField("delimiter_byte3", None)
-    ]
-
-    def extract_padding(self, p):
-        return "", p
-
-
-class PAS5211MsgSetOltOptics(PAS5211Msg):
-    opcode = 106
-    name = "PAS5211MsgSetOltOptics"
-    fields_desc = [
-        PacketField("burst_timing_ctrl", None, BurstTimingCtrl),
-        PacketField("general_optics_params", None, GeneralOpticsParams),
-        ByteField("reserved1", 0),
-        ByteField("reserved2", 0),
-        ByteField("reserved3", 0),
-        PacketField("reset_timing_ctrl", None, ResetTimingCtrl),
-        ByteField("voltage_if_mode", None),
-        PacketField("preamble_params", None, PreambleParams),
-        ByteField("reserved4", 0),
-        ByteField("reserved5", 0),
-        ByteField("reserved6", 0)
-    ]
-
-
-class PAS5211MsgSetOltOpticsResponse(PAS5211Msg):
-    name = "PAS5211MsgSetOltOpticsResponse"
-    fields_desc = []
-
-
-class PAS5211MsgSetOpticsIoControl(PAS5211Msg):
-    opcode = 108
-    name = "PAS5211MsgSetOpticsIoControl"
-    fields_desc = [
-        ByteField("i2c_clk", None),
-        ByteField("i2c_data", None),
-        ByteField("tx_enable", None),
-        ByteField("tx_fault", None),
-        ByteField("tx_enable_polarity", None),
-        ByteField("tx_fault_polarity", None),
-    ]
-
-
-class PAS5211MsgSetOpticsIoControlResponse(PAS5211Msg):
-    name = "PAS5211MsgSetOpticsIoControlResponse"
-    fields_desc = [ ]
-
-    def extract_padding(self, p):
-        return "", p
-
-
-class PAS5211MsgStartDbaAlgorithm(PAS5211Msg):
-    opcode = 55
-    name = "PAS5211MsgStartDbaAlgorithm"
-    fields_desc = [
-        LEShortField("size", 0),
-        ByteField("initialization_data", None)
-    ]
-
-
-class PAS5211MsgStartDbaAlgorithmResponse(PAS5211Msg):
-    name = "PAS5211MsgStartDbaAlgorithmResponse"
-    opcode = 10295
-    fields_desc = []
-
-
-class PAS5211MsgSetGeneralParam(PAS5211Msg):
-    opcode = 164
-    name = "PAS5211MsgSetGeneralParam"
-    fields_desc = [
-        LEIntField("parameter", None),
-        LEIntField("reserved", 0),
-        LEIntField("value", None)
-    ]
-
-
-class PAS5211MsgSetGeneralParamResponse(PAS5211Msg):
-    name = "PAS5211MsgSetGeneralParamResponse"
-    fields_desc = []
-
-
-class PAS5211MsgGetGeneralParam(PAS5211Msg):
-    opcode = 165
-    name = "PAS5211MsgGetGeneralParam"
-    fields_desc = [
-        LEIntField("parameter", None),
-        LEIntField("reserved", 0),
-    ]
-
-
-class PAS5211MsgGetGeneralParamResponse(PAS5211Msg):
-    name = "PAS5211MsgGetGeneralParamResponse"
-    fields_desc = [
-        LEIntField("parameter", None),
-        LEIntField("reserved", 0),
-        LEIntField("value", None)
-    ]
-
-
-class PAS5211MsgGetDbaMode(PAS5211Msg):
-    opcode = 57
-    name = "PAS5211MsgGetDbaMode"
-    fields_desc = []
-
-
-class  PAS5211MsgGetDbaModeResponse(PAS5211Msg):
-    name = "PAS5211MsgGetDbaModeResponse"
-    fields_desc = [
-        LEIntField("dba_mode", None),
-    ]
-
-
-
-
-class PAS5211MsgAddOltChannel(PAS5211Msg):
-    opcode = 4
-    name = "PAS5211MsgAddOltChannel"
-    fields_desc = [
-
-    ]
-
-
-class PAS5211MsgAddOltChannelResponse(PAS5211Msg):
-    name = "PAS5211MsgAddOltChannelResponse"
-    fields_desc = [
-
-    ]
-
-
-class PAS5211MsgSetAlarmConfig(PAS5211Msg):
-    opcode = 48
-    name = "PAS5211MsgSetAlarmConfig"
-    fields_desc = [
-        LEShortField("type", None),
-        LEShortField("activate", None),
-        LEIntField("parameter1", None),
-        LEIntField("parameter2", None),
-        LEIntField("parameter3", None),
-        LEIntField("parameter4", None)
-    ]
-
-
-class PAS5211MsgSetOltChannelActivationPeriod(PAS5211Msg):
-    opcode = 11
-    name = "PAS5211MsgSetOltChannelActivationPeriod"
-    fields_desc = [
-        LEIntField("activation_period", None)
-    ]
-
-
-class PAS5211MsgSetOltChannelActivationPeriodResponse(PAS5211Msg):
-    name = "PAS5211MsgSetOltChannelActivationPeriodResponse"
-    fields_desc = []
-
-
-class PAS5211MsgSetAlarmConfigResponse(PAS5211Msg):
-    name = "PAS5211MsgSetAlarmConfigResponse"
-    fields_desc = []
-
-
-class PAS5211MsgSendCliCommand(PAS5211Msg):
-    opcode = 15
-    name = "PAS5211MsgSendCliCommand"
-    fields_desc = [
-        FieldLenField("size", None, fmt="<H", length_of="command"),
-        StrField("command", "")
-    ]
-
-
-class PAS5211MsgSwitchToInboundMode(PAS5211Msg):
-    opcode = 0xec
-    name = "PAS5211MsgSwitchToInboundMode"
-    fields_desc = [
-        MACField("mac", None),
-        LEShortField("mode", 0)
-    ]
-
-class PAS5211MsgGetActivationAuthMode(PAS5211Msg):
-    opcode = 145
-    name = "PAS5211MsgGetActivationAuthMode"
-    fields_desc = [
-        LEShortField("nothing", 0) # no idea why this is here
-    ]
-
-class PAS5211MsgGetActivationAuthModeResponse(PAS5211Msg):
-    opcode = 10385
-    name = "PAS5211MsgGetActivationAuthMode"
-    fields_desc = [
-        LEShortField("mode", 0),
-        LEShortField("reserved", 0),
-    ]
-
-class PAS5211MsgSetOnuOmciPortId(PAS5211Msg):
-    opcode = 41
-    name = "PAS5211MsgSetOnuOmciPortId"
-    fields_desc = [
-        LEShortField("port_id", 0),
-        LEShortField("activate", PON_ENABLE)
-    ]
-
-class PAS5211MsgSetOnuOmciPortIdResponse(PAS5211Msg):
-    opcode = 10281
-    name = "PAS5211MsgSetOnuOmciPortIdResponse"
-    fields_desc = []
-
-
-class PAS5211MsgGetLogicalObjectStatus(PAS5211Msg):
-    opcode = 223
-    name = "PAS5211MsgGetLogicalObjectStatus"
-    fields_desc = [
-        LEIntField("type", None),
-        LEIntField("value", None)
-    ]
-
-class PAS5211MsgGetLogicalObjectStatusResponse(PAS5211Msg):
-    opcode = 10463
-    name = "PAS5211MsgGetLogicalObjectStatusResponse"
-    fields_desc = [
-        LEIntField("type", None),
-        LEIntField("value", None),
-        FieldLenField("return_length", None, fmt="<H", length_of="return_value"),
-        LEIntField("return_value", "")
-    ]
-
-class PAS5211MsgSetOnuAllocId(PAS5211Msg):
-    opcode = 8
-    name = "PAS5211MsgSetOnuAllocId"
-    fields_desc = [
-        LEShortField("alloc_id", None),
-        LEShortField("allocate", None)
-    ]
-
-class PAS5211MsgSetOnuAllocIdResponse(PAS5211Msg):
-    opcode = 10248
-    name = "PAS5211MsgSetOnuAllocIdResponse"
-    fields_desc = []
-
-
-class PAS5211MsgSendDbaAlgorithmMsg(PAS5211Msg):
-    opcode = 47
-    name = "PAS5211MsgSendDbaAlgorithmMsg"
-    fields_desc = [
-        LEShortField("id", None),
-        LEShortField("size", None),
-        ByteField("data", None)
-    ]
-
-class PAS5211MsgSendDbaAlgorithmMsgResponse(PAS5211Msg):
-    opcode = 10287
-    name = "PAS5211MsgSendDbaAlgorithmMsgReponse"
-    fields_desc = []
-
-class PAS5211MsgSetPortIdConfig(PAS5211Msg):
-    opcode = 18
-    name = "PAS5211MsgSetPortIdConfig"
-    fields_desc = [
-        LEShortField("port_id", None),
-        LEShortField("activate", PON_ENABLE),
-        LEShortField("alloc_id", None),
-        LEIntField("type", None),
-        LEIntField("destination", None),
-        LEShortField("reserved", None)
-    ]
-
-class PAS5211MsgSetPortIdConfigResponse(PAS5211Msg):
-    opcode = 10258
-    name = "PAS5211MsgSetPortIdConfigResponse"
-    fields_desc = []
-
-
-class PAS5211MsgGetOnuIdByPortId(PAS5211Msg):
-    opcode = 196
-    name = "PAS5211MsgGetOnuIdByPortId"
-    fields_desc = [
-        LEShortField("port_id", None),
-        LEShortField("reserved", None)
-    ]
-
-
-class PAS5211MsgGetOnuIdByPortIdResponse(PAS5211Msg):
-    opcode = 196
-    name = "PAS5211MsgGetOnuIdByPortIdResponse"
-    fields_desc = [
-        LEShortField("valid", None),
-        LEShortField("onu_id", None)
-    ]
-
-
-class PAS5211SetVlanUplinkConfiguration(PAS5211Msg):
-    opcode = 39
-    name = "PAS5211SetVlanUplinkConfiguration"
-    fields_desc = [
-        LEShortField("port_id", None),
-        LEIntField("pvid_config_enabled", None),
-        LEShortField("min_cos"),
-        LEShortField("max_cos"),
-        LEIntField("de_bit", None),
-        LEShortField("reserved", None)
-    ]
-
-
-class PAS5211SetVlanUplinkConfigurationResponse(PAS5211Msg):
-    opcode = 10279
-    name = "PAS5211SetVlanUplinkConfigurationResponse"
-    fields_desc = []
-
-
-class PAS5211GetOnuAllocs(PAS5211Msg):
-    opcode = 9
-    name = "PAS5211GetOnuAllocs"
-    fields_desc = [
-        LEShortField("nothing", None) # It's in the PMC code... so yeah.
-    ]
-
-
-class PAS5211GetOnuAllocsResponse(PAS5211Msg):
-    opcode = 9
-    name = "PAS5211GetOnuAllocsResponse"
-    fields_desc = [
-        LEShortField("allocs_number", None),
-        FieldListField("alloc_ids", None, LEShortField("alloc_id", None))
-    ]
-
-
-class PAS5211GetSnInfo(PAS5211Msg):
-    opcode = 7
-    name = "PAS5211GetSnInfo"
-    fields_desc = [
-        StrField("serial_number", None)
-    ]
-
-
-class PAS5211GetSnInfoResponse(PAS5211Msg):
-    opcode = 7
-    name = "PAS5211GetSnInfoResponse"
-    fields_desc = [
-        StrField("serial_number", None),
-        LEShortField("found", None),
-        LEShortField("type", None),
-        LEShortField("onu_state", None),
-        LELongField("equalization_delay", None),
-        LEShortField("reserved", None)
-    ]
-
-
-class PAS5211GetOnusRange(PAS5211Msg):
-    opcode = 116
-    name = "PAS5211GetOnusRange"
-    fields_desc = [
-        LEShortField("nothing", None)
-    ]
-
-
-class PAS5211GetOnusRangeResponse(PAS5211Msg):
-    opcode = 116
-    name = "PAS5211GetOnusRangeResponse"
-    fields_desc = [
-        LELongField("min_distance", None),
-        LELongField("max_distance", None),
-        LELongField("actual_min_distance", None),
-        LELongField("actual_max_distance", None)
-    ]
-
-
-
-class Frame(Packet):
-    pass
-
-
-class PAS5211MsgSendFrame(PAS5211Msg):
-    opcode = 42
-    name = "PAS5211MsgSendFrame"
-    fields_desc = [
-        FieldLenField("length", None, fmt="<H", length_of="frame"),
-        LEShortField("port_type", PON_PORT_PON),
-        LEShortField("port_id", 0),
-        LEShortField("management_frame", PON_FALSE),
-        ConditionalField(PacketField("frame", None, Packet), lambda pkt: pkt.management_frame==PON_FALSE),
-        ConditionalField(PacketField("frame", None, OmciFrame), lambda pkt: pkt.management_frame==PON_TRUE)
-    ]
-
-    def extract_padding(self, p):
-        return "", p
-
-
-class PAS5211MsgSendFrameResponse(PAS5211Msg):
-    name = "PAS5211MsgSendFrameResponse"
-    fields_desc = []
-
-
-class PAS5211Event(PAS5211Msg):
-    opcode = 12
-
-
-class PAS5211EventFrameReceived(PAS5211Event):
-    name = "PAS5211EventFrameReceived"
-    fields_desc = [
-        FieldLenField("length", None, length_of="frame", fmt="<H"),
-        LEShortField("port_type", PON_PORT_PON),
-        LEShortField("port_id", 0),
-        LEShortField("management_frame", PON_FALSE),
-        LEShortField("classification_entity", None),
-        LEShortField("l3_offset", None),
-        LEShortField("l4_offset", None),
-        LEShortField("ignored", 0), # TODO these do receive values, but there is no code in PMC using it
-        ConditionalField(PacketField("frame", None, Packet), lambda pkt: pkt.management_frame==PON_FALSE),
-        ConditionalField(PacketField("frame", None, OmciFrame), lambda pkt: pkt.management_frame==PON_TRUE)
-    ]
-
-class PAS5211EventDbaAlgorithm(PAS5211Event):
-    name = "PAS5211EventDbaAlgorithm"
-    fields_desc = [
-        LEShortField("size", None),
-        ByteField("event_buffer", None) # According to Pythagoras_API.c line 264. Am I certain? No.
-    ]
-
-
-class PAS5211EventOnuActivation(PAS5211Event):
-    name = "PAS5211EventOnuActivation"
-    fields_desc = [
-        StrFixedLenField("serial_number", None, length=8),
-        LEIntField("equalization_period", None)
-    ]
-
-
-# bindings for messages received
-
-split_layers(Dot3, LLC)
-bind_layers(Dot3, PAS5211FrameHeader)
-bind_layers(PAS5211FrameHeader, PAS5211MsgHeader)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetProtocolVersion, opcode=0x3000 | 2)
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetProtocolVersionResponse, opcode=0x2800 | 2)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetOltVersion, opcode=0x3000 | 3)
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetOltVersionResponse, opcode=0x3800 | 3)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetOltOptics, opcode=0x3000 | 106)
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetOltOpticsResponse, opcode=0x2800 | 106)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetOpticsIoControl, opcode=0x3000 | 108)
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetOpticsIoControlResponse, opcode=0x2800 | 108)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetGeneralParam, opcode=0x3000 | 164)
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetGeneralParamResponse, opcode=0x2800 | 164)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetGeneralParam, opcode=0x3000 | 165)
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetGeneralParamResponse, opcode=0x2800 | 165)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgAddOltChannel, opcode=0x3000 | 4)
-bind_layers(PAS5211MsgHeader, PAS5211MsgAddOltChannelResponse, opcode=0x2800 | 4)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetAlarmConfig, opcode=0x3000 | 48)
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetAlarmConfigResponse, opcode=0x2800 | 48)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetOltChannelActivationPeriod, opcode=0x3000 | 11)
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetOltChannelActivationPeriodResponse, opcode=0x2800 | 11)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgStartDbaAlgorithm, opcode=0x3000 | 55)
-bind_layers(PAS5211MsgHeader, PAS5211MsgStartDbaAlgorithmResponse, opcode=0x2800 | 55)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetDbaMode, opcode=0x3000 | 57)
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetDbaModeResponse, opcode=0x2800 | 57)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgSendFrame, opcode=0x3000 | 42)
-bind_layers(PAS5211MsgHeader, PAS5211MsgSendFrameResponse, opcode=0x2800 | 42)
-
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetActivationAuthMode, opcode=0x3000 | 145)
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetActivationAuthModeResponse, opcode=0x2800 | 145)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetOnuOmciPortId, opcode=0x3000 | 41)
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetOnuOmciPortIdResponse, opcode=0x2800 | 41)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetLogicalObjectStatus, opcode=0x3000 | 223)
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetLogicalObjectStatusResponse, opcode=0x2800 | 223)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetOnuAllocId, opcode=0x3000 | 8)
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetOnuAllocIdResponse, opcode=0x2800 | 8)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgSendDbaAlgorithmMsg, opcode=0x3000 | 47)
-bind_layers(PAS5211MsgHeader, PAS5211MsgSendDbaAlgorithmMsgResponse, opcode=0x2800 | 47)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetPortIdConfig, opcode=0x3000 | 18)
-bind_layers(PAS5211MsgHeader, PAS5211MsgSetPortIdConfigResponse, opcode=0x2800 | 18)
-
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetOnuIdByPortId, opcode=0x3000 | 196)
-bind_layers(PAS5211MsgHeader, PAS5211MsgGetOnuIdByPortIdResponse, opcode=0x2800 | 18)
-
-bind_layers(PAS5211MsgHeader, PAS5211SetVlanUplinkConfiguration, opcode=0x3000 | 39)
-bind_layers(PAS5211MsgHeader, PAS5211SetVlanUplinkConfigurationResponse, opcode=0x2800 | 39)
-
-bind_layers(PAS5211MsgHeader, PAS5211GetOnuAllocs, opcode=0x3000 | 9)
-bind_layers(PAS5211MsgHeader, PAS5211GetOnuAllocsResponse, opcode=0x2800 | 9)
-
-bind_layers(PAS5211MsgHeader, PAS5211GetSnInfo, opcode=0x3000 | 7)
-bind_layers(PAS5211MsgHeader, PAS5211GetSnInfoResponse, opcode=0x2800 | 7)
-
-bind_layers(PAS5211MsgHeader, PAS5211GetOnusRange, opcode=0x3000 | 116)
-bind_layers(PAS5211MsgHeader, PAS5211GetOnusRangeResponse, opcode=0x2800 | 116)
-
-# bindings for events received
-bind_layers(PAS5211MsgHeader, PAS5211EventOnuActivation, opcode=0x2800 | 12, event_type=1)
-bind_layers(PAS5211MsgHeader, PAS5211EventFrameReceived, opcode=0x2800 | 12, event_type=10)
-bind_layers(PAS5211MsgHeader, PAS5211EventDbaAlgorithm, opcode=0x2800 | 12, event_type=11)
-bind_layers(PAS5211MsgHeader, PAS5211Event, opcode=0x2800 | 12)
-
-class Display(object):
-    def __init__(self, pkts):
-        self.pkts = pkts
-
-    def show(self, seq):
-        self.pkts[seq].show()
-
-    def __getitem__(self, key):
-        self.show(key)
-
-
-if __name__ == '__main__':
-
-    packets = rdpcap(sys.argv[1])
-    p = Display(packets)
-    code.interact(local=locals())
-
