Tibit: Disabling auto KPI collection for now.

Change-Id: Icef8131eed5cf149d4f27e3e813f97d71a93d5e7
diff --git a/voltha/adapters/dpoe_onu/eoam_config.py b/voltha/adapters/dpoe_onu/eoam_config.py
new file mode 100644
index 0000000..b69770b
--- /dev/null
+++ b/voltha/adapters/dpoe_onu/eoam_config.py
@@ -0,0 +1,358 @@
+#!/usr/bin/env python
+#--------------------------------------------------------------------------#
+# Copyright (C) 2015 - 2016 by Tibit Communications, Inc.                  #
+# All rights reserved.                                                     #
+#                                                                          #
+#    _______ ____  _ ______                                                #
+#   /_  __(_) __ )(_)_  __/                                                #
+#    / / / / __  / / / /                                                   #
+#   / / / / /_/ / / / /                                                    #
+#  /_/ /_/_____/_/ /_/                                                     #
+#                                                                          #
+#--------------------------------------------------------------------------#
+""" EOAM protocol implementation in scapy """
+
+TIBIT_VERSION_NUMBER = '1.1.2'
+
+import time
+import logging
+import argparse
+import sys
+import inspect
+
+logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
+from scapy.all import Dot1Q
+from scapy.all import sniff
+from scapy.all import IP, UDP
+from scapy.packet import Packet, bind_layers
+from scapy.fields import StrField
+from scapy.layers.l2 import Ether
+from scapy.main import interact
+from scapy.sendrecv import sendp
+from scapy.sendrecv import srp1
+from scapy.config import conf
+conf.verb = None
+
+import fcntl, socket, struct # for get hw address
+
+# TODO should remove import *
+from EOAM_TLV import *
+
+EOAM_MULTICAST_ADDRESS = '01:80:c2:00:00:02'
+IGMP_MULTICAST_ADDRESS = '01:00:5e:00:00:01'   # for test
+
+class EOAM():
+    """ EOAM frame layer """
+    def __init__(self, ctag=None, dryrun=False, stag=None,
+                 verbose=False, etype='8809',
+                 dst=EOAM_MULTICAST_ADDRESS,
+                 hexdump=False, interface='eth0',
+                 sleep=1.0):
+        self.verbose = verbose
+        self.dst = dst
+        self.dryrun = dryrun
+        self.hexdump = hexdump
+        self.interface = interface
+        self.etype = int(etype, 16)
+        self.stag = stag
+        self.ctag = ctag
+        self.sleep = sleep
+        if (self.verbose == True):
+            print("=== Settings ================")
+            print("ctag      = %s" % self.ctag)
+            print("stag      = %s" % self.stag)
+            print("dst       = %s" % self.dst)
+            print("dryrun    = %s" % self.dryrun)
+            print("hexdump   = %s" % self.hexdump)
+            print("interface = %s" % self.interface)
+            print("etype     = 0x%04x" % self.etype)
+            print("verbose   = %s" % self.verbose)
+            print("=== END Settings ============")
+
+    def send_frame(self, frame_body):
+        PACKET = Ether()
+        PACKET.length = 64
+        PACKET.dst = self.dst
+        PACKET.src = self.getHwAddr(self.interface)
+        if self.stag:
+            # WARNING: September/2016: This should be 0x88a8, but the Intel 10G
+            # hardware I am currently using does not support receiving a TPID of
+            # 0x88a8. So, I send double CTAGs, and I usually set this to 0x8100.
+            # (NOTE: The Intel hardware can send a TPID of 0x88a8)
+            PACKET.type = 0x8100
+            if self.ctag:
+                PACKET/=Dot1Q(type=0x8100,vlan=int(self.stag))
+                PACKET/=Dot1Q(type=self.etype,vlan=int(self.ctag))
+            else:
+                PACKET/=Dot1Q(type=self.etype,vlan=int(self.stag))
+        else:
+            if self.ctag:
+                PACKET.type = 0x8100
+                PACKET/=Dot1Q(type=self.etype,vlan=int(self.ctag))
+            else:
+                PACKET.type = self.etype
+#            PACKET/=Dot1Q(type=self.etype, vlan=int(self.ctag))
+        PACKET/=SlowProtocolsSubtype()/FlagsBytes()/OAMPDU()
+        PACKET/=frame_body
+        PACKET/=EndOfPDU()
+        if (self.verbose == True):
+            PACKET.show()
+            print '###[ Frame Length %d (before padding) ]###' % len(PACKET)
+        if (self.hexdump == True):
+            print hexdump(PACKET)
+        if (self.dryrun != True):
+            sendp(PACKET, iface=self.interface, verbose=self.verbose)
+            time.sleep(self.sleep)
+        return PACKET
+
+    def get_request(self, TLV):
+        return self.send_frame(CablelabsOUI()/DPoEOpcode_GetRequest()/TLV)
+
+    def set_request(self, TLV):
+        return self.send_frame(CablelabsOUI()/DPoEOpcode_SetRequest()/TLV)
+
+    def send_multicast_register(self, TLV):
+        '''
+        Note, for mulicast, the standard specifies a register message
+        with ActionFlags of either Register or Deregister
+        '''
+        return self.send_frame(CablelabsOUI()/DPoEOpcode_MulticastRegister()/TLV)
+
+    def set_request_broadcom(self, TLV):
+        return self.send_frame(BroadcomOUI()/DPoEOpcode_SetRequest()/TLV)
+
+    def getHwAddr(self, ifname):
+        if (not self.dryrun):
+            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+            info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', ifname[:15]))
+        else:
+            info = range(1, 24)
+            info[18:24] = ['0','1','2','3','4','5']
+
+        return ':'.join(['%02x' % ord(char) for char in info[18:24]])
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-d', '--dst', dest='dst', action='store', default=EOAM_MULTICAST_ADDRESS,
+                        help='MAC destination (default: %s)' % EOAM_MULTICAST_ADDRESS)
+    parser.add_argument('-e', '--etype', dest='etype', action='store', default='8809',
+                        help='EtherType value (default: 0x8809)')
+    parser.add_argument('-i', '--interface', dest='interface', action='store', default='eth0',
+                        help='ETH interface to send (default: eth0)')
+    parser.add_argument('-s', '--stag', dest='stag', action='store', default=None,
+                        help='STAG value (default: None)')
+    parser.add_argument('-c', '--ctag', dest='ctag', action='store', default=None,
+                        help='CTAG value (default: None)')
+    parser.add_argument('-p', '--sleep', dest='sleep', action='store', default='1.0', type=float,
+                        help='SLEEP time after frame (default: 0.5 secs)')
+    parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', default=False,
+                        help='verbose frame print out')
+    parser.add_argument('-x', '--hexdump', dest='hexdump', action='store_true', default=False,
+                        help='Hexdump the frame')
+    parser.add_argument('-y', '--dryrun', dest='dryrun', action='store_true', default=False,
+                        help='Dry run test, dont send - just print')
+
+    parser.add_argument('-t', '--test', dest='test', action='store_true', default=False,
+                        help='Run commands under test')
+    parser.add_argument('-r', '--critical', dest='critical', action='store_true', default=False,
+                        help='Send the critical OAM set of set_request()')
+    parser.add_argument('-ta', '--test_add', dest='test_add', action='store_true', default=False,
+                        help='Run commands under test')
+    parser.add_argument('-td', '--test_del', dest='test_del', action='store_true', default=False,
+                        help='Run commands under test')
+    parser.add_argument('-tc', '--test_clr', dest='test_clr', action='store_true', default=False,
+                        help='Run commands under test')
+
+    args = parser.parse_args()
+
+    if (args.dryrun == True):
+        args.sleep = 0.0
+
+    eoam = EOAM(
+        dryrun=args.dryrun,
+        dst=args.dst,
+        etype=args.etype,
+        hexdump=args.hexdump,
+        interface=args.interface,
+        stag=args.stag,
+        ctag=args.ctag,
+        verbose=args.verbose,
+        )
+
+    if (not args.critical
+        and not args.test
+        and not args.test_add
+        and not args.test_del
+        and not args.test_clr):
+        print 'WARNING: *** No frames sent, please specify \'test\' or \'critical\', etc.  See --help'
+
+    # Critical OAM Messages
+    if (args.critical == True):
+
+        # OAM GET Requests
+        print 'GET DeviceId and MAX Logical Links Message'
+        eoam.get_request(DeviceId()/MaxLogicalLinks())
+
+        print 'SET Report Thresholds Message'
+        eoam.set_request(ReportThresholdsSet())
+
+        print 'SET OAM Frame Rate Message'
+        eoam.set_request(OamFrameRateSet())
+
+        print 'GET multiple - Device and Manufacturing Info'
+        eoam.get_request(DONUObject()/DeviceId()/MaxLogicalLinks()/
+                              FirmwareInfo()/ChipsetInfo()/NumberOfNetworkPorts()/NumberOfS1Interfaces())
+
+        print 'GET - LLID Queue Configuration'
+        eoam.get_request(DONUObject()/LLIDQueueConfiguration())
+
+        print 'GET - ONU Manufacturer Organization Name'
+        eoam.get_request(DONUObject()/OnuManufacturerOrganizationName())
+
+        print 'GET - ONU Firmware Mfg Time Varying Controls'
+        eoam.get_request(DONUObject()/FirmwareMfgTimeVaryingControls())
+
+        print 'GET - ONU Vendor Name'
+        eoam.get_request(DONUObject()/VendorName())
+
+        print 'GET - ONU Model Number'
+        eoam.get_request(DONUObject()/ModelNumber())
+
+        print 'GET - ONU Hardware Version'
+        eoam.get_request(DONUObject()/HardwareVersion())
+
+        print 'SET - Clear Port Ingress Rules -- Network Port Object'
+        eoam.set_request(NetworkPortObject()/ClearPortIngressRules())
+
+        print 'SET - Clear Port Ingress Rules -- User Port Object'
+        eoam.set_request(UserPortObject()/ClearPortIngressRules())
+
+        print 'SET - Broadcom Specific TLVs'
+        eoam.set_request_broadcom(Broadcom07_7F_F1_Set01()/Broadcom07_7F_F1_Set02()/
+                                       Broadcom07_7F_F1_Set03()/Broadcom07_7F_F1_Set04())
+
+        print 'SET - Multicast Register Message 01'
+        eoam.send_multicast_register(MulticastRegisterSetSumitomo01())
+
+        print 'SET - Multicast Register Message 02'
+        eoam.send_multicast_register(MulticastRegisterSetSumitomo02())
+
+        print 'SET - Custom Field EtherType'
+        eoam.set_request(UserPortObject()/CustomFieldEtherType())
+
+        print 'SET - Custom Field Generic L3'
+        eoam.set_request(UserPortObject()/CustomFieldGenericL3())
+
+        print 'SET - MAC Learning MIN/MAX/Age Limit -- User Port Object'
+        eoam.set_request(UserPortObject()/MacLearningMaxAllowedSet()/DynamicAddressAgeLimitSet()/
+                              SourceAddressAdmissionControlSet()/MacLearningMinGuaranteeSet())
+
+        print 'SET - MAC Learning/Flooding/Local Switching -- D-ONU Port Object'
+        eoam.set_request(DONUObject()/MacLearningAggregateLimitSet()/FloodUnknownSet()/LocalSwitchingSet())
+
+        print 'SET - Report Thresholds -- Unicast Logical Link'
+        eoam.set_request(UnicastLogicalLink()/UnicastLogicalLinkReportThresholdsSet())
+
+        print 'SET - Port Ingress Rule -- Network Port Object -- Precedence 12'
+        eoam.set_request(NetworkPortObject()/
+                              PortIngressRuleHeader(precedence=12)/
+                              PortIngressRuleClauseMatchLength01(operator=1)/
+                              PortIngressRuleResultForward()/
+                              PortIngressRuleResultQueue(objecttype=0x0003)/
+                              PortIngressRuleTerminator()/
+                              AddPortIngressRule())
+
+        print 'SET - Port Ingress Rule -- User Port Object -- Precedence 13'
+        eoam.set_request(UserPortObject()/
+                              PortIngressRuleHeader(precedence=13)/
+                              PortIngressRuleClauseMatchLength00(fieldcode=1, operator=7)/
+                              PortIngressRuleResultQueue(objecttype=0x0002)/
+                              PortIngressRuleTerminator()/
+                              AddPortIngressRule())
+
+        print 'SET - Port Ingress Rule -- User Port Object -- Precedence 7 Discard 01'
+        eoam.set_request(UserPortObject()/
+                              PortIngressRuleHeader(precedence=7)/
+                              PortIngressRuleClauseMatchLength06(fieldcode=1, operator=1)/
+                              PortIngressRuleResultDiscard()/
+                              PortIngressRuleTerminator()/
+                              AddPortIngressRule())
+
+
+        print 'SET - Port Ingress Rule -- User Port Object -- Precedence 7 Discard 02'
+        eoam.set_request(UserPortObject()/
+                              PortIngressRuleHeader(precedence=7)/
+                              PortIngressRuleClauseMatchLength06(fieldcode=1, operator=1, match5=0x02)/
+                              PortIngressRuleClauseMatchLength02(fieldcode=0x19, operator=1, match=0x8889)/
+                              PortIngressRuleClauseMatchLength01(fieldcode=0x1a, operator=1, match=0x03)/
+                              PortIngressRuleResultDiscard()/
+                              PortIngressRuleTerminator()/
+                              AddPortIngressRule())
+
+        print 'GET - D-ONU Object -- Firmware Filename'
+        eoam.set_request(DONUObject()/FirmwareFilename())
+
+        print 'SET - User Port Object 0 -- Broadcom Specific TLVs'
+        eoam.set_request_broadcom(UserPortObject(number=0)/Broadcom07_7F_F6_Set())
+
+        print 'SET - User Port Object 1 -- Broadcom Specific TLVs'
+        eoam.set_request_broadcom(UserPortObject(number=1)/Broadcom07_7F_F6_Set())
+
+        print 'SET - User Port Object 0 -- Clause 30 Attributes -- MAC Enable'
+        eoam.set_request(UserPortObject()/Clause30AttributesMacEnable())
+
+        print 'SET - IPMC Forwarding Rule Configuration'
+        eoam.set_request(IpmcForwardingRuleConfiguration())
+
+        print 'SET - Enable User Traffic -- Unicast Logical Link'
+        eoam.set_request(UnicastLogicalLink()/EnableUserTraffic())
+
+    if (args.test == True):
+        print 'SET - Multicast Register Message 01'
+        eoam.send_multicast_register(MulticastRegisterSet(MulticastLink=0x3ff0, UnicastLink=0x120f))
+
+        #print 'SET - Multicast Deregister Message 02'
+        eoam.send_multicast_register(MulticastRegisterSet(ActionFlags="Deregister",MulticastLink=0x3ff0, UnicastLink=0x120f))
+
+    if (args.test_clr == True):
+        print 'SET Clear Static MAC Table -- User Port Object'
+        eoam.set_request(ClearStaticMacTable())
+
+    elif (args.test_add == True):
+        print 'SET Add Static MAC Address -- User Port Object'
+        eoam.set_request(AddStaticMacAddress(mac=IGMP_MULTICAST_ADDRESS))
+
+    elif (args.test_del == True):
+        print 'SET Delete Static MAC Address -- User Port Object'
+        eoam.set_request(DeleteStaticMacAddress(mac=IGMP_MULTICAST_ADDRESS))
+
+
+
+    # EXTERNAL OAM LIB TESTING
+    #import tboam
+    #tboam.get_request(f.branch, f.leaf)
+    #print 'SET - User Port Object 1 -- Broadcom Specific TLVs'
+    #f = eoam.set_request_broadcom(UserPortObject(number=1)/Broadcom07_7F_F6_Set())
+    #print("=== receive frame ===========")
+    #Now, pretend I just received this frame.
+    #f.show()
+    #tboam.set_request(f.branch, f.leaf)
+
+    # Examples
+    #oam_frame = eoam.get_request(UserPortObject()/LoopbackEnable())
+    #oam_frame = eoam.get_reqeust(UserPortObject()/LoopbackDisable())
+    #oam_frame = eoam.set_request(UserPortObject()/LoopbackEnable())
+    #oam_frame = eoam.set_request(UnicastLogicalLink()/AlarmReportingSet())
+    #oam_frame = eoam.get_request(UserPortObject()/BytesDropped())
+    #oam_frame = eoam.get_request(UserPortObject()/TxBytesUnused())
+    #print 'GET -- User Port Object -- Rx Frame 512-1023'
+    #oam_frame = eoam.get_request(UserPortObject()/RxFrame_512_1023())
+    #print 'GET -- User Port Object -- Tx Frame 512-1023'
+    #oam_frame = eoam.get_request(UserPortObject()/TxFrame_512_1023())
+    #oam_frame = eoam.get_request(NetworkPortObject()/BytesDropped())
+    #oam_frame = eoam.get_request(NetworkPortObject()/TxBytesUnused())
+    #print 'GET -- Network Port Object -- Rx Frame 512-1023'
+    #oam_frame = eoam.get_request(NetworkPortObject()/RxFrame_512_1023())
+    #print 'GET -- Network Port Object -- Tx Frame 512-1023'
+    #oam_frame = eoam.get_request(NetworkPortObject()/TxFrame_512_1023())