Skip to content

Commit

Permalink
Added parsing of PORTMAP GETPORT functions.
Browse files Browse the repository at this point in the history
When we see PRTOMAP GETPORT calls for UDP, make sure all further UDP packets to  or from
this port goes to the ONC-RPC dissector regardless of the port on the other side.

We need this because if there is ONC-RPC traffic going between the ONC-RPC Program port to a port which has a normal ethereal dissector, ethereal would dissect the traffic as the protocol associated with the other port instead.

svn path=/trunk/; revision=5430
  • Loading branch information
Ronnie Sahlberg committed May 9, 2002
1 parent a0c1d24 commit 9625720
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 27 deletions.
4 changes: 2 additions & 2 deletions epan/conversation.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* conversation.c
* Routines for building lists of packets that are part of a "conversation"
*
* $Id: conversation.c,v 1.17 2001/11/29 09:05:25 guy Exp $
* $Id: conversation.c,v 1.18 2002/05/09 12:10:06 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
Expand Down Expand Up @@ -775,7 +775,7 @@ find_conversation(address *addr_a, address *addr_b, port_type ptype,
* one address/port pair.
*
* First try looking for a conversation with the specified address A
* and port B as the first address and port.
* and port A as the first address and port.
* (Neither "addr_b" nor "port_b" take part in this lookup.)
*/
conversation =
Expand Down
37 changes: 36 additions & 1 deletion packet-portmap.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* packet-portmap.c
* Routines for portmap dissection
*
* $Id: packet-portmap.c,v 1.35 2002/04/14 23:04:03 guy Exp $
* $Id: packet-portmap.c,v 1.36 2002/05/09 12:10:05 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
Expand Down Expand Up @@ -37,6 +37,8 @@
#include "packet-rpc.h"
#include "packet-portmap.h"
#include "ipproto.h"
#include "epan/conversation.h"
#include "epan/packet_info.h"

/*
* See:
Expand Down Expand Up @@ -66,6 +68,8 @@ static gint ett_portmap = -1;
static gint ett_portmap_rpcb = -1;
static gint ett_portmap_entry = -1;

static dissector_handle_t rpc_handle;
static dissector_handle_t rpc_tcp_handle;

/* Dissect a getport call */
static int
Expand All @@ -75,6 +79,17 @@ dissect_getport_call(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
guint32 proto;
guint32 prog;

/* make sure we remember protocol type until the reply packet */
if(!pinfo->fd->flags.visited){
rpc_call_info_value *rpc_call=pinfo->private_data;
if(rpc_call){
proto = tvb_get_ntohl(tvb, offset+8);
if(proto==17){ /* only do this for UDP */
rpc_call->private_data=(void *)PT_UDP;
}
}
}

if ( tree )
{
prog = tvb_get_ntohl(tvb, offset+0);
Expand All @@ -99,6 +114,24 @@ static int
dissect_getport_reply(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
proto_tree *tree)
{
/* we might have learnt a <ipaddr><protocol><port> mapping for ONC-RPC*/
if(!pinfo->fd->flags.visited){
rpc_call_info_value *rpc_call=pinfo->private_data;
/* only do this for UDP, TCP does not need anything like this */
if(rpc_call && ((int)rpc_call->private_data==PT_UDP) ){
guint32 port;
port=tvb_get_ntohl(tvb, offset);
if(port){
conversation_t *conv;
conv=find_conversation(&pinfo->src, &pinfo->dst, (port_type)rpc_call->private_data, port, 0, NO_ADDR_B|NO_PORT_B);
if(!conv){
conv=conversation_new(&pinfo->src, &pinfo->dst, (port_type)rpc_call->private_data, port, 0, NO_ADDR_B|NO_PORT_B);
}
conversation_set_dissector(conv, rpc_handle);
}
}
}

offset = dissect_rpc_uint32(tvb, tree, hf_portmap_port,
offset);
return offset;
Expand Down Expand Up @@ -530,4 +563,6 @@ proto_reg_handoff_portmap(void)
rpc_init_proc_table(PORTMAP_PROGRAM, 2, portmap2_proc);
rpc_init_proc_table(PORTMAP_PROGRAM, 3, portmap3_proc);
rpc_init_proc_table(PORTMAP_PROGRAM, 4, portmap4_proc);
rpc_handle = find_dissector("rpc");
rpc_tcp_handle = find_dissector("rpc-tcp");
}
58 changes: 35 additions & 23 deletions packet-rpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Routines for rpc dissection
* Copyright 1999, Uwe Girlich <Uwe.Girlich@philosys.de>
*
* $Id: packet-rpc.c,v 1.90 2002/04/03 13:24:12 girlich Exp $
* $Id: packet-rpc.c,v 1.91 2002/05/09 12:10:05 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
Expand Down Expand Up @@ -1198,6 +1198,7 @@ dissect_rpc_indir_call(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
rpc_call->prog = prog;
rpc_call->vers = vers;
rpc_call->proc = proc;
rpc_call->private_data = NULL;

/*
* XXX - what about RPCSEC_GSS?
Expand Down Expand Up @@ -1767,6 +1768,7 @@ dissect_rpc_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
rpc_call->prog = prog;
rpc_call->vers = vers;
rpc_call->proc = proc;
rpc_call->private_data = NULL;
rpc_call->xid = xid;
rpc_call->flavor = flavor;
rpc_call->gss_proc = gss_proc;
Expand All @@ -1780,6 +1782,12 @@ dissect_rpc_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
rpc_call);
}

if(rpc_call && rpc_call->rep_num){
proto_tree_add_text(rpc_tree, tvb, 0, 0,
"The reply to this request is in frame %u",
rpc_call->rep_num);
}

offset += 16;

offset = dissect_rpc_cred(tvb, rpc_tree, offset);
Expand All @@ -1803,21 +1811,6 @@ dissect_rpc_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
gss_proc = rpc_call->gss_proc;
gss_svc = rpc_call->gss_svc;

/* Indicate the frame to which this is a reply. */
proto_tree_add_text(rpc_tree, tvb, 0, 0,
"This is a reply to a request in frame %u",
rpc_call->req_num);
ns.secs= pinfo->fd->abs_secs-rpc_call->req_time.secs;
ns.nsecs=pinfo->fd->abs_usecs*1000-rpc_call->req_time.nsecs;
if(ns.nsecs<0){
ns.nsecs+=1000000000;
ns.secs--;
}
proto_tree_add_time(rpc_tree, hf_rpc_time, tvb, offset, 0,
&ns);



if (rpc_call->proc_info != NULL) {
dissect_function = rpc_call->proc_info->dissect_reply;
if (rpc_call->proc_info->name != NULL) {
Expand Down Expand Up @@ -1873,6 +1866,29 @@ dissect_rpc_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
"Procedure: %s (%u)", procname, proc);
}

reply_state = tvb_get_ntohl(tvb,offset+0);
if (rpc_tree) {
proto_tree_add_uint(rpc_tree, hf_rpc_state_reply, tvb,
offset+0, 4, reply_state);
}
offset += 4;

/* Indicate the frame to which this is a reply. */
if(rpc_call && rpc_call->req_num){
proto_tree_add_text(rpc_tree, tvb, 0, 0,
"This is a reply to a request in frame %u",
rpc_call->req_num);
ns.secs= pinfo->fd->abs_secs-rpc_call->req_time.secs;
ns.nsecs=pinfo->fd->abs_usecs*1000-rpc_call->req_time.nsecs;
if(ns.nsecs<0){
ns.nsecs+=1000000000;
ns.secs--;
}
proto_tree_add_time(rpc_tree, hf_rpc_time, tvb, offset, 0,
&ns);
}


if (rpc_call->rep_num == 0) {
/* We have not yet seen a reply to that call, so
this must be the first reply; remember its
Expand All @@ -1897,13 +1913,6 @@ dissect_rpc_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
}

reply_state = tvb_get_ntohl(tvb,offset+0);
if (rpc_tree) {
proto_tree_add_uint(rpc_tree, hf_rpc_state_reply, tvb,
offset+0, 4, reply_state);
}
offset += 4;

if (reply_state == MSG_ACCEPTED) {
offset = dissect_rpc_verf(tvb, rpc_tree, offset, msg_type);
accept_state = tvb_get_ntohl(tvb,offset+0);
Expand Down Expand Up @@ -2914,6 +2923,9 @@ proto_register_rpc(void)
"Whether the RPC dissector should defragment multi-fragment RPC-over-TCP messages",
&rpc_defragment);

register_dissector("rpc", dissect_rpc, proto_rpc);
register_dissector("rpc-tcp", dissect_rpc_tcp, proto_rpc);

/*
* Init the hash tables. Dissectors for RPC protocols must
* have a "handoff registration" routine that registers the
Expand Down
3 changes: 2 additions & 1 deletion packet-rpc.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* packet-rpc.h
*
* $Id: packet-rpc.h,v 1.35 2002/04/03 13:24:13 girlich Exp $
* $Id: packet-rpc.h,v 1.36 2002/05/09 12:10:05 sahlberg Exp $
*
* (c) 1999 Uwe Girlich
*
Expand Down Expand Up @@ -93,6 +93,7 @@ typedef struct _rpc_call_info_value {
struct _rpc_proc_info_value* proc_info;
gboolean request; /* Is this a request or not ?*/
nstime_t req_time;
void *private_data;
} rpc_call_info_value;


Expand Down

0 comments on commit 9625720

Please sign in to comment.