On 06/12/2015 08:05 AM, Tommi Kenakkala wrote:
There's an issue for which I'd like to hear your opinion.
ofono_sim_inserted_notify signals org.ofono.SimManager Present property true,
but PinRequired and LockedPins are known only after
__ofono_sim_recheck_pin asks them from driver.
In general, the client has to assume that SimManager is not initialized
until SubscriberIdentity is present, or PinRequired is set.
Problem can arise at startup but I've met this especially during
hotswap i.e. when I remove and insert the same/different card.
If a driver completes query_passwd_state synchronously there's less
room for problems, but if driver has to find out the values
asynchronously the time window is longer.
I'm using an implementation of rilmodem, but even the default atmodem
driver asks password state asynchronously (AT+CPIN?).
In general oFono tries to do two things to alleviate issues of
- We only register DBus interfaces once the initial state has been queried.
- We delay GetProperties() return until we queried the needed states and
cached them. This is mostly used for interfaces which are unlikely to
be used by multiple clients (which would need to deal with Error.Busy)
The above are not really a good fit for SimManager, so it has always
If a client, for example triggered by the Present property change
signal, asks GetProperties during the time window then PinRequired &
LockedPins values are not updated yet.
Then the client should simply wait for the relevant signal to arrive.
Either SubscriberIdentity or PinRequired.
A client can't work around Problem1, it doesn't know when after a
hotswap PinRequired becomes available. sim_pin_query_cb checks
"sim->pin_type = pin_type" before emitting PinRequired changed signal.
Works for boot when pin_type is 0 but not for card hotswap because
sim->pin_type is not reset, instead the old value is preserved.
Sounds like a bug. Are you hot-swapping two PIN-locked SIMs? Can you
share a log of what's happening?
One fix proposal to Problem2 is to reset pin_type to
OFONO_SIM_PASSWORD_INVALID in ofono_sim_inserted_notify when removed.
That requires skipping appending PinRequired in sim_get_properties()
if value is OFONO_SIM_PASSWORD_INVALID, otherwise
ofono_dbus_dict_append crashes because sim_passwd_name() didn't have a
value for OFONO_SIM_PASSWORD_INVALID.
(I would've put resetting to sim_free_main_state(), but that's called
when changing PIN fails due to wrong passwords and sim app switches
PUK lock (OFONO_SIM_STATE_LOCKED_OUT), it would reset the password
type already set as puk.)
Setting it to OFONO_SIM_PASSWORD_INVALID is definitely not the right way
to go. But there might be other ways to take care of the problem. Can
you share the logs of what is happening first?
Similar for LockedPins, but there reason is sim_pin_query_cb() doesn't
emit property change all.
Fix proposal to Problem3 is to emit a change signal sim_pin_query_cb()
if "sim->locked_pins[pin_type]" wasn't already TRUE.
Please let me know your comments and improvement ideas. I can submit
patches if you're interested.