Added support for cpythonize to generate auxillary info
to stdout.  Also added check for of_message_parse to
print out error if wrong version is called.
diff --git a/tools/munger/Makefile b/tools/munger/Makefile
index aa7394c..5a04a1f 100644
--- a/tools/munger/Makefile
+++ b/tools/munger/Makefile
@@ -21,16 +21,13 @@
 PYTHONIZE = bin/pyopenflow-pythonize.py
 OFP_GEN_CMD = (cd ${PYLIBOF_DIR} && ${PYTHONIZE} -i ${OF_HEADER} \
 	${TARGET_DIR}/ofp.py)
+OFP_AUX_INFO = ${TARGET_DIR}/ofp_aux.py
 
 # Dependencies for ofp.py
 OFP_DEP = ${ABS_OF_HEADER} $(wildcard ${PYLIBOF_DIR}/pylib/*.py)
-OFP_DEP = $(wildcard ${PYLIBOF_DIR}/pylib/of/*.py) 
+OFP_DEP += $(wildcard ${PYLIBOF_DIR}/pylib/of/*.py) 
 
-# FIXME:  There are three types of .py files:
-#    ofp.py from pylibopenflow output
-#    %.py generated from %_gen.py
-#    of_message.py and action_list.py -- hand built, already in src dir
-
+# Generated and other files
 GEN_FILES := $(addprefix ${TARGET_DIR}/,ofp.py message.py error.py action.py)
 OTHER_FILES :=  $(addprefix ${TARGET_DIR}/,action_list.py of_message.py)
 LINT_SOURCE := ${GEN_FILES} ${OTHER_FILES}
@@ -40,13 +37,15 @@
 all: ${GEN_FILES}
 	@echo "Generated files"
 
+# The core OpenFlow libraries generated from openflow.h
 ${TARGET_DIR}/ofp.py: ${OFP_DEP}
-	${OFP_GEN_CMD}
+	${OFP_GEN_CMD} > ${OFP_AUX_INFO}
 
 # General rule like src/message.py comes from scripts/message_gen.py
 ${TARGET_DIR}/%.py: scripts/%_gen.py ${TARGET_DIR}/ofp.py
 	python $< > $@
 
+# The pylint files
 lint/%.log: ${TARGET_DIR}/%.py
 	(cd ${TARGET_DIR} && pylint -e $(notdir $<)) > $@
 
diff --git a/tools/munger/scripts/action_gen.py b/tools/munger/scripts/action_gen.py
index 22c7b4b..c66eb8f 100644
--- a/tools/munger/scripts/action_gen.py
+++ b/tools/munger/scripts/action_gen.py
@@ -4,6 +4,10 @@
 #
 
 import re
+import sys
+sys.path.append("../../src/python/oftest/ofmsg")
+from ofp import *
+from ofp_aux import class_to_members_map
 
 print """
 # Python OpenFlow action wrapper classes
@@ -12,7 +16,9 @@
 
 # This will never happen; done to avoid lint warning
 if __name__ == '__main__':
-    def of_message_parse(msg): return None
+    def of_message_parse(msg):
+        print "ERROR: of_msg_parse in action.py called"
+        return None
 
 """
 
@@ -69,6 +75,8 @@
 class action_--TYPE--(--PARENT_TYPE--):
     \"""
     Wrapper class for --TYPE-- action object
+
+    --DOC_INFO--
     \"""
     def __init__(self):
         --PARENT_TYPE--.__init__(self)
@@ -81,10 +89,17 @@
 
 if __name__ == '__main__':
     for (t, parent) in action_class_map.items():
+        if not parent in class_to_members_map.keys():
+            doc_info = "Unknown parent action class: " + parent
+        else:
+            doc_info = "Data members inherited from " + parent + ":\n"
+            for var in class_to_members_map[parent]:
+                doc_info += "    @arg " + var + "\n"
         action_name = "OFPAT_" + t.upper()
         to_print = re.sub('--TYPE--', t, template)
         to_print = re.sub('--PARENT_TYPE--', parent, to_print)
         to_print = re.sub('--ACTION_NAME--', action_name, to_print)
+        to_print = re.sub('--DOC_INFO--', doc_info, to_print)
         print to_print
 
     # Generate a list of action classes
diff --git a/tools/munger/scripts/error_gen.py b/tools/munger/scripts/error_gen.py
index 7dff087..9fce70d 100644
--- a/tools/munger/scripts/error_gen.py
+++ b/tools/munger/scripts/error_gen.py
@@ -4,6 +4,10 @@
 #
 
 import re
+import sys
+sys.path.append("../../src/python/oftest/ofmsg")
+from ofp import *
+from ofp_aux import class_to_members_map
 
 print """
 # Python OpenFlow error wrapper classes
@@ -12,7 +16,9 @@
 
 # This will never happen; done to avoid lint warning
 if __name__ == '__main__':
-    def of_message_parse(msg): return None
+    def of_message_parse(msg):
+        print "ERROR: of_msg_parse in error.py called"
+        return None
 
 """
 
@@ -28,6 +34,12 @@
 class --TYPE--_error_msg(ofp_error_msg):
     \"""
     Wrapper class for --TYPE-- error message class
+
+    Data members inherited from ofp_error_msg:
+    @arg type
+    @arg code
+    @arg data: Binary string following message members
+    
     \"""
     def __init__(self):
         ofp_error_msg.__init__(self)
diff --git a/tools/munger/scripts/message_gen.py b/tools/munger/scripts/message_gen.py
index f065874..61aada8 100644
--- a/tools/munger/scripts/message_gen.py
+++ b/tools/munger/scripts/message_gen.py
@@ -80,6 +80,9 @@
 import re
 import string
 import sys
+sys.path.append("../../src/python/oftest/ofmsg")
+from ofp import *
+from ofp_aux import class_to_members_map
 
 message_top_matter = """
 # Python OpenFlow message wrapper classes
@@ -107,6 +110,7 @@
         \"""
         self.header = ofp_header()
         # Additional base data members declared here
+
     # Normally will define pack, unpack, __len__ functions
 
 class template_msg(ofp_template_msg):
@@ -123,7 +127,11 @@
         Must set the header type value appropriately for the message
 
         \"""
+
+        ##@var header
+        # OpenFlow message header: length, version, xid, type
         ofp_template_msg.__init__(self)
+        self.header = ofp_header()
         # For a real message, will be set to an integer
         self.header.type = "TEMPLATE_MSG_VALUE"
     def pack(self):
@@ -268,21 +276,51 @@
     _p1('"""')
     _p1("Wrapper class for " + msg)
     print
+    _p1("OpenFlow message header: length, version, xid, type")
+    _p1("@arg length: The total length of the message")
+    _p1("@arg version: The OpenFlow version (" + str(OFP_VERSION) + ")")
+    _p1("@arg xid: The transaction ID")
+    _p1("@arg type: The message type (" + msg_name + "=" + 
+        str(eval(msg_name)) + ")")
+    print
+    if has_core_members and parent in class_to_members_map.keys():
+        _p1("Data members inherited from " + parent + ":")
+        for var in class_to_members_map[parent]:
+            _p1("@arg " + var)
     if has_list:
         if list_type == None:
-            _p1("Has trailing variable array " + list_var);
+            _p1("@arg " + list_var + ": Variable length array of TBD")
         else:
-            _p1("Has trailing object " + list_var + " of type " + list_type);
-        print
+            _p1("@arg " + list_var + ": Object of type " + list_type);
     if has_string:
-        _p1("Has trailing string data")
-        print
+        _p1("@arg data: Binary string following message members")
+    print
     _p1('"""')
 
     print
     _p1("def __init__(self):")
     if has_core_members:
         _p2(parent + ".__init__(self)")
+    _p2("##@var header")
+    _p2("# OpenFlow message header: length, version, xid, type")
+    _p2("# @arg length: The total length of the message")
+    _p2("# @arg version: The OpenFlow version (" + str(OFP_VERSION) + ")")
+    _p2("# @arg xid: The transaction ID")
+    _p2("# @arg type: The message type (" + msg_name + "=" + 
+        str(eval(msg_name)) + ")")
+    print
+    if has_list:
+        _p2("##@var " + list_var)
+        if list_type == None:
+            _p2("# Array of objects of type TBD")
+        else:
+            _p2("# Object of type " + list_type)
+        print
+    if has_string:
+        _p2("##@var data")
+        _p2("# Binary string following message members")
+        print
+
     _p2("self.header = ofp_header()")
     _p2("self.header.type = " + msg_name)
     if has_list: