Open Source Telephony
 help / color / mirror / Atom feed
From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH 1/2] sim: add ofono_sim_ready_notify() support
Date: Thu, 26 Aug 2010 11:10:18 -0500	[thread overview]
Message-ID: <4C7691EA.1070506@gmail.com> (raw)
In-Reply-To: <AANLkTi=23A=db++wwE0wsrmQk7P0=9Cip00+XRg1BvDA@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 5161 bytes --]

Hi Pekka,

On 08/26/2010 10:49 AM, Pekka Pessi wrote:
> Hi Kristen and all,
> 
> This is what I have in mind:
> - no sim_pin_check after return from sim_pin_enter() but driver calls
> sim_ready_notify()
> - if driver has no pin check, retry initialization after sim_ready_notify()
> - when SIM requires PUK, change state back to SIM_INSERTED

Isn't it already in state SIM_INSERTED?  We go to SIM_INSERTED as soon
as the driver calls sim_inserted_notify()

> 
> There is no sim_set_state() yet, it has to be added
> 
> PIN2 and PUK2 results from pin query should be ignored, they are
> transient and do not prevent SIM from being ready.
> 
> --Pekka
> 
> --- a/src/sim.c
> +++ b/src/sim.c
> @@ -80,6 +80,15 @@ struct ofono_sim {
>  	gboolean sdn_ready;
>  	enum ofono_sim_state state;
>  	enum ofono_sim_password_type pin_type;
> +	union {
> +		struct {
> +			unsigned pre_pin_started:1;
> +			unsigned pre_pin_done:1;
> +			unsigned post_pin_started:1;
> +			unsigned ready_notified:1;
> +		};
> +		unsigned all;
> +	} init;
>  	gboolean locked_pins[OFONO_SIM_PASSWORD_SIM_PUK]; /* Number of PINs */
>  	char **language_prefs;
>  	GQueue *simop_q;
> @@ -693,8 +702,6 @@ static void sim_enter_pin_cb(const struct
> ofono_error *error, void *data)
>  		reply = dbus_message_new_method_return(sim->pending);
> 
>  	__ofono_dbus_pending_reply(&sim->pending, reply);
> -
> -	sim_pin_check(sim);

You do want to check the PIN if this is not PIN/PIN2.  E.g. some weird
carrier/corp/etc lock.

>  }
> 
>  static DBusMessage *sim_enter_pin(DBusConnection *conn, DBusMessage *msg,
> @@ -980,6 +987,12 @@ static void sim_imsi_cb(const struct ofono_error
> *error, const char *imsi,
> 
>  	if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
>  		ofono_error("Unable to read IMSI, emergency calls only");
> +
> +		sim->init.post_pin_started = 0;
> +
> +		if (sim->init.ready_notified)
> +			sim_pin_check(sim);
> +

I am lost, are we polling the IMSI here?  What is the point of
sim_ready_notify then?

>  		return;
>  	}
> 
> @@ -1130,6 +1143,9 @@ static void sim_efphase_read_cb(int ok, int
> length, int record,
> 
>  static void sim_initialize_after_pin(struct ofono_sim *sim)
>  {
> +	sim->init.post_pin_started = 1;
> +	sim->init.ready_notified = 0;
> +
>  	ofono_sim_read(sim, SIM_EFPHASE_FILEID,
>  			OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
>  			sim_efphase_read_cb, sim);
> @@ -1167,6 +1183,10 @@ static void sim_pin_query_cb(const struct
> ofono_error *error,
>  		goto checkdone;
>  	}
> 
> +	if (pin_type == OFONO_SIM_PASSWORD_PIN2 ||
> +			pin_type == OFONO_SIM_PASSWORD_PUK2)
> +		pin_type = OFONO_SIM_PASSWORD_NONE;
> +

Again, not sure you can really assume that if there are other PINs present.

>  	if (sim->pin_type != pin_type) {
>  		sim->pin_type = pin_type;
>  		pin_name = sim_passwd_name(pin_type);
> @@ -1185,7 +1205,18 @@ static void sim_pin_query_cb(const struct
> ofono_error *error,
>  	}
> 
>  checkdone:
> -	if (pin_type == OFONO_SIM_PASSWORD_NONE)
> +	if (pin_type != OFONO_SIM_PASSWORD_NONE) {
> +		int ready_notified = sim->init.ready_notified;
> +
> +		sim->init.post_pin_started = 0;
> +		sim->init.ready_notified = 0;
> +
> +		sim_set_state(sim, OFONO_SIM_STATE_INSERTED);
> +
> +		return;
> +	}
> +
> +	if (sim->init.pre_pin_done && !sim->init.post_pin_started)
>  		sim_initialize_after_pin(sim);

I am lost here :) I think we need to talk this over on IRC.

>  }
> 
> @@ -1199,6 +1230,22 @@ static void sim_pin_check(struct ofono_sim *sim)
>  	sim->driver->query_passwd_state(sim, sim_pin_query_cb, sim);
>  }
> 
> +void ofono_sim_ready_notify(struct ofono_sim *sim)
> +{
> +	if (sim == NULL)
> +		return;
> +
> +	sim->init.ready_notified = 1;
> +
> +	if (sim->state == OFONO_SIM_STATE_NOT_PRESENT)
> +		return;
> +
> +	if (!sim->init.pre_pin_done)
> +		return;
> +
> +	sim_pin_check(sim);
> +}
> +
>  static void sim_efli_read_cb(int ok, int length, int record,
>  				const unsigned char *data,
>  				int record_length, void *userdata)
> @@ -1379,6 +1426,8 @@ skip_efpl:
>  						DBUS_TYPE_STRING,
>  						&sim->language_prefs);
> 
> +	sim->init.pre_pin_done = 1;
> +
>  	sim_pin_check(sim);
>  }
> 
> @@ -1407,6 +1456,8 @@ static void sim_iccid_read_cb(int ok, int
> length, int record,
> 
>  static void sim_initialize(struct ofono_sim *sim)
>  {
> +	sim->init.pre_pin_started = 1;
> +
>  	/* Perform SIM initialization according to 3GPP 31.102 Section 5.1.1.2
>  	 * The assumption here is that if sim manager is being initialized,
>  	 * then sim commands are implemented, and the sim manager is then
>  static void sim_free_state(struct ofono_sim *sim)
> @@ -2007,6 +2060,8 @@ static void sim_free_state(struct ofono_sim *sim)
>  		g_free(sim->iccid);
>  		sim->iccid = NULL;
>  	}
> +
> +	sim->init.all = 0;
>  }
> 
>  void ofono_sim_inserted_notify(struct ofono_sim *sim, ofono_bool_t inserted)
> _______________________________________________
> ofono mailing list
> ofono(a)ofono.org
> http://lists.ofono.org/listinfo/ofono

Regards,
-Denis

  reply	other threads:[~2010-08-26 16:10 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-25 11:23 [PATCH 0/2] ofono_sim_ready_notify Kristen Carlson Accardi
2010-08-25 11:23 ` [PATCH 1/2] sim: add ofono_sim_ready_notify() support Kristen Carlson Accardi
2010-08-26 12:17   ` Pekka Pessi
2010-08-26 15:18     ` Denis Kenzior
2010-08-26 15:49     ` Pekka Pessi
2010-08-26 16:10       ` Denis Kenzior [this message]
2010-08-25 11:23 ` [PATCH 2/2] atmodem: call sim_ready_notify when epev is received Kristen Carlson Accardi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4C7691EA.1070506@gmail.com \
    --to=denkenz@gmail.com \
    --cc=ofono@ofono.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox