aboutsummaryrefslogtreecommitdiffstats
path: root/epan/oids.c
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2007-08-16 06:48:51 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2007-08-16 06:48:51 +0000
commitb782333f20619dd823e6e25f7ef42fc8c22c46a7 (patch)
treeda243b3080097214498ed5d3e2ba10bd4ae9b2ad /epan/oids.c
parent696e992a8ce559df7bb6b420809d0c39e2e14e42 (diff)
- It's just-a-bad-idea(tm) to redefine anything from a foreign library, Don't.
- Allow to look for value-types by name. [still largelly untested] svn path=/trunk/; revision=22524
Diffstat (limited to 'epan/oids.c')
-rw-r--r--epan/oids.c80
1 files changed, 60 insertions, 20 deletions
diff --git a/epan/oids.c b/epan/oids.c
index 6d32baea49..f232babc6a 100644
--- a/epan/oids.c
+++ b/epan/oids.c
@@ -146,6 +146,62 @@ static char* alnumerize(const char* name) {
return s;
}
+struct _smi_type_data {
+ char* name;
+ enum SmiBasetype base;
+ enum ftenum type;
+ int display;
+};
+
+const struct _smi_type_data* get_typedata(SmiType* smiType) {
+ static const struct _smi_type_data types_by_name[] = {
+ {"IpAddress",0,FT_IPv4,BASE_NONE},
+ {"InetAddressIPv4",0,FT_IPv4,BASE_NONE},
+ {"InetAddressIPv6",0,FT_IPv4,BASE_NONE},
+ {"NetworkAddress",0,FT_IPv4,BASE_NONE},
+ {"MacAddress",0,FT_ETHER,BASE_NONE},
+ {"TimeTicks",0,FT_RELATIVE_TIME,BASE_NONE},
+ {"Ipv6Address",0,FT_IPv4,BASE_NONE},
+ {"TimeStamp",0,FT_RELATIVE_TIME,BASE_NONE}
+ };
+ static const struct _smi_type_data types_by_base[] = {
+ {NULL,SMI_BASETYPE_UNKNOWN,FT_BYTES,BASE_NONE},
+ {NULL,SMI_BASETYPE_INTEGER32,FT_INT32,BASE_DEC},
+ {NULL,SMI_BASETYPE_OCTETSTRING,FT_BYTES,BASE_NONE},
+ {NULL,SMI_BASETYPE_OBJECTIDENTIFIER,FT_OID,BASE_NONE},
+ {NULL,SMI_BASETYPE_UNSIGNED32,FT_UINT32,BASE_NONE},
+ {NULL,SMI_BASETYPE_UNSIGNED64,FT_UINT64,BASE_DEC},
+ {NULL,SMI_BASETYPE_FLOAT32,FT_FLOAT,BASE_DEC},
+ {NULL,SMI_BASETYPE_FLOAT64,FT_DOUBLE,BASE_DEC},
+ {NULL,SMI_BASETYPE_FLOAT128,FT_BYTES,BASE_NONE},
+ {NULL,SMI_BASETYPE_ENUM,FT_UINT32,BASE_DEC},
+ {NULL,SMI_BASETYPE_BITS,FT_BYTES,BASE_DEC},
+ };
+ const struct _smi_type_data* type = NULL;
+ SmiType* sT = smiType;
+ guint i;
+
+
+ do {
+ for (i = 0; i < array_length(types_by_name) ; i++ ) {
+ const char* name = smiRenderType(sT, SMI_RENDER_NAME);
+ type = &(types_by_name[i]);
+ if (name && g_str_equal(name, types_by_name[i].name)) {
+ return type;
+ }
+ }
+ } while(( sT = smiGetParentType(sT) ));
+
+ if (! type) {
+ for (i = 0; i < array_length(types_by_base) ; i++ ) {
+ if(sT->basetype == types_by_base[i].base) {
+ return type;
+ }
+ }
+ }
+ return types_by_base;
+}
+
#define IS_ENUMABLE(ft) (( (ft == FT_UINT8) || (ft == FT_UINT16) || (ft == FT_UINT24) || (ft == FT_UINT32) \
|| (ft == FT_INT8) || (ft == FT_INT16) || (ft == FT_INT24) || (ft == FT_INT32) \
|| (ft == FT_UINT64) || (ft == FT_INT64) ))
@@ -156,22 +212,8 @@ void register_mibs(void) {
guint i;
int proto_smi = -1;
- static struct _smi_type_data {
- enum ftenum type;
- int display;
- } types[] = {
- {FT_BYTES,BASE_NONE},
- {FT_INT32,BASE_DEC},
- {FT_BYTES,BASE_NONE},
- {FT_OID,BASE_NONE},
- {FT_UINT32,BASE_DEC},
- {FT_INT64,BASE_DEC},
- {FT_UINT64,BASE_DEC},
- {FT_FLOAT,BASE_DEC},
- {FT_DOUBLE,BASE_DEC},
- {FT_BYTES,BASE_NONE},
- {FT_UINT32,BASE_DEC},
- };
+
+
GArray* hfa = g_array_new(FALSE,TRUE,sizeof(hf_register_info));
GArray* etta = g_array_new(FALSE,TRUE,sizeof(gint*));
static uat_field_t smi_fields[] = {
@@ -220,11 +262,9 @@ void register_mibs(void) {
if (smiType) {
SmiNamedNumber* smiEnum;
- struct _smi_type_data* typedata;
+ const struct _smi_type_data* typedata = get_typedata(smiType);
hf_register_info hf = { NULL, { NULL, NULL, FT_NONE, BASE_NONE, NULL, 0, "", HFILL }};
-
- typedata = &(types[smiType->basetype <= SMI_BASETYPE_ENUM ? smiType->basetype : SMI_BASETYPE_UNKNOWN]);
-
+
hf.hfinfo.name = oid_data->name;
hf.p_id = &(oid_data->value_hfid);
hf.hfinfo.type = typedata->type;