summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gatchat/gatppp.c49
-rw-r--r--gatchat/ppp.h11
-rw-r--r--gatchat/ppp_auth.c13
-rw-r--r--gatchat/ppp_ipcp.c8
-rw-r--r--gatchat/ppp_lcp.c8
-rw-r--r--gatchat/ppp_net.c11
6 files changed, 26 insertions, 74 deletions
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;
}