summaryrefslogtreecommitdiffstats
path: root/gatchat/ppp_ipcp.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-04-07 16:40:49 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-04-07 16:41:49 -0500
commit4e01f9921e527a4e360a43eff6f9b8bcda70a5c5 (patch)
treef4cba2b1ac09fb244bcefaddc06c223b50c96016 /gatchat/ppp_ipcp.c
parent5f361d7de979aaac9212b5dd596eaf71fbf3b557 (diff)
downloadofono-4e01f9921e527a4e360a43eff6f9b8bcda70a5c5.tar.bz2
ppp: Add rca callback
When the other side acks our options, then let us apply these options locally and start using them
Diffstat (limited to 'gatchat/ppp_ipcp.c')
-rw-r--r--gatchat/ppp_ipcp.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/gatchat/ppp_ipcp.c b/gatchat/ppp_ipcp.c
index 19bd4fea..b8610666 100644
--- a/gatchat/ppp_ipcp.c
+++ b/gatchat/ppp_ipcp.c
@@ -108,6 +108,26 @@ static void ipcp_finished(struct pppcp_data *data)
g_print("ipcp finished\n");
}
+static void ipcp_rca(struct pppcp_data *pppcp,
+ const struct pppcp_packet *packet)
+{
+ struct ipcp_data *ipcp = pppcp_get_data(pppcp);
+ struct ppp_option_iter iter;
+
+ ppp_option_iter_init(&iter, packet);
+
+ while (ppp_option_iter_next(&iter) == TRUE) {
+ switch (ppp_option_iter_get_type(&iter)) {
+ case IP_ADDRESS:
+ memcpy(ipcp->ip_address,
+ ppp_option_iter_get_data(&iter), 4);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
/*
* Scan the option to see if it is acceptable, unacceptable, or rejected
*/
@@ -136,9 +156,6 @@ static void ipcp_option_process(struct pppcp_data *pppcp,
struct ipcp_data *ipcp = pppcp_get_data(pppcp);
switch (option->type) {
- case IP_ADDRESS:
- memcpy(ipcp->ip_address, option->data, 4);
- break;
case PRIMARY_DNS_SERVER:
memcpy(ipcp->primary_dns, option->data, 4);
break;
@@ -162,6 +179,7 @@ struct pppcp_action ipcp_action = {
.this_layer_down = ipcp_down,
.this_layer_started = ipcp_started,
.this_layer_finished = ipcp_finished,
+ .rca = ipcp_rca,
.option_scan = ipcp_option_scan,
.option_process = ipcp_option_process,
};