diff --git a/gatchat/gatppp.c b/gatchat/gatppp.c index fd0a3f41..67aa3d95 100644 --- a/gatchat/gatppp.c +++ b/gatchat/gatppp.c @@ -46,13 +46,6 @@ struct frame_buffer { guint8 bytes[0]; }; -static GList *packet_handlers = NULL; - -void ppp_register_packet_handler(struct ppp_packet_handler *handler) -{ - packet_handlers = g_list_append(packet_handlers, handler); -} - /* * FCS lookup table copied from rfc1662. */ @@ -180,39 +173,35 @@ static struct frame_buffer *ppp_encode(GAtPPP *ppp, guint8 *data, int len) return fb; } -static gint is_proto_handler(gconstpointer a, gconstpointer b) -{ - const struct ppp_packet_handler *h = a; - const guint16 proto = (guint16) GPOINTER_TO_UINT(b); - - if (h->proto == proto) - return 0; - else - return -1; -} - /* called when we have received a complete ppp frame */ static void ppp_recv(GAtPPP *ppp, struct frame_buffer *frame) { guint protocol = ppp_proto(frame->bytes); guint8 *packet = ppp_info(frame->bytes); - struct ppp_packet_handler *h; - GList *list; if (!frame) return; - /* - * check to see if we have a protocol handler - * registered for this packet - */ - list = g_list_find_custom(packet_handlers, - GUINT_TO_POINTER(protocol), is_proto_handler); - if (list) { - h = list->data; - h->handler(h->priv, packet); - } else + switch (protocol) { + case PPP_IP_PROTO: + ppp_net_process_packet(ppp->net, packet); + break; + case LCP_PROTOCOL: + pppcp_process_packet(ppp->lcp, packet); + break; + case IPCP_PROTO: + pppcp_process_packet(ppp->ipcp, packet); + break; + case CHAP_PROTOCOL: + if (ppp->auth->proto == protocol && + ppp->auth->proto_data != NULL) { + ppp->auth->process_packet(ppp->auth, packet); + break; + } + /* Otherwise fall through */ + default: lcp_protocol_reject(ppp->lcp, frame->bytes, frame->len); + }; g_free(frame); } diff --git a/gatchat/ppp.h b/gatchat/ppp.h index 1262c120..fa3749cf 100644 --- a/gatchat/ppp.h +++ b/gatchat/ppp.h @@ -55,12 +55,6 @@ enum ppp_event { PPP_DOWN }; -struct ppp_packet_handler { - guint16 proto; - void (*handler)(gpointer priv, guint8 *packet); - gpointer priv; -}; - struct ppp_header { guint16 proto; guint8 info[0]; @@ -144,7 +138,6 @@ struct _GAtPPP { }; void ppp_generate_event(GAtPPP *ppp, enum ppp_event event); -void ppp_register_packet_handler(struct ppp_packet_handler *handler); void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen); void ppp_set_auth(GAtPPP *ppp, guint8 *auth_data); void ppp_set_recv_accm(GAtPPP *ppp, guint32 accm); @@ -159,6 +152,7 @@ void lcp_open(struct pppcp_data *data); void lcp_establish(struct pppcp_data *data); void lcp_terminate(struct pppcp_data *data); void lcp_protocol_reject(struct pppcp_data *lcp, guint8 *packet, gsize len); +void auth_process_packet(struct auth_data *data, guint8 *new_packet); void auth_set_credentials(struct auth_data *data, const char *username, const char *passwd); void auth_set_proto(struct auth_data *data, guint16 proto, guint8 method); @@ -166,7 +160,8 @@ struct auth_data *auth_new(GAtPPP *ppp); void auth_free(struct auth_data *auth); struct ppp_net_data *ppp_net_new(GAtPPP *ppp); void ppp_net_open(struct ppp_net_data *data); -void ppp_net_free(struct ppp_net_data *data); +void ppp_net_process_packet(struct ppp_net_data *data, guint8 *packet); void ppp_net_close(struct ppp_net_data *data); +void ppp_net_free(struct ppp_net_data *data); struct pppcp_data *ipcp_new(GAtPPP *ppp); void ipcp_free(struct pppcp_data *data); diff --git a/gatchat/ppp_auth.c b/gatchat/ppp_auth.c index 78cde4b8..77fa06d2 100644 --- a/gatchat/ppp_auth.c +++ b/gatchat/ppp_auth.c @@ -135,9 +135,8 @@ static void chap_process_failure(struct auth_data *data, guint8 *packet) /* * parse the packet */ -static void chap_process_packet(gpointer priv, guint8 *new_packet) +static void chap_process_packet(struct auth_data *data, guint8 *new_packet) { - struct auth_data *data = priv; guint8 code = new_packet[0]; switch (code) { @@ -162,11 +161,6 @@ static void chap_process_packet(gpointer priv, guint8 *new_packet) } } -struct ppp_packet_handler chap_packet_handler = { - .proto = CHAP_PROTOCOL, - .handler = chap_process_packet, -}; - static void chap_free(struct auth_data *auth) { /* TBD unregister protocol handler */ @@ -192,9 +186,6 @@ static struct chap_data *chap_new(struct auth_data *auth, guint8 method) break; } - /* register packet handler for CHAP protocol */ - chap_packet_handler.priv = auth; - ppp_register_packet_handler(&chap_packet_handler); return data; } @@ -205,7 +196,9 @@ void auth_set_proto(struct auth_data *data, guint16 proto, guint8 method) switch (proto) { case CHAP_PROTOCOL: + data->proto = proto; data->proto_data = chap_new(data, method); + data->process_packet = chap_process_packet; break; default: g_print("Unknown auth protocol 0x%x\n", proto); diff --git a/gatchat/ppp_ipcp.c b/gatchat/ppp_ipcp.c index c9a902ea..394001e4 100644 --- a/gatchat/ppp_ipcp.c +++ b/gatchat/ppp_ipcp.c @@ -183,11 +183,6 @@ static const char *ipcp_option_strings[256] = { [SECONDARY_NBNS_SERVER] = "Secondary NBNS Server Address", }; -struct ppp_packet_handler ipcp_packet_handler = { - .proto = IPCP_PROTO, - .handler = pppcp_process_packet, -}; - struct pppcp_data *ipcp_new(GAtPPP *ppp) { struct ipcp_data *data; @@ -223,9 +218,6 @@ struct pppcp_data *ipcp_new(GAtPPP *ppp) ipcp_option->length= 6; pppcp_add_config_option(pppcp, ipcp_option); - /* register packet handler for IPCP protocol */ - ipcp_packet_handler.priv = pppcp; - ppp_register_packet_handler(&ipcp_packet_handler); return pppcp; } diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c index 75ec6196..76c6759b 100644 --- a/gatchat/ppp_lcp.c +++ b/gatchat/ppp_lcp.c @@ -170,11 +170,6 @@ static const char *lcp_option_strings[256] = { [13] = "Callback", }; -struct ppp_packet_handler lcp_packet_handler = { - .proto = LCP_PROTOCOL, - .handler = pppcp_process_packet, -}; - struct pppcp_action lcp_action = { .this_layer_up = lcp_up, .this_layer_down = lcp_down, @@ -255,8 +250,5 @@ struct pppcp_data *lcp_new(GAtPPP *ppp) option->length = 6; pppcp_add_config_option(pppcp, option); - /* register packet handler for LCP protocol */ - lcp_packet_handler.priv = pppcp; - ppp_register_packet_handler(&lcp_packet_handler); return pppcp; } diff --git a/gatchat/ppp_net.c b/gatchat/ppp_net.c index 79d354db..908da84f 100644 --- a/gatchat/ppp_net.c +++ b/gatchat/ppp_net.c @@ -41,9 +41,8 @@ /* XXX should be maximum IP Packet size */ #define MAX_PACKET 1500 -static void ip_process_packet(gpointer priv, guint8 *packet) +void ppp_net_process_packet(struct ppp_net_data *data, guint8 *packet) { - struct ppp_net_data *data = priv; GError *error = NULL; GIOStatus status; gsize bytes_written; @@ -144,11 +143,6 @@ void ppp_net_open(struct ppp_net_data *data) ppp_net_callback, (gpointer) data); } -struct ppp_packet_handler ip_packet_handler = { - .proto = PPP_IP_PROTO, - .handler = ip_process_packet, -}; - struct ppp_net_data *ppp_net_new(GAtPPP *ppp) { struct ppp_net_data *data; @@ -159,9 +153,6 @@ struct ppp_net_data *ppp_net_new(GAtPPP *ppp) data->ppp = ppp; - /* register packet handler for IP protocol */ - ip_packet_handler.priv = data; - ppp_register_packet_handler(&ip_packet_handler); return data; }