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)