From Graeme Lunt:

Basically the changes are:
a) [pres] make the find_oid_by_[pres_]ctx_id (I changed the name to make it more specific) non-static so it can be called from other dissectors (see acse.cnf changes). I also call it from RTSE and ROS dissectors
b) [acse] remove (#ifdef NOT_NEEDED) the oid lookup table and any reference to acse_handle - as these are no longer needed
c) [acse] register the acse dissector on 2.2.1.0.1
with some modifications: -#ifdef:ed code removed
- renamed aco -> pco

svn path=/trunk/; revision=15678
This commit is contained in:
Anders Broman 2005-09-04 09:00:01 +00:00
parent 60eb171f7a
commit bc4b6481b4
9 changed files with 98 additions and 88 deletions

View File

@ -76,10 +76,19 @@ ACRQ-apdu/aSO-context-name aCRQ_aSO_context_name
hf_index, object_identifier_id);
#.FN_BODY EXTERNAL/indirect-reference
char *oid;
offset = dissect_ber_integer(FALSE, pinfo, tree, tvb, offset,
hf_acse_indirect_reference,
&indir_ref);
/* look up the indirect reference */
if(oid = find_oid_by_pres_ctx_id(pinfo, indir_ref)) {
strcpy(object_identifier_id, oid);
}
if(session)
session->pres_ctx_id = indir_ref;
#.FN_BODY EXTERNAL/encoding/single-ASN1-type
offset=call_ber_oid_callback(object_identifier_id, tvb, offset, pinfo, top_tree);

View File

@ -49,6 +49,7 @@
#include "packet-ber.h"
#include "packet-acse.h"
#include "packet-ses.h"
#include "packet-pres.h"
#include "packet-x509if.h"
#define PNAME "ACSE"
@ -72,6 +73,7 @@ static guint32 indir_ref=0;
static proto_tree *top_tree=NULL;
#if NOT_NEEDED
/* to keep track of presentation context identifiers and protocol-oids */
typedef struct _acse_ctx_oid_t {
/* XXX here we should keep track of ADDRESS/PORT as well */
@ -134,6 +136,7 @@ find_oid_by_ctx_id(packet_info *pinfo _U_, guint32 idx)
return NULL;
}
# endif /* NOT_NEEDED */
#include "packet-acse-fn.c"
@ -182,14 +185,14 @@ dissect_acse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
/* data pdu is not ACSE pdu and has to go directly to app dissector */
switch(session->spdu_type){
case SES_CONNECTION_REQUEST: /* AARQ */
case SES_CONNECTION_ACCEPT: /* AARE */
case SES_REFUSE: /* RLRE */
case SES_DISCONNECT: /* RLRQ */
case SES_FINISH: /* RLRE */
case SES_ABORT: /* ABRT */
case SES_CONNECTION_ACCEPT: /* AARE */
case SES_REFUSE: /* RLRE */
case SES_DISCONNECT: /* RLRQ */
case SES_FINISH: /* RLRE */
case SES_ABORT: /* ABRT */
break;
case SES_DATA_TRANSFER:
oid=find_oid_by_ctx_id(pinfo, indir_ref);
oid=find_oid_by_pres_ctx_id(pinfo, indir_ref);
if(oid){
call_ber_oid_callback(oid, tvb, offset, pinfo, parent_tree);
} else {
@ -223,18 +226,6 @@ dissect_acse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
}
}
switch(session->spdu_type){
case SES_CONNECTION_REQUEST: /* AARQ */
case SES_CONNECTION_ACCEPT: /* AARE */
/* these two functions are used to set up the association
between a presentation identifier (indir_ref) and
a protocol identified by a oid.
it is ugly to handle it with global variables but
better than nothing.
*/
register_ctx_id_and_oid(pinfo, indir_ref, object_identifier_id);
break;
}
}
/*--- proto_register_acse ----------------------------------------------*/
@ -259,14 +250,16 @@ void proto_register_acse(void) {
proto_register_field_array(proto_acse, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
register_init_routine(acse_init);
}
/*--- proto_reg_handoff_acse -------------------------------------------*/
void proto_reg_handoff_acse(void) {
/*#include "packet-acse-dis-tab.c"*/
register_ber_oid_dissector("2.2.3.1.1", dissect_acse, proto_acse, "acse");
register_ber_oid_name("2.2.3.1.1","aCSE-id");
register_ber_oid_dissector("2.2.1.0.1", dissect_acse, proto_acse, "acse-as-id");
}

View File

@ -53,9 +53,9 @@ static struct SESSION_DATA_STRUCTURE* session = NULL;
/* pointers for acse dissector */
proto_tree *global_tree = NULL;
packet_info *global_pinfo = NULL;
/* dissector for data */
static dissector_handle_t data_handle;
static dissector_handle_t acse_handle;
static char abstract_syntax_name_oid[BER_MAX_OID_STR_LEN];
static guint32 presentation_context_identifier;
@ -79,16 +79,16 @@ static gint ett_pres = -1;
static guint
pres_ctx_oid_hash(gconstpointer k)
{
pres_ctx_oid_t *aco=(pres_ctx_oid_t *)k;
return aco->ctx_id;
pres_ctx_oid_t *pco=(pres_ctx_oid_t *)k;
return pco->ctx_id;
}
/* XXX this one should be made ADDRESS/PORT aware */
static gint
pres_ctx_oid_equal(gconstpointer k1, gconstpointer k2)
{
pres_ctx_oid_t *aco1=(pres_ctx_oid_t *)k1;
pres_ctx_oid_t *aco2=(pres_ctx_oid_t *)k2;
return aco1->ctx_id==aco2->ctx_id;
pres_ctx_oid_t *pco1=(pres_ctx_oid_t *)k1;
pres_ctx_oid_t *pco2=(pres_ctx_oid_t *)k2;
return pco1->ctx_id==pco2->ctx_id;
}
static void
@ -106,26 +106,27 @@ pres_init(void)
static void
register_ctx_id_and_oid(packet_info *pinfo _U_, guint32 idx, char *oid)
{
pres_ctx_oid_t *aco, *tmpaco;
aco=se_alloc(sizeof(pres_ctx_oid_t));
aco->ctx_id=idx;
aco->oid=se_strdup(oid);
pres_ctx_oid_t *pco, *tmppco;
pco=se_alloc(sizeof(pres_ctx_oid_t));
pco->ctx_id=idx;
pco->oid=se_strdup(oid);
/* if this ctx already exists, remove the old one first */
tmpaco=(pres_ctx_oid_t *)g_hash_table_lookup(pres_ctx_oid_table, aco);
if(tmpaco){
g_hash_table_remove(pres_ctx_oid_table, tmpaco);
tmppco=(pres_ctx_oid_t *)g_hash_table_lookup(pres_ctx_oid_table, pco);
if(tmppco){
g_hash_table_remove(pres_ctx_oid_table, tmppco);
}
g_hash_table_insert(pres_ctx_oid_table, aco, aco);
g_hash_table_insert(pres_ctx_oid_table, pco, pco);
}
static char *
find_oid_by_ctx_id(packet_info *pinfo _U_, guint32 idx)
char *
find_oid_by_pres_ctx_id(packet_info *pinfo _U_, guint32 idx)
{
pres_ctx_oid_t aco, *tmpaco;
aco.ctx_id=idx;
tmpaco=(pres_ctx_oid_t *)g_hash_table_lookup(pres_ctx_oid_table, &aco);
if(tmpaco){
return tmpaco->oid;
pres_ctx_oid_t pco, *tmppco;
pco.ctx_id=idx;
tmppco=(pres_ctx_oid_t *)g_hash_table_lookup(pres_ctx_oid_table, &pco);
if(tmppco){
return tmppco->oid;
}
return NULL;
}
@ -261,5 +262,5 @@ void proto_reg_handoff_pres(void) {
"itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) abstractSyntax(1) pres(1) version1(1)"); */
data_handle = find_dissector("data");
acse_handle = find_dissector("acse");
}

View File

@ -27,4 +27,6 @@
/*#include "packet-pres-exp.h"*/
extern char *find_oid_by_pres_ctx_id(packet_info *pinfo _U_, guint32 idx);
#endif /* PACKET_PRES_H */

View File

@ -36,7 +36,7 @@ CPR-PPDU/normal-mode-parameters/provider-reason cPR_PPDU__provider-reason
tvbuff_t *next_tvb;
char *oid;
oid=find_oid_by_ctx_id(pinfo, presentation_context_identifier);
oid=find_oid_by_pres_ctx_id(pinfo, presentation_context_identifier);
if(oid){
next_tvb = tvb_new_subset(tvb, offset, -1, -1);
call_ber_oid_callback(oid, next_tvb, offset, pinfo, global_tree);

View File

@ -1,6 +1,6 @@
/* Do not modify this file. */
/* It is created automatically by the ASN.1 to Ethereal dissector compiler */
/* ./packet-acse.c */
/* .\packet-acse.c */
/* ../../tools/asn2eth.py -X -b -e -p acse -c acse.cnf -s packet-acse-template acse.asn */
/* Input file: packet-acse-template.c */
@ -56,6 +56,7 @@
#include "packet-ber.h"
#include "packet-acse.h"
#include "packet-ses.h"
#include "packet-pres.h"
#include "packet-x509if.h"
#define PNAME "ACSE"
@ -230,6 +231,7 @@ static guint32 indir_ref=0;
static proto_tree *top_tree=NULL;
#if NOT_NEEDED
/* to keep track of presentation context identifiers and protocol-oids */
typedef struct _acse_ctx_oid_t {
/* XXX here we should keep track of ADDRESS/PORT as well */
@ -292,6 +294,7 @@ find_oid_by_ctx_id(packet_info *pinfo _U_, guint32 idx)
return NULL;
}
# endif /* NOT_NEEDED */
/*--- Included file: packet-acse-fn.c ---*/
@ -316,10 +319,19 @@ static int dissect_direct_reference(packet_info *pinfo, proto_tree *tree, tvbuff
static int
dissect_acse_T_indirect_reference(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
char *oid;
offset = dissect_ber_integer(FALSE, pinfo, tree, tvb, offset,
hf_acse_indirect_reference,
&indir_ref);
/* look up the indirect reference */
if(oid = find_oid_by_pres_ctx_id(pinfo, indir_ref)) {
strcpy(object_identifier_id, oid);
}
if(session)
session->pres_ctx_id = indir_ref;
return offset;
}
@ -1874,14 +1886,14 @@ dissect_acse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
/* data pdu is not ACSE pdu and has to go directly to app dissector */
switch(session->spdu_type){
case SES_CONNECTION_REQUEST: /* AARQ */
case SES_CONNECTION_ACCEPT: /* AARE */
case SES_REFUSE: /* RLRE */
case SES_DISCONNECT: /* RLRQ */
case SES_FINISH: /* RLRE */
case SES_ABORT: /* ABRT */
case SES_CONNECTION_ACCEPT: /* AARE */
case SES_REFUSE: /* RLRE */
case SES_DISCONNECT: /* RLRQ */
case SES_FINISH: /* RLRE */
case SES_ABORT: /* ABRT */
break;
case SES_DATA_TRANSFER:
oid=find_oid_by_ctx_id(pinfo, indir_ref);
oid=find_oid_by_pres_ctx_id(pinfo, indir_ref);
if(oid){
call_ber_oid_callback(oid, tvb, offset, pinfo, parent_tree);
} else {
@ -1915,18 +1927,6 @@ dissect_acse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
}
}
switch(session->spdu_type){
case SES_CONNECTION_REQUEST: /* AARQ */
case SES_CONNECTION_ACCEPT: /* AARE */
/* these two functions are used to set up the association
between a presentation identifier (indir_ref) and
a protocol identified by a oid.
it is ugly to handle it with global variables but
better than nothing.
*/
register_ctx_id_and_oid(pinfo, indir_ref, object_identifier_id);
break;
}
}
/*--- proto_register_acse ----------------------------------------------*/
@ -2416,14 +2416,16 @@ void proto_register_acse(void) {
proto_register_field_array(proto_acse, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
register_init_routine(acse_init);
}
/*--- proto_reg_handoff_acse -------------------------------------------*/
void proto_reg_handoff_acse(void) {
/*#include "packet-acse-dis-tab.c"*/
register_ber_oid_dissector("2.2.3.1.1", dissect_acse, proto_acse, "acse");
register_ber_oid_name("2.2.3.1.1","aCSE-id");
register_ber_oid_dissector("2.2.1.0.1", dissect_acse, proto_acse, "acse-as-id");
}

View File

@ -1,6 +1,6 @@
/* Do not modify this file. */
/* It is created automatically by the ASN.1 to Ethereal dissector compiler */
/* ./packet-acse.h */
/* .\packet-acse.h */
/* ../../tools/asn2eth.py -X -b -e -p acse -c acse.cnf -s packet-acse-template acse.asn */
/* Input file: packet-acse-template.h */

View File

@ -60,9 +60,9 @@ static struct SESSION_DATA_STRUCTURE* session = NULL;
/* pointers for acse dissector */
proto_tree *global_tree = NULL;
packet_info *global_pinfo = NULL;
/* dissector for data */
static dissector_handle_t data_handle;
static dissector_handle_t acse_handle;
static char abstract_syntax_name_oid[BER_MAX_OID_STR_LEN];
static guint32 presentation_context_identifier;
@ -233,16 +233,16 @@ static gint ett_pres_User_session_requirements = -1;
static guint
pres_ctx_oid_hash(gconstpointer k)
{
pres_ctx_oid_t *aco=(pres_ctx_oid_t *)k;
return aco->ctx_id;
pres_ctx_oid_t *pco=(pres_ctx_oid_t *)k;
return pco->ctx_id;
}
/* XXX this one should be made ADDRESS/PORT aware */
static gint
pres_ctx_oid_equal(gconstpointer k1, gconstpointer k2)
{
pres_ctx_oid_t *aco1=(pres_ctx_oid_t *)k1;
pres_ctx_oid_t *aco2=(pres_ctx_oid_t *)k2;
return aco1->ctx_id==aco2->ctx_id;
pres_ctx_oid_t *pco1=(pres_ctx_oid_t *)k1;
pres_ctx_oid_t *pco2=(pres_ctx_oid_t *)k2;
return pco1->ctx_id==pco2->ctx_id;
}
static void
@ -260,26 +260,27 @@ pres_init(void)
static void
register_ctx_id_and_oid(packet_info *pinfo _U_, guint32 idx, char *oid)
{
pres_ctx_oid_t *aco, *tmpaco;
aco=se_alloc(sizeof(pres_ctx_oid_t));
aco->ctx_id=idx;
aco->oid=se_strdup(oid);
pres_ctx_oid_t *pco, *tmppco;
pco=se_alloc(sizeof(pres_ctx_oid_t));
pco->ctx_id=idx;
pco->oid=se_strdup(oid);
/* if this ctx already exists, remove the old one first */
tmpaco=(pres_ctx_oid_t *)g_hash_table_lookup(pres_ctx_oid_table, aco);
if(tmpaco){
g_hash_table_remove(pres_ctx_oid_table, tmpaco);
tmppco=(pres_ctx_oid_t *)g_hash_table_lookup(pres_ctx_oid_table, pco);
if(tmppco){
g_hash_table_remove(pres_ctx_oid_table, tmppco);
}
g_hash_table_insert(pres_ctx_oid_table, aco, aco);
g_hash_table_insert(pres_ctx_oid_table, pco, pco);
}
static char *
find_oid_by_ctx_id(packet_info *pinfo _U_, guint32 idx)
char *
find_oid_by_pres_ctx_id(packet_info *pinfo _U_, guint32 idx)
{
pres_ctx_oid_t aco, *tmpaco;
aco.ctx_id=idx;
tmpaco=(pres_ctx_oid_t *)g_hash_table_lookup(pres_ctx_oid_table, &aco);
if(tmpaco){
return tmpaco->oid;
pres_ctx_oid_t pco, *tmppco;
pco.ctx_id=idx;
tmppco=(pres_ctx_oid_t *)g_hash_table_lookup(pres_ctx_oid_table, &pco);
if(tmppco){
return tmppco->oid;
}
return NULL;
}
@ -948,7 +949,7 @@ dissect_pres_T_single_ASN1_type(gboolean implicit_tag _U_, tvbuff_t *tvb, int of
tvbuff_t *next_tvb;
char *oid;
oid=find_oid_by_ctx_id(pinfo, presentation_context_identifier);
oid=find_oid_by_pres_ctx_id(pinfo, presentation_context_identifier);
if(oid){
next_tvb = tvb_new_subset(tvb, offset, -1, -1);
call_ber_oid_callback(oid, next_tvb, offset, pinfo, global_tree);
@ -2245,5 +2246,5 @@ void proto_reg_handoff_pres(void) {
"itu-t(0) identified-organization(4) etsi(0) mobileDomain(0) gsm-Network(1) abstractSyntax(1) pres(1) version1(1)"); */
data_handle = find_dissector("data");
acse_handle = find_dissector("acse");
}

View File

@ -34,4 +34,6 @@
/*#include "packet-pres-exp.h"*/
extern char *find_oid_by_pres_ctx_id(packet_info *pinfo _U_, guint32 idx);
#endif /* PACKET_PRES_H */