diff --git a/src/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs b/src/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs index 20e726ef..6c22036c 100644 --- a/src/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs +++ b/src/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs @@ -102,31 +102,34 @@ namespace LwipMibCompiler MibTypesResolver.ResolveTypes(md.Modules[0]); MibTree mt = new MibTree(md.Modules[0] as MibModule); - if (mt.Root == null) + if (mt.Root.Count == 0) { Console.WriteLine("No root element found inside MIB!"); return; } - - // create LWIP object tree from MIB structure - Console.WriteLine(" Creating lwIP object tree..."); - - SnmpMib snmpMib = new SnmpMib(); - snmpMib.Oid = mt.Root.Entity.Value; - snmpMib.BaseOid = (int[])(object)MibTypesResolver.ResolveOid(mt.Root.Entity).GetOidValues(); - snmpMib.Name = _alphaNumericRegex.Replace(md.Modules[0].Name, "").ToLowerInvariant(); - - ProcessMibTreeNode(mt.Root, snmpMib); - - // let the tree transform itself depending on node structure - snmpMib.Analyze(); - - // generate code from LWIP object tree - Console.WriteLine(" Generating code files..."); - MibCFile generatedFile = new MibCFile(); + MibCFile generatedFile = new MibCFile(); MibHeaderFile generatedHeaderFile = new MibHeaderFile(); - snmpMib.Generate(generatedFile, generatedHeaderFile); + + foreach (MibTreeNode mibTreeNode in mt.Root) + { + // create LWIP object tree from MIB structure + Console.WriteLine(" Creating lwIP object tree " + mibTreeNode.Entity.Name); + + SnmpMib snmpMib = new SnmpMib(); + snmpMib.Oid = mibTreeNode.Entity.Value; + snmpMib.BaseOid = (int[])(object)MibTypesResolver.ResolveOid(mibTreeNode.Entity).GetOidValues(); + snmpMib.Name = mibTreeNode.Entity.Name; + + ProcessMibTreeNode(mibTreeNode, snmpMib); + + // let the tree transform itself depending on node structure + snmpMib.Analyze(); + + // generate code from LWIP object tree + Console.WriteLine(" Generating code " + snmpMib.Name); + snmpMib.Generate(generatedFile, generatedHeaderFile); + } string preservedCode = MibCFile.GetPreservedCode(destFile); if (!string.IsNullOrEmpty(preservedCode)) diff --git a/src/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs b/src/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs index 2abf7b58..c5577ef5 100644 --- a/src/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs +++ b/src/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs @@ -163,7 +163,7 @@ namespace LwipSnmpCodeGeneration // check if we can merge this node to a scalar array node (all childs need to be scalars) if (this.childNodes.Count > 0) { - if (LwipOpts.GenerateScalarArrays && (this.childScalarNodes.Count == this.childNodes.Count)) + if (LwipOpts.GenerateScalarArrays && (this.childScalarNodes.Count == this.childNodes.Count) && (this.ParentNode != null)) { SnmpScalarArrayNode scalarArrayNode = new SnmpScalarArrayNode(this.childScalarNodes, this.ParentNode); scalarArrayNode.Oid = this.Oid; diff --git a/src/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs b/src/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs index 5a7ddfd3..f9be39ff 100644 --- a/src/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs +++ b/src/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; using Lextm.SharpSnmpLib.Mib.Elements.Entities; namespace Lextm.SharpSnmpLib.Mib @@ -11,7 +8,7 @@ namespace Lextm.SharpSnmpLib.Mib /// public class MibTree { - private MibTreeNode _root = null; + private readonly List _root = new List(); public MibTree(MibModule module) { @@ -27,24 +24,48 @@ namespace Lextm.SharpSnmpLib.Mib if (mi != null) { entities.Remove(element); - _root = new MibTreeNode(null, mi); + _root.Add(new MibTreeNode(null, mi)); break; } } - if (_root == null) + // gather all items below ModuleIdentity + foreach (MibTreeNode mibTreeNode in _root) + { + BuildTree(mibTreeNode, entities); + UpdateTreeNodeTypes(mibTreeNode); + } + + // find OID assignments as root, if there are any that are not below ModuleIdentity + // FIXME: There may be multiple OID assignments that create a tree (find the root ones!) + foreach (IEntity element in entities) + { + OidValueAssignment oa = element as OidValueAssignment; + + if (oa != null) + { + entities.Remove(element); + _root.Add(new MibTreeNode(null, oa)); + break; + } + } + + if (_root.Count == 0) { //no module identity, assume first entity is root - _root = new MibTreeNode(null, entities[0]); + _root.Add(new MibTreeNode(null, entities[0])); entities.RemoveAt(0); } - BuildTree(_root, entities); - UpdateTreeNodeTypes(_root); + foreach (MibTreeNode mibTreeNode in _root) + { + BuildTree(mibTreeNode, entities); + UpdateTreeNodeTypes(mibTreeNode); + } } } - public MibTreeNode Root + public IList Root { get { return _root; } }