Search code examples
clinuxnetwork-programmingioctlmtu

set MTU for device with multiple interfaces


I am using

ioctl(s, SIOCSIFMTU, (caddr_t)&ifr)

to change the MTU for an interface.

code is similar to this

struct ifreq ifr; 
ifr.ifr_addr.sa_family = AF_INET;
//iap->ifa_name is bond1:xx
strncpy(ifr.ifr_name, iap->ifa_name, sizeof(ifr.ifr_name));
ifr.ifr_mtu = 1492; 
ioctl(s, SIOCSIFMTU, (caddr_t)&ifr)

My problem is that the device has multiple interfaces and that the MTU is set to 1492 for all of these. I want to do it specifically for only one interface, leaving all the others not impacted. How can I do it?

bond1:43 Link encap:Ethernet HWaddr 00:0E:0C:E4:C5:45
inet addr:10.7.181.59 Bcast:10.7.181.255 Mask:255.255.255.0 UP BROADCAST RUNNING MASTER MULTICAST MTU:1492 Metric:1

bond1:48 Link encap:Ethernet HWaddr 00:0E:0C:E4:C5:45
inet addr:10.7.181.60 Bcast:10.7.181.255 Mask:255.255.255.0 UP BROADCAST RUNNING MASTER MULTICAST MTU:1492 Metric:1

bond1:49 Link encap:Ethernet HWaddr 00:0E:0C:E4:C5:45
inet addr:10.7.181.61 Bcast:10.7.181.255 Mask:255.255.255.0 UP BROADCAST RUNNING MASTER MULTICAST MTU:1492 Metric:1


Solution

  • If you want to update MTU for the specific interface you shallset ifr_name field of the struct ifreq to the name of the interface

    EDIT: You problem is in the name of the interface. The number after the column in the interface name is just an alias. Actually, you don't have several different interfaces it's the same interface. That is why you setting is applied onto all interfaces with name "bond:xx"