SNMP MIB compiler: Add ability to generate UDP-MIB and TCP-MIB

This commit is contained in:
Dirk Ziegelmeier 2016-01-11 10:24:31 +01:00
parent b9d0d80946
commit 713deba83f
3 changed files with 55 additions and 31 deletions

View File

@ -102,31 +102,34 @@ namespace LwipMibCompiler
MibTypesResolver.ResolveTypes(md.Modules[0]); MibTypesResolver.ResolveTypes(md.Modules[0]);
MibTree mt = new MibTree(md.Modules[0] as MibModule); 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!"); Console.WriteLine("No root element found inside MIB!");
return; return;
} }
MibCFile generatedFile = new MibCFile();
// 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();
MibHeaderFile generatedHeaderFile = new MibHeaderFile(); 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); string preservedCode = MibCFile.GetPreservedCode(destFile);
if (!string.IsNullOrEmpty(preservedCode)) if (!string.IsNullOrEmpty(preservedCode))

View File

@ -163,7 +163,7 @@ namespace LwipSnmpCodeGeneration
// check if we can merge this node to a scalar array node (all childs need to be scalars) // check if we can merge this node to a scalar array node (all childs need to be scalars)
if (this.childNodes.Count > 0) 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); SnmpScalarArrayNode scalarArrayNode = new SnmpScalarArrayNode(this.childScalarNodes, this.ParentNode);
scalarArrayNode.Oid = this.Oid; scalarArrayNode.Oid = this.Oid;

View File

@ -1,7 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lextm.SharpSnmpLib.Mib.Elements.Entities; using Lextm.SharpSnmpLib.Mib.Elements.Entities;
namespace Lextm.SharpSnmpLib.Mib namespace Lextm.SharpSnmpLib.Mib
@ -11,7 +8,7 @@ namespace Lextm.SharpSnmpLib.Mib
/// </summary> /// </summary>
public class MibTree public class MibTree
{ {
private MibTreeNode _root = null; private readonly List<MibTreeNode> _root = new List<MibTreeNode>();
public MibTree(MibModule module) public MibTree(MibModule module)
{ {
@ -27,24 +24,48 @@ namespace Lextm.SharpSnmpLib.Mib
if (mi != null) if (mi != null)
{ {
entities.Remove(element); entities.Remove(element);
_root = new MibTreeNode(null, mi); _root.Add(new MibTreeNode(null, mi));
break; 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 //no module identity, assume first entity is root
_root = new MibTreeNode(null, entities[0]); _root.Add(new MibTreeNode(null, entities[0]));
entities.RemoveAt(0); entities.RemoveAt(0);
} }
BuildTree(_root, entities); foreach (MibTreeNode mibTreeNode in _root)
UpdateTreeNodeTypes(_root); {
BuildTree(mibTreeNode, entities);
UpdateTreeNodeTypes(mibTreeNode);
}
} }
} }
public MibTreeNode Root public IList<MibTreeNode> Root
{ {
get { return _root; } get { return _root; }
} }