summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristen Carlson Accardi <kristen@linux.intel.com>2010-04-22 15:49:15 -0700
committerDenis Kenzior <denkenz@gmail.com>2010-04-22 17:56:31 -0500
commite98fb9a6bde592ec78fec49bdb3cbf614c2af457 (patch)
treecc9477bae2c93913ce64c3d23c40eb0da885cdcd
parent6e28fd9396243540f769630aebe3c8dab978d56c (diff)
downloadofono-e98fb9a6bde592ec78fec49bdb3cbf614c2af457.tar.bz2
ppp: change MTU on TUN device when MRU option received
-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)