VOL-2583 adding "IPv4MulticastAddressTable" frame to omci_entities.py .
 This entity using by Multicast GEM Interworking TP.

Change-Id: I4d64cc2b2ded55e94d24b4f5fca0e69b560b2679
diff --git a/VERSION b/VERSION
index d245ee8..d3bec23 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.3.19
+2.3.20_dev
diff --git a/pyvoltha/adapters/extensions/omci/omci_entities.py b/pyvoltha/adapters/extensions/omci/omci_entities.py
index 3df13e1..930c5d0 100644
--- a/pyvoltha/adapters/extensions/omci/omci_entities.py
+++ b/pyvoltha/adapters/extensions/omci/omci_entities.py
@@ -523,6 +523,38 @@
     mandatory_operations = {OP.Get, OP.Set}
 
 
+class IPv4MulticastAddressTable(Packet):
+    name = "IPv4MulticastAddressTable"
+    fields_desc = [
+        BitField("gem_port_id", 0, 2),
+        BitField("secondary_key", 0, 2),
+        IPField("multicast_ip_range_start", None),
+        IPField("multicast_ip_range_stop", None)
+    ]
+
+    def to_json(self):
+        return json.dumps(self.fields, separators=(',', ':'))
+
+    def index(self):
+        return b'%02d' % (self.fields.get('gem_port_id',0)) + \
+               b'%03d' % (self.fields.get('secondary_key',0)) + \
+               b'%01d' % (self.fields.get('multicast_ip_range_start',0)) + \
+               b'%03d' % (self.fields.get('multicast_ip_range_stop',0))
+
+    def is_delete(self):
+        return self.fields.get('gem_port_id',0) == 0x1fff and \
+            self.fields.get('secondary_key',0) == 0x1fff and \
+            self.fields.get('multicast_ip_range_start',0) == 0x1fff and \
+            self.fields.get('multicast_ip_range_stop',0) == 0x1fff
+
+    def delete(self):
+        self.fields['gem_port_id'] = 0x1fff
+        self.fields['secondary_key'] = 0x1fff
+        self.fields['multicast_ip_range_start'] = 0x1fff
+        self.fields['multicast_ip_range_stop'] = 0x1fff
+        return self
+
+
 class OntPowerShedding(EntityClass):
     class_id = 133
     attributes = [
@@ -957,6 +989,8 @@
         ECA(ShortField("gal_profile_pointer", None), {AA.R, AA.W, AA.SBC}),
         ECA(ByteField("gal_loopback_configuration", None), {AA.R, AA.W, AA.SBC},
             deprecated=True),
+        ECA(OmciTableField(PacketLenField("ipv4_multicast_address_table", None, IPv4MulticastAddressTable,
+                                          length_from=lambda pkt: 12)), {AA.R, AA.W})
         # TODO add multicast_address_table here (page 85 of spec.)
         # ECA(...("multicast_address_table", None), {AA.R, AA.W})
     ]