aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKévin Redon <kredon@sysmocom.de>2018-07-10 16:04:00 +0200
committerKévin Redon <kredon@sysmocom.de>2018-07-11 22:24:40 +0200
commit31ed8029b79ec789c2bedc0efdfecb06aa7a023f (patch)
tree07183ef3b29c5086b464d479899592a5956ab4ff
parent3b7624c120ce395f9020d2d965e170c88b81478b (diff)
host sniff: add functions to print flags
-rw-r--r--host/simtrace2-sniff.c90
1 files changed, 61 insertions, 29 deletions
diff --git a/host/simtrace2-sniff.c b/host/simtrace2-sniff.c
index d5fe48a..efb986f 100644
--- a/host/simtrace2-sniff.c
+++ b/host/simtrace2-sniff.c
@@ -94,6 +94,61 @@ static int gsmtap_send_sim(const uint8_t *apdu, unsigned int len)
return 0;
}
+const struct value_string change_flags[] = {
+ {
+ .value = SNIFF_CHANGE_FLAG_CARD_INSERT,
+ .str = "card inserted",
+ },
+ {
+ .value = SNIFF_CHANGE_FLAG_CARD_EJECT,
+ .str = "card ejected",
+ },
+ {
+ .value = SNIFF_CHANGE_FLAG_RESET_HOLD,
+ .str = "reset hold",
+ },
+ {
+ .value = SNIFF_CHANGE_FLAG_RESET_RELEASE,
+ .str = "reset release",
+ },
+ {
+ .value = SNIFF_CHANGE_FLAG_TIMEOUT_WT,
+ .str = "data transfer timeout",
+ },
+ {
+ .value = 0,
+ .str = NULL,
+ },
+};
+
+const struct value_string data_flags[] = {
+ {
+ .value = SNIFF_DATA_FLAG_ERROR_INCOMPLETE,
+ .str = "incomplete",
+ },
+ {
+ .value = SNIFF_DATA_FLAG_ERROR_MALFORMED,
+ .str = "malformed",
+ },
+ {
+ .value = 0,
+ .str = NULL,
+ },
+};
+
+static void print_flags(const struct value_string* flag_meanings, uint32_t nb_flags, uint32_t flags) {
+ uint32_t i;
+ for (i = 0; i < nb_flags; i++) {
+ if (flags & flag_meanings[i].value) {
+ printf(flag_meanings[i].str);
+ flags &= ~flag_meanings[i].value;
+ if (flags) {
+ printf(", ");
+ }
+ }
+ }
+}
+
static int process_change(const uint8_t *buf, int len)
{
/* check if there is enough data for the structure */
@@ -103,22 +158,12 @@ static int process_change(const uint8_t *buf, int len)
struct sniff_change *change = (struct sniff_change *)buf;
printf("Card state change: ");
- if (change->flags&SNIFF_CHANGE_FLAG_CARD_INSERT) {
- printf("card inserted ");
- }
- if (change->flags&SNIFF_CHANGE_FLAG_CARD_EJECT) {
- printf("card ejected ");
- }
- if (change->flags&SNIFF_CHANGE_FLAG_RESET_HOLD) {
- printf("reset hold ");
- }
- if (change->flags&SNIFF_CHANGE_FLAG_RESET_RELEASE) {
- printf("reset release ");
- }
- if (change->flags&SNIFF_CHANGE_FLAG_TIMEOUT_WT) {
- printf("data transfer timeout ");
+ if (change->flags) {
+ print_flags(change_flags, ARRAY_SIZE(change_flags), change->flags);
+ printf("\n");
+ } else {
+ printf("no changes\n");
}
- printf("\n");
return 0;
}
@@ -176,20 +221,7 @@ static int process_data(enum simtrace_msg_type_sniff type, const uint8_t *buf, i
}
if (data->flags) {
printf(" (");
- if (data->flags & SNIFF_DATA_FLAG_ERROR_INCOMPLETE) {
- printf("incomplete");
- data->flags &= ~SNIFF_DATA_FLAG_ERROR_INCOMPLETE;
- if (data->flags) {
- printf(", ");
- }
- }
- if (data->flags & SNIFF_DATA_FLAG_ERROR_MALFORMED) {
- printf("malformed");
- data->flags &= ~SNIFF_DATA_FLAG_ERROR_MALFORMED;
- if (data->flags) {
- printf(", ");
- }
- }
+ print_flags(data_flags, ARRAY_SIZE(data_flags), data->flags);
printf(")");
}
printf(": ");