summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2013-04-05 21:49:51 +0200
committerBjørn Mork <bjorn@mork.no>2013-04-05 21:49:51 +0200
commit968c6d2028cbdd1b4f78a8cfc4b8234a56c607aa (patch)
tree1bef6f7896d27ef83ab9902db24a5edeae939168
parent2aaa064fa2590eef1b259d333088731b5bf6a5d2 (diff)
fragmentation support
Signed-off-by: Bjørn Mork <bjorn@mork.no>
-rwxr-xr-xscripts/mbim.pl25
1 files changed, 25 insertions, 0 deletions
diff --git a/scripts/mbim.pl b/scripts/mbim.pl
index efd45cf..9aaf227 100755
--- a/scripts/mbim.pl
+++ b/scripts/mbim.pl
@@ -1345,6 +1345,7 @@ my %decoder = (
"MSFWID" => \&decode_msfwid,
);
+my %frag;
sub decode_mbim {
my $msg = shift;
@@ -1369,6 +1370,18 @@ sub decode_mbim {
printf " TotalFragments:\t0x%08x\n", $total;
printf " CurrentFragment:\t0x%08x\n", $current;
+ # cache fragments for later?
+ if ($total > 1) {
+ my $key = sprintf "%08x-%d", $type, $tid;
+ if ($current == 0) {
+ $frag{$key} = $msg;
+ } else {
+ $frag{$key} .= substr($msg, 20);
+ }
+ return if ($current < $total - 1);
+ $msg = delete $frag{$key};
+ }
+
my $uuid = uuid_to_string(substr($msg, 20, 16));
my $service = &uuid_to_service($uuid);
print "$service ($uuid)\n";
@@ -1397,6 +1410,18 @@ sub decode_mbim {
print " TotalFragments:\t$total\n";
print " CurrentFragment:\t$current\n";
+ # cache fragments for later?
+ if ($total > 1) {
+ my $key = sprintf "%08x-%d", $type, $tid;
+ if ($current == 0) {
+ $frag{$key} = $msg;
+ } else {
+ $frag{$key} .= substr($msg, 20);
+ }
+ return if ($current < $total - 1);
+ $msg = delete $frag{$key};
+ }
+
my $uuid = uuid_to_string(substr($msg, 20, 16));
my $service = &uuid_to_service($uuid);
print "$service ($uuid)\n";