diff options
author | Bjørn Mork <bjorn@mork.no> | 2015-11-26 14:21:12 +0100 |
---|---|---|
committer | Bjørn Mork <bjorn@mork.no> | 2015-11-26 14:21:12 +0100 |
commit | d79c56ac212cfc9f2c8de9e335ccefccf5f0ed6b (patch) | |
tree | f19cc451010cdb446edf1d9b790ca927f7b52d80 | |
parent | 18593a058afa1cfe29325bab1d689c2b6a77ec40 (diff) |
qmi.pl: assorted changes - yes, this is descriptive :)
Signed-off-by: Bjørn Mork <bjorn@mork.no>
-rwxr-xr-x | scripts/qmi.pl | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/scripts/qmi.pl b/scripts/qmi.pl index 149b020..cde2671 100755 --- a/scripts/qmi.pl +++ b/scripts/qmi.pl @@ -11,6 +11,7 @@ use constant { QMI_NAS => 0x03, QMI_WMS => 0x05, QMI_PDS => 0x06, + QMI_UIM => 0x0B, QMI_LOC => 0x10, }; @@ -976,6 +977,7 @@ my %sysname = ( 3 => "QMI_NAS", 5 => "QMI_WMS", 6 => "QMI_PDS", + 0xB => "QMI_UIM", 0x10 => "QMI_LOC", ); @@ -1317,7 +1319,7 @@ sub pretty_print_qmi { my $txt; # special casing status - if ($k == 0x02) { + if ($k == 0x02 && $qmi->{ctrl} == 0x80) { $txt = ($v->[0] ? "FAILURE" : "SUCCESS") . " - " . $err{unpack("v", pack("C*", @$v[2..3]))}; } elsif ($qmi->{sys} == QMI_WDS) { $txt = QMI::WDS::tlv($qmi->{msgid}, $k, $v); @@ -1563,6 +1565,13 @@ sub mk_pds { return &mk_qmi(QMI_PDS, $cid, @_); } +# QMI User Identity Module Spec (QMI_UIM) +sub mk_uim { + my $cid = &get_cid(QMI_UIM); + return undef if (!$cid); + return &mk_qmi(QMI_UIM, $cid, @_); +} + my %srvc_status = ( 1 => "DISCONNECTED", 2 => "CONNECTED", @@ -1722,6 +1731,32 @@ sub dms_verify_pin { return $pinok{1}; # we only really care about PIN1 } +# alternate PIN verification for newer firmwares +sub uim_verify_pin { + my $pinnumber = shift; + + unless ($pin{$pinnumber}) { + warn "$netdev: No PIN$pinnumber configured\n" if $verbose; + return undef; + } + my $pin = $pin{$pinnumber}; + + my $req = &mk_uim(0x0026, # QMI_UIM_VERIFY_PIN + { 0x01 => pack("C*", 0, # Primary GW provisioning + 0), # no AID elements + 0x02 => pack("C*", $pinnumber, length($pin)) . $pin}); + + my $ret = &send_and_recv($req); + my $status = &verify_status($ret); + if ($status) { + warn "$netdev: PIN verfication failed: $err{$status}\n"; + if ($status == 0x0003) { # QMI_ERR_INTERNAL + warn "$netdev: SIM card missing?\n"; + } + return undef; + } + return 1; +} sub dms_dump_msg { @@ -2125,6 +2160,10 @@ if ($system == QMI_WDS) { &ctl_set_data_format($mode, shift); } } +} elsif ($system == QMI_UIM) { + if ($cmd eq 'pin') { + &uim_verify_pin(1); + } } elsif ($system == QMI_PDS) { if ($cmd eq 'xtra') { my $old = $debug; |