Linux系统网络设备启动和禁止“ifconfig eth0 up/down”命令的跟踪

本文从用户熟知的Linux命令`ifconfig eth0 up/down`出发,跟踪其在内核中的执行过程。通过分析源码,揭示了`ifconfig`如何设置或清除网络设备的IFF_UP标志,以及这些操作如何触发内核中的`dev_open`和`dev_close`函数。此外,还介绍了网络设备通知链netdev_chain的注册和注销。最后,以ti的网卡驱动为例,展示了启动网卡时的函数调用流程,直至与PHY芯片的交互。 " 114017033,10535219,使用Python对接钉钉机器人实现自动消息推送,"['对接钉钉', '消息推送', 'API接口', '自动化']
摘要由CSDN通过智能技术生成

前面文章讲了Linux系统的ethtool框架的一些东西,是从用户空间可以直观认识到的地方入手。同样,本文从Linux系统绝大部分人都熟悉的“ifconfig eth0 up”命令来跟踪一下此命令在内核中的发生了什么事情。由于ifconfig启动(up)和禁止(down)网络设备很相似,就放到一起讲了。

首先从ifconfig的源码入手,我下载的源码地址是http://www.tazenda.demon.co.uk/phil/net-tools/。这个网站上还有大量很有用的工具的源码,源码分布符合Linux的系统目录,有兴趣的可以去看看。

在我们输入up或down时,对应的代码如下:

[cpp]  view plain   copy
 
  1. main()  
  2. {  
  3.      if (!strcmp(*spp, "up")) {  
  4.          goterr |= set_flag(ifr.ifr_name, (IFF_UP | IFF_RUNNING));  
  5.          spp++;  
  6.          continue;  
  7.      }  
  8.      if (!strcmp(*spp, "down")) {  
  9.          goterr |= clr_flag(ifr.ifr_name, IFF_UP);  
  10.          spp++;  
  11.          continue;  
  12.      }  
  13. }  

很简单,就是根据用户的输入来标志IFF_UP参考。当up时,使用set_flag置位IFF_UP和IFF_RUNNING,当down时,使用clr_flag清除IFF_UP。Linux的这种思想值得学习,其实对于内核来讲,真的就是通过IFF_UP标志来判断网卡的使能和禁止的。

来看设置标志的set_flag函数:

[cpp]  view plain   copy
 
  1. static int set_flag(char *ifname, short flag)  
  2. {  
  3.     struct ifreq ifr;  
  4.   
  5.     safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ);  
  6.     if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) {  
  7.      fprintf(stderr, _("%s: unknown interface: %s\n"),  
  8.           ifname,     strerror(errno));  
  9.      return (-1);  
  10.     }  
  11.     safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ);  
  12.     ifr.ifr_flags |= flag;  
  13.     if (ioctl(skfd, SIOCSIFFLAGS, &ifr) < 0) {  
  14.      perror("SIOCSIFFLAGS");  
  15.      return -1;  
  16.     }  
  17.     return (0);  
  18. }  

以及清除标志的clr_flag函数:

[cpp]  view plain   copy
 
  1. static int clr_flag(char *ifname, short flag)  
  2. {  
  3.     struct ifreq ifr;  
  4.     int fd;  
  5.   
  6.     if (strchr(ifname, ':')) {  
  7.         /* This is a v4 alias interface.  Downing it via a socket for 
  8.         another AF may have bad consequences. */  
  9.         fd = get_socket_for_af(AF_INET);  
  10.      if (fd < 0) {  
  11.          fprintf(stderr, _("No support for INET on this system.\n"));  
  12.          return -1;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值