diff options
author | Kristen Carlson Accardi <kristen@linux.intel.com> | 2010-04-22 15:49:15 -0700 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-04-22 17:56:31 -0500 |
commit | e98fb9a6bde592ec78fec49bdb3cbf614c2af457 (patch) | |
tree | cc9477bae2c93913ce64c3d23c40eb0da885cdcd /gatchat/ppp_net.c | |
parent | 6e28fd9396243540f769630aebe3c8dab978d56c (diff) | |
download | ofono-e98fb9a6bde592ec78fec49bdb3cbf614c2af457.tar.bz2 |
ppp: change MTU on TUN device when MRU option received
Diffstat (limited to 'gatchat/ppp_net.c')
-rw-r--r-- | gatchat/ppp_net.c | 23 |
1 files changed, 20 insertions, 3 deletions
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) |