diff options
author | Kristen Carlson Accardi <kristen@linux.intel.com> | 2010-04-02 22:27:00 -0700 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-04-05 09:45:14 -0500 |
commit | 9905245e796a51c8425c70fdb6c760ab26ec7176 (patch) | |
tree | 79b348e60a9f4ee83fff564b78aed54e4a907999 /gatchat/ppp_cp.c | |
parent | c2fb0a16305bf7156cc4e98b9642f37b0e2342d3 (diff) | |
download | ofono-9905245e796a51c8425c70fdb6c760ab26ec7176.tar.bz2 |
ppp: implement Max-Failure counter
put a cap on the number of Configure-Nak packets we send.
Diffstat (limited to 'gatchat/ppp_cp.c')
-rw-r--r-- | gatchat/ppp_cp.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/gatchat/ppp_cp.c b/gatchat/ppp_cp.c index 63d724d8..c5af89a6 100644 --- a/gatchat/ppp_cp.c +++ b/gatchat/ppp_cp.c @@ -232,6 +232,15 @@ static void copy_option(gpointer data, gpointer user_data) *location += option->length; } +static void reject_option(gpointer data, gpointer user_data) +{ + struct ppp_option *option = data; + struct pppcp_data *pppcp = user_data; + + pppcp->rejected_options = + g_list_append(pppcp->rejected_options, option); +} + static void print_option(gpointer data, gpointer user_data) { struct ppp_option *option = data; @@ -309,6 +318,8 @@ static void pppcp_send_configure_ack(struct pppcp_data *data, pppcp_trace(data); + data->failure_counter = 0; + g_list_foreach(data->acceptable_options, print_option, data); /* subtract for header. */ @@ -341,6 +352,16 @@ static void pppcp_send_configure_nak(struct pppcp_data *data, guint8 olength; guint8 *odata; + /* + * if we have exceeded our Max-Failure counter, we need + * to convert all packets to Configure-Reject + */ + if (data->failure_counter >= data->max_failure) { + g_list_foreach(data->unacceptable_options, reject_option, data); + g_list_free(data->unacceptable_options); + data->unacceptable_options = NULL; + } + /* if we have any rejected options, send a config-reject */ if (g_list_length(data->rejected_options)) { pppcp_trace(data); @@ -389,6 +410,7 @@ static void pppcp_send_configure_nak(struct pppcp_data *data, ntohs(packet->length)); pppcp_packet_free(packet); + data->failure_counter++; } } |