Merge remote-tracking branch 'origin/master' into of14
Conflicts:
java_gen/pre-written/pom.xml
diff --git a/java_gen/java_model.py b/java_gen/java_model.py
index fa2199c..b3c3df0 100644
--- a/java_gen/java_model.py
+++ b/java_gen/java_model.py
@@ -184,14 +184,25 @@
@memoize
def enums(self):
name_version_enum_map = OrderedDefaultDict(lambda: OrderedDict())
+ name_stable_map = {}
for version in self.versions:
- logger.info("version: {}".format(version.ir_version))
+ logger.debug("version: {}".format(version.ir_version))
of_protocol = loxi_globals.ir[version.ir_version]
for enum in of_protocol.enums:
name_version_enum_map[enum.name][version] = enum
+ stable = (enum.params.get('stable') == 'True')
- enums = [ JavaEnum(name, version_enum_map) for name, version_enum_map,
+ logger.debug("Enum: %s stable: %s", enum.name, stable)
+
+ if not enum.name in name_stable_map:
+ name_stable_map[enum.name] = stable
+ else:
+ if name_stable_map[enum.name] != stable:
+ raise Exception("Inconsistent enum stability (should be caught " +\
+ " by IR)")
+
+ enums = [ JavaEnum(name, name_stable_map[name], version_enum_map) for name, version_enum_map,
in name_version_enum_map.items() ]
# inelegant - need java name here
@@ -1041,8 +1052,9 @@
#######################################################################
class JavaEnum(object):
- def __init__(self, c_name, version_enum_map):
+ def __init__(self, c_name, stable, version_enum_map):
self.c_name = c_name
+ self.stable = stable
self.name = "OF" + java_type.name_c_to_caps_camel("_".join(c_name.split("_")[1:]))
@@ -1062,7 +1074,23 @@
self.entries = [ e for e in self.entries if e.name not in model.enum_entry_blacklist[self.name] ]
self.package = "org.projectfloodlight.openflow.protocol"
- self.metadata = model.enum_metadata_map[self.name]
+ static_metadata = model.enum_metadata_map[self.name]
+ if self.stable:
+ # need this to look up wire_type, which does not matter
+ any_version = version_enum_map.keys()[0]
+ # if this is a 'stable' enum, i.e., its value won't change, add
+ # a "Metadata" (virtual) field "StableValue" to it that returns
+ # its wirevalue.
+ stable_value = JavaModel.OFEnumPropertyMetadata("StableValue",
+ self.wire_type(any_version),
+ value = lambda entry: entry.stable_value)
+
+ self.metadata = JavaModel.OFEnumMetadata(
+ properties=static_metadata.properties + (stable_value, ),
+ to_string=static_metadata.to_string
+ )
+ else:
+ self.metadata = static_metadata
def wire_type(self, version):
ir_enum = self.version_enums[version]
@@ -1113,7 +1141,7 @@
@property
def constructor_params(self):
- return [ m.value(self) for m in self.enum.metadata.properties ]
+ return [ (m.type, m.value(self)) for m in self.enum.metadata.properties ]
def has_value(self, version):
return version in self.values
@@ -1129,6 +1157,13 @@
return [ self.values[version] if version in self.values else not_present for version in versions ]
@property
+ def stable_value(self):
+ if self.enum.stable:
+ return self.values.values()[0]
+ else:
+ raise Exception("Enum {} not stable".format(self.enum.name))
+
+ @property
@memoize
def masked_enum_group(self):
group = find(lambda g: self.name in g.members, model.masked_enum_groups[self.enum.name])
diff --git a/java_gen/java_type.py b/java_gen/java_type.py
index 294f5f0..b23dcd0 100644
--- a/java_gen/java_type.py
+++ b/java_gen/java_type.py
@@ -53,9 +53,12 @@
signed-craziness
"""
signed, bits, cast_needed = java_primitives_info[t]
+ if t == 'boolean':
+ return "true" if bool(value) and value not in("False", "false") else "false"
+
max = (1 << bits)-1
if value > max:
- raise Exception("Value %d to large for type %s" % (value, t))
+ raise Exception("Value %s to large for type %s" % (value, t))
if signed:
max_pos = (1 << (bits-1)) - 1
diff --git a/java_gen/templates/const.java b/java_gen/templates/const.java
index a7786f4..1828bac 100644
--- a/java_gen/templates/const.java
+++ b/java_gen/templates/const.java
@@ -37,7 +37,7 @@
public enum ${class_name} {
//:: for i, entry in enumerate(enum.entries):
//:: if enum.metadata.properties:
-//:: params = "({})".format(", ".join(entry.constructor_params))
+//:: params = "({})".format(", ".join(type.format_value(value) for (type, value) in entry.constructor_params))
//:: else:
//:: params = ""
//:: #endif
diff --git a/loxi_front_end/parser.py b/loxi_front_end/parser.py
index 4a465f7..fbf476d 100644
--- a/loxi_front_end/parser.py
+++ b/loxi_front_end/parser.py
@@ -68,7 +68,7 @@
s('}') - s(';')
# Enums
-enum_param_name = kw("wire_type") | kw("bitmask") | kw("complete")
+enum_param_name = kw("wire_type") | kw("bitmask") | kw("complete") | kw("stable")
enum_param = P.Group(enum_param_name - s('=') - word)
enum_param_list = P.Forward()
enum_param_list << enum_param + P.Optional(s(',') + P.Optional(enum_param_list))
diff --git a/loxi_ir/unified.py b/loxi_ir/unified.py
index 41b86dc..fa97c87 100644
--- a/loxi_ir/unified.py
+++ b/loxi_ir/unified.py
@@ -98,6 +98,9 @@
self.entries[e.name] = ir.OFEnumEntry(e.name, e.value, copy.copy(e.params))
else:
entry = self.entries[e.name]
+ if v_enum.params.get('stable') == 'True' and e.value != entry.value:
+ raise Exception("Error unifying stable ir enum {} - adding entry {} version {} value {} <-> {}".format(
+ self.name, e.name, version, entry.value, e.value))
for name, value in e.params.items():
if not name in entry.params:
entry.params[name] = value
diff --git a/openflow_input/bsn_gentable b/openflow_input/bsn_gentable
index 1344ef5..6ccaac5 100644
--- a/openflow_input/bsn_gentable
+++ b/openflow_input/bsn_gentable
@@ -351,3 +351,13 @@
uint32_t subtype == 5;
list(of_bsn_gentable_bucket_stats_entry_t) entries;
};
+
+// Reference a gentable entry from an action list
+struct of_action_bsn_gentable : of_action_bsn {
+ uint16_t type == 65535;
+ uint16_t len;
+ uint32_t experimenter == 0x5c16c7;
+ uint32_t subtype == 5;
+ uint32_t table_id;
+ list(of_bsn_tlv_t) key;
+};
diff --git a/openflow_input/bsn_lacp b/openflow_input/bsn_lacp
index d2e540a..2a63b17 100644
--- a/openflow_input/bsn_lacp
+++ b/openflow_input/bsn_lacp
@@ -31,7 +31,7 @@
#version 4
// LACP Convergence Status set in of_bsn_lacp_convergence_notif message
-enum of_bsn_lacp_convergence_status_t(wire_type=uint8_t, complete=False) {
+enum of_bsn_lacp_convergence_status(wire_type=uint8_t, complete=False) {
LACP_SUCCESS = 0,
LACP_TIMEDOUT = 1,
LACP_OUT_OF_SYNC = 2,
diff --git a/openflow_input/bsn_pdu b/openflow_input/bsn_pdu
index 66465f3..007365b 100644
--- a/openflow_input/bsn_pdu
+++ b/openflow_input/bsn_pdu
@@ -32,7 +32,7 @@
// When the slot_num field has this value, the message applies
// to all currently used slots on the switch for the given port
-enum of_bsn_pdu_slot_num_t(wire_type=uint8_t, complete=False) {
+enum of_bsn_pdu_slot_num(wire_type=uint8_t, complete=False) {
BSN_PDU_SLOT_NUM_ANY = 0xff
};
diff --git a/openflow_input/bsn_port_counter b/openflow_input/bsn_port_counter
index 73ba80e..83cd1c8 100644
--- a/openflow_input/bsn_port_counter
+++ b/openflow_input/bsn_port_counter
@@ -30,7 +30,7 @@
#version 4
-enum ofp_bsn_port_counter(wire_type=uint8_t, complete=False) {
+enum ofp_bsn_port_counter(wire_type=uint8_t, complete=False, stable=True) {
OFP_BSN_PORT_COUNTER_RX_BYTES = 0,
OFP_BSN_PORT_COUNTER_RX_PACKETS_UNICAST = 1,
OFP_BSN_PORT_COUNTER_RX_PACKETS_BROADCAST = 2,
diff --git a/openflow_input/bsn_tlv b/openflow_input/bsn_tlv
index 3e52d02..8b55b03 100644
--- a/openflow_input/bsn_tlv
+++ b/openflow_input/bsn_tlv
@@ -340,3 +340,32 @@
uint16_t length;
uint16_t value;
};
+
+struct of_bsn_tlv_name : of_bsn_tlv {
+ uint16_t type == 52;
+ uint16_t length;
+ of_octets_t value; /* UTF-8 encoded. Not null terminated. */
+};
+
+enum ofp_bsn_lacp_state(wire_type=uint8_t, bitmask=True) {
+ OFP_BSN_LACP_STATE_ACTIVITY = 0x01,
+ OFP_BSN_LACP_STATE_TIMEOUT = 0x02,
+ OFP_BSN_LACP_STATE_AGGREGATION = 0x04,
+ OFP_BSN_LACP_STATE_SYNCHRONIZATION = 0x08,
+ OFP_BSN_LACP_STATE_COLLECTING = 0x10,
+ OFP_BSN_LACP_STATE_DISTRIBUTING = 0x20,
+ OFP_BSN_LACP_STATE_DEFAULTED = 0x40,
+ OFP_BSN_LACP_STATE_EXPIRED = 0x80,
+};
+
+struct of_bsn_tlv_actor_state: of_bsn_tlv {
+ uint16_t type == 53;
+ uint16_t length;
+ enum ofp_bsn_lacp_state value;
+};
+
+struct of_bsn_tlv_partner_state: of_bsn_tlv {
+ uint16_t type == 54;
+ uint16_t length;
+ enum ofp_bsn_lacp_state value;
+};
diff --git a/openflow_input/bsn_vlan_counter b/openflow_input/bsn_vlan_counter
index 5d90724..c5814f4 100644
--- a/openflow_input/bsn_vlan_counter
+++ b/openflow_input/bsn_vlan_counter
@@ -34,7 +34,7 @@
OFP_BSN_VLAN_ALL = 0xffff,
};
-enum of_bsn_vlan_counter_t(wire_type=uint8_t, complete=False) {
+enum of_bsn_vlan_counter(wire_type=uint8_t, complete=False, stable=True) {
OFP_BSN_VLAN_COUNTER_RX_BYTES = 0,
OFP_BSN_VLAN_COUNTER_RX_PACKETS = 1,
OFP_BSN_VLAN_COUNTER_TX_BYTES = 2,
diff --git a/openflow_input/bsn_vrf_counter b/openflow_input/bsn_vrf_counter
index 7676e69..b638ff7 100644
--- a/openflow_input/bsn_vrf_counter
+++ b/openflow_input/bsn_vrf_counter
@@ -34,7 +34,7 @@
OFP_BSN_VRF_ALL = 0xffffffff,
};
-enum of_bsn_vrf_counter_t(wire_type=uint8_t, complete=False) {
+enum of_bsn_vrf_counter(wire_type=uint8_t, complete=False, stable=True) {
OFP_BSN_VRF_COUNTER_BYTES = 0,
OFP_BSN_VRF_COUNTER_PACKETS = 1,
};