EOAM: changing to two byte match field

Change-Id: I88ef0f82005d2ad9a1030b4c3d5981284e74e8f2
diff --git a/voltha/adapters/tibit_olt/tibit_olt.py b/voltha/adapters/tibit_olt/tibit_olt.py
index e2ee432..f162a7d 100644
--- a/voltha/adapters/tibit_olt/tibit_olt.py
+++ b/voltha/adapters/tibit_olt/tibit_olt.py
@@ -36,7 +36,8 @@
     PortIngressRuleResultSet, PortIngressRuleResultInsert, \
     PortIngressRuleTerminator, AddPortIngressRule, CablelabsOUI, PonPortObject
 from voltha.extensions.eoam.EOAM_TLV import PortIngressRuleHeader
-from voltha.extensions.eoam.EOAM_TLV import ClauseSubtypeEnum as Clause
+from voltha.extensions.eoam.EOAM_TLV import ClauseSubtypeEnum
+from voltha.extensions.eoam.EOAM_TLV import RuleOperatorEnum
 from voltha.core.flow_decomposer import *
 from voltha.core.logical_device_agent import mac_str_to_tuple
 from voltha.protos.adapter_pb2 import Adapter, AdapterConfig
@@ -405,7 +406,8 @@
 
         assert len(groups.items) == 0, "Cannot yet deal with groups"
 
-        ClauseFields = {v: k for k, v in Clause.iteritems()}
+        Clause = {v: k for k, v in ClauseSubtypeEnum.iteritems()}
+        Operator = {v: k for k, v in RuleOperatorEnum.iteritems()}
 
         for flow in flows.items:
             in_port = get_in_port(flow)
@@ -421,13 +423,12 @@
                 for field in get_ofb_fields(flow):
 
                     if field.type == ETH_TYPE:
-                        log.info('#### field.type == ETH_TYPE ####')
                         _type = field.eth_type
+                        log.info('#### field.type == ETH_TYPE ####')
                         dn_req /= PortIngressRuleClauseMatchLength02(
-                            fieldcode=ClauseFields['L2 Type/Len'],
-                            operator=1,
-                            match0=(_type >> 8) & 0xff,
-                            match1=_type & 0xff)
+                            fieldcode=Clause['L2 Type/Len'],
+                            operator=Operator['=='],
+                            match=_type)
 
                     elif field.type == IP_PROTO:
                         _proto = field.ip_proto
@@ -470,7 +471,7 @@
                         if action.push.ethertype != 0x8100:
                             log.error('unhandled-ether-type',
                                       ethertype=action.push.ethertype)
-                            dn_req /= PortIngressRuleResultInsert(fieldcode=ClauseFields['C-VLAN Tag'])
+                            dn_req /= PortIngressRuleResultInsert(fieldcode=Clause['C-VLAN Tag'])
 
                     elif action.type == SET_FIELD:
                         assert (action.set_field.field.oxm_class ==
@@ -478,7 +479,7 @@
                         field = action.set_field.field.ofb_field
                         if field.type == VLAN_VID:
                             dn_req /= PortIngressRuleResultSet(
-                                fieldcode=ClauseFields['C-VLAN Tag'], value=field.vlan_vid & 0xfff)
+                                fieldcode=Clause['C-VLAN Tag'], value=field.vlan_vid & 0xfff)
                         else:
                             log.error('unsupported-action-set-field-type',
                                       field_type=field.type)
@@ -509,10 +510,9 @@
                     if field.type == ETH_TYPE:
                         _type = field.eth_type
                         up_req /= PortIngressRuleClauseMatchLength02(
-                            fieldcode=ClauseFields['L2 Type/Len'],
+                            fieldcode=Clause['L2 Type/Len'],
                             operator=1,
-                            match0=(_type >> 8) & 0xff,
-                            match1=_type & 0xff)
+                            match=_type)
 
                     elif field.type == IP_PROTO:
                         _proto = field.ip_proto
@@ -555,7 +555,7 @@
                         if action.push.ethertype != 0x8100:
                             log.error('unhandled-ether-type',
                                       ethertype=action.push.ethertype)
-                        up_req /= PortIngressRuleResultInsert(fieldcode=ClauseFields['C-VLAN Tag'])
+                        up_req /= PortIngressRuleResultInsert(fieldcode=Clause['C-VLAN Tag'])
 
                     elif action.type == SET_FIELD:
                         assert (action.set_field.field.oxm_class ==
@@ -563,7 +563,7 @@
                         field = action.set_field.field.ofb_field
                         if field.type == VLAN_VID:
                             up_req /= PortIngressRuleResultSet(
-                                fieldcode=ClauseFields['C-VLAN Tag'], value=field.vlan_vid & 0xfff)
+                                fieldcode=Clause['C-VLAN Tag'], value=field.vlan_vid & 0xfff)
                         else:
                             log.error('unsupported-action-set-field-type',
                                       field_type=field.type)
diff --git a/voltha/extensions/eoam/EOAM.py b/voltha/extensions/eoam/EOAM.py
index a671c4d..db081c1 100644
--- a/voltha/extensions/eoam/EOAM.py
+++ b/voltha/extensions/eoam/EOAM.py
@@ -163,6 +163,10 @@
                         help='Run commands under test')
     parser.add_argument('-te', '--test_eapol', dest='test_eapol', action='store_true', default=False,
                         help='Run commands under test')
+    parser.add_argument('-ti', '--test_igmp', dest='test_igmp', action='store_true', default=False,
+                        help='Run commands under test')
+    parser.add_argument('-th', '--test_dhcp', dest='test_dhcp', action='store_true', default=False,
+                        help='Run commands under test')
     parser.add_argument('-tu', '--test_upstream', dest='test_upstream', action='store_true', default=False,
                         help='Run commands under test')
     parser.add_argument('-td', '--test_downstream', dest='test_downstream', action='store_true', default=False,
@@ -192,6 +196,8 @@
         and not args.test_add
         and not args.test_clr
         and not args.test_eapol
+        and not args.test_igmp
+        and not args.test_dhcp
         and not args.test_upstream
         and not args.test_downstream
         and not args.test_multicast):
@@ -222,23 +228,108 @@
         #################################################################################
         ## EAPOL
         #################################################################################
-        print 'SET - Port Ingress Rule -- DOLT Port Object -- EAPOL'
-        eoam.set_request(DOLTObject()/
+        Clause = {v: k for k, v in ClauseSubtypeEnum.iteritems()}
+        Operator = {v: k for k, v in RuleOperatorEnum.iteritems()}
+
+        print 'SET - Port Ingress Rule -- PON Port Object -- EAPOL'
+        eoam.set_request(PonPortObject()/
                          PortIngressRuleHeader(precedence=32)/
-                         PortIngressRuleClauseMatchLength02(fieldcode=3, operator=1, match0=0x88, match1=0x8e)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['L2 Type/Len'],
+                                                            operator=Operator['=='], match=0x888e)/
                          PortIngressRuleResultForward()/
-                         PortIngressRuleResultSet(fieldcode=7, value=4090)/
-                         PortIngressRuleResultInsert(fieldcode=7)/
+                         PortIngressRuleResultSet(fieldcode=Clause['C-VLAN Tag'], value=4090)/
+                         PortIngressRuleResultInsert(fieldcode=Clause['C-VLAN Tag'])/
                          PortIngressRuleTerminator()/
                          AddPortIngressRule())
 
-        print 'Delete - Port Ingress Rule -- DOLT Port Object -- EAPOL'
-        eoam.set_request(DOLTObject()/
+        time.sleep(3)
+
+        print 'Delete - Port Ingress Rule -- PON Port Object -- EAPOL'
+        eoam.set_request(PonPortObject()/
                          PortIngressRuleHeader(precedence=32)/
-                         PortIngressRuleClauseMatchLength02(fieldcode=3, operator=1, match0=0x88, match1=0x8e)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['L2 Type/Len'],
+                                                            operator=Operator['=='], match=0x888e)/
                          PortIngressRuleResultForward()/
-                         PortIngressRuleResultSet(fieldcode=7, value=4090)/
-                         PortIngressRuleResultInsert(fieldcode=7)/
+                         PortIngressRuleResultSet(fieldcode=Clause['C-VLAN Tag'], value=4090)/
+                         PortIngressRuleResultInsert(fieldcode=Clause['C-VLAN Tag'])/
+                         PortIngressRuleTerminator()/
+                         DeletePortIngressRule())
+
+    if (args.test_igmp == True):
+        #################################################################################
+        ## IGMP
+        #################################################################################
+        Clause = {v: k for k, v in ClauseSubtypeEnum.iteritems()}
+        Operator = {v: k for k, v in RuleOperatorEnum.iteritems()}
+
+        print 'SET - Port Ingress Rule -- PON Port Object -- IGMP'
+        eoam.set_request(PonPortObject()/
+                         PortIngressRuleHeader(precedence=13)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['L2 Type/Len'],
+                                                            operator=Operator['=='], match=0x0800)/
+                         PortIngressRuleClauseMatchLength01(fieldcode=Clause['IPv4/IPv6 Protocol Type'],
+                                                            operator=Operator['=='], match=0x02)/
+                         PortIngressRuleResultForward()/
+                         PortIngressRuleResultSet(fieldcode=Clause['C-VLAN Tag'], value=4000)/
+                         PortIngressRuleResultInsert(fieldcode=Clause['C-VLAN Tag'])/
+                         PortIngressRuleTerminator()/
+                         AddPortIngressRule())
+
+        time.sleep(3)
+
+        print 'Delete - Port Ingress Rule -- PON Port Object -- IGMP'
+        eoam.set_request(PonPortObject()/
+                         PortIngressRuleHeader(precedence=13)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['L2 Type/Len'],
+                                                            operator=Operator['=='], match=0x0800)/
+                         PortIngressRuleClauseMatchLength01(fieldcode=Clause['IPv4/IPv6 Protocol Type'],
+                                                            operator=Operator['=='], match=0x02)/
+                         PortIngressRuleResultForward()/
+                         PortIngressRuleResultSet(fieldcode=Clause['C-VLAN Tag'], value=4000)/
+                         PortIngressRuleResultInsert(fieldcode=Clause['C-VLAN Tag'])/
+                         PortIngressRuleTerminator()/
+                         DeletePortIngressRule())
+
+    if (args.test_dhcp == True):
+        #################################################################################
+        ## DHCP
+        #################################################################################
+        Clause = {v: k for k, v in ClauseSubtypeEnum.iteritems()}
+        Operator = {v: k for k, v in RuleOperatorEnum.iteritems()}
+
+        print 'SET - Port Ingress Rule -- PON Port Object -- DHCP'
+        eoam.set_request(PonPortObject()/
+                         PortIngressRuleHeader(precedence=13)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['L2 Type/Len'],
+                                                            operator=Operator['=='], match=0x0800)/
+                         PortIngressRuleClauseMatchLength01(fieldcode=Clause['IPv4/IPv6 Protocol Type'],
+                                                            operator=Operator['=='], match=0x11)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['TCP/UDP source port'],
+                                                            operator=Operator['=='], match=0x0044)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['TCP/UDP destination port'],
+                                                            operator=Operator['=='], match=0x0043)/
+                         PortIngressRuleResultForward()/
+                         PortIngressRuleResultSet(fieldcode=Clause['C-VLAN Tag'], value=4000)/
+                         PortIngressRuleResultInsert(fieldcode=Clause['C-VLAN Tag'])/
+                         PortIngressRuleTerminator()/
+                         AddPortIngressRule())
+
+        time.sleep(3)
+
+        print 'Delete - Port Ingress Rule -- PON Port Object -- DHCP'
+        eoam.set_request(PonPortObject()/
+                         PortIngressRuleHeader(precedence=13)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['L2 Type/Len'],
+                                                            operator=Operator['=='], match=0x0800)/
+                         PortIngressRuleClauseMatchLength01(fieldcode=Clause['IPv4/IPv6 Protocol Type'],
+                                                            operator=Operator['=='], match=0x11)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['TCP/UDP source port'],
+                                                            operator=Operator['=='], match=0x0044)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['TCP/UDP destination port'],
+                                                            operator=Operator['=='], match=0x0043)/
+                         PortIngressRuleResultForward()/
+                         PortIngressRuleResultSet(fieldcode=Clause['C-VLAN Tag'], value=4000)/
+                         PortIngressRuleResultInsert(fieldcode=Clause['C-VLAN Tag'])/
                          PortIngressRuleTerminator()/
                          DeletePortIngressRule())
 
@@ -246,35 +337,35 @@
         #################################################################################
         ## UPSTREAM
         #################################################################################
-        ClauseFields = {v: k for k, v in ClauseSubtypeEnum.iteritems()}
-        OperatorFields = {v: k for k, v in RuleOperatorEnum.iteritems()}
+        Clause = {v: k for k, v in ClauseSubtypeEnum.iteritems()}
+        Operator = {v: k for k, v in RuleOperatorEnum.iteritems()}
 
         print 'SET - Port Ingress Rule -- OLT Unicast Logical Link -- Upstream Traffic'
         eoam.set_request(OLTUnicastLogicalLink(unicastvssn="TBIT", unicastlink=0xe2222900)/
                          PortIngressRuleHeader(precedence=13)/
-                         PortIngressRuleClauseMatchLength02(fieldcode=ClauseFields['C-VLAN Tag'], fieldinstance=0,
-                                                            operator=OperatorFields['=='], match0=0x00, match1=0xf1)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['C-VLAN Tag'], fieldinstance=0,
+                                                            operator=Operator['=='], match=0x00f1)/
                          PortIngressRuleResultForward()/
-                         PortIngressRuleResultCopy(fieldcode=ClauseFields['C-VLAN Tag'])/
-                         PortIngressRuleResultInsert(fieldcode=ClauseFields['C-VLAN Tag'], fieldinstance=1)/
-                         PortIngressRuleResultSet(fieldcode=ClauseFields['C-VLAN Tag'], value=1000)/
-                         PortIngressRuleResultReplace(fieldcode=ClauseFields['C-VLAN Tag'])/
+                         PortIngressRuleResultCopy(fieldcode=Clause['C-VLAN Tag'])/
+                         PortIngressRuleResultInsert(fieldcode=Clause['C-VLAN Tag'], fieldinstance=1)/
+                         PortIngressRuleResultSet(fieldcode=Clause['C-VLAN Tag'], value=1000)/
+                         PortIngressRuleResultReplace(fieldcode=Clause['C-VLAN Tag'])/
                          PortIngressRuleTerminator()/
                          AddPortIngressRule())
 
 
-        time.sleep(15)
+        time.sleep(3)
 
         print 'DELETE - Port Ingress Rule -- OLT Unicast Logical Link -- Upstream Traffic'
         eoam.set_request(OLTUnicastLogicalLink(unicastvssn="TBIT", unicastlink=0xe2222900)/
                          PortIngressRuleHeader(precedence=13)/
-                         PortIngressRuleClauseMatchLength02(fieldcode=ClauseFields['C-VLAN Tag'], fieldinstance=0,
-                                                            operator=OperatorFields['=='], match0=0x00, match1=0xf1)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['C-VLAN Tag'], fieldinstance=0,
+                                                            operator=Operator['=='], match=0x00f1)/
                          PortIngressRuleResultForward()/
-                         PortIngressRuleResultCopy(fieldcode=ClauseFields['C-VLAN Tag'])/
-                         PortIngressRuleResultInsert(fieldcode=ClauseFields['C-VLAN Tag'], fieldinstance=1)/
-                         PortIngressRuleResultSet(fieldcode=ClauseFields['C-VLAN Tag'], value=1000)/
-                         PortIngressRuleResultReplace(fieldcode=ClauseFields['C-VLAN Tag'])/
+                         PortIngressRuleResultCopy(fieldcode=Clause['C-VLAN Tag'])/
+                         PortIngressRuleResultInsert(fieldcode=Clause['C-VLAN Tag'], fieldinstance=1)/
+                         PortIngressRuleResultSet(fieldcode=Clause['C-VLAN Tag'], value=1000)/
+                         PortIngressRuleResultReplace(fieldcode=Clause['C-VLAN Tag'])/
                          PortIngressRuleTerminator()/
                          DeletePortIngressRule())
 
@@ -282,35 +373,35 @@
         #################################################################################
         ## DOWNSTREAM
         #################################################################################
-        ClauseFields = {v: k for k, v in ClauseSubtypeEnum.iteritems()}
-        OperatorFields = {v: k for k, v in RuleOperatorEnum.iteritems()}
+        Clause = {v: k for k, v in ClauseSubtypeEnum.iteritems()}
+        Operator = {v: k for k, v in RuleOperatorEnum.iteritems()}
 
         print 'SET - Port Ingress Rule -- NNI Port Object -- Downstream Traffic'
         eoam.set_request(NetworkToNetworkPortObject()/
                          PortIngressRuleHeader(precedence=13)/
-                         PortIngressRuleClauseMatchLength02(fieldcode=ClauseFields['C-VLAN Tag'], fieldinstance=0,
-                                                            operator=OperatorFields['=='], match0=0x0f, match1=0xa0)/
-                         PortIngressRuleClauseMatchLength02(fieldcode=ClauseFields['C-VLAN Tag'], fieldinstance=1,
-                                                            operator=OperatorFields['=='], match0=0x00, match1=0xf1)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['C-VLAN Tag'], fieldinstance=0,
+                                                            operator=Operator['=='], match=0x0fa0)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['C-VLAN Tag'], fieldinstance=1,
+                                                            operator=Operator['=='], match=0x00f1)/
                          PortIngressRuleResultOLTQueue(unicastvssn="TBIT", unicastlink=0xe2222900)/
                          PortIngressRuleResultForward()/
-                         PortIngressRuleResultDelete(fieldcode=ClauseFields['C-VLAN Tag'])/
+                         PortIngressRuleResultDelete(fieldcode=Clause['C-VLAN Tag'])/
                          PortIngressRuleTerminator()/
                          AddPortIngressRule())
 
 
-        time.sleep(15)
+        time.sleep(3)
 
         print 'DELETE - Port Ingress Rule -- NNI Port Object -- Downstream Traffic'
         eoam.set_request(NetworkToNetworkPortObject()/
                          PortIngressRuleHeader(precedence=13)/
-                         PortIngressRuleClauseMatchLength02(fieldcode=ClauseFields['C-VLAN Tag'], fieldinstance=0,
-                                                            operator=OperatorFields['=='], match0=0x0f, match1=0xa0)/
-                         PortIngressRuleClauseMatchLength02(fieldcode=ClauseFields['C-VLAN Tag'], fieldinstance=1,
-                                                            operator=OperatorFields['=='], match0=0x00, match1=0xf1)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['C-VLAN Tag'], fieldinstance=0,
+                                                            operator=Operator['=='], match=0x0fa0)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['C-VLAN Tag'], fieldinstance=1,
+                                                            operator=Operator['=='], match=0x00f1)/
                          PortIngressRuleResultOLTQueue(unicastvssn="TBIT", unicastlink=0xe2222900)/
                          PortIngressRuleResultForward()/
-                         PortIngressRuleResultDelete(fieldcode=ClauseFields['C-VLAN Tag'])/
+                         PortIngressRuleResultDelete(fieldcode=Clause['C-VLAN Tag'])/
                          PortIngressRuleTerminator()/
                          DeletePortIngressRule())
 
@@ -318,30 +409,30 @@
         #################################################################################
         ## MULTICAST
         #################################################################################
-        ClauseFields = {v: k for k, v in ClauseSubtypeEnum.iteritems()}
-        OperatorFields = {v: k for k, v in RuleOperatorEnum.iteritems()}
+        Clause = {v: k for k, v in ClauseSubtypeEnum.iteritems()}
+        Operator = {v: k for k, v in RuleOperatorEnum.iteritems()}
 
         print 'SET - Port Ingress Rule -- NNI Port Object -- Downstream Multicast Traffic'
         eoam.set_request(NetworkToNetworkPortObject()/
                          PortIngressRuleHeader(precedence=13)/
-                         PortIngressRuleClauseMatchLength02(fieldcode=ClauseFields['C-VLAN Tag'], fieldinstance=0,
-                                                            operator=OperatorFields['=='], match0=0x00, match1=0x8c)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['C-VLAN Tag'], fieldinstance=0,
+                                                            operator=Operator['=='], match=0x008c)/
                          PortIngressRuleResultOLTBroadcastQueue()/
                          PortIngressRuleResultForward()/
-                         PortIngressRuleResultDelete(fieldcode=ClauseFields['C-VLAN Tag'])/
+                         PortIngressRuleResultDelete(fieldcode=Clause['C-VLAN Tag'])/
                          PortIngressRuleTerminator()/
                          AddPortIngressRule())
 
 
-        time.sleep(15)
+        time.sleep(3)
 
         print 'DELETE - Port Ingress Rule -- NNI Port Object -- Downstream Multicast Traffic'
         eoam.set_request(NetworkToNetworkPortObject()/
                          PortIngressRuleHeader(precedence=13)/
-                         PortIngressRuleClauseMatchLength02(fieldcode=ClauseFields['C-VLAN Tag'], fieldinstance=0,
-                                                            operator=OperatorFields['=='], match0=0x00, match1=0x8c)/
+                         PortIngressRuleClauseMatchLength02(fieldcode=Clause['C-VLAN Tag'], fieldinstance=0,
+                                                            operator=Operator['=='], match=0x008c)/
                          PortIngressRuleResultOLTBroadcastQueue()/
                          PortIngressRuleResultForward()/
-                         PortIngressRuleResultDelete(fieldcode=ClauseFields['C-VLAN Tag'])/
+                         PortIngressRuleResultDelete(fieldcode=Clause['C-VLAN Tag'])/
                          PortIngressRuleTerminator()/
                          DeletePortIngressRule())
diff --git a/voltha/extensions/eoam/EOAM_TLV.py b/voltha/extensions/eoam/EOAM_TLV.py
index 0558aa4..6b9d96b 100644
--- a/voltha/extensions/eoam/EOAM_TLV.py
+++ b/voltha/extensions/eoam/EOAM_TLV.py
@@ -796,14 +796,14 @@
                      0x1f: "Custom field 7",
                      }
 
-RuleOperatorEnum = { 0x00: "F",             #False
+RuleOperatorEnum = { 0x00: "F",           #False
                      0x01: "==",
                      0x02: "!=",
                      0x03: "<=",
                      0x04: ">=",
                      0x05: "exists",
                      0x06: "!exist",
-                     0x07: "T",
+                     0x07: "T",           #True
                      }
 
 class PortIngressRule(Packet):
@@ -851,7 +851,7 @@
                    XByteField("lsbmask", 0),
                    XByteField("operator", 0),
                    XByteField("matchlength", 1),
-                   XByteField("match0", 0),
+                   XByteField("match", 0),
                    ]
 
 class PortIngressRuleClauseMatchLength02(Packet):
@@ -867,8 +867,7 @@
                    XByteField("lsbmask", 0),
                    XByteField("operator", 0),
                    XByteField("matchlength", 2),
-                   XByteField("match0", 0),
-                   XByteField("match1", 0),
+                   XShortField("match", 0),
                    ]