ppp: change MTU on TUN device when MRU option received

This commit is contained in:
Kristen Carlson Accardi 2010-04-22 15:49:15 -07:00 committed by Denis Kenzior
parent 6e28fd9396
commit e98fb9a6bd
3 changed files with 23 additions and 5 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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)