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]);
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))

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)
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;

View File

@ -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
/// </summary>
public class MibTree
{
private MibTreeNode _root = null;
private readonly List<MibTreeNode> _root = new List<MibTreeNode>();
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<MibTreeNode> Root
{
get { return _root; }
}