diff options
author | Philip Paeps <philip@paeps.cx> | 2014-06-19 12:07:05 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2014-06-21 11:50:34 -0500 |
commit | a88662d23c45f49d9af5a508d4d0a778950b2420 (patch) | |
tree | 493246fd2c2789995a6530ca8f379e6a4ed402c8 /gatchat/ppp_lcp.c | |
parent | 1dd85809307b200bfe87e6a71c68fa244cb15bc6 (diff) | |
download | ofono-a88662d23c45f49d9af5a508d4d0a778950b2420.tar.bz2 |
gatchat: implement PAP authentication
Make the authentication method configurable, CHAP or PAP, defaulting to
CHAP (i.e.: previous behaviour).
Implementation details:
o If PAP is configured, we NAK the CHAP authentication protocol option
in LCP configuration requests and suggest PAP instead. This works
around the amusing requirement of 3GPP TS 29.061 that modems must
send a forced positive acknowledgement of the authentication method
tried (i.e.: the modem will successfully accept any CHAP handshake,
but if the network only supports PAP, the modem will hang up
when it tries and fails to activate the PDP context)
o The PAP Authenticate-Request is resent a hard-coded three times at
ten-second intervals. This may be a bit too persistent. Chances
are if it doesn't work the first time, it'll never work, but the
RFC insists that we MUST retry.
Diffstat (limited to 'gatchat/ppp_lcp.c')
-rw-r--r-- | gatchat/ppp_lcp.c | 62 |
1 files changed, 43 insertions, 19 deletions
diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c index 4f420f17..df9cd0ef 100644 --- a/gatchat/ppp_lcp.c +++ b/gatchat/ppp_lcp.c @@ -238,25 +238,49 @@ static enum rcr_result lcp_rcr(struct pppcp_data *pppcp, guint8 method = option_data[2]; guint8 *option; - if ((proto == CHAP_PROTOCOL) && (method == MD5)) - break; - - /* - * try to suggest CHAP & MD5. If we are out - * of memory, just reject. - */ - - option = g_try_malloc0(5); - if (option == NULL) - return RCR_REJECT; - - option[0] = AUTH_PROTO; - option[1] = 5; - put_network_short(&option[2], CHAP_PROTOCOL); - option[4] = MD5; - *new_options = option; - *new_len = 5; - return RCR_NAK; + switch (g_at_ppp_get_auth_method(ppp)) { + case G_AT_PPP_AUTH_METHOD_CHAP: + if (proto == CHAP_PROTOCOL && method == MD5) + break; + + /* + * Try to suggest CHAP/MD5. + * Just reject if we run out of memory. + */ + option = g_try_malloc0(5); + if (option == NULL) + return RCR_REJECT; + + option[0] = AUTH_PROTO; + option[1] = 5; + put_network_short(&option[2], CHAP_PROTOCOL); + option[4] = MD5; + *new_options = option; + *new_len = 5; + + return RCR_NAK; + + case G_AT_PPP_AUTH_METHOD_PAP: + if (proto == PAP_PROTOCOL) + break; + + /* + * Try to suggest PAP. + * Just reject if we run out of memory. + */ + option = g_try_malloc0(4); + if (option == NULL) + return RCR_REJECT; + + option[0] = AUTH_PROTO; + option[1] = 4; + put_network_short(&option[2], PAP_PROTOCOL); + *new_options = option; + *new_len = 4; + + return RCR_NAK; + } + break; } case ACCM: case PFC: |