update pyloxi to floodlight/loxigen-artifacts @ b44eb26cc919f8bd61d0da059163a1a7dce088de

Pulls in OF 1.4.
diff --git a/src/python/loxi/of13/action.py b/src/python/loxi/of13/action.py
index 25f1e1f..04b17de 100644
--- a/src/python/loxi/of13/action.py
+++ b/src/python/loxi/of13/action.py
@@ -246,6 +246,71 @@
 
 bsn.subtypes[4] = bsn_checksum
 
+class bsn_gentable(bsn):
+    type = 65535
+    experimenter = 6035143
+    subtype = 5
+
+    def __init__(self, table_id=None, key=None):
+        if table_id != None:
+            self.table_id = table_id
+        else:
+            self.table_id = 0
+        if key != None:
+            self.key = key
+        else:
+            self.key = []
+        return
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!L", self.table_id))
+        packed.append(loxi.generic_util.pack_list(self.key))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(reader):
+        obj = bsn_gentable()
+        _type = reader.read("!H")[0]
+        assert(_type == 65535)
+        _len = reader.read("!H")[0]
+        orig_reader = reader
+        reader = orig_reader.slice(_len - (2 + 2))
+        _experimenter = reader.read("!L")[0]
+        assert(_experimenter == 6035143)
+        _subtype = reader.read("!L")[0]
+        assert(_subtype == 5)
+        obj.table_id = reader.read("!L")[0]
+        obj.key = loxi.generic_util.unpack_list(reader, bsn_tlv.bsn_tlv.unpack)
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.table_id != other.table_id: return False
+        if self.key != other.key: return False
+        return True
+
+    def pretty_print(self, q):
+        q.text("bsn_gentable {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("table_id = ");
+                q.text("%#x" % self.table_id)
+                q.text(","); q.breakable()
+                q.text("key = ");
+                q.pp(self.key)
+            q.breakable()
+        q.text('}')
+
+bsn.subtypes[5] = bsn_gentable
+
 class bsn_mirror(bsn):
     type = 65535
     experimenter = 6035143
diff --git a/src/python/loxi/of13/action_id.py b/src/python/loxi/of13/action_id.py
index 6e3a3e6..b8e1a06 100644
--- a/src/python/loxi/of13/action_id.py
+++ b/src/python/loxi/of13/action_id.py
@@ -222,6 +222,52 @@
 
 bsn.subtypes[4] = bsn_checksum
 
+class bsn_gentable(bsn):
+    type = 65535
+    experimenter = 6035143
+    subtype = 5
+
+    def __init__(self):
+        return
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(reader):
+        obj = bsn_gentable()
+        _type = reader.read("!H")[0]
+        assert(_type == 65535)
+        _len = reader.read("!H")[0]
+        orig_reader = reader
+        reader = orig_reader.slice(_len - (2 + 2))
+        _experimenter = reader.read("!L")[0]
+        assert(_experimenter == 6035143)
+        _subtype = reader.read("!L")[0]
+        assert(_subtype == 5)
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        return True
+
+    def pretty_print(self, q):
+        q.text("bsn_gentable {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+            q.breakable()
+        q.text('}')
+
+bsn.subtypes[5] = bsn_gentable
+
 class bsn_mirror(bsn):
     type = 65535
     experimenter = 6035143
diff --git a/src/python/loxi/of13/bsn_tlv.py b/src/python/loxi/of13/bsn_tlv.py
index 0b2b8c1..6ebb0fd 100644
--- a/src/python/loxi/of13/bsn_tlv.py
+++ b/src/python/loxi/of13/bsn_tlv.py
@@ -209,6 +209,53 @@
 
 bsn_tlv.subtypes[42] = actor_port_priority
 
+class actor_state(bsn_tlv):
+    type = 53
+
+    def __init__(self, value=None):
+        if value != None:
+            self.value = value
+        else:
+            self.value = 0
+        return
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 1
+        packed.append(struct.pack("!B", self.value))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(reader):
+        obj = actor_state()
+        _type = reader.read("!H")[0]
+        assert(_type == 53)
+        _length = reader.read("!H")[0]
+        orig_reader = reader
+        reader = orig_reader.slice(_length - (2 + 2))
+        obj.value = reader.read("!B")[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.value != other.value: return False
+        return True
+
+    def pretty_print(self, q):
+        q.text("actor_state {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("value = ");
+                q.text("%#x" % self.value)
+            q.breakable()
+        q.text('}')
+
+bsn_tlv.subtypes[53] = actor_state
+
 class actor_system_mac(bsn_tlv):
     type = 41
 
@@ -1516,6 +1563,53 @@
 
 bsn_tlv.subtypes[49] = partner_port_priority
 
+class partner_state(bsn_tlv):
+    type = 54
+
+    def __init__(self, value=None):
+        if value != None:
+            self.value = value
+        else:
+            self.value = 0
+        return
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 1
+        packed.append(struct.pack("!B", self.value))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(reader):
+        obj = partner_state()
+        _type = reader.read("!H")[0]
+        assert(_type == 54)
+        _length = reader.read("!H")[0]
+        orig_reader = reader
+        reader = orig_reader.slice(_length - (2 + 2))
+        obj.value = reader.read("!B")[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.value != other.value: return False
+        return True
+
+    def pretty_print(self, q):
+        q.text("partner_state {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("value = ");
+                q.text("%#x" % self.value)
+            q.breakable()
+        q.text('}')
+
+bsn_tlv.subtypes[54] = partner_state
+
 class partner_system_mac(bsn_tlv):
     type = 48
 
diff --git a/src/python/loxi/of13/common.py b/src/python/loxi/of13/common.py
index 3e30b70..361865d 100644
--- a/src/python/loxi/of13/common.py
+++ b/src/python/loxi/of13/common.py
@@ -3088,6 +3088,8 @@
 table_feature_prop.subtypes[15] = table_feature_prop_apply_setfield_miss
 
 class table_feature_prop_experimenter(table_feature_prop):
+    subtypes = {}
+
     type = 65534
 
     def __init__(self, experimenter=None, subtype=None, experimenter_data=None):
@@ -3118,6 +3120,11 @@
 
     @staticmethod
     def unpack(reader):
+        subtype, = reader.peek('!L', 4)
+        subclass = table_feature_prop_experimenter.subtypes.get(subtype)
+        if subclass:
+            return subclass.unpack(reader)
+
         obj = table_feature_prop_experimenter()
         _type = reader.read("!H")[0]
         assert(_type == 65534)
@@ -3141,9 +3148,6 @@
         with q.group():
             with q.indent(2):
                 q.breakable()
-                q.text("experimenter = ");
-                q.text("%#x" % self.experimenter)
-                q.text(","); q.breakable()
                 q.text("subtype = ");
                 q.text("%#x" % self.subtype)
                 q.text(","); q.breakable()
@@ -3155,6 +3159,8 @@
 table_feature_prop.subtypes[65534] = table_feature_prop_experimenter
 
 class table_feature_prop_experimenter_miss(table_feature_prop):
+    subtypes = {}
+
     type = 65535
 
     def __init__(self, experimenter=None, subtype=None, experimenter_data=None):
@@ -3185,6 +3191,11 @@
 
     @staticmethod
     def unpack(reader):
+        subtype, = reader.peek('!L', 4)
+        subclass = table_feature_prop_experimenter_miss.subtypes.get(subtype)
+        if subclass:
+            return subclass.unpack(reader)
+
         obj = table_feature_prop_experimenter_miss()
         _type = reader.read("!H")[0]
         assert(_type == 65535)
@@ -3208,9 +3219,6 @@
         with q.group():
             with q.indent(2):
                 q.breakable()
-                q.text("experimenter = ");
-                q.text("%#x" % self.experimenter)
-                q.text(","); q.breakable()
                 q.text("subtype = ");
                 q.text("%#x" % self.subtype)
                 q.text(","); q.breakable()
diff --git a/src/python/loxi/of13/const.py b/src/python/loxi/of13/const.py
index 0d2e531..adbbd83 100644
--- a/src/python/loxi/of13/const.py
+++ b/src/python/loxi/of13/const.py
@@ -25,42 +25,42 @@
 OFPQ_MAX_RATE_UNCFG = 65535
 OFPQ_MIN_RATE_UNCFG = 65535
 
-# Identifiers from group of_bsn_lacp_convergence_status_t
+# Identifiers from group of_bsn_lacp_convergence_status
 LACP_SUCCESS = 0
 LACP_TIMEDOUT = 1
 LACP_OUT_OF_SYNC = 2
 
-of_bsn_lacp_convergence_status_t_map = {
+of_bsn_lacp_convergence_status_map = {
     0: 'LACP_SUCCESS',
     1: 'LACP_TIMEDOUT',
     2: 'LACP_OUT_OF_SYNC',
 }
 
-# Identifiers from group of_bsn_pdu_slot_num_t
+# Identifiers from group of_bsn_pdu_slot_num
 BSN_PDU_SLOT_NUM_ANY = 255
 
-of_bsn_pdu_slot_num_t_map = {
+of_bsn_pdu_slot_num_map = {
     255: 'BSN_PDU_SLOT_NUM_ANY',
 }
 
-# Identifiers from group of_bsn_vlan_counter_t
+# Identifiers from group of_bsn_vlan_counter
 OFP_BSN_VLAN_COUNTER_RX_BYTES = 0
 OFP_BSN_VLAN_COUNTER_RX_PACKETS = 1
 OFP_BSN_VLAN_COUNTER_TX_BYTES = 2
 OFP_BSN_VLAN_COUNTER_TX_PACKETS = 3
 
-of_bsn_vlan_counter_t_map = {
+of_bsn_vlan_counter_map = {
     0: 'OFP_BSN_VLAN_COUNTER_RX_BYTES',
     1: 'OFP_BSN_VLAN_COUNTER_RX_PACKETS',
     2: 'OFP_BSN_VLAN_COUNTER_TX_BYTES',
     3: 'OFP_BSN_VLAN_COUNTER_TX_PACKETS',
 }
 
-# Identifiers from group of_bsn_vrf_counter_t
+# Identifiers from group of_bsn_vrf_counter
 OFP_BSN_VRF_COUNTER_BYTES = 0
 OFP_BSN_VRF_COUNTER_PACKETS = 1
 
-of_bsn_vrf_counter_t_map = {
+of_bsn_vrf_counter_map = {
     0: 'OFP_BSN_VRF_COUNTER_BYTES',
     1: 'OFP_BSN_VRF_COUNTER_PACKETS',
 }
@@ -246,6 +246,27 @@
     2: 'OFP_BSN_CONTROLLER_ROLE_REASON_EXPERIMENTER',
 }
 
+# Identifiers from group ofp_bsn_lacp_state
+OFP_BSN_LACP_STATE_ACTIVITY = 1
+OFP_BSN_LACP_STATE_TIMEOUT = 2
+OFP_BSN_LACP_STATE_AGGREGATION = 4
+OFP_BSN_LACP_STATE_SYNCHRONIZATION = 8
+OFP_BSN_LACP_STATE_COLLECTING = 16
+OFP_BSN_LACP_STATE_DISTRIBUTING = 32
+OFP_BSN_LACP_STATE_DEFAULTED = 64
+OFP_BSN_LACP_STATE_EXPIRED = 128
+
+ofp_bsn_lacp_state_map = {
+    1: 'OFP_BSN_LACP_STATE_ACTIVITY',
+    2: 'OFP_BSN_LACP_STATE_TIMEOUT',
+    4: 'OFP_BSN_LACP_STATE_AGGREGATION',
+    8: 'OFP_BSN_LACP_STATE_SYNCHRONIZATION',
+    16: 'OFP_BSN_LACP_STATE_COLLECTING',
+    32: 'OFP_BSN_LACP_STATE_DISTRIBUTING',
+    64: 'OFP_BSN_LACP_STATE_DEFAULTED',
+    128: 'OFP_BSN_LACP_STATE_EXPIRED',
+}
+
 # Identifiers from group ofp_bsn_loglevel
 OFP_BSN_LOGLEVEL_MSG = 0
 OFP_BSN_LOGLEVEL_ERROR = 1