[PATCH 1/1] Fix primary context active/deactive result d-bus reply missing issue
From: Martin Xu martin...@intel.com If user offline modem when the gprs_context is in enabling or disabling state(activating/disactivating), the GPRS primary context activate/disactivate result will not be replied to the corresponding application. --- drivers/atmodem/gprs-context.c |7 +++ src/gprs.c |5 + 2 files changed, 12 insertions(+), 0 deletions(-) diff --git a/drivers/atmodem/gprs-context.c b/drivers/atmodem/gprs-context.c index ba95cbf..bfbd2c5 100644 --- a/drivers/atmodem/gprs-context.c +++ b/drivers/atmodem/gprs-context.c @@ -301,6 +301,13 @@ static void at_gprs_context_remove(struct ofono_gprs_context *gc) if (gcd-state != STATE_IDLE gcd-ppp) { g_at_ppp_unref(gcd-ppp); + + if (gcd-state == STATE_ENABLING) + CALLBACK_WITH_FAILURE(gcd-cb, gcd-cb_data); + + if (gcd-state == STATE_DISABLING) + CALLBACK_WITH_SUCCESS(gcd-cb, gcd-cb_data); + g_at_chat_resume(gcd-chat); } diff --git a/src/gprs.c b/src/gprs.c index deffeb8..99cb55d 100644 --- a/src/gprs.c +++ b/src/gprs.c @@ -351,6 +351,9 @@ static struct pri_context *gprs_context_by_path(struct ofono_gprs *gprs, static void context_settings_free(struct context_settings *settings) { + if (settings == NULL) + return; + if (settings-ipv4) { g_free(settings-ipv4-ip); g_free(settings-ipv4-netmask); @@ -736,6 +739,8 @@ static void pri_reset_context_settings(struct pri_context *ctx) return; settings = ctx-context_driver-settings; + if (settings == NULL) + return; interface = settings-interface; settings-interface = NULL; -- 1.7.2.2 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 1/2] Fix ofonod crash issue
From: Martin Xu martin...@intel.com In case of offline modem when GPRS data connection is connected, if gprs atom is removed before PPP termination process is complete, the terminate_timer will not be stop. It will cause ofonod crash when the timer time out. --- gatchat/ppp_cp.c |2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/gatchat/ppp_cp.c b/gatchat/ppp_cp.c index f0731cc..6e4a9c5 100644 --- a/gatchat/ppp_cp.c +++ b/gatchat/ppp_cp.c @@ -970,6 +970,8 @@ void pppcp_process_packet(gpointer priv, const guint8 *new_packet) void pppcp_free(struct pppcp_data *pppcp) { + pppcp_stop_timer(pppcp-config_timer_data); + pppcp_stop_timer(pppcp-terminate_timer_data); g_free(pppcp-peer_options); g_free(pppcp); } -- 1.7.2.2 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 2/2] Check modem device open failure
From: Martin Xu martin...@intel.com disable gprs function if open modem device file failed, Otherwise, it will cause ofonod crash, due to gatchat is NULL. --- plugins/huawei.c | 10 ++ 1 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/huawei.c b/plugins/huawei.c index 4051a93..1f69a8c 100644 --- a/plugins/huawei.c +++ b/plugins/huawei.c @@ -475,9 +475,10 @@ static void huawei_disconnect(gpointer user_data) data-modem = NULL; data-modem = open_device(modem, Modem, Modem: ); - if (data-modem == NULL) + if (data-modem == NULL) { + ofono_error(open device failed!); return; - + } g_at_chat_set_disconnect_function(data-modem, huawei_disconnect, modem); @@ -681,8 +682,9 @@ static void huawei_post_online(struct ofono_modem *modem) ofono_ussd_create(modem, OFONO_VENDOR_QUALCOMM_MSM, atmodem, data-pcui); - if (data-sim_state == HUAWEI_SIM_STATE_VALID || - data-sim_state == HUAWEI_SIM_STATE_INVALID_CS) { + if ((data-sim_state == HUAWEI_SIM_STATE_VALID || + data-sim_state == HUAWEI_SIM_STATE_INVALID_CS) + data-modem != NULL) { data-gprs = ofono_gprs_create(modem, OFONO_VENDOR_HUAWEI, atmodem, data-pcui); -- 1.7.2.2 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 1/1] Switch to offline mode only when the modem is NOT online
From: Martin Xu martin...@intel.com --- plugins/huawei.c |3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/plugins/huawei.c b/plugins/huawei.c index 1f69a8c..5f2c47f 100644 --- a/plugins/huawei.c +++ b/plugins/huawei.c @@ -217,7 +217,8 @@ static gboolean notify_sim_state(struct ofono_modem *modem, */ ofono_modem_set_powered(modem, TRUE); - g_at_chat_send(data-pcui, AT+CFUN=5, none_prefix, + if (ofono_modem_get_online(modem) == FALSE) + g_at_chat_send(data-pcui, AT+CFUN=5, none_prefix, cfun_offline, modem, NULL); return FALSE; -- 1.7.2.2 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH] Fix huawei_disconnect function issue
From: Martin Xu martin...@intel.com huawei_disconnect is used to recovery the io and gprs context when io error happends, see commit 39382730d7758b093ca6271f4e9dea875fa04b3a However, io error not only happends at PPP disconnect, in theory it can happends at any situation. I also observed that it happens when modem go into offline mode at my Huawei EM770W modem. in this case, gprs should not be reopened. --- plugins/huawei.c | 50 -- 1 files changed, 36 insertions(+), 14 deletions(-) diff --git a/plugins/huawei.c b/plugins/huawei.c index 6f05677..5bf02fd 100644 --- a/plugins/huawei.c +++ b/plugins/huawei.c @@ -470,10 +470,7 @@ static void huawei_disconnect(gpointer user_data) struct ofono_modem *modem = user_data; struct huawei_data *data = ofono_modem_get_data(modem); - DBG(); - - if (data-gc) - ofono_gprs_context_remove(data-gc); + DBG(data-gc %p, data-gc); g_at_chat_unref(data-modem); data-modem = NULL; @@ -485,6 +482,12 @@ static void huawei_disconnect(gpointer user_data) g_at_chat_set_disconnect_function(data-modem, huawei_disconnect, modem); + /* gprs_context has been destructed and needs not reopen */ + if (data-gc == NULL) + return; + + ofono_gprs_context_remove(data-gc); + if (data-sim_state == HUAWEI_SIM_STATE_VALID || data-sim_state == HUAWEI_SIM_STATE_INVALID_CS) { ofono_info(Reopened GPRS context channel); @@ -579,15 +582,29 @@ static int huawei_disable(struct ofono_modem *modem) return -EINPROGRESS; } +struct huawei_cb_data { + struct cb_data *cbd; + ofono_bool_t online; + struct ofono_modem *modem; +}; + static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data) { - struct cb_data *cbd = user_data; - ofono_modem_online_cb_t cb = cbd-cb; + struct huawei_cb_data *online_cbd = user_data; + ofono_modem_online_cb_t cb = online_cbd-cbd-cb; + struct huawei_data *data = ofono_modem_get_data(online_cbd-modem); + + if (ok) { + /* offline mode gprs_context and gprs will be flushed */ + if (online_cbd-online == FALSE) { + data-gc = NULL; + data-gprs = NULL; + } - if (ok) - CALLBACK_WITH_SUCCESS(cb, cbd-data); + CALLBACK_WITH_SUCCESS(cb, online_cbd-cbd-data); + } else - CALLBACK_WITH_FAILURE(cb, cbd-data); + CALLBACK_WITH_FAILURE(cb, online_cbd-cbd-data); } static void huawei_set_online(struct ofono_modem *modem, ofono_bool_t online, @@ -595,21 +612,26 @@ static void huawei_set_online(struct ofono_modem *modem, ofono_bool_t online, { struct huawei_data *data = ofono_modem_get_data(modem); GAtChat *chat = data-pcui; - struct cb_data *cbd = cb_data_new(cb, user_data); + struct huawei_cb_data *online_cbd; char const *command = online ? AT+CFUN=1 : AT+CFUN=5; DBG(modem %p %s, modem, online ? online : offline); - if (cbd == NULL) + online_cbd = g_try_new0(struct huawei_cb_data, 1); + online_cbd-cbd = cb_data_new(cb, user_data); + if (online_cbd-cbd == NULL) goto error; + online_cbd-online = online; + online_cbd-modem = modem; - if (g_at_chat_send(chat, command, NULL, set_online_cb, cbd, g_free)) + if (g_at_chat_send(chat, command, NULL, set_online_cb, + online_cbd, g_free)) return; error: - g_free(cbd); + g_free(online_cbd); - CALLBACK_WITH_FAILURE(cb, cbd-data); + CALLBACK_WITH_FAILURE(cb, user_data); } static void huawei_pre_sim(struct ofono_modem *modem) -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH] Fix huawei_disconnect function issue
From: Martin Xu martin...@intel.com huawei_disconnect is used to recovery the io and gprs context when io error happends, see commit 39382730d7758b093ca6271f4e9dea875fa04b3a However, io error not only happends at PPP disconnect, in theory it can happends at any situation. I also observed that it happens when modem go into offline mode at my Huawei EM770W modem. in this case, gprs should not be reopened. --- plugins/huawei.c | 49 +++-- 1 files changed, 35 insertions(+), 14 deletions(-) diff --git a/plugins/huawei.c b/plugins/huawei.c index 6f05677..939509f 100644 --- a/plugins/huawei.c +++ b/plugins/huawei.c @@ -78,6 +78,7 @@ struct huawei_data { struct ofono_gprs *gprs; struct ofono_gprs_context *gc; gboolean voice; + gboolean online; gboolean ndis; guint sim_poll_timeout; guint sim_poll_count; @@ -97,6 +98,7 @@ static int huawei_probe(struct ofono_modem *modem) if (data == NULL) return -ENOMEM; + data-online = FALSE; ofono_modem_set_data(modem, data); return 0; @@ -470,10 +472,7 @@ static void huawei_disconnect(gpointer user_data) struct ofono_modem *modem = user_data; struct huawei_data *data = ofono_modem_get_data(modem); - DBG(); - - if (data-gc) - ofono_gprs_context_remove(data-gc); + DBG(data-online %d, data-online); g_at_chat_unref(data-modem); data-modem = NULL; @@ -485,6 +484,13 @@ static void huawei_disconnect(gpointer user_data) g_at_chat_set_disconnect_function(data-modem, huawei_disconnect, modem); + /* reopen GPRS context channel only at online state */ + if (data-online == FALSE) + return; + + if (data-gc) + ofono_gprs_context_remove(data-gc); + if (data-sim_state == HUAWEI_SIM_STATE_VALID || data-sim_state == HUAWEI_SIM_STATE_INVALID_CS) { ofono_info(Reopened GPRS context channel); @@ -579,15 +585,25 @@ static int huawei_disable(struct ofono_modem *modem) return -EINPROGRESS; } +struct huawei_cb_data { + struct cb_data *cbd; + ofono_bool_t online; + struct ofono_modem *modem; +}; + static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data) { - struct cb_data *cbd = user_data; - ofono_modem_online_cb_t cb = cbd-cb; + struct huawei_cb_data *online_cbd = user_data; + ofono_modem_online_cb_t cb = online_cbd-cbd-cb; + struct huawei_data *data = ofono_modem_get_data(online_cbd-modem); - if (ok) - CALLBACK_WITH_SUCCESS(cb, cbd-data); + if (ok) { + data-online = online_cbd-online; + + CALLBACK_WITH_SUCCESS(cb, online_cbd-cbd-data); + } else - CALLBACK_WITH_FAILURE(cb, cbd-data); + CALLBACK_WITH_FAILURE(cb, online_cbd-cbd-data); } static void huawei_set_online(struct ofono_modem *modem, ofono_bool_t online, @@ -595,21 +611,26 @@ static void huawei_set_online(struct ofono_modem *modem, ofono_bool_t online, { struct huawei_data *data = ofono_modem_get_data(modem); GAtChat *chat = data-pcui; - struct cb_data *cbd = cb_data_new(cb, user_data); + struct huawei_cb_data *online_cbd; char const *command = online ? AT+CFUN=1 : AT+CFUN=5; DBG(modem %p %s, modem, online ? online : offline); - if (cbd == NULL) + online_cbd = g_try_new0(struct huawei_cb_data, 1); + online_cbd-cbd = cb_data_new(cb, user_data); + if (online_cbd-cbd == NULL) goto error; + online_cbd-online = online; + online_cbd-modem = modem; - if (g_at_chat_send(chat, command, NULL, set_online_cb, cbd, g_free)) + if (g_at_chat_send(chat, command, NULL, set_online_cb, + online_cbd, g_free)) return; error: - g_free(cbd); + g_free(online_cbd); - CALLBACK_WITH_FAILURE(cb, cbd-data); + CALLBACK_WITH_FAILURE(cb, user_data); } static void huawei_pre_sim(struct ofono_modem *modem) -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[V3 PATCH 1/3] PPP: Fix transmit ACCM and receive ACCM setting issue
From: Martin Xu martin...@intel.com Tramsmit ACCM and receive ACCM is mixed up. According to RFC1662 Section 7.1, ACCM Configuration Option is used to inform the peer which control characters MUST remain mapped when the peer sends them. --- gatchat/ppp_lcp.c | 16 ++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c index 3a80a62..cc3e231 100644 --- a/gatchat/ppp_lcp.c +++ b/gatchat/ppp_lcp.c @@ -149,7 +149,13 @@ static void lcp_rca(struct pppcp_data *pppcp, const struct pppcp_packet *packet) while (ppp_option_iter_next(iter) == TRUE) { switch (ppp_option_iter_get_type(iter)) { case ACCM: - ppp_set_xmit_accm(pppcp_get_ppp(pppcp), 0); + /* +* RFC1662 Section 7.1 +* The Configuration Option is used to inform the peer +* which control characters MUST remain mapped when +* the peer sends them. +*/ + ppp_set_recv_accm(pppcp_get_ppp(pppcp), 0); break; default: break; @@ -263,7 +269,13 @@ static enum rcr_result lcp_rcr(struct pppcp_data *pppcp, while (ppp_option_iter_next(iter) == TRUE) { switch (ppp_option_iter_get_type(iter)) { case ACCM: - ppp_set_recv_accm(ppp, + /* +* RFC1662 Section 7.1 +* The Configuration Option is used to inform the peer +* which control characters MUST remain mapped when +* the peer sends them. +*/ + ppp_set_xmit_accm(ppp, get_host_long(ppp_option_iter_get_data(iter))); break; case AUTH_PROTO: -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[V3 PATCH 2/3] PPP: Use default ACCM (0xffffffff) to trasmit package
From: Martin Xu martin...@intel.com Using my Huawei EM770W modem, if set ACCM as 0x, RXJ- event breaks PPP link, after IP package transmit for a while. Using default ACCM, the issue can be fixed. I tested it at China Unicom networks. --- gatchat/ppp_lcp.c |8 +--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c index cc3e231..91a8b67 100644 --- a/gatchat/ppp_lcp.c +++ b/gatchat/ppp_lcp.c @@ -105,8 +105,7 @@ static void lcp_generate_config_options(struct lcp_data *lcp) static void lcp_reset_config_options(struct lcp_data *lcp) { - lcp-req_options = REQ_OPTION_ACCM; - lcp-accm = 0; + /* Using the default ACCM */ lcp_generate_config_options(lcp); } @@ -147,6 +146,7 @@ static void lcp_rca(struct pppcp_data *pppcp, const struct pppcp_packet *packet) ppp_option_iter_init(iter, packet); while (ppp_option_iter_next(iter) == TRUE) { + const guint8 *data = ppp_option_iter_get_data(iter); switch (ppp_option_iter_get_type(iter)) { case ACCM: /* @@ -155,7 +155,9 @@ static void lcp_rca(struct pppcp_data *pppcp, const struct pppcp_packet *packet) * which control characters MUST remain mapped when * the peer sends them. */ - ppp_set_recv_accm(pppcp_get_ppp(pppcp), 0); + + ppp_set_recv_accm(pppcp_get_ppp(pppcp), + pppcpget_host_long(data)); break; default: break; -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[V3 PATCH 3/3] Huawei: set Huawei EM770W modem device to 00
From: Martin Xu martin...@intel.com Device 00 is ppp port. Setting it as 01, my Huawei EM770W modem PPP connection can't work --- plugins/ofono.rules |2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/plugins/ofono.rules b/plugins/ofono.rules index 111f071..7dec243 100644 --- a/plugins/ofono.rules +++ b/plugins/ofono.rules @@ -37,7 +37,7 @@ ATTRS{idVendor}==12d1, ATTRS{idProduct}==1401, ENV{OFONO_IFACE_NUM}==02, E ATTRS{idVendor}==12d1, ATTRS{idProduct}==1402, ENV{OFONO_IFACE_NUM}==00, ENV{OFONO_HUAWEI_TYPE}=Modem ATTRS{idVendor}==12d1, ATTRS{idProduct}==1402, ENV{OFONO_IFACE_NUM}==02, ENV{OFONO_HUAWEI_TYPE}=Pcui -ATTRS{idVendor}==12d1, ATTRS{idProduct}==1404, ENV{OFONO_IFACE_NUM}==01, ENV{OFONO_HUAWEI_TYPE}=Modem +ATTRS{idVendor}==12d1, ATTRS{idProduct}==1404, ENV{OFONO_IFACE_NUM}==00, ENV{OFONO_HUAWEI_TYPE}=Modem ATTRS{idVendor}==12d1, ATTRS{idProduct}==1404, ENV{OFONO_IFACE_NUM}==02, ENV{OFONO_HUAWEI_TYPE}=Pcui ATTRS{idVendor}==12d1, ATTRS{idProduct}==1404, ENV{OFONO_HUAWEI_VOICE}=1 -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 2/3] Use default ACCM (0xffffffff) to trasmit package
From: Martin Xu martin...@intel.com Using my Huawei EM770W modem, if set ACCM as 0x, RXJ- event breaks PPP link, after IP package transmit for a while. Using default ACCM, the issue can be fixed. I tested it at China Unicom networks. --- gatchat/ppp_lcp.c |9 ++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c index cc3e231..2264731 100644 --- a/gatchat/ppp_lcp.c +++ b/gatchat/ppp_lcp.c @@ -105,8 +105,7 @@ static void lcp_generate_config_options(struct lcp_data *lcp) static void lcp_reset_config_options(struct lcp_data *lcp) { - lcp-req_options = REQ_OPTION_ACCM; - lcp-accm = 0; + /* Using the default ACCM */ lcp_generate_config_options(lcp); } @@ -155,7 +154,11 @@ static void lcp_rca(struct pppcp_data *pppcp, const struct pppcp_packet *packet) * which control characters MUST remain mapped when * the peer sends them. */ - ppp_set_recv_accm(pppcp_get_ppp(pppcp), 0); + + /* +* Using the default ACCM +* ppp_set_recv_accm(pppcp_get_ppp(pppcp), ~0U); +*/ break; default: break; -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 1/3] PPP: Fix transmit ACCM and receive ACCM setting issue
From: Martin Xu martin...@intel.com Tramsmit ACCM and receive ACCM is mixed up. According to RFC1662 Section 7.1, ACCM Configuration Option is used to inform the peer which control characters MUST remain mapped when the peer sends them. --- gatchat/ppp_lcp.c | 16 ++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c index 3a80a62..cc3e231 100644 --- a/gatchat/ppp_lcp.c +++ b/gatchat/ppp_lcp.c @@ -149,7 +149,13 @@ static void lcp_rca(struct pppcp_data *pppcp, const struct pppcp_packet *packet) while (ppp_option_iter_next(iter) == TRUE) { switch (ppp_option_iter_get_type(iter)) { case ACCM: - ppp_set_xmit_accm(pppcp_get_ppp(pppcp), 0); + /* +* RFC1662 Section 7.1 +* The Configuration Option is used to inform the peer +* which control characters MUST remain mapped when +* the peer sends them. +*/ + ppp_set_recv_accm(pppcp_get_ppp(pppcp), 0); break; default: break; @@ -263,7 +269,13 @@ static enum rcr_result lcp_rcr(struct pppcp_data *pppcp, while (ppp_option_iter_next(iter) == TRUE) { switch (ppp_option_iter_get_type(iter)) { case ACCM: - ppp_set_recv_accm(ppp, + /* +* RFC1662 Section 7.1 +* The Configuration Option is used to inform the peer +* which control characters MUST remain mapped when +* the peer sends them. +*/ + ppp_set_xmit_accm(ppp, get_host_long(ppp_option_iter_get_data(iter))); break; case AUTH_PROTO: -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 3/3] Huawei: set Huawei EM770W modem device to 00
From: Martin Xu martin...@intel.com Device 00 is ppp port. Setting it as 01, my Huawei EM770W modem PPP connection can't work --- plugins/ofono.rules |2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/plugins/ofono.rules b/plugins/ofono.rules index 111f071..7dec243 100644 --- a/plugins/ofono.rules +++ b/plugins/ofono.rules @@ -37,7 +37,7 @@ ATTRS{idVendor}==12d1, ATTRS{idProduct}==1401, ENV{OFONO_IFACE_NUM}==02, E ATTRS{idVendor}==12d1, ATTRS{idProduct}==1402, ENV{OFONO_IFACE_NUM}==00, ENV{OFONO_HUAWEI_TYPE}=Modem ATTRS{idVendor}==12d1, ATTRS{idProduct}==1402, ENV{OFONO_IFACE_NUM}==02, ENV{OFONO_HUAWEI_TYPE}=Pcui -ATTRS{idVendor}==12d1, ATTRS{idProduct}==1404, ENV{OFONO_IFACE_NUM}==01, ENV{OFONO_HUAWEI_TYPE}=Modem +ATTRS{idVendor}==12d1, ATTRS{idProduct}==1404, ENV{OFONO_IFACE_NUM}==00, ENV{OFONO_HUAWEI_TYPE}=Modem ATTRS{idVendor}==12d1, ATTRS{idProduct}==1404, ENV{OFONO_IFACE_NUM}==02, ENV{OFONO_HUAWEI_TYPE}=Pcui ATTRS{idVendor}==12d1, ATTRS{idProduct}==1404, ENV{OFONO_HUAWEI_VOICE}=1 -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 0/2] fix ACCM handle issue for Huawei EM770W modem
From: Martin Xu martin...@intel.com [PATCH 1/2] PPP: Fix Trasmit ACCM and Receive ACCM setting error according to RFC 1662 section 7.2, looks like oFono has set receive and transmit ACCM wrongly. normally the two ACCM are both set as 0x, and the issue will not be found. Once the they are different, oFono will run to error. [PATCH 2/2] Inform Huawei modem using ACCM 0x to trasmit package. Using my Huawei modem (EM770W) if set ACCM as 0x, the RXJ- event will happend, and PPP link down, when IP package is transmited for a while. If I set ACCM as 0x, the RXJ- event never happen, and the modem can work quite stable. I tested the modem at China Unicom networks. Not sure whether the issue is specific to specific modem. If it is the case, ofono may let user to set the ACCM to specific modem. gatchat/ppp_lcp.c | 15 --- 1 files changed, 12 insertions(+), 3 deletions(-) -- 1.7.2.2 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 1/2] PPP: Fix Transmit ACCM and Receive ACCM setting error
From: Martin Xu martin...@intel.com --- gatchat/ppp_lcp.c | 13 +++-- 1 files changed, 11 insertions(+), 2 deletions(-) diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c index 3a80a62..bc97257 100644 --- a/gatchat/ppp_lcp.c +++ b/gatchat/ppp_lcp.c @@ -149,7 +149,11 @@ static void lcp_rca(struct pppcp_data *pppcp, const struct pppcp_packet *packet) while (ppp_option_iter_next(iter) == TRUE) { switch (ppp_option_iter_get_type(iter)) { case ACCM: - ppp_set_xmit_accm(pppcp_get_ppp(pppcp), 0); + /* RFC1662 Section 7.1 +* The Configuration Option is used to inform the peer which control +* characters MUST remain mapped when the peer sends them. +*/ + ppp_set_recv_accm(pppcp_get_ppp(pppcp), 0); break; default: break; @@ -263,7 +267,12 @@ static enum rcr_result lcp_rcr(struct pppcp_data *pppcp, while (ppp_option_iter_next(iter) == TRUE) { switch (ppp_option_iter_get_type(iter)) { case ACCM: - ppp_set_recv_accm(ppp, + /* RFC1662 Section 7.1 +* The Configuration Option is used to inform the peer which control +* characters MUST remain mapped when the peer sends them. +*/ + + ppp_set_xmit_accm(ppp, get_host_long(ppp_option_iter_get_data(iter))); break; case AUTH_PROTO: -- 1.7.2.2 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 2/2] Inform Huawei modem using ACCM 0xffffffff to trasmit package. Using my Huawei modem (EM770W) if set ACCM as 0x00000000, the RXJ- event will happend, and PPP link down, when IP package tran
From: Martin Xu martin...@intel.com --- gatchat/ppp_lcp.c |4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c index bc97257..181bc14 100644 --- a/gatchat/ppp_lcp.c +++ b/gatchat/ppp_lcp.c @@ -106,7 +106,7 @@ static void lcp_generate_config_options(struct lcp_data *lcp) static void lcp_reset_config_options(struct lcp_data *lcp) { lcp-req_options = REQ_OPTION_ACCM; - lcp-accm = 0; + lcp-accm = ~0U; lcp_generate_config_options(lcp); } @@ -153,7 +153,7 @@ static void lcp_rca(struct pppcp_data *pppcp, const struct pppcp_packet *packet) * The Configuration Option is used to inform the peer which control * characters MUST remain mapped when the peer sends them. */ - ppp_set_recv_accm(pppcp_get_ppp(pppcp), 0); + ppp_set_recv_accm(pppcp_get_ppp(pppcp), ~0U); break; default: break; -- 1.7.2.2 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH] Fix compile warning at MeeGo The gcc version is MeeGo 4.5.1
From: blutolan bluto...@blutolan-desktop.(none) --- src/call-forwarding.c |2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/call-forwarding.c b/src/call-forwarding.c index 512f223..36ba4f1 100644 --- a/src/call-forwarding.c +++ b/src/call-forwarding.c @@ -246,7 +246,7 @@ static gboolean is_cfu_enabled(struct ofono_call_forwarding *cf, static void sim_set_cf_indicator(struct ofono_call_forwarding *cf) { gboolean cfu_voice; - struct ofono_call_forwarding_condition *cond; + struct ofono_call_forwarding_condition *cond = NULL; cfu_voice = is_cfu_enabled(cf, cond); -- 1.7.2.2 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH] Fix compile warning at MeeGo The gcc version is MeeGo 4.5.1
From: Martin Xu martin...@intel.com --- src/call-forwarding.c |2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/call-forwarding.c b/src/call-forwarding.c index 512f223..36ba4f1 100644 --- a/src/call-forwarding.c +++ b/src/call-forwarding.c @@ -246,7 +246,7 @@ static gboolean is_cfu_enabled(struct ofono_call_forwarding *cf, static void sim_set_cf_indicator(struct ofono_call_forwarding *cf) { gboolean cfu_voice; - struct ofono_call_forwarding_condition *cond; + struct ofono_call_forwarding_condition *cond = NULL; cfu_voice = is_cfu_enabled(cf, cond); -- 1.7.2.2 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 1/1] new modem desc for f3607g modem in Samos platform
From: root r...@blutolan-desktop.localdomain --- plugins/udev.c |6 ++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/plugins/udev.c b/plugins/udev.c index 243ce9b..8bb2d65 100644 --- a/plugins/udev.c +++ b/plugins/udev.c @@ -86,24 +86,30 @@ static void add_mbm(struct ofono_modem *modem, if (desc == NULL) return; + DBG(desc: %s, desc); + registered = ofono_modem_get_integer(modem, Registered); if (registered != 0) return; if (g_str_has_suffix(desc, Minicard Modem) || + g_str_has_suffix(desc, Mini-Card Modem) || g_str_has_suffix(desc, Broadband Modem) || g_str_has_suffix(desc, Broadband USB Modem)) { devnode = udev_device_get_devnode(udev_device); ofono_modem_set_string(modem, MODEM_DEVICE, devnode); } else if (g_str_has_suffix(desc, Minicard Data Modem) || + g_str_has_suffix(desc, Mini-Card Data Modem) || g_str_has_suffix(desc, Broadband Data Modem)) { devnode = udev_device_get_devnode(udev_device); ofono_modem_set_string(modem, DATA_DEVICE, devnode); } else if (g_str_has_suffix(desc, Minicard GPS Port) || + g_str_has_suffix(desc, Mini-Card GPRS Port) || g_str_has_suffix(desc, Broadband GPS Port)) { devnode = udev_device_get_devnode(udev_device); ofono_modem_set_string(modem, GPS_DEVICE, devnode); } else if (g_str_has_suffix(desc, Minicard Network Adapter) || + g_str_has_suffix(desc, Mini-Card Network Adapter) || g_str_has_suffix(desc, Broadband Network Adapter) || g_str_has_suffix(desc, Minicard NetworkAdapter)) { devnode = udev_device_get_property_value(udev_device, -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 1/1] Allow builds to install the test scripts for debugging
--- Makefile.am |9 +++-- bootstrap-configure |1 + configure.ac|4 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 4b0d7e8..2a140c1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -231,7 +231,7 @@ doc_files = doc/overview.txt doc/ofono-paper.txt \ doc/call-meter-api.txt \ doc/dataconnectionmanager-api.txt -test_files = test/test-manager test/test-modem test/test-voicecall \ +test_scripts = test/test-manager test/test-modem test/test-voicecall \ test/test-network-registration test/test-phonebook \ test/test-advice-of-charge test/test-call-settings \ test/test-call-forwarding test/test-call-barring \ @@ -244,10 +244,15 @@ test_files = test/test-manager test/test-modem test/test-voicecall \ test/activate-context test/deactivate-context \ test/process-context-settings +if TEST +testdir = $(pkglibdir)/test +test_SCRIPTS = $(test_scripts) +endif + conf_files = src/ofono.conf plugins/modem.conf EXTRA_DIST = src/genbuiltin plugins/example_history.c $(doc_files) \ - $(test_files) $(conf_files) $(udev_files) + $(test_scripts) $(conf_files) $(udev_files) dist_man_MANS = doc/ofonod.8 diff --git a/bootstrap-configure b/bootstrap-configure index 63a689a..f665943 100755 --- a/bootstrap-configure +++ b/bootstrap-configure @@ -7,6 +7,7 @@ fi ./bootstrap \ ./configure --enable-maintainer-mode \ --enable-debug \ + --enable-test \ --prefix=/usr \ --mandir=/usr/share/man \ --sysconfdir=/etc \ diff --git a/configure.ac b/configure.ac index 5c2255a..a3b7d75 100644 --- a/configure.ac +++ b/configure.ac @@ -48,6 +48,10 @@ AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], fi ]) +AC_ARG_ENABLE(test, AC_HELP_STRING([--enable-test], + [enable test/example scripts]), [enable_test=${enableval}]) +AM_CONDITIONAL(TEST, test ${enable_test} = yes) + AC_ARG_ENABLE(pie, AC_HELP_STRING([--enable-pie], [enable position independent executables flag]), [ if (test ${enableval} = yes -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 5/5] update gprs context settings when activating primary conext
--- drivers/mbmmodem/gprs-context.c | 14 ++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/drivers/mbmmodem/gprs-context.c b/drivers/mbmmodem/gprs-context.c index ecbafa0..b800d4a 100644 --- a/drivers/mbmmodem/gprs-context.c +++ b/drivers/mbmmodem/gprs-context.c @@ -116,6 +116,18 @@ static void mbm_cgdcont_cb(gboolean ok, GAtResult *result, gpointer user_data) CALLBACK_WITH_FAILURE(cb, cbd-data); } +static void update_gprs_context_settings(struct ofono_gprs_context *gc) +{ + const char *interface; + + struct ofono_modem *modem = ofono_gprs_context_get_modem(gc); + + interface = ofono_modem_get_string(modem, NetworkInterface); + + ofono_gprs_context_update_settings(gc, interface, dhcp, + NULL, NULL, NULL, NULL); +} + static void mbm_gprs_activate_primary(struct ofono_gprs_context *gc, const struct ofono_gprs_primary_context *ctx, ofono_gprs_context_cb_t cb, void *data) @@ -132,6 +144,8 @@ static void mbm_gprs_activate_primary(struct ofono_gprs_context *gc, cbd-user = gc; + update_gprs_context_settings(gc); + /* TODO: Handle username / password fields */ len = sprintf(buf, AT+CGDCONT=%u,\IP\, ctx-cid); -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 1/4] add interface property to primary context
--- include/gprs-context.h |1 + src/gprs.c |4 2 files changed, 5 insertions(+), 0 deletions(-) diff --git a/include/gprs-context.h b/include/gprs-context.h index c4ebd23..adb0820 100644 --- a/include/gprs-context.h +++ b/include/gprs-context.h @@ -37,6 +37,7 @@ struct ofono_gprs_context; struct ofono_gprs_primary_context { unsigned int cid; int direction; + char *interface; char apn[OFONO_GPRS_MAX_APN_LENGTH + 1]; char username[OFONO_GPRS_MAX_USERNAME_LENGTH + 1]; char password[OFONO_GPRS_MAX_PASSWORD_LENGTH + 1]; diff --git a/src/gprs.c b/src/gprs.c index 0253109..18ae82a 100644 --- a/src/gprs.c +++ b/src/gprs.c @@ -185,6 +185,10 @@ static DBusMessage *pri_get_properties(DBusConnection *conn, ofono_dbus_dict_append(dict, Password, DBUS_TYPE_STRING, strvalue); + strvalue = ctx-context.interface; + ofono_dbus_dict_append(dict, Interface, DBUS_TYPE_STRING, + strvalue); + dbus_message_iter_close_container(iter, dict); return reply; -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 3/4] add function ofono_gprs_context_get_modem
--- include/gprs-context.h |2 ++ src/gprs.c |5 + 2 files changed, 7 insertions(+), 0 deletions(-) diff --git a/include/gprs-context.h b/include/gprs-context.h index b8c770d..2a788ef 100644 --- a/include/gprs-context.h +++ b/include/gprs-context.h @@ -76,6 +76,8 @@ void ofono_gprs_context_remove(struct ofono_gprs_context *gc); void ofono_gprs_context_set_data(struct ofono_gprs_context *gc, void *data); void *ofono_gprs_context_get_data(struct ofono_gprs_context *gc); +struct ofono_modem *ofono_gprs_context_get_modem(struct ofono_gprs_context *gc); + #ifdef __cplusplus } #endif diff --git a/src/gprs.c b/src/gprs.c index 60d26ec..025b944 100644 --- a/src/gprs.c +++ b/src/gprs.c @@ -1249,6 +1249,11 @@ void *ofono_gprs_context_get_data(struct ofono_gprs_context *gc) return gc-driver_data; } +struct ofono_modem *ofono_gprs_context_get_modem(struct ofono_gprs_context *gc) +{ + return __ofono_atom_get_modem(gc-atom); +} + int ofono_gprs_driver_register(const struct ofono_gprs_driver *d) { DBG(driver: %p, name: %s, d, d-name); -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 2/4] add create/destroy_interface to ofono_gprs_context_driver
--- include/gprs-context.h |4 src/gprs.c | 20 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/include/gprs-context.h b/include/gprs-context.h index adb0820..b8c770d 100644 --- a/include/gprs-context.h +++ b/include/gprs-context.h @@ -57,6 +57,10 @@ struct ofono_gprs_context_driver { void (*deactivate_primary)(struct ofono_gprs_context *gc, unsigned int id, ofono_gprs_context_cb_t cb, void *data); + void (*create_interface)(struct ofono_gprs_context *gc, + struct ofono_gprs_primary_context *ctx); + void (*destroy_interface)(struct ofono_gprs_context *gc, + struct ofono_gprs_primary_context *ctx); }; void ofono_gprs_context_deactivated(struct ofono_gprs_context *gc, unsigned id); diff --git a/src/gprs.c b/src/gprs.c index 18ae82a..60d26ec 100644 --- a/src/gprs.c +++ b/src/gprs.c @@ -498,21 +498,29 @@ static struct pri_context *pri_context_create(struct ofono_gprs *gprs, const char *name, enum gprs_context_type type) { - struct pri_context *context = g_try_new0(struct pri_context, 1); + struct ofono_gprs_context *gc = gprs-context_driver; + struct pri_context *ctx = g_try_new0(struct pri_context, 1); - if (!context) + if (!ctx) return NULL; - context-gprs = gprs; - strcpy(context-name, name); - context-type = type; + ctx-gprs = gprs; + strcpy(ctx-name, name); + ctx-type = type; + + if (gc-driver-create_interface) + gc-driver-create_interface(gc, ctx-context); - return context; + return ctx; } static void pri_context_destroy(gpointer userdata) { struct pri_context *ctx = userdata; + struct ofono_gprs_context *gc = ctx-gprs-context_driver; + + if (gc-driver-destroy_interface) + gc-driver-destroy_interface(gc, ctx-context); if (ctx-path) g_free(ctx-path); -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 4/4] add mbm_gprs_create/destroy_interface to mbm gprs_context_driver
--- drivers/mbmmodem/gprs-context.c | 21 + 1 files changed, 21 insertions(+), 0 deletions(-) diff --git a/drivers/mbmmodem/gprs-context.c b/drivers/mbmmodem/gprs-context.c index ecbafa0..d3e03b7 100644 --- a/drivers/mbmmodem/gprs-context.c +++ b/drivers/mbmmodem/gprs-context.c @@ -172,6 +172,25 @@ error: CALLBACK_WITH_FAILURE(cb, data); } +static void mbm_gprs_create_interface(struct ofono_gprs_context *gc, + struct ofono_gprs_primary_context *ctx) +{ + const char *interface; + struct ofono_modem *modem = ofono_gprs_context_get_modem(gc); + + interface = ofono_modem_get_string(modem, NetworkInterface); + + g_free(ctx-interface); + ctx-interface = g_strdup(interface); +} + +static void mbm_gprs_destroy_interface(struct ofono_gprs_context *gc, + struct ofono_gprs_primary_context *ctx) +{ + g_free(ctx-interface); + ctx-interface = NULL; +} + static void e2nap_notifier(GAtResult *result, gpointer user_data) { struct ofono_gprs_context *gc = user_data; @@ -237,6 +256,8 @@ static struct ofono_gprs_context_driver driver = { .remove = mbm_gprs_context_remove, .activate_primary = mbm_gprs_activate_primary, .deactivate_primary = mbm_gprs_deactivate_primary, + .create_interface = mbm_gprs_create_interface, + .destroy_interface = mbm_gprs_destroy_interface, }; void mbm_gprs_context_init() -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
index c2e9c41..6661074 100644
___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono
[PATCH 1/1] Use AT+CFUN? to query powered state
--- plugins/mbm.c |3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/plugins/mbm.c b/plugins/mbm.c index fd4569c..602709d 100644 --- a/plugins/mbm.c +++ b/plugins/mbm.c @@ -187,6 +187,9 @@ static int mbm_enable(struct ofono_modem *modem) NULL, NULL, NULL); g_at_chat_send(data-chat, AT*EMRDY?, none_prefix, NULL, NULL, NULL); + g_at_chat_send(data-chat, AT+CFUN?, cfun_prefix, + cfun_query, modem, NULL); + return -EINPROGRESS; } -- 1.6.1.3 ___ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono