linux下网卡的名称eth%都是保存在net_device结构中,我想修改一下网络设备的名称,在网上找了一圈也没有一个合适的命令能解决,所有的帖子都是用修改配置文件的方法,我不想用这种方法,查看linux内核源码,发现dev层提供了一个函数dev_change_name,
在用户层只要调用ioctl函数使用SIOCSIFNAME选项就可以更改了,等有时间修改一下ifconfig的源码实现这个功能。
static int dev_ifsioc(struct net *net, struct ifreq *ifr,
unsigned int cmd)
{
int err;
struct net_device *dev = __dev_get_by_name(net,
ifr->ifr_name);
const struct net_device_ops *ops;
if (!dev)
return -ENODEV;
ops = dev->netdev_ops;
switch (cmd) {
case SIOCSIFFLAGS:
return dev_change_flags(dev, ifr->ifr_flags);
case SIOCSIFMETRIC:
return -EOPNOTSUPP;
case SIOCSIFMTU:
return dev_set_mtu(dev, ifr->ifr_mtu);
case SIOCSIFHWADDR:
return dev_set_mac_address(dev,
&ifr->ifr_hwaddr);
case SIOCSIFHWBROADCAST:
if (ifr->ifr_hwaddr.sa_family !=
dev->type)
return -EINVAL;
memcpy(dev->broadcast,
ifr->ifr_hwaddr.sa_data,
min(sizeof ifr->ifr_hwaddr.sa_data, (size_t)
dev->addr_len));
call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
return 0;
case SIOCSIFMAP:
if (ops->ndo_set_config) {
if (!netif_device_present(dev))
return -ENODEV;
return ops->ndo_set_config(dev,
&ifr->ifr_map);
}
return -EOPNOTSUPP;
case SIOCADDMULTI:
if (!ops->ndo_set_rx_mode ||
ifr->ifr_hwaddr.sa_family !=
AF_UNSPEC)
return -EINVAL;
if (!netif_device_present(dev))
return -ENODEV;
return dev_mc_add_global(dev,
ifr->ifr_hwaddr.sa_data);
case SIOCDELMULTI:
if (!ops->ndo_set_rx_mode ||
ifr->ifr_hwaddr.sa_family !=
AF_UNSPEC)
return -EINVAL;
if (!netif_device_present(dev))
return -ENODEV;
return dev_mc_del_global(dev,
ifr->ifr_hwaddr.sa_data);
case SIOCSIFTXQLEN:
if (ifr->ifr_qlen < 0)
return -EINVAL;
dev->tx_queue_len =
ifr->ifr_qlen;
return 0;
case
SIOCSIFNAME:
ifr->ifr_newname[IFNAMSIZ-1]
= '\0';
return dev_change_name(dev,
ifr->ifr_newname); //使用这个选项修改网卡名称
case SIOCSHWTSTAMP:
err = net_hwtstamp_validate(ifr);
if (err)
return err;
default:
if ((cmd >= SIOCDEVPRIVATE
&&
cmd <=
SIOCDEVPRIVATE + 15) ||
cmd == SIOCBONDENSLAVE
||
cmd == SIOCBONDRELEASE
||
cmd == SIOCBONDSETHWADDR
||
cmd ==
SIOCBONDSLAVEINFOQUERY ||
cmd == SIOCBONDINFOQUERY
||
cmd == SIOCBONDCHANGEACTIVE
||
cmd == SIOCGMIIPHY ||
cmd == SIOCGMIIREG ||
cmd == SIOCSMIIREG ||
cmd == SIOCBRADDIF ||
cmd == SIOCBRDELIF ||
cmd == SIOCSHWTSTAMP ||
cmd == SIOCGHWTSTAMP ||
cmd == SIOCWANDEV) {
err = -EOPNOTSUPP;
if (ops->ndo_do_ioctl) {
if (netif_device_present(dev))
err = ops->ndo_do_ioctl(dev, ifr, cmd);
else
err = -ENODEV;
}
} else
err = -EINVAL;
}
return err;
}