When a TCP graph is summoned, work out how many unique TCP conversations
are present. However, still only create the graph for the first/only one. LTE MAC or RLC frames often contain multiple SDUs that are segments of the same TCP conversation - this avoids the need to find a frame with only one SDU. svn path=/trunk/; revision=41721
This commit is contained in:
parent
914a9df522
commit
611dcb0d68
|
@ -1832,16 +1832,36 @@ static void graph_segment_list_get (struct graph *g)
|
||||||
|
|
||||||
typedef struct _th_t {
|
typedef struct _th_t {
|
||||||
int num_hdrs;
|
int num_hdrs;
|
||||||
struct tcpheader *tcphdr;
|
#define MAX_SUPPORTED_TCP_HEADERS 8
|
||||||
|
struct tcpheader *tcphdrs[MAX_SUPPORTED_TCP_HEADERS];
|
||||||
} th_t;
|
} th_t;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
tap_tcpip_packet(void *pct, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *vip)
|
tap_tcpip_packet(void *pct, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *vip)
|
||||||
{
|
{
|
||||||
|
int n;
|
||||||
|
gboolean is_unique = TRUE;
|
||||||
th_t *th=pct;
|
th_t *th=pct;
|
||||||
|
struct tcpheader *header = (struct tcpheader *)vip;
|
||||||
|
|
||||||
th->num_hdrs++;
|
/* Check new header details against any/all stored ones */
|
||||||
th->tcphdr=(struct tcpheader *)vip;
|
for (n=0; n < th->num_hdrs; n++) {
|
||||||
|
struct tcpheader *stored = th->tcphdrs[n];
|
||||||
|
|
||||||
|
if (compare_headers(&stored->ip_src, &stored->ip_dst,
|
||||||
|
stored->th_sport, stored->th_dport,
|
||||||
|
&header->ip_src, &header->ip_dst,
|
||||||
|
header->th_sport, stored->th_dport,
|
||||||
|
COMPARE_CURR_DIR)) {
|
||||||
|
is_unique = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add address if unique and have space for it */
|
||||||
|
if (is_unique && (th->num_hdrs < MAX_SUPPORTED_TCP_HEADERS)) {
|
||||||
|
th->tcphdrs[th->num_hdrs++] = header;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1858,7 +1878,7 @@ static struct tcpheader *select_tcpip_session (capture_file *cf, struct segment
|
||||||
epan_dissect_t edt;
|
epan_dissect_t edt;
|
||||||
dfilter_t *sfcode;
|
dfilter_t *sfcode;
|
||||||
GString *error_string;
|
GString *error_string;
|
||||||
th_t th = {0, NULL};
|
th_t th = {0, {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
|
||||||
|
|
||||||
fdata = cf->current_frame;
|
fdata = cf->current_frame;
|
||||||
|
|
||||||
|
@ -1904,26 +1924,27 @@ static struct tcpheader *select_tcpip_session (capture_file *cf, struct segment
|
||||||
if(th.num_hdrs>1){
|
if(th.num_hdrs>1){
|
||||||
/* can only handle a single tcp layer yet */
|
/* can only handle a single tcp layer yet */
|
||||||
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
|
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
|
||||||
"The selected packet has more than one TCP"
|
"The selected packet has more than one TCP unique conversation "
|
||||||
"header in it.");
|
"in it.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For now, still always choose the first/only one */
|
||||||
hdrs->num = fdata->num;
|
hdrs->num = fdata->num;
|
||||||
hdrs->rel_secs = (guint32) fdata->rel_ts.secs;
|
hdrs->rel_secs = (guint32) fdata->rel_ts.secs;
|
||||||
hdrs->rel_usecs = fdata->rel_ts.nsecs/1000;
|
hdrs->rel_usecs = fdata->rel_ts.nsecs/1000;
|
||||||
hdrs->abs_secs = (guint32) fdata->abs_ts.secs;
|
hdrs->abs_secs = (guint32) fdata->abs_ts.secs;
|
||||||
hdrs->abs_usecs = fdata->abs_ts.nsecs/1000;
|
hdrs->abs_usecs = fdata->abs_ts.nsecs/1000;
|
||||||
hdrs->th_seq=th.tcphdr->th_seq;
|
hdrs->th_seq=th.tcphdrs[0]->th_seq;
|
||||||
hdrs->th_ack=th.tcphdr->th_ack;
|
hdrs->th_ack=th.tcphdrs[0]->th_ack;
|
||||||
hdrs->th_win=th.tcphdr->th_win;
|
hdrs->th_win=th.tcphdrs[0]->th_win;
|
||||||
hdrs->th_flags=th.tcphdr->th_flags;
|
hdrs->th_flags=th.tcphdrs[0]->th_flags;
|
||||||
hdrs->th_sport=th.tcphdr->th_sport;
|
hdrs->th_sport=th.tcphdrs[0]->th_sport;
|
||||||
hdrs->th_dport=th.tcphdr->th_dport;
|
hdrs->th_dport=th.tcphdrs[0]->th_dport;
|
||||||
hdrs->th_seglen=th.tcphdr->th_seglen;
|
hdrs->th_seglen=th.tcphdrs[0]->th_seglen;
|
||||||
COPY_ADDRESS(&hdrs->ip_src, &th.tcphdr->ip_src);
|
COPY_ADDRESS(&hdrs->ip_src, &th.tcphdrs[0]->ip_src);
|
||||||
COPY_ADDRESS(&hdrs->ip_dst, &th.tcphdr->ip_dst);
|
COPY_ADDRESS(&hdrs->ip_dst, &th.tcphdrs[0]->ip_dst);
|
||||||
return th.tcphdr;
|
return th.tcphdrs[0];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue