summaryrefslogtreecommitdiffstats
path: root/gatchat/ppp_cp.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-04-07 15:40:02 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-04-07 16:41:49 -0500
commit5f361d7de979aaac9212b5dd596eaf71fbf3b557 (patch)
treea0f997f90536b11be61079d3a5c429bb94226cc7 /gatchat/ppp_cp.c
parent4a6a381a1d5c2932c904b021383b8d63e369aeb0 (diff)
downloadofono-5f361d7de979aaac9212b5dd596eaf71fbf3b557.tar.bz2
ppp: Add pppcp option iterators
Diffstat (limited to 'gatchat/ppp_cp.c')
-rw-r--r--gatchat/ppp_cp.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/gatchat/ppp_cp.c b/gatchat/ppp_cp.c
index 98c6635d..1c86bee4 100644
--- a/gatchat/ppp_cp.c
+++ b/gatchat/ppp_cp.c
@@ -217,6 +217,52 @@ static struct pppcp_packet *pppcp_packet_new(struct pppcp_data *data,
return packet;
}
+void ppp_option_iter_init(struct ppp_option_iter *iter,
+ const struct pppcp_packet *packet)
+{
+ iter->max = ntohs(packet->length) - CP_HEADER_SZ;
+ iter->pdata = packet->data;
+ iter->pos = 0;
+ iter->type = 0;
+ iter->len = 0;
+ iter->option_data = NULL;
+}
+
+gboolean ppp_option_iter_next(struct ppp_option_iter *iter)
+{
+ const guint8 *cur = iter->pdata + iter->pos;
+ const guint8 *end = iter->pdata + iter->max;
+
+ if (cur + 1 > end)
+ return FALSE;
+
+ if (cur + cur[1] > end)
+ return FALSE;
+
+ iter->type = cur[0];
+ iter->len = cur[1] - 2;
+ iter->option_data = cur + 2;
+
+ iter->pdata += cur[1];
+
+ return TRUE;
+}
+
+guint8 ppp_option_iter_get_type(struct ppp_option_iter *iter)
+{
+ return iter->type;
+}
+
+guint8 ppp_option_iter_get_length(struct ppp_option_iter *iter)
+{
+ return iter->len;
+}
+
+const guint8 *ppp_option_iter_get_data(struct ppp_option_iter *iter)
+{
+ return iter->option_data;
+}
+
static gboolean pppcp_timeout(gpointer user_data)
{
struct pppcp_timer_data *timer_data = user_data;