Various clean up

Remove of_message_parse hack; just won't use it in message
objects for now.

Never rely on pack to calculate length of objects

Fix circular reference between eq and ne

Clean up some bad function references caught by test script
diff --git a/tools/munger/scripts/message_gen.py b/tools/munger/scripts/message_gen.py
index 61aada8..1f93b1c 100644
--- a/tools/munger/scripts/message_gen.py
+++ b/tools/munger/scripts/message_gen.py
@@ -90,10 +90,6 @@
 from ofp import *
 from action_list import action_list
 
-# This will never happen; done to avoid lint warning
-if __name__ == '__main__':
-    def of_message_parse(msg): return None
-
 # Define templates for documentation
 class ofp_template_msg:
     \"""
@@ -333,10 +329,10 @@
 
     print
     _p1("def pack(self):")
-    _p2("# Fixme:  Calculate length for header, etc, once __len__ fixed")
+    _p2("self.header.length = len(self)")
     _p2("packed = self.header.pack()")
     if has_core_members:
-        _p2("packed += " + parent + ".pack()")
+        _p2("packed += " + parent + ".pack(self)")
     if has_list:
         if list_type == None:
             _p2('for obj in self.' + list_var + ':')
@@ -345,6 +341,7 @@
             _p2('packed += self.' + list_var + '.pack()')
     if has_string:
         _p2('packed += self.data')
+    _p2("return packed")
 
     print
     _p1("def unpack(self, binary_string):")
@@ -356,10 +353,13 @@
             _p2("for obj in self." + list_var + ":")
             _p3("binary_string = obj.unpack(binary_string)")
         elif msg == "packet_out":  # Special case this
-            _p2('binary_string = self.actions.unpack(bytes=self.actions_len)')
+            _p2('binary_string = self.actions.unpack(' + 
+                'binary_string, bytes=self.actions_len)')
         elif msg == "flow_mod":  # Special case this
-            _p2("ai_len = self.header.length - OFP_FLOW_MOD_BYTES")
-            _p2("binary_string = self.actions.unpack(bytes=ai_len)")
+            _p2("ai_len = self.header.length - (OFP_FLOW_MOD_BYTES + " + 
+                "OFP_HEADER_BYTES)")
+            _p2("binary_string = self.actions.unpack(binary_string, " +
+                "bytes=ai_len)")
         else:
             _p2("binary_string = self." + list_var + ".unpack(binary_string)")
     if has_string:
@@ -371,10 +371,21 @@
 
     print
     _p1("def __len__(self):")
-    _p2("# Fixme:  Do the right thing")
-    _p2("return len(self.pack())")
+    _p2("length = OFP_HEADER_BYTES")
+    if has_core_members:
+        _p2("length += " + parent + ".__len__(self)")
+    if has_list:
+        if list_type == None:
+            _p2("for obj in self." + list_var + ":")
+            _p3("length += len(obj)")
+        else:
+            _p2("length += len(self." + list_var + ")")
+    if has_string:
+        _p2("length += len(self.data)")
+    _p2("return length")
 
     print
+    _p1("##@todo Convert this to __str__")
     _p1("def show(self, prefix=''):")
     _p2("print prefix + '" + msg + " (" + msg_name + ")'")
     _p2("prefix += '  '")
@@ -391,19 +402,20 @@
             _p2('self.' + list_var + ".show(prefix + '  ')")
     if has_string:
         _p2("print prefix + 'data is of length ' + str(len(self.data))")
-        _p2("if len(self.data) > 0:")
-        _p3("obj = of_message_parse(self.data)")
-        _p3("if obj != None:")
-        _p4("obj.show(prefix)")
-        _p3("else:")
-        _p4('print prefix + "Unable to parse data"')
+        _p2("##@todo Fix this circular reference")
+        _p2("# if len(self.data) > 0:")
+        _p3("# obj = of_message_parse(self.data)")
+        _p3("# if obj != None:")
+        _p4("# obj.show(prefix)")
+        _p3("# else:")
+        _p4('# print prefix + "Unable to parse data"')
 
     print
     _p1("def __eq__(self, other):")
-    _p2("if type(self) != type (other): return False")
-    _p2("if self.header.__ne__(other.header): return False")
+    _p2("if type(self) != type(other): return False")
+    _p2("if not self.header.__eq__(other.header): return False")
     if has_core_members:
-        _p2("if " + parent + ".__ne__(other." + parent + "): return False")
+        _p2("if not " + parent + ".__eq__(self, other): return False")
     if has_string:
         _p2("if self.data != other.data: return False")
     if has_list:
@@ -486,6 +498,7 @@
     def pack(self, assertstruct=True):
         packed = ofp_stats_request.pack(self)
         packed += ofp_--TYPE--_stats_request.pack(self)
+        return packed
 
     def unpack(self, binary_string):
         binary_string = ofp_stats_request.unpack(self, binary_string)
@@ -537,6 +550,7 @@
         packed = ofp_stats_reply.pack(self)
         for obj in self.stats:
             packed += obj.pack()
+        return packed
 
     def unpack(self, binary_string):
         binary_string = ofp_stats_reply.unpack(self, binary_string)
@@ -558,11 +572,12 @@
     def show(self, prefix=''):
         print prefix + "--TYPE--_stats_reply"
         ofp_stats_reply.show(self)
+        print prefix + "Stats array of length " + str(len(self.stats))
         for obj in self.stats:
             obj.show()
 
     def __eq__(self, other):
-        if ofp_stats_reply.__ne__(self, other): return False
+        if not ofp_stats_reply.__eq__(self, other): return False
         return self.stats == other.stats
 
     def __ne__(self, other): return not self.__eq__(other)
@@ -601,16 +616,20 @@
         self.actions = action_list()
 
     def pack(self, assertstruct=True):
-        if self.length < OFP_FLOW_STATS_BYTES:
-            print "ERROR in flow_stats_entry pack: length member is too small"
-            return None
+        self.length = len(self)
         packed = ofp_flow_stats.pack(self, assertstruct)
         packed += self.actions.pack()
+        if len(packed) != self.length:
+            print("ERROR: flow_stats_entry pack length not equal",
+                  self.length, len(packed))
         return packed
 
     def unpack(self, binary_string):
         binary_string = ofp_flow_stats.unpack(self, binary_string)
         ai_len = self.length - OFP_FLOW_STATS_BYTES
+        if ai_len < 0:
+            print("ERROR: flow_stats_entry unpack length too small",
+                  self.length)
         binary_string = self.actions.unpack(binary_string, bytes=ai_len)
         return binary_string