diff options
-rw-r--r-- | gatchat/ppp_cp.c | 46 | ||||
-rw-r--r-- | gatchat/ppp_cp.h | 17 |
2 files changed, 63 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; diff --git a/gatchat/ppp_cp.h b/gatchat/ppp_cp.h index 913df0f8..407cbd7e 100644 --- a/gatchat/ppp_cp.h +++ b/gatchat/ppp_cp.h @@ -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); |