summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gatchat/gatppp.c3
-rw-r--r--gatchat/ppp.h2
-rw-r--r--gatchat/ppp_net.c23
3 files changed, 23 insertions, 5 deletions
diff --git a/gatchat/gatppp.c b/gatchat/gatppp.c
index 705a298f..fc6769c3 100644
--- a/gatchat/gatppp.c
+++ b/gatchat/gatppp.c
@@ -411,7 +411,8 @@ void ppp_net_up_notify(GAtPPP *ppp, const char *ip,
{
ppp->net = ppp_net_new(ppp);
- ppp_net_set_mtu(ppp->net, ppp->mtu);
+ if (ppp_net_set_mtu(ppp->net, ppp->mtu) == FALSE)
+ g_printerr("Unable to set MTU\n");
if (ppp->connect_cb == NULL)
return;
diff --git a/gatchat/ppp.h b/gatchat/ppp.h
index 07483a91..c7e6d246 100644
--- a/gatchat/ppp.h
+++ b/gatchat/ppp.h
@@ -103,7 +103,7 @@ struct ppp_net *ppp_net_new(GAtPPP *ppp);
const char *ppp_net_get_interface(struct ppp_net *net);
void ppp_net_process_packet(struct ppp_net *net, guint8 *packet);
void ppp_net_free(struct ppp_net *net);
-void ppp_net_set_mtu(struct ppp_net *net, guint16 mtu);
+gboolean ppp_net_set_mtu(struct ppp_net *net, guint16 mtu);
/* PPP functions related to main GAtPPP object */
void ppp_debug(GAtPPP *ppp, const char *str);
diff --git a/gatchat/ppp_net.c b/gatchat/ppp_net.c
index c1f2eb4c..b8b33554 100644
--- a/gatchat/ppp_net.c
+++ b/gatchat/ppp_net.c
@@ -48,12 +48,29 @@ struct ppp_net {
gint mtu;
};
-void ppp_net_set_mtu(struct ppp_net *net, guint16 mtu)
+gboolean ppp_net_set_mtu(struct ppp_net *net, guint16 mtu)
{
- if (net == NULL)
- return;
+ struct ifreq ifr;
+ int sock;
+ int rc;
+
+ if (net == NULL || mtu >= MAX_PACKET)
+ return FALSE;
net->mtu = mtu;
+
+ sock = socket(AF_INET, SOCK_DGRAM, 0);
+ if (sock < 0)
+ return FALSE;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, net->if_name, sizeof(ifr.ifr_name));
+ ifr.ifr_mtu = mtu;
+
+ rc = ioctl(sock, SIOCSIFMTU, (caddr_t) &ifr);
+
+ close(sock);
+ return (rc < 0) ? FALSE: TRUE;
}
void ppp_net_process_packet(struct ppp_net *net, guint8 *packet)