| /* |
| * |
| * PPP library with GLib integration |
| * |
| * Copyright (C) 2009-2011 Intel Corporation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| * |
| */ |
| |
| struct pppcp_data; |
| struct ppp_option_iter; |
| |
| /* option format */ |
| struct ppp_option { |
| guint8 type; |
| guint8 length; |
| guint8 data[0]; |
| }; |
| |
| enum rcr_result { |
| RCR_ACCEPT, |
| RCR_REJECT, |
| RCR_NAK, |
| }; |
| |
| enum pppcp_code { |
| PPPCP_CODE_TYPE_CONFIGURE_REQUEST = 1, |
| PPPCP_CODE_TYPE_CONFIGURE_ACK, |
| PPPCP_CODE_TYPE_CONFIGURE_NAK, |
| PPPCP_CODE_TYPE_CONFIGURE_REJECT, |
| PPPCP_CODE_TYPE_TERMINATE_REQUEST, |
| PPPCP_CODE_TYPE_TERMINATE_ACK, |
| PPPCP_CODE_TYPE_CODE_REJECT, |
| PPPCP_CODE_TYPE_PROTOCOL_REJECT, |
| PPPCP_CODE_TYPE_ECHO_REQUEST, |
| PPPCP_CODE_TYPE_ECHO_REPLY, |
| PPPCP_CODE_TYPE_DISCARD_REQUEST |
| }; |
| |
| struct pppcp_packet { |
| guint8 code; |
| guint8 identifier; |
| guint16 length; |
| guint8 data[0]; |
| } __attribute__((packed)); |
| |
| struct ppp_option_iter { |
| guint16 max; |
| guint16 pos; |
| const guint8 *pdata; |
| guint8 type; |
| guint8 len; |
| const guint8 *option_data; |
| }; |
| |
| struct pppcp_proto { |
| guint16 proto; |
| const char *name; |
| guint16 supported_codes; |
| void (*this_layer_up)(struct pppcp_data *data); |
| void (*this_layer_down)(struct pppcp_data *data); |
| void (*this_layer_started)(struct pppcp_data *data); |
| void (*this_layer_finished)(struct pppcp_data *data); |
| /* Remote side acked these options, we can now use them */ |
| void (*rca)(struct pppcp_data *pppcp, const struct pppcp_packet *pkt); |
| /* |
| * Remote side sent us an Conf-Req-Nak or Conf-Req-Rej. The protocol |
| * driver should examine the packet and update its options accordingly, |
| * then use set_local_options to set a new set of options to try |
| * before returning |
| */ |
| void (*rcn_nak)(struct pppcp_data *pppcp, |
| const struct pppcp_packet *pkt); |
| void (*rcn_rej)(struct pppcp_data *pppcp, |
| const struct pppcp_packet *pkt); |
| /* |
| * Remote side has sent us a request with its options, return whether |
| * we should ack / nak / rej these options. In the case of nak / rej, |
| * the list of options to be sent to the peer is given in the |
| * new_options & new_len out arguments |
| */ |
| enum rcr_result (*rcr)(struct pppcp_data *pppcp, |
| const struct pppcp_packet *pkt, |
| guint8 **new_options, guint16 *new_len); |
| }; |
| |
| 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, const struct pppcp_proto *proto, |
| gboolean dormant, guint max_failure); |
| void pppcp_free(struct pppcp_data *data); |
| |
| void pppcp_set_data(struct pppcp_data *pppcp, gpointer data); |
| gpointer pppcp_get_data(struct pppcp_data *pppcp); |
| GAtPPP *pppcp_get_ppp(struct pppcp_data *pppcp); |
| |
| guint8 pppcp_get_code(const guint8 *data); |
| |
| void pppcp_set_local_options(struct pppcp_data *data, |
| const guint8 *options, |
| guint16 len); |
| |
| void pppcp_process_packet(gpointer priv, const guint8 *new_packet, gsize len); |
| void pppcp_send_protocol_reject(struct pppcp_data *data, |
| const guint8 *rejected_packet, gsize len); |
| void pppcp_signal_open(struct pppcp_data *data); |
| void pppcp_signal_close(struct pppcp_data *data); |
| void pppcp_signal_up(struct pppcp_data *data); |
| void pppcp_signal_down(struct pppcp_data *data); |