diff options
-rwxr-xr-x | ncp2222.py | 648 |
1 files changed, 329 insertions, 319 deletions
diff --git a/ncp2222.py b/ncp2222.py index 5464419c4d..ab9edfa522 100755 --- a/ncp2222.py +++ b/ncp2222.py @@ -1,32 +1,32 @@ #!/usr/bin/python -# -# ncp2222.py -# -# Creates C code from a table of NCP type 0x2222 packet types. -# (And 0x3333, which are the replies, but the packets are more commonly -# refered to as type 0x2222; the 0x3333 replies are understood to be -# part of the 0x2222 "family") -# -# Data comes from "Programmer's Guide to the NetWare Core Protocol" -# by Steve Conner and Dianne Conner. -# -# $Id: ncp2222.py,v 1.1 2000/07/28 20:03:42 gram Exp $ -# -# Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org> -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +""" +Creates C code from a table of NCP type 0x2222 packet types. +(And 0x3333, which are the replies, but the packets are more commonly +refered to as type 0x2222; the 0x3333 replies are understood to be +part of the 0x2222 "family") + +Data comes from "Programmer's Guide to the NetWare Core Protocol" +by Steve Conner and Dianne Conner. + +$Id: ncp2222.py,v 1.2 2000/08/08 16:39:48 gram Exp $ + +Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org> + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +""" import sys @@ -34,21 +34,22 @@ import sys # Global containers ############################################################################## -# The UniqueCollection class stores objects which can be compared to other -# objects of the same class. If two objects in the collection are equivalent, -# only one is stored. class UniqueCollection: + """The UniqueCollection class stores objects which can be compared to other + objects of the same class. If two objects in the collection are equivalent, + only one is stored.""" - # Constructor def __init__(self, name): + "Constructor" self.name = name self.members = [] - # Add an object to the members lists, if a comparable object - # doesn't already exist. The object that is in the member list, that is - # either the object that was added or the comparable object that was - # already in the member list, is returned. def Add(self, object): + """Add an object to the members lists, if a comparable object + doesn't already exist. The object that is in the member list, that is + either the object that was added or the comparable object that was + already in the member list, is returned.""" + # Is 'object' a duplicate of some other member? for member in self.members: if member == object: @@ -58,12 +59,12 @@ class UniqueCollection: self.members.append(object) return object - # Returns the list of members. def Members(self): + "Returns the list of members." return self.members - # Does the list of members contain the object? def HasMember(self, object): + "Does the list of members contain the object?" for member in self.members: if member == object: return 1 @@ -76,16 +77,17 @@ ptvc_lists = UniqueCollection('PTVC Lists') ############################################################################## -# NamedList's keep track of PTVC's and Completion Codes -############################################################################## + class NamedList: - # Constructor + "NamedList's keep track of PTVC's and Completion Codes" def __init__(self, name, list): + "Constructor" self.name = name self.list = list - # Compare this NamedList to another def __cmp__(self, other): + "Compare this NamedList to another" + # Python will do a deep comparison of lists within lists. if self.list < other.list: return -1 @@ -94,26 +96,26 @@ class NamedList: else: return 0 - # String representation def __repr__(self): + "String representation" return "NamedList: " + `self.list` - # Get/Set name of list def Name(self, new_name = None): + "Get/Set name of list" if new_name != None: self.name = new_name return self.name - # Returns record lists def Records(self): + "Returns record lists" return self.list - # Is there no list (different from an empty list)? def Null(self): + "Is there no list (different from an empty list)?" return self.list == None - # It the list empty (different from a null list)? def Empty(self): + "It the list empty (different from a null list)?" assert(not self.Null()) if self.list: @@ -122,10 +124,11 @@ class NamedList: return 1 -# ProtoTree TVBuff Cursor List ("PTVC List") Class class PTVC(NamedList): - # Constructor + """ProtoTree TVBuff Cursor List ("PTVC List") Class""" + def __init__(self, name, records): + "Constructor" self.list = [] NamedList.__init__(self, name, self.list) @@ -145,8 +148,8 @@ class PTVC(NamedList): self.list.append(ptvc_rec) class PTVCRecord: - # Constructor def __init__(self, record): + "Constructor" self.length = record[1] self.field = record[2] @@ -167,8 +170,8 @@ class PTVCRecord: except IndexError: self.endianness = self.field.Endianness() - # Comparison operator def __cmp__(self, other): + "Comparison operator" if self.length < other.length: return -1 elif self.length > other.length: @@ -181,8 +184,8 @@ class PTVCRecord: else: return 0 - # String representation def __repr__(self): + "String representation" endianness = 'FALSE' if self.endianness == LE: endianness = 'TRUE' @@ -205,11 +208,11 @@ class PTVCRecord: ############################################################################## -# NCP Packet class -############################################################################## + class NCP: - # Constructor + "NCP Packet class" def __init__(self, func_code, description, group): + "Constructor" self.func_code = func_code self.description = description self.group = group @@ -228,8 +231,8 @@ class NCP: # Simple NCP Function self.start_offset = 7 - # Returns the function code for this NCP packet. def FunctionCode(self, part=None): + "Returns the function code for this NCP packet." if part == None: return self.func_code elif part == 'high': @@ -246,8 +249,8 @@ class NCP: sys.stderr.write("Unknown directive '%s' for function_code()\n" % (part)) sys.exit(1) - # Does this NPC packet require a subfunction field? def HasSubFunction(self): + "Does this NPC packet require a subfunction field?" if self.func_code <= 0xff: return 0 else: @@ -280,8 +283,8 @@ class NCP: self.CheckRecords(size, records, "Reply", 8) self.ptvc_reply = self.MakePTVC(records, "reply") - # Simple sanity check def CheckRecords(self, size, records, descr, min_hdr_length): + "Simple sanity check" min = size max = size if type(size) == type(()): @@ -316,22 +319,24 @@ class NCP: sys.exit(1) - # Makes a PTVC out of a request or reply record list. Possibly adds - # it to the global list of PTVCs (the global list is a UniqueCollection, - # so an equivalent PTVC may already be in the global list). def MakePTVC(self, records, name_suffix): + """Makes a PTVC out of a request or reply record list. Possibly adds + it to the global list of PTVCs (the global list is a UniqueCollection, + so an equivalent PTVC may already be in the global list).""" + name = "%s_%s" % (self.CName(), name_suffix) ptvc = PTVC(name, records) return ptvc_lists.Add(ptvc) - # Returns a C symbol based on the NCP function code def CName(self): + "Returns a C symbol based on the NCP function code" return "ncp_0x%x" % (self.func_code) - # Returns a list of variables used in the request and reply records. - # A variable is listed only once, even if it is used twice (once in - # the request, once in the reply). def Variables(self): + """Returns a list of variables used in the request and reply records. + A variable is listed only once, even if it is used twice (once in + the request, once in the reply).""" + variables = {} if self.request_records: for record in self.request_records: @@ -346,10 +351,11 @@ class NCP: return variables.keys() - # Sets or returns the list of completion codes. Internally, a NamedList - # is used to store the completion codes, but the caller of this function - # never realizes that because Python lists are the input and output. def CompletionCodes(self, codes=None): + """Sets or returns the list of completion codes. Internally, a NamedList + is used to store the completion codes, but the caller of this function + never realizes that because Python lists are the input and output.""" + if codes == None: return self.codes @@ -375,11 +381,12 @@ class NCP: self.Finalize() - # Adds the NCP object to the global collection of NCP objects. This - # is done automatically after setting the CompletionCode list. Yes, this - # is a shortcut, but it makes our list of NCP packet definitions look - # neater, since an explicit "add to global list of packets" is not needed. def Finalize(self): + """Adds the NCP object to the global collection of NCP objects. This + is done automatically after setting the CompletionCode list. Yes, this + is a shortcut, but it makes our list of NCP packet definitions look + neater, since an explicit "add to global list of packets" is not needed.""" + # Add packet to global collection of packets if packets.HasMember(self): sys.stderr.write("Already have NCP Function Code 0x%x\n" % \ @@ -391,13 +398,13 @@ class NCP: ############################################################################## -# Classes for NCP field types -############################################################################## + LE = 1 # Little-Endian BE = 0 # Big-Endian NA = -1 # Not Applicable class Type: + " Virtual class for NCP field types" type = "Type" ftype = None disp = "BASE_DEC" @@ -466,26 +473,29 @@ class uint32(Type): def __init__(self, abbrev, descr, endianness = BE): Type.__init__(self, abbrev, descr, 4, endianness) -# A string of up to 255 characters. The first byte -# gives the string length. Thus, the total length of -# this data structure is from 1 to 256 bytes, including -# the first byte. class nstring8(Type): + """A string of up to 255 characters. The first byte + gives the string length. Thus, the total length of + this data structure is from 1 to 256 bytes, including + the first byte.""" + type = "nstring8" ftype = "FT_NSTRING_UINT8" def __init__(self, abbrev, descr): Type.__init__(self, abbrev, descr, -1) -# NUL-terminated string. class stringz(Type): + "NUL-terminated string." + type = "stringz" ftype = "FT_STRING" def __init__(self, abbrev, descr): Type.__init__(self, abbrev, descr, -1) -# Abstract class for val_stringN, where N is number -# of bits that key takes up class val_string(Type): + """Abstract class for val_stringN, where N is number + of bits that key takes up.""" + type = "val_string" disp = 'BASE_HEX' @@ -1156,251 +1166,251 @@ pkt.CompletionCodes([0x0000, 0x8800, 0x9300, 0xff00]) ############################################################################## # Produce C code ############################################################################## +if __name__ == '__main__': + print "/*" + print " * Generated automatically from %s" % (sys.argv[0]) + print " * Do not edit this file manually, as all changes will be lost." + print " */\n" + + print """ + /* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + #ifdef HAVE_CONFIG_H + # include "config.h" + #endif + + #include <glib.h> + #include "packet.h" + #include "conversation.h" + #include "ptvcursor.h" + #include "packet-ncp-int.h" + + static int hf_ncp_func = -1; + static int hf_ncp_length = -1; + static int hf_ncp_subfunc = -1; + static int hf_ncp_completion_code = -1; + static int hf_ncp_connection_status = -1; + """ + + # Look at all packet types in the packets collection, and cull information + # from them. + packet_keys = [] + for packet in packets.Members(): + packet_keys.append(packet.FunctionCode()) + packet_keys.sort() + + errors_used_list = [] + errors_used_hash = {} + groups_used_list = [] + groups_used_hash = {} + variables_used_hash = {} + + for pkt in packets.Members(): + # Determine which error codes are used. + codes = pkt.CompletionCodes() + for code in codes.Records(): + if not errors_used_hash.has_key(code): + errors_used_hash[code] = len(errors_used_list) + errors_used_list.append(code) + + # Determine which groups are used. + group = pkt.Group() + if not groups_used_hash.has_key(group): + groups_used_hash[group] = len(groups_used_list) + groups_used_list.append(group) + + # Determine which variables are used. + vars = pkt.Variables() + for var in vars: + variables_used_hash[var] = 1 + + + + # Print the hf variable declarations + for var in variables_used_hash.keys(): + print "static int " + var.HFName() + " = -1;" + + + # Print the value_string's + for var in variables_used_hash.keys(): + if var.type == "val_string8" or var.type == "val_string16": + print "" + print `var` + + + print """ + void + proto_register_ncp2222(void) + { + + static hf_register_info hf[] = { + { &hf_ncp_func, + { "Function", "ncp.func", FT_UINT8, BASE_HEX, NULL, 0x0, "" }}, + + { &hf_ncp_length, + { "Packet Length", "ncp.length", FT_UINT16, BASE_DEC, NULL, 0x0, "" }}, + + { &hf_ncp_subfunc, + { "SubFunction", "ncp.subfunc", FT_UINT8, BASE_HEX, NULL, 0x0, "" }}, + + { &hf_ncp_completion_code, + { "Completion Code", "ncp.completion_code", FT_UINT8, BASE_HEX, NULL, 0x0, "" }}, + + { &hf_ncp_connection_status, + { "Connection Status", "ncp.connection_status", FT_UINT8, BASE_DEC, NULL, 0x0, "" }}, + """ + + # Print the registration code for the hf variables + for var in variables_used_hash.keys(): + print "\t{ &%s," % (var.HFName()) + print "\t{ \"%s\", \"%s\", %s, %s, %s, 0x%x, \"\" }},\n" % \ + (var.Description(), var.DFilter(), + var.EtherealFType(), var.Display(), var.ValuesName(), + var.Mask()) + + print """\t}; + + proto_register_field_array(proto_ncp, hf, array_length(hf)); + } + """ + + + # Determine which error codes are not used + errors_not_used = {} + # Copy the keys from the error list... + for code in errors.keys(): + errors_not_used[code] = 1 + # ... and remove the ones that *were* used. + for code in errors_used_list: + del errors_not_used[code] + + # Print a remark showing errors not used + list_errors_not_used = errors_not_used.keys() + list_errors_not_used.sort() + for code in list_errors_not_used: + print "/* Error 0x%04x not used: %s */" % (code, errors[code]) + print "\n" + + # Print the errors table + print "/* Error strings. */" + print "static const char *ncp_errors[] = {" + for code in errors_used_list: + print '\t/* %02d (0x%04x) */ "%s",' % (errors_used_hash[code], code, errors[code]) + print "};\n" + + + + + # Determine which groups are not used + groups_not_used = {} + # Copy the keys from the group list... + for group in groups.keys(): + groups_not_used[group] = 1 + # ... and remove the ones that *were* used. + for group in groups_used_list: + del groups_not_used[group] + + # Print a remark showing groups not used + list_groups_not_used = groups_not_used.keys() + list_groups_not_used.sort() + for group in list_groups_not_used: + print "/* Group not used: %s = %s */" % (group, groups[group]) + print "\n" + + # Print the groups table + print "/* Group strings. */" + print "static const char *ncp_groups[] = {" + for group in groups_used_list: + print '\t/* %02d (%s) */ "%s",' % (groups_used_hash[group], group, groups[group]) + print "};\n" + + # Print PTVC's + print "/* PTVC records. These are re-used to save space. */" + for ptvc in ptvc_lists.Members(): + if not ptvc.Null() and not ptvc.Empty(): + print "static const ptvc_record %s[] = {" % (ptvc.Name()) + records = ptvc.Records() + for ptvc_rec in records: + print "\t%s," % (ptvc_rec) + print "\t{ NULL, 0, 0 }" + print "};\n" + + # Print error_equivalency tables + print "/* Error-Equivalency Tables. These are re-used to save space. */" + for compcodes in compcode_lists.Members(): + errors = compcodes.Records() + # Make sure the record for error = 0x00 comes last. + print "static const error_equivalency %s[] = {" % (compcodes.Name()) + for error in errors: + error_in_packet = error >> 8; + ncp_error_index = errors_used_hash[error] + print "\t{ 0x%02x, %d }, /* 0x%04x */" % (error_in_packet, + ncp_error_index, error) + print "\t{ 0x00, -1 }\n};\n" + + + # Print ncp_record packet records + print "#define SUBFUNC 0xff" + print "#define NOSUB 0x00" + + print "/* ncp_record structs for packets */" + print "static const ncp_record ncp_packets[] = {" + for pkt in packets.Members(): + if pkt.HasSubFunction(): + subfunc_string = "SUBFUNC" + else: + subfunc_string = "NOSUB" + print '\t{ 0x%02x, 0x%02x, %s, "%s",' % (pkt.FunctionCode('high'), + pkt.FunctionCode('low'), subfunc_string, pkt.Description()), -print "/*" -print " * Generated automatically from %s" % (sys.argv[0]) -print " * Do not edit this file manually, as all changes will be lost." -print " */\n" - -print """ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <glib.h> -#include "packet.h" -#include "conversation.h" -#include "ptvcursor.h" -#include "packet-ncp-int.h" - -static int hf_ncp_func = -1; -static int hf_ncp_length = -1; -static int hf_ncp_subfunc = -1; -static int hf_ncp_completion_code = -1; -static int hf_ncp_connection_status = -1; -""" - -# Look at all packet types in the packets collection, and cull information -# from them. -packet_keys = [] -for packet in packets.Members(): - packet_keys.append(packet.FunctionCode()) -packet_keys.sort() - -errors_used_list = [] -errors_used_hash = {} -groups_used_list = [] -groups_used_hash = {} -variables_used_hash = {} - -for pkt in packets.Members(): - # Determine which error codes are used. - codes = pkt.CompletionCodes() - for code in codes.Records(): - if not errors_used_hash.has_key(code): - errors_used_hash[code] = len(errors_used_list) - errors_used_list.append(code) - - # Determine which groups are used. - group = pkt.Group() - if not groups_used_hash.has_key(group): - groups_used_hash[group] = len(groups_used_list) - groups_used_list.append(group) - - # Determine which variables are used. - vars = pkt.Variables() - for var in vars: - variables_used_hash[var] = 1 - - - -# Print the hf variable declarations -for var in variables_used_hash.keys(): - print "static int " + var.HFName() + " = -1;" - - -# Print the value_string's -for var in variables_used_hash.keys(): - if var.type == "val_string8" or var.type == "val_string16": - print "" - print `var` - - -print """ -void -proto_register_ncp2222(void) -{ - - static hf_register_info hf[] = { - { &hf_ncp_func, - { "Function", "ncp.func", FT_UINT8, BASE_HEX, NULL, 0x0, "" }}, - - { &hf_ncp_length, - { "Packet Length", "ncp.length", FT_UINT16, BASE_DEC, NULL, 0x0, "" }}, - - { &hf_ncp_subfunc, - { "SubFunction", "ncp.subfunc", FT_UINT8, BASE_HEX, NULL, 0x0, "" }}, + print '\t%d /* %s */,' % (groups_used_hash[pkt.Group()], pkt.Group()) - { &hf_ncp_completion_code, - { "Completion Code", "ncp.completion_code", FT_UINT8, BASE_HEX, NULL, 0x0, "" }}, + ptvc = pkt.PTVCRequest() + if not ptvc.Null() and not ptvc.Empty(): + ptvc_request = ptvc.Name() + else: + ptvc_request = 'NULL' - { &hf_ncp_connection_status, - { "Connection Status", "ncp.connection_status", FT_UINT8, BASE_DEC, NULL, 0x0, "" }}, -""" + ptvc = pkt.PTVCReply() + if not ptvc.Null() and not ptvc.Empty(): + ptvc_reply = ptvc.Name() + else: + ptvc_reply = 'NULL' -# Print the registration code for the hf variables -for var in variables_used_hash.keys(): - print "\t{ &%s," % (var.HFName()) - print "\t{ \"%s\", \"%s\", %s, %s, %s, 0x%x, \"\" }},\n" % \ - (var.Description(), var.DFilter(), - var.EtherealFType(), var.Display(), var.ValuesName(), - var.Mask()) + errors = pkt.CompletionCodes() + print '\t\t%s, NULL, %s, NULL,' % (ptvc_request, ptvc_reply) + print '\t\t%s },\n' % (errors.Name()) -print """\t}; + print '\t{ 0, 0, 0, NULL }' + print "};\n" - proto_register_field_array(proto_ncp, hf, array_length(hf)); -} -""" + print "/* ncp funcs that require a subfunc */" + print "static const guint8 ncp_func_requires_subfunc[] = {" + hi_seen = {} + for pkt in packets.Members(): + if pkt.HasSubFunction(): + hi_func = pkt.FunctionCode('high') + if not hi_seen.has_key(hi_func): + print "\t0x%02x," % (hi_func) + hi_seen[hi_func] = 1 + print "\t0" + print "};\n" -# Determine which error codes are not used -errors_not_used = {} -# Copy the keys from the error list... -for code in errors.keys(): - errors_not_used[code] = 1 -# ... and remove the ones that *were* used. -for code in errors_used_list: - del errors_not_used[code] - -# Print a remark showing errors not used -list_errors_not_used = errors_not_used.keys() -list_errors_not_used.sort() -for code in list_errors_not_used: - print "/* Error 0x%04x not used: %s */" % (code, errors[code]) -print "\n" - -# Print the errors table -print "/* Error strings. */" -print "static const char *ncp_errors[] = {" -for code in errors_used_list: - print '\t/* %02d (0x%04x) */ "%s",' % (errors_used_hash[code], code, errors[code]) -print "};\n" - - - - -# Determine which groups are not used -groups_not_used = {} -# Copy the keys from the group list... -for group in groups.keys(): - groups_not_used[group] = 1 -# ... and remove the ones that *were* used. -for group in groups_used_list: - del groups_not_used[group] - -# Print a remark showing groups not used -list_groups_not_used = groups_not_used.keys() -list_groups_not_used.sort() -for group in list_groups_not_used: - print "/* Group not used: %s = %s */" % (group, groups[group]) -print "\n" - -# Print the groups table -print "/* Group strings. */" -print "static const char *ncp_groups[] = {" -for group in groups_used_list: - print '\t/* %02d (%s) */ "%s",' % (groups_used_hash[group], group, groups[group]) -print "};\n" - -# Print PTVC's -print "/* PTVC records. These are re-used to save space. */" -for ptvc in ptvc_lists.Members(): - if not ptvc.Null() and not ptvc.Empty(): - print "static const ptvc_record %s[] = {" % (ptvc.Name()) - records = ptvc.Records() - for ptvc_rec in records: - print "\t%s," % (ptvc_rec) - print "\t{ NULL, 0, 0 }" - print "};\n" - -# Print error_equivalency tables -print "/* Error-Equivalency Tables. These are re-used to save space. */" -for compcodes in compcode_lists.Members(): - errors = compcodes.Records() - # Make sure the record for error = 0x00 comes last. - print "static const error_equivalency %s[] = {" % (compcodes.Name()) - for error in errors: - error_in_packet = error >> 8; - ncp_error_index = errors_used_hash[error] - print "\t{ 0x%02x, %d }, /* 0x%04x */" % (error_in_packet, - ncp_error_index, error) - print "\t{ 0x00, -1 }\n};\n" - - -# Print ncp_record packet records -print "#define SUBFUNC 0xff" -print "#define NOSUB 0x00" - -print "/* ncp_record structs for packets */" -print "static const ncp_record ncp_packets[] = {" -for pkt in packets.Members(): - if pkt.HasSubFunction(): - subfunc_string = "SUBFUNC" - else: - subfunc_string = "NOSUB" - print '\t{ 0x%02x, 0x%02x, %s, "%s",' % (pkt.FunctionCode('high'), - pkt.FunctionCode('low'), subfunc_string, pkt.Description()), - - print '\t%d /* %s */,' % (groups_used_hash[pkt.Group()], pkt.Group()) - - ptvc = pkt.PTVCRequest() - if not ptvc.Null() and not ptvc.Empty(): - ptvc_request = ptvc.Name() - else: - ptvc_request = 'NULL' - - ptvc = pkt.PTVCReply() - if not ptvc.Null() and not ptvc.Empty(): - ptvc_reply = ptvc.Name() - else: - ptvc_reply = 'NULL' - - errors = pkt.CompletionCodes() - print '\t\t%s, NULL, %s, NULL,' % (ptvc_request, ptvc_reply) - print '\t\t%s },\n' % (errors.Name()) - -print '\t{ 0, 0, 0, NULL }' -print "};\n" - -print "/* ncp funcs that require a subfunc */" -print "static const guint8 ncp_func_requires_subfunc[] = {" -hi_seen = {} -for pkt in packets.Members(): - if pkt.HasSubFunction(): - hi_func = pkt.FunctionCode('high') - if not hi_seen.has_key(hi_func): - print "\t0x%02x," % (hi_func) - hi_seen[hi_func] = 1 -print "\t0" -print "};\n" - - -print '#include "ncp2222.h"' + print '#include "ncp2222.h"' |