aboutsummaryrefslogtreecommitdiffstats
path: root/ui/cli/tap-iousers.c
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2014-07-26 12:41:27 -0400
committerMichael Mann <mmann78@netscape.net>2014-07-30 16:12:54 +0000
commitdcf6d44b7f5e69e08be8ccd452b87733326053cc (patch)
tree8d68df38e6b5ed2c6caa5f2ccd6c1425eea95d90 /ui/cli/tap-iousers.c
parent54777bf31566e0e72e9204fd0d60bfbe8521d6c3 (diff)
Apply refactored "conversation" (tap) data to TShark.
I intentionally left the fields displayed alone (so they don't exactly match Wireshark GUI), because as Guy points out in bug 6310, not sure its A Bug or A Feature. But at least all types of conversations allowed are in sync with Wireshark GUI. Bug:6310 Change-Id: I722837df510a39dadc1f9a07a99275509516698c Reviewed-on: https://code.wireshark.org/review/3212 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'ui/cli/tap-iousers.c')
-rw-r--r--ui/cli/tap-iousers.c525
1 files changed, 45 insertions, 480 deletions
diff --git a/ui/cli/tap-iousers.c b/ui/cli/tap-iousers.c
index d82fbb78b5..2156839fda 100644
--- a/ui/cli/tap-iousers.c
+++ b/ui/cli/tap-iousers.c
@@ -23,349 +23,32 @@
#include "config.h"
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <epan/packet_info.h>
#include <epan/packet.h>
-#include <epan/addr_resolv.h>
#include <epan/tap.h>
#include <epan/timestamp.h>
-#include <epan/conv_id.h>
-#include <epan/conversation.h>
#include <epan/stat_cmd_args.h>
-#include <epan/dissectors/packet-ip.h>
-#include <epan/dissectors/packet-ipv6.h>
-#include <epan/dissectors/packet-ipx.h>
-#include <epan/dissectors/packet-tcp.h>
-#include <epan/dissectors/packet-udp.h>
-#include <epan/dissectors/packet-eth.h>
-#include <epan/dissectors/packet-sctp.h>
-#include <epan/dissectors/packet-tr.h>
-#include <epan/dissectors/packet-scsi.h>
-#include <epan/dissectors/packet-fc.h>
-#include <epan/dissectors/packet-fddi.h>
-
-void register_tap_listener_iousers(void);
+#include <ui/conversation_ui.h>
+#include <epan/conversation_table.h>
typedef struct _io_users_t {
const char *type;
- char *filter;
- struct _io_users_item_t *items;
+ const char *filter;
+ conv_hash_t hash;
} io_users_t;
-typedef struct _io_users_item_t {
- struct _io_users_item_t *next;
- char *name1;
- char *name2;
- conv_id_t conv_id;
- address addr1;
- address addr2;
- guint32 frames1;
- guint32 frames2;
- guint64 bytes1;
- guint64 bytes2;
- nstime_t start_rel_time;
- nstime_t stop_rel_time;
- nstime_t start_abs_time;
-} io_users_item_t;
-
-#define iousers_process_name_packet(iu, name1, name2, direction, pkt_len, rel_ts, abs_ts) \
- iousers_process_name_packet_with_conv_id(iu, name1, name2, CONV_ID_UNSET, direction, pkt_len, rel_ts, abs_ts)
-
-static void
-iousers_process_name_packet_with_conv_id(
- io_users_t *iu,
- char *name1,
- char *name2,
- conv_id_t conv_id,
- int direction,
- guint64 pkt_len,
- nstime_t *rel_ts,
- nstime_t *abs_ts)
-{
- io_users_item_t *iui;
-
- for(iui=iu->items;iui;iui=iui->next){
- if((iui->conv_id==conv_id)
- && (!strcmp(iui->name1, name1))
- && (!strcmp(iui->name2, name2)) ){
- break;
- }
- }
-
- if(!iui){
- iui=g_new(io_users_item_t,1);
- iui->next=iu->items;
- iu->items=iui;
- iui->name1=g_strdup(name1);
- iui->name2=g_strdup(name2);
- iui->conv_id=conv_id;
- iui->frames1=0;
- iui->frames2=0;
- iui->bytes1=0;
- iui->bytes2=0;
- memcpy(&iui->start_rel_time, rel_ts, sizeof(iui->start_rel_time));
- memcpy(&iui->stop_rel_time, rel_ts, sizeof(iui->stop_rel_time));
- memcpy(&iui->start_abs_time, abs_ts, sizeof(iui->start_abs_time));
- }
- else {
- if (nstime_cmp(rel_ts, &iui->stop_rel_time) > 0) {
- memcpy(&iui->stop_rel_time, rel_ts, sizeof(iui->stop_rel_time));
- } else if (nstime_cmp(rel_ts, &iui->start_rel_time) < 0) {
- memcpy(&iui->start_rel_time, rel_ts, sizeof(iui->start_rel_time));
- memcpy(&iui->start_abs_time, abs_ts, sizeof(iui->start_abs_time));
- }
- }
-
- if(direction){
- iui->frames1++;
- iui->bytes1+=pkt_len;
- } else {
- iui->frames2++;
- iui->bytes2+=pkt_len;
- }
-}
-
-static void
-iousers_process_address_packet(io_users_t *iu, const address *src, const address *dst, guint64 pkt_len,
- nstime_t *ts)
-{
- const address *addr1, *addr2;
- io_users_item_t *iui;
-
- if(CMP_ADDRESS(src, dst)>0){
- addr1=src;
- addr2=dst;
- } else {
- addr2=src;
- addr1=dst;
- }
-
- for(iui=iu->items;iui;iui=iui->next){
- if((!CMP_ADDRESS(&iui->addr1, addr1))
- &&(!CMP_ADDRESS(&iui->addr2, addr2)) ){
- break;
- }
- }
-
- if(!iui){
- iui=g_new(io_users_item_t,1);
- iui->next=iu->items;
- iu->items=iui;
- COPY_ADDRESS(&iui->addr1, addr1);
- iui->name1=g_strdup(ep_address_to_str(addr1));
- COPY_ADDRESS(&iui->addr2, addr2);
- iui->name2=g_strdup(ep_address_to_str(addr2));
- iui->frames1=0;
- iui->frames2=0;
- iui->bytes1=0;
- iui->bytes2=0;
- memcpy(&iui->start_rel_time, ts, sizeof(iui->start_rel_time));
- memcpy(&iui->stop_rel_time, ts, sizeof(iui->stop_rel_time));
- }
- else {
- if (nstime_cmp(ts, &iui->stop_rel_time) > 0) {
- memcpy(&iui->stop_rel_time, ts, sizeof(iui->stop_rel_time));
- } else if (nstime_cmp(ts, &iui->start_rel_time) < 0) {
- memcpy(&iui->start_rel_time, ts, sizeof(iui->start_rel_time));
- }
- }
-
- if(!CMP_ADDRESS(dst, &iui->addr1)){
- iui->frames1++;
- iui->bytes1+=pkt_len;
- } else {
- iui->frames2++;
- iui->bytes2+=pkt_len;
- }
-}
-
-static int
-iousers_udpip_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vudph)
-{
- io_users_t *iu=(io_users_t *)arg;
- const e_udphdr *udph=(const e_udphdr *)vudph;
- char name1[256],name2[256];
- int direction=0;
-
- if(udph->uh_sport>udph->uh_dport){
- direction=0;
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&udph->ip_src),ep_udp_port_to_display(udph->uh_sport));
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&udph->ip_dst),ep_udp_port_to_display(udph->uh_dport));
- } else if(udph->uh_sport<udph->uh_dport){
- direction=1;
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&udph->ip_src),ep_udp_port_to_display(udph->uh_sport));
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&udph->ip_dst),ep_udp_port_to_display(udph->uh_dport));
- } else if(CMP_ADDRESS(&udph->ip_src, &udph->ip_dst)>0){
- direction=0;
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&udph->ip_src),ep_udp_port_to_display(udph->uh_sport));
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&udph->ip_dst),ep_udp_port_to_display(udph->uh_dport));
- } else {
- direction=1;
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&udph->ip_src),ep_udp_port_to_display(udph->uh_sport));
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&udph->ip_dst),ep_udp_port_to_display(udph->uh_dport));
- }
-
- iousers_process_name_packet(iu, name1, name2, direction, pinfo->fd->pkt_len, &pinfo->rel_ts, &pinfo->fd->abs_ts);
-
- return 1;
-}
-
-
-static int
-iousers_sctp_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vsctp)
-{
- io_users_t *iu=(io_users_t *)arg;
- const struct _sctp_info* sctph = (const struct _sctp_info*)vsctp;
- char name1[256],name2[256], s_sport[10], s_dport[10];
- int direction=0;
-
- g_snprintf(s_sport, sizeof s_sport, "%d",sctph->sport);
- g_snprintf(s_dport, sizeof s_dport, "%d",sctph->dport);
-
- if(sctph->sport > sctph->dport) {
- direction=0;
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&sctph->ip_src),s_sport);
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&sctph->ip_dst),s_dport);
- } else if(sctph->sport < sctph->dport) {
- direction=1;
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&sctph->ip_src),s_sport);
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&sctph->ip_dst),s_dport);
- } else {
- direction=0;
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&sctph->ip_src),s_sport);
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&sctph->ip_dst),s_dport);
- }
-
- iousers_process_name_packet(iu, name1, name2, direction, pinfo->fd->pkt_len, &pinfo->rel_ts, &pinfo->fd->abs_ts);
-
- return 1;
-}
-
-
-static int
-iousers_tcpip_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vtcph)
-{
- io_users_t *iu=(io_users_t *)arg;
- const struct tcpheader *tcph=(const struct tcpheader *)vtcph;
- char name1[256],name2[256];
- int direction=0;
-
- if(tcph->th_sport>tcph->th_dport){
- direction=0;
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&tcph->ip_src),ep_tcp_port_to_display(tcph->th_sport));
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&tcph->ip_dst),ep_tcp_port_to_display(tcph->th_dport));
- } else if(tcph->th_sport<tcph->th_dport){
- direction=1;
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&tcph->ip_src),ep_tcp_port_to_display(tcph->th_sport));
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&tcph->ip_dst),ep_tcp_port_to_display(tcph->th_dport));
- } else if(CMP_ADDRESS(&tcph->ip_src, &tcph->ip_dst)>0){
- direction=0;
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&tcph->ip_src),ep_tcp_port_to_display(tcph->th_sport));
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&tcph->ip_dst),ep_tcp_port_to_display(tcph->th_dport));
- } else {
- direction=1;
- g_snprintf(name2,256,"%s:%s",ep_address_to_str(&tcph->ip_src),ep_tcp_port_to_display(tcph->th_sport));
- g_snprintf(name1,256,"%s:%s",ep_address_to_str(&tcph->ip_dst),ep_tcp_port_to_display(tcph->th_dport));
- }
-
- iousers_process_name_packet_with_conv_id(iu, name1, name2, tcph->th_stream, direction, pinfo->fd->pkt_len, &pinfo->rel_ts, &pinfo->fd->abs_ts);
-
- return 1;
-}
-
-
-static int
-iousers_ip_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vip)
-{
- io_users_t *iu=(io_users_t *)arg;
- const ws_ip *iph=(const ws_ip *)vip;
-
- iousers_process_address_packet(iu, &iph->ip_src, &iph->ip_dst, pinfo->fd->pkt_len, &pinfo->rel_ts);
-
- return 1;
-}
-
-static int
-iousers_ipv6_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vip)
-{
- io_users_t *iu=(io_users_t *)arg;
- const struct ip6_hdr *ip6h=(const struct ip6_hdr *)vip;
- address src, dst;
-
- /* Addresses aren't implemented as 'address' type in struct ip6_hdr */
- src.type = dst.type = AT_IPv6;
- src.len = dst.len = sizeof(struct e_in6_addr);
- src.data = &ip6h->ip6_src;
- dst.data = &ip6h->ip6_dst;
-
- iousers_process_address_packet(iu, &src, &dst, pinfo->fd->pkt_len, &pinfo->rel_ts);
-
- return 1;
-}
-
-static int
-iousers_ipx_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vipx)
-{
- io_users_t *iu=(io_users_t *)arg;
- const ipxhdr_t *ipxh=(const ipxhdr_t *)vipx;
-
- iousers_process_address_packet(iu, &ipxh->ipx_src, &ipxh->ipx_dst, pinfo->fd->pkt_len, &pinfo->rel_ts);
-
- return 1;
-}
-
-static int
-iousers_fc_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vfc)
-{
- io_users_t *iu=(io_users_t *)arg;
- const fc_hdr *fchdr=(const fc_hdr *)vfc;
-
- iousers_process_address_packet(iu, &fchdr->s_id, &fchdr->d_id, pinfo->fd->pkt_len, &pinfo->rel_ts);
-
- return 1;
-}
-
-static int
-iousers_eth_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *veth)
-{
- io_users_t *iu=(io_users_t *)arg;
- const eth_hdr *ehdr=(const eth_hdr *)veth;
-
- iousers_process_address_packet(iu, &ehdr->src, &ehdr->dst, pinfo->fd->pkt_len, &pinfo->rel_ts);
-
- return 1;
-}
-
-static int
-iousers_fddi_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *veth)
-{
- io_users_t *iu=(io_users_t *)arg;
- const fddi_hdr *ehdr=(const fddi_hdr *)veth;
-
- iousers_process_address_packet(iu, &ehdr->src, &ehdr->dst, pinfo->fd->pkt_len, &pinfo->rel_ts);
-
- return 1;
-}
-
-static int
-iousers_tr_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vtr)
-{
- io_users_t *iu=(io_users_t *)arg;
- const tr_hdr *trhdr=(const tr_hdr *)vtr;
-
- iousers_process_address_packet(iu, &trhdr->src, &trhdr->dst, pinfo->fd->pkt_len, &pinfo->rel_ts);
-
- return 1;
-}
-
static void
iousers_draw(void *arg)
{
- io_users_t *iu = (io_users_t *)arg;
- io_users_item_t *iui;
- guint32 last_frames, max_frames;
+ conv_hash_t *hash = (conv_hash_t*)arg;
+ io_users_t *iu = (io_users_t *)hash->user_data;
+ conv_item_t *iui;
+ guint64 last_frames, max_frames;
struct tm * tm_time;
+ guint i;
printf("================================================================================\n");
printf("%s Conversations\n",iu->type);
@@ -392,29 +75,34 @@ iousers_draw(void *arg)
break;
}
- max_frames=0xffffffff;
+ max_frames=UINT_MAX;
do {
last_frames=0;
- for(iui=iu->items;iui;iui=iui->next){
- guint32 tot_frames;
- tot_frames=iui->frames1+iui->frames2;
+ for (i=0; (iu->hash.conv_array && i < iu->hash.conv_array->len); i++){
+ guint64 tot_frames;
+
+ iui = &g_array_index(iu->hash.conv_array, conv_item_t, i);
+ tot_frames = iui->rx_frames + iui->tx_frames;
- if((tot_frames>last_frames)
- &&(tot_frames<max_frames)){
+ if ((tot_frames>last_frames) && (tot_frames<max_frames)){
last_frames=tot_frames;
}
}
- for(iui=iu->items;iui;iui=iui->next){
- guint32 tot_frames;
- tot_frames=iui->frames1+iui->frames2;
- if(tot_frames==last_frames){
+ for (i=0; (iu->hash.conv_array && i < iu->hash.conv_array->len); i++){
+ guint64 tot_frames;
+
+ iui = &g_array_index(iu->hash.conv_array, conv_item_t, i);
+ tot_frames = iui->rx_frames + iui->tx_frames;
+
+ if (tot_frames == last_frames){
printf("%-20s <-> %-20s %6d %9" G_GINT64_MODIFIER "d %6d %9" G_GINT64_MODIFIER "d %6d %9" G_GINT64_MODIFIER "d ",
- iui->name1, iui->name2,
- iui->frames1, iui->bytes1,
- iui->frames2, iui->bytes2,
- iui->frames1+iui->frames2,
- iui->bytes1+iui->bytes2
+ /* XXX - TODO: make name resolution configurable (through gbl_resolv_flags?) */
+ get_conversation_address(&iui->src_address, TRUE), get_conversation_address(&iui->dst_address, TRUE),
+ iui->tx_frames, iui->tx_bytes,
+ iui->rx_frames, iui->rx_bytes,
+ iui->tx_frames+iui->rx_frames,
+ iui->tx_bytes+iui->rx_bytes
);
switch (timestamp_get_type()) {
@@ -424,7 +112,7 @@ iousers_draw(void *arg)
tm_time->tm_hour,
tm_time->tm_min,
tm_time->tm_sec,
- nstime_to_sec(&iui->stop_rel_time) - nstime_to_sec(&iui->start_rel_time));
+ nstime_to_sec(&iui->stop_time) - nstime_to_sec(&iui->start_time));
break;
case TS_ABSOLUTE_WITH_YMD:
tm_time = localtime(&iui->start_abs_time.secs);
@@ -435,7 +123,7 @@ iousers_draw(void *arg)
tm_time->tm_hour,
tm_time->tm_min,
tm_time->tm_sec,
- nstime_to_sec(&iui->stop_rel_time) - nstime_to_sec(&iui->start_rel_time));
+ nstime_to_sec(&iui->stop_time) - nstime_to_sec(&iui->start_time));
break;
case TS_ABSOLUTE_WITH_YDOY:
tm_time = localtime(&iui->start_abs_time.secs);
@@ -445,7 +133,7 @@ iousers_draw(void *arg)
tm_time->tm_hour,
tm_time->tm_min,
tm_time->tm_sec,
- nstime_to_sec(&iui->stop_rel_time) - nstime_to_sec(&iui->start_rel_time));
+ nstime_to_sec(&iui->stop_time) - nstime_to_sec(&iui->start_time));
break;
case TS_UTC:
tm_time = gmtime(&iui->start_abs_time.secs);
@@ -453,7 +141,7 @@ iousers_draw(void *arg)
tm_time->tm_hour,
tm_time->tm_min,
tm_time->tm_sec,
- nstime_to_sec(&iui->stop_rel_time) - nstime_to_sec(&iui->start_rel_time));
+ nstime_to_sec(&iui->stop_time) - nstime_to_sec(&iui->start_time));
break;
case TS_UTC_WITH_YMD:
tm_time = gmtime(&iui->start_abs_time.secs);
@@ -464,7 +152,7 @@ iousers_draw(void *arg)
tm_time->tm_hour,
tm_time->tm_min,
tm_time->tm_sec,
- nstime_to_sec(&iui->stop_rel_time) - nstime_to_sec(&iui->start_rel_time));
+ nstime_to_sec(&iui->stop_time) - nstime_to_sec(&iui->start_time));
break;
case TS_UTC_WITH_YDOY:
tm_time = gmtime(&iui->start_abs_time.secs);
@@ -474,14 +162,14 @@ iousers_draw(void *arg)
tm_time->tm_hour,
tm_time->tm_min,
tm_time->tm_sec,
- nstime_to_sec(&iui->stop_rel_time) - nstime_to_sec(&iui->start_rel_time));
+ nstime_to_sec(&iui->stop_time) - nstime_to_sec(&iui->start_time));
break;
case TS_RELATIVE:
case TS_NOT_SET:
default:
printf("%14.9f %12.4f\n",
- nstime_to_sec(&iui->start_rel_time),
- nstime_to_sec(&iui->stop_rel_time) - nstime_to_sec(&iui->start_rel_time)
+ nstime_to_sec(&iui->start_time),
+ nstime_to_sec(&iui->stop_time) - nstime_to_sec(&iui->start_time)
);
break;
}
@@ -492,135 +180,18 @@ iousers_draw(void *arg)
printf("================================================================================\n");
}
-static void
-iousers_init(const char *opt_arg, void* userdata _U_)
+void init_iousers(struct register_ct* ct, const char *filter)
{
- const char *filter=NULL;
- const char *tap_type, *tap_type_name;
- tap_packet_cb packet_func;
- io_users_t *iu=NULL;
+ io_users_t *iu;
GString *error_string;
- if(!strncmp(opt_arg,"conv,eth",8)){
- if(opt_arg[8]==','){
- filter=opt_arg+9;
- } else {
- filter=NULL;
- }
- tap_type="eth";
- tap_type_name="Ethernet";
- packet_func=iousers_eth_packet;
- } else if(!strncmp(opt_arg,"conv,fc",7)){
- if(opt_arg[7]==','){
- filter=opt_arg+8;
- } else {
- filter=NULL;
- }
- tap_type="fc";
- tap_type_name="Fibre Channel";
- packet_func=iousers_fc_packet;
- } else if(!strncmp(opt_arg,"conv,fddi",9)){
- if(opt_arg[9]==','){
- filter=opt_arg+10;
- } else {
- filter=NULL;
- }
- tap_type="fddi";
- tap_type_name="FDDI";
- packet_func=iousers_fddi_packet;
- } else if(!strncmp(opt_arg,"conv,tcp",8)){
- if(opt_arg[8]==','){
- filter=opt_arg+9;
- } else {
- filter=NULL;
- }
- tap_type="tcp";
- tap_type_name="TCP";
- packet_func=iousers_tcpip_packet;
- } else if(!strncmp(opt_arg,"conv,udp",8)){
- if(opt_arg[8]==','){
- filter=opt_arg+9;
- } else {
- filter=NULL;
- }
- tap_type="udp";
- tap_type_name="UDP";
- packet_func=iousers_udpip_packet;
- } else if(!strncmp(opt_arg,"conv,tr",7)){
- if(opt_arg[7]==','){
- filter=opt_arg+8;
- } else {
- filter=NULL;
- }
- tap_type="tr";
- tap_type_name="Token Ring";
- packet_func=iousers_tr_packet;
- } else if(!strncmp(opt_arg,"conv,ipx",8)){
- if(opt_arg[8]==','){
- filter=opt_arg+9;
- } else {
- filter=NULL;
- }
- tap_type="ipx";
- tap_type_name="IPX";
- packet_func=iousers_ipx_packet;
- } else if(!strncmp(opt_arg,"conv,ipv6",9)){
- if(opt_arg[9]==','){
- filter=opt_arg+10;
- } else {
- filter=NULL;
- }
- tap_type="ipv6";
- tap_type_name="IPv6";
- packet_func=iousers_ipv6_packet;
- } else if(!strncmp(opt_arg,"conv,ip",7)){
- if(opt_arg[7]==','){
- filter=opt_arg+8;
- } else {
- filter=NULL;
- }
- tap_type="ip";
- tap_type_name="IPv4";
- packet_func=iousers_ip_packet;
- } else if(!strncmp(opt_arg,"conv,sctp",9)) {
- if(opt_arg[9]==','){
- filter=opt_arg+10;
- } else {
- filter=NULL;
- }
- tap_type="sctp";
- tap_type_name="SCTP";
- packet_func=iousers_sctp_packet;
- } else {
- fprintf(stderr, "tshark: invalid \"-z conv,<type>[,<filter>]\" argument\n");
- fprintf(stderr," <type> must be one of\n");
- fprintf(stderr," \"eth\"\n");
- fprintf(stderr," \"fc\"\n");
- fprintf(stderr," \"fddi\"\n");
- fprintf(stderr," \"ip\"\n");
- fprintf(stderr," \"ipx\"\n");
- fprintf(stderr," \"sctp\"\n");
- fprintf(stderr," \"tcp\"\n");
- fprintf(stderr," \"tr\"\n");
- fprintf(stderr," \"udp\"\n");
- exit(1);
- }
-
-
- iu=g_new(io_users_t,1);
- iu->items=NULL;
- iu->type=tap_type_name;
- if(filter){
- iu->filter=g_strdup(filter);
- } else {
- iu->filter=NULL;
- }
+ iu = g_new0(io_users_t,1);
+ iu->type = proto_get_protocol_short_name(find_protocol_by_id(get_conversation_proto_id(ct)));
+ iu->filter = g_strdup(filter);
+ iu->hash.user_data = iu;
- error_string=register_tap_listener(tap_type, iu, filter, 0, NULL, packet_func, iousers_draw);
+ error_string=register_tap_listener(proto_get_protocol_filter_name(get_conversation_proto_id(ct)), &iu->hash, filter, 0, NULL, get_conversation_packet_func(ct), iousers_draw);
if(error_string){
- if(iu->items){
- g_free(iu->items);
- }
g_free(iu);
fprintf(stderr, "tshark: Couldn't register conversations tap: %s\n",
error_string->str);
@@ -629,9 +200,3 @@ iousers_init(const char *opt_arg, void* userdata _U_)
}
}
-
-void
-register_tap_listener_iousers(void)
-{
- register_stat_cmd_arg("conv,", iousers_init, NULL);
-}