mirror of git://git.sysmocom.de/ofono
ppp: Add pppcp option iterators
This commit is contained in:
parent
4a6a381a1d
commit
5f361d7de9
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue