ppp: implement ppp_packet_new
PATCH 1/1 ppp: implement ppp_packet_new
--- gatchat/gatppp.c | 15 +++++++++++++++ gatchat/ppp.h | 1 + gatchat/ppp_auth.c | 4 +--- gatchat/ppp_cp.c | 5 +---- gatchat/ppp_net.c | 26 +++++++++++++++++--------- 5 files changed, 35 insertions(+), 16 deletions(-)
gatchat/gatppp.c +15 -0
@@ -84,6 +84,21 @@ void ppp_debug(GAtPPP *ppp, const char *str) ppp->debugf (str, ppp->debug_data); } +struct ppp_header *ppp_packet_new (gsize infolen,guint16 protocol) +{ +struct ppp_header *ppp_packet; + + ppp_packet =g_try_malloc0 (infolen +sizeof (*ppp_packet)); +if (ppp_packet ==NULL ) +return NULL ; + + ppp_packet->proto =htons (protocol); + ppp_packet->address =PPP_ADDR_FIELD ; + ppp_packet->control =PPP_CTRL ; + +return ppp_packet; +} +/* * Silently discard packets which are received when they shouldn't be */
gatchat/ppp.h +1 -0
@@ -114,3 +114,4 @@ void ppp_lcp_finished_notify(GAtPPP *ppp);void ppp_set_recv_accm (GAtPPP *ppp,guint32 accm);void ppp_set_xmit_accm (GAtPPP *ppp,guint32 accm);void ppp_set_mtu (GAtPPP *ppp,const guint8 *data); +struct ppp_header *ppp_packet_new (gsize infolen,guint16 protocol);
gatchat/ppp_auth.c +1 -3
@@ -83,12 +83,10 @@ static void chap_process_challenge(struct ppp_chap *chap, const guint8 *packet)*/ digest_len =g_checksum_type_get_length (chap->method); response_length = digest_len +sizeof (*header) +1 ; - ppp_packet =g_try_malloc0 (response_length +sizeof (struct ppp_header )); + ppp_packet =ppp_packet_new (response_length,CHAP_PROTOCOL );if (!ppp_packet) goto challenge_out; -/* add our protocol information */ - ppp_packet->proto =htons (CHAP_PROTOCOL ); response = (struct chap_header *) &ppp_packet->info;if (response) { response->code =RESPONSE ;
gatchat/ppp_cp.c +1 -4
@@ -204,13 +204,10 @@ static struct pppcp_packet *pppcp_packet_new(struct pppcp_data *data,struct ppp_header *ppp_packet;guint16 packet_length = bufferlen +sizeof (*packet); - ppp_packet =g_try_malloc0 (packet_length +sizeof (*ppp_packet)); + ppp_packet =ppp_packet_new (packet_length, data->driver->proto);if (!ppp_packet)return NULL ; -/* add our protocol information */ - ppp_packet->proto =htons (data->driver->proto); -/* advance past protocol to add CP header information */ packet = (struct pppcp_packet *) (ppp_packet->info);
gatchat/ppp_net.c +17 -9
@@ -46,6 +46,7 @@ struct ppp_net {GIOChannel *channel;gint watch;gint mtu; +struct ppp_header *ppp_packet; };gboolean ppp_net_set_mtu (struct ppp_net *net,guint16 mtu)
@@ -95,23 +96,21 @@ static gboolean ppp_net_callback(GIOChannel *channel, GIOCondition cond, {struct ppp_net *net = (struct ppp_net *) userdata;GIOStatus status; -gchar buf[MAX_PACKET +sizeof (struct ppp_header )];gsize bytes_read;GError *error =NULL ; -struct ppp_header *ppp = (struct ppp_header *) buf; +gchar *buf = (gchar *) net->ppp_packet->info;if (cond & (G_IO_NVAL |G_IO_ERR |G_IO_HUP ))return FALSE;if (cond &G_IO_IN ) {/* leave space to add PPP protocol field */ - status =g_io_channel_read_chars (channel, - buf +sizeof (struct ppp_header ), net->mtu, - &bytes_read, &error); -if (bytes_read >0 ) { - ppp->proto =htons (PPP_IP_PROTO ); -ppp_transmit (net->ppp, (guint8 *) buf, bytes_read); - } + status =g_io_channel_read_chars (channel, buf, net->mtu, + &bytes_read, &error); +if (bytes_read >0 ) +ppp_transmit (net->ppp, (guint8 *) net->ppp_packet, + bytes_read); +if (status !=G_IO_STATUS_NORMAL && status !=G_IO_STATUS_AGAIN )return FALSE; }
@@ -135,6 +134,12 @@ struct ppp_net *ppp_net_new(GAtPPP *ppp)if (net ==NULL )return NULL ; + net->ppp_packet =ppp_packet_new (MAX_PACKET ,PPP_IP_PROTO ); +if (net->ppp_packet ==NULL ) { +g_free (net); +return NULL ; + } +/* open a tun interface */ fd =open ("/dev/net/tun" ,O_RDWR );if (fd <0 )
@@ -176,6 +181,8 @@ error:if (fd >=0 )close (fd); +g_free (net->if_name); +g_free (net->ppp_packet);g_free (net);return NULL ; }
@@ -185,6 +192,7 @@ void ppp_net_free(struct ppp_net *net)g_source_remove (net->watch);g_io_channel_unref (net->channel); +g_free (net->ppp_packet);g_free (net->if_name);g_free (net); }
Signature · 1 line
1.6.6.1