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.
This commit is contained in:
Denis Kenzior 2010-04-02 15:10:29 -05:00
parent 3c39543cd6
commit 2c466c8baf
6 changed files with 26 additions and 74 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}