【问题标题】:set MTU for device with multiple interfaces为具有多个接口的设备设置 MTU
【发布时间】:2011-09-11 13:27:46
【问题描述】:

我正在使用

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

更改接口的 MTU。

代码与此类似

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)

我的问题是设备有多个接口并且 MTU 设置为 1492 对于所有这些。我只想专门为一个接口做这件事,而其他所有接口都不受影响。我该怎么做?

bond1:43 链路封装:以太网 HWaddr 00:0E:0C:E4:C5:45
inet 地址:10.7.181.59 广播:10.7.181.255 掩码:255.255.255.0 UP BROADCAST RUNNING MASTER MULTICAST MTU:1492 Metric:1

bond1:48 链路封装:以太网 HWaddr 00:0E:0C:E4:C5:45
inet 地址:10.7.181.60 广播:10.7.181.255 掩码:255.255.255.0 UP BROADCAST RUNNING MASTER MULTICAST MTU:1492 Metric:1

bond1:49 链路封装:以太网 HWaddr 00:0E:0C:E4:C5:45
inet 地址:10.7.181.61 广播:10.7.181.255 掩码:255.255.255.0 UP BROADCAST RUNNING MASTER MULTICAST MTU:1492 Metric:1

【问题讨论】:

    标签: c linux network-programming ioctl mtu


    【解决方案1】:

    如果要更新特定接口的 MTU,应将 struct ifreqifr_name 字段设置为接口名称

    编辑:您的问题出在界面名称上。接口名称中列后面的数字只是一个别名。实际上,您没有几个不同的接口,它是同一个接口。这就是为什么您的设置应用于名称为 "bond:xx"

    的所有接口

    【讨论】:

    • 我正在这样做。检查 strncpy(ifr.ifr_name, iap->ifa_name, sizeof(ifr.ifr_name));但是还是不行
    • 抱歉造成误会。接口名称的问题。查看更新的答案。
    • 很遗憾,您无法修复它,因为它是具有相同 MAC 地址和其他属性的相同接口。唯一的事情就是使用不同的物理接口。
    【解决方案2】:

    这可能有效。先获取Alias接口,然后设置MTU。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多