Show the time between SR and failure or grant.

svn path=/trunk/; revision=31265
This commit is contained in:
Martin Mathieson 2009-12-14 16:04:14 +00:00
parent 5e3d697f0d
commit 52163da600
1 changed files with 43 additions and 6 deletions

View File

@ -148,6 +148,8 @@ static int hf_mac_lte_failure_answering_sr = -1;
static int hf_mac_lte_sr_leading_to_failure = -1; static int hf_mac_lte_sr_leading_to_failure = -1;
static int hf_mac_lte_sr_leading_to_grant = -1; static int hf_mac_lte_sr_leading_to_grant = -1;
static int hf_mac_lte_sr_invalid_event = -1; static int hf_mac_lte_sr_invalid_event = -1;
static int hf_mac_lte_sr_time_since_request = -1;
static int hf_mac_lte_sr_time_until_answer = -1;
/* Subtrees. */ /* Subtrees. */
@ -629,6 +631,7 @@ typedef struct SRState {
SRStatus status; SRStatus status;
guint32 lastSRFramenum; guint32 lastSRFramenum;
guint32 lastGrantFramenum; guint32 lastGrantFramenum;
nstime_t requestTime;
} SRState; } SRState;
@ -646,11 +649,10 @@ typedef enum SRResultType {
} SRResultType; } SRResultType;
/* TODO: add another result type to capture illegal state/event pairs,
which could be displayed as expert info errors */
typedef struct SRResult { typedef struct SRResult {
SRResultType type; SRResultType type;
guint32 frameNum; guint32 frameNum;
guint32 timeDifference;
/* These 2 are only used with InvalidSREvent */ /* These 2 are only used with InvalidSREvent */
SRStatus status; SRStatus status;
@ -1392,10 +1394,7 @@ static SRResult *GetSRResult(guint32 frameNum, gboolean can_create)
/* Keep track of SR requests, failures and related grants, in order to show them /* Keep track of SR requests, failures and related grants, in order to show them
as generated fields in these frames. as generated fields in these frames */
TODO:
- also record times of previous frames so can show time differences
- on second pass, set up result info for SR frames themselves */
static void TrackSRInfo(SREvent event, packet_info *pinfo, proto_tree *tree, static void TrackSRInfo(SREvent event, packet_info *pinfo, proto_tree *tree,
tvbuff_t *tvb, guint16 rnti, proto_item *event_ti) tvbuff_t *tvb, guint16 rnti, proto_item *event_ti)
{ {
@ -1414,6 +1413,12 @@ static void TrackSRInfo(SREvent event, packet_info *pinfo, proto_tree *tree,
/* First time through - update state with new info */ /* First time through - update state with new info */
if (!pinfo->fd->flags.visited) { if (!pinfo->fd->flags.visited) {
guint32 timeSinceRequest;
/* Store time of request */
if (event == SR_Request) {
state->requestTime = pinfo->fd->abs_ts;
}
switch (state->status) { switch (state->status) {
case None: case None:
@ -1444,6 +1449,9 @@ static void TrackSRInfo(SREvent event, packet_info *pinfo, proto_tree *tree,
break; break;
case SR_Outstanding: case SR_Outstanding:
timeSinceRequest = ((pinfo->fd->abs_ts.secs - state->requestTime.secs) * 1000) +
((pinfo->fd->abs_ts.nsecs - state->requestTime.nsecs) / 1000000);
switch (event) { switch (event) {
case SR_Grant: case SR_Grant:
/* Got grant we were waiting for, so state goes to None */ /* Got grant we were waiting for, so state goes to None */
@ -1455,11 +1463,13 @@ static void TrackSRInfo(SREvent event, packet_info *pinfo, proto_tree *tree,
result = GetSRResult(pinfo->fd->num, TRUE); result = GetSRResult(pinfo->fd->num, TRUE);
result->type = GrantAnsweringSR; result->type = GrantAnsweringSR;
result->frameNum = state->lastSRFramenum; result->frameNum = state->lastSRFramenum;
result->timeDifference = timeSinceRequest;
/* Also set forward link for SR */ /* Also set forward link for SR */
resultForSRFrame = GetSRResult(state->lastSRFramenum, TRUE); resultForSRFrame = GetSRResult(state->lastSRFramenum, TRUE);
resultForSRFrame->type = SRLeadingToGrant; resultForSRFrame->type = SRLeadingToGrant;
resultForSRFrame->frameNum = pinfo->fd->num; resultForSRFrame->frameNum = pinfo->fd->num;
resultForSRFrame->timeDifference = timeSinceRequest;
break; break;
case SR_Request: case SR_Request:
@ -1480,11 +1490,13 @@ static void TrackSRInfo(SREvent event, packet_info *pinfo, proto_tree *tree,
result = GetSRResult(pinfo->fd->num, TRUE); result = GetSRResult(pinfo->fd->num, TRUE);
result->type = FailureAnsweringSR; result->type = FailureAnsweringSR;
result->frameNum = state->lastSRFramenum; result->frameNum = state->lastSRFramenum;
result->timeDifference = timeSinceRequest;
/* Also set forward link for SR */ /* Also set forward link for SR */
resultForSRFrame = GetSRResult(state->lastSRFramenum, TRUE); resultForSRFrame = GetSRResult(state->lastSRFramenum, TRUE);
resultForSRFrame->type = SRLeadingToFailure; resultForSRFrame->type = SRLeadingToFailure;
resultForSRFrame->frameNum = pinfo->fd->num; resultForSRFrame->frameNum = pinfo->fd->num;
resultForSRFrame->timeDifference = timeSinceRequest;
break; break;
} }
break; break;
@ -1538,21 +1550,34 @@ static void TrackSRInfo(SREvent event, packet_info *pinfo, proto_tree *tree,
ti = proto_tree_add_uint(tree, hf_mac_lte_grant_answering_sr, ti = proto_tree_add_uint(tree, hf_mac_lte_grant_answering_sr,
tvb, 0, 0, result->frameNum); tvb, 0, 0, result->frameNum);
PROTO_ITEM_SET_GENERATED(ti); PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_since_request,
tvb, 0, 0, result->timeDifference);
PROTO_ITEM_SET_GENERATED(ti);
break; break;
case FailureAnsweringSR: case FailureAnsweringSR:
ti = proto_tree_add_uint(tree, hf_mac_lte_failure_answering_sr, ti = proto_tree_add_uint(tree, hf_mac_lte_failure_answering_sr,
tvb, 0, 0, result->frameNum); tvb, 0, 0, result->frameNum);
PROTO_ITEM_SET_GENERATED(ti); PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_since_request,
tvb, 0, 0, result->timeDifference);
PROTO_ITEM_SET_GENERATED(ti);
break; break;
case SRLeadingToGrant: case SRLeadingToGrant:
ti = proto_tree_add_uint(tree, hf_mac_lte_sr_leading_to_grant, ti = proto_tree_add_uint(tree, hf_mac_lte_sr_leading_to_grant,
tvb, 0, 0, result->frameNum); tvb, 0, 0, result->frameNum);
PROTO_ITEM_SET_GENERATED(ti); PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_until_answer,
tvb, 0, 0, result->timeDifference);
PROTO_ITEM_SET_GENERATED(ti);
break; break;
case SRLeadingToFailure: case SRLeadingToFailure:
ti = proto_tree_add_uint(tree, hf_mac_lte_sr_leading_to_failure, ti = proto_tree_add_uint(tree, hf_mac_lte_sr_leading_to_failure,
tvb, 0, 0, result->frameNum); tvb, 0, 0, result->frameNum);
PROTO_ITEM_SET_GENERATED(ti); PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_until_answer,
tvb, 0, 0, result->timeDifference);
PROTO_ITEM_SET_GENERATED(ti);
break; break;
case InvalidSREvent: case InvalidSREvent:
ti = proto_tree_add_item(tree, hf_mac_lte_sr_invalid_event, ti = proto_tree_add_item(tree, hf_mac_lte_sr_invalid_event,
@ -3186,6 +3211,18 @@ void proto_register_mac_lte(void)
NULL, HFILL NULL, HFILL
} }
}, },
{ &hf_mac_lte_sr_time_since_request,
{ "Time since SR (ms)",
"mac-lte.ulsch.time-since-sr", FT_UINT32, BASE_DEC, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_sr_time_until_answer,
{ "Time until answer (ms)",
"mac-lte.ulsch.time-until-sr-answer", FT_UINT32, BASE_DEC, 0, 0x0,
NULL, HFILL
}
},
}; };