aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2005-01-20 12:29:11 +0000
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2005-01-20 12:29:11 +0000
commit85c7eb84fd6e61e2e167dae31c74b91ca337458e (patch)
treec06d47144192d8d8f6294f1dac065ed27830c15d /epan/dissectors
parent5978eebab002176fe501b39946ba6674a93d796d (diff)
make TCP SACK option handle relative sequence numbers
svn path=/trunk/; revision=13140
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-tcp.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c
index 0ef1249eb2..c8072bcbd4 100644
--- a/epan/dissectors/packet-tcp.c
+++ b/epan/dissectors/packet-tcp.c
@@ -2251,7 +2251,27 @@ dissect_tcpopt_sack(const ip_tcp_opt *optp, tvbuff_t *tvb,
{
proto_tree *field_tree = NULL;
proto_item *tf;
- guint leftedge, rightedge;
+ guint32 leftedge, rightedge;
+ struct tcp_analysis *tcpd=NULL;
+ int direction;
+ guint32 base_ack=0;
+
+ if(tcp_relative_seq){
+ /* find(or create if needed) the conversation for this tcp session */
+ tcpd=get_tcp_conversation_data(pinfo);
+
+ /* check direction and get ua lists */
+ direction=CMP_ADDRESS(&pinfo->src, &pinfo->dst);
+ /* if the addresses are equal, match the ports instead */
+ if(direction==0) {
+ direction= (pinfo->srcport > pinfo->destport)*2-1;
+ }
+ if(direction>=0){
+ base_ack=tcpd->base_seq2;
+ } else {
+ base_ack=tcpd->base_seq1;
+ }
+ }
tf = proto_tree_add_text(opt_tree, tvb, offset, optlen, "%s:", optp->name);
offset += 2; /* skip past type and length */
@@ -2269,9 +2289,16 @@ dissect_tcpopt_sack(const ip_tcp_opt *optp, tvbuff_t *tvb,
break;
}
leftedge = tvb_get_ntohl(tvb, offset);
- proto_tree_add_uint_format(field_tree, hf_tcp_option_sack_sle, tvb,
+ if(tcp_relative_seq){
+ proto_tree_add_uint_format(field_tree, hf_tcp_option_sack_sle, tvb,
+ offset, 4, leftedge-base_ack,
+ "left edge = %u (relative)", leftedge-base_ack);
+ } else {
+ proto_tree_add_uint_format(field_tree, hf_tcp_option_sack_sle, tvb,
offset, 4, leftedge,
"left edge = %u", leftedge);
+ }
+
optlen -= 4;
if (optlen < 4) {
proto_tree_add_text(field_tree, tvb, offset, optlen,
@@ -2281,11 +2308,17 @@ dissect_tcpopt_sack(const ip_tcp_opt *optp, tvbuff_t *tvb,
/* XXX - check whether it goes past end of packet */
rightedge = tvb_get_ntohl(tvb, offset + 4);
optlen -= 4;
- proto_tree_add_uint_format(field_tree, hf_tcp_option_sack_sre, tvb,
+ if(tcp_relative_seq){
+ proto_tree_add_uint_format(field_tree, hf_tcp_option_sack_sre, tvb,
+ offset+4, 4, rightedge-base_ack,
+ "right edge = %u (relative)", rightedge-base_ack);
+ } else {
+ proto_tree_add_uint_format(field_tree, hf_tcp_option_sack_sre, tvb,
offset+4, 4, rightedge,
"right edge = %u", rightedge);
- tcp_info_append_uint(pinfo, "SLE", leftedge);
- tcp_info_append_uint(pinfo, "SRE", rightedge);
+ }
+ tcp_info_append_uint(pinfo, "SLE", leftedge-base_ack);
+ tcp_info_append_uint(pinfo, "SRE", rightedge-base_ack);
offset += 8;
}
}