ppp: Add pppcp option iterators

This commit is contained in:
Denis Kenzior 2010-04-07 15:40:02 -05:00
parent 4a6a381a1d
commit 5f361d7de9
2 changed files with 63 additions and 0 deletions

View File

@ -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;

View File

@ -20,6 +20,7 @@
*/
struct pppcp_data;
struct ppp_option_iter;
/* option format */
struct ppp_option {
@ -48,6 +49,15 @@ enum pppcp_code {
PPPCP_CODE_TYPE_DISCARD_REQUEST
};
struct ppp_option_iter {
guint16 max;
guint16 pos;
const guint8 *pdata;
guint8 type;
guint8 len;
const guint8 *option_data;
};
struct pppcp_action {
void (*this_layer_up)(struct pppcp_data *data);
void (*this_layer_down)(struct pppcp_data *data);
@ -66,6 +76,13 @@ struct pppcp_packet {
guint8 data[0];
} __attribute__((packed));
void ppp_option_iter_init(struct ppp_option_iter *iter,
const struct pppcp_packet *packet);
gboolean ppp_option_iter_next(struct ppp_option_iter *iter);
guint8 ppp_option_iter_get_type(struct ppp_option_iter *iter);
guint8 ppp_option_iter_get_length(struct ppp_option_iter *iter);
const guint8 *ppp_option_iter_get_data(struct ppp_option_iter *iter);
struct pppcp_data *pppcp_new(GAtPPP *ppp, guint16 proto,
const struct pppcp_action *action);
void pppcp_free(struct pppcp_data *data);