summaryrefslogtreecommitdiffstats
path: root/gatchat
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-04-02 15:10:29 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-04-02 15:11:48 -0500
commit2c466c8baf5948d72abce63683d70c0777a9e289 (patch)
treee8e5131462ee5ec2acb33c7e0dc55e9c101a0f30 /gatchat
parent3c39543cd6c0e3f08dac843cecb9cc7131283f0f (diff)
downloadofono-2c466c8baf5948d72abce63683d70c0777a9e289.tar.bz2
Refactor: Get rid of packet handler registrations
There are only about 4 protocols that the current ppp code handles and it is doubtful that it will grow much more. There's no point in having an extensive packet handler registration framework.
Diffstat (limited to 'gatchat')
-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;
}