网络link状态检测

简介: 网络link状态检测

Linux系统提供了两类ioctl系统调用SIOCETHTOOL和SIOCXMIIXXX,用于控制或者获取网卡PHY的状态。这两类系统调用的实现取决于PHY驱动中对应ioctl的实现,一般的PHY驱动都会实现至少其中的一类。下面以获取网卡的Link状态来说明这两类系统调用的使用。代码



#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <linux/mii.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/ioctl.h>

#include <net/if.h>

#include <linux/sockios.h>

#include <linux/types.h>

#include <netinet/in.h>

 

static int detect_ethtool(int skfd, char *ifname);

static int detect_mii(int skfd, char *ifname);

#define MII_BMSR            0x01        /* Basic mode status register  */

#define BMSR_JCD                0x0002  /* Jabber detected             */

#define BMSR_LSTATUS            0x0004  /* Link status                 */

#define BMSR_RFAULT             0x0010  /* Remote fault detected       */

 

/*--------------------------------------------------------------------------*/

/**

@brief Detect eth link status from ETHTOOL API and MII reg.

@param ifname -- interface name.

@return Return true if link is up, return false if link is down,

or return -1 if errors occur.

This function will first try to get eth link status from ETHTOOL API.

If it fails, it will try to get eth link status from MII reg.

*/

/*--------------------------------------------------------------------------*/

static int get_netlink_status(char *ifname)

{

   int skfd = -1;

   int link_status;

 

   if (ifname == NULL) {

       ifname = "eth0";

   }

 

   if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {

       nl_err("socket error\n");

       return -1;

   }

 

   link_status = detect_ethtool(skfd, ifname);

   if (link_status < 0)

       link_status = detect_mii(skfd, ifname);

 

   close(skfd);

   return link_status;

}

 

 

/*--------------------------------------------------------------------------*/

/**

@brief Detect eth link status from ETHTOOL API.

@param skfd -- socket handler.

@param ifname -- interface name.

@return Return true if link is up, return false if link is down,

or return -1 if errors occur.

*/

/*--------------------------------------------------------------------------*/

int detect_ethtool(int skfd, char *ifname)

{

   struct ifreq ifr;

   struct ethtool_value edata;

 

   memset(&ifr, 0, sizeof(ifr));

   edata.cmd = ETHTOOL_GLINK;

 

   strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)-1);

   ifr.ifr_data = (char *) &edata;

 

   if (ioctl(skfd, SIOCETHTOOL, &ifr) == -1) {

       nl_err("ETHTOOL_GLINK failed: %s\n", strerror(errno));

       return -1;

   }

 

   return (edata.data ? 1 : 0);

}

 

/*--------------------------------------------------------------------------*/

/**

@brief Detect eth link status from MII status reg.

@param skfd -- socket handler.

@param ifname -- interface name.

@return Return true if link is up, return false if link is down,

or return -1 if errors occur.

*/

/*--------------------------------------------------------------------------*/

static int detect_mii(int skfd, char *ifname)

{

   struct ifreq ifr;

   struct mii_ioctl_data *mii_val;

 

 

   strncpy(ifr.ifr_name, ifname, IFNAMSIZ);

   if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0) {

       fprintf(stderr, "SIOCGMIIPHY on %s failed: %s\n", ifname,

       strerror(errno));

       (void) close(skfd);

       return -1;

   }

 

   mii_val = (struct mii_ioctl_data *)(&ifr.ifr_data);

   mii_val->reg_num = MII_BMSR;

 

   if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0) {

       nl_err("SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name,

       strerror(errno));

       return -1;

   }

 

   if ((!(mii_val->val_out & BMSR_RFAULT)) &&

       (mii_val->val_out & BMSR_LSTATUS) &&

       (!(mii_val->val_out & BMSR_JCD))) {

       return 1;

   } else {

       return 0;

   }

}

int main(int argc, char* argv[])

{

   if(argc != 2)

   {

       fprintf(stderr, "usage: %s <ethname>", argv[0]);

       return -1;

   }

   if(getuid() != 0)

   {

       fprintf(stderr, "Netlink Status Check Need Root Power.\n");

       return 1;

   }

 

   printf("Net link status: %s\n", get_netlink_status(argv[1])==1?"up":"down");

   return 0;

}

SIOCETHTOOL相当于是对SIOCGMIIPHY的一个封装吧,其实最终调用的方式都是读取状态寄存器Link Status的值,测试程序中用到的三个寄存器如下图所示:







Remote Fault:远端错误指示位。Bit4=1代表连接对端(Link Partner)出错,至于出错的具体类型以及错误检测机制在规范中并没有定义,由PHY的制造商自由发挥,一般的厂商都会在其他的寄存器(Register16-31由厂商自行定义)指示比较详细的错误类型。在与端口相关的故障查证中,Remote Fault是一个重要的指示信息,通过互联双方的Remote Fault信息(可能要加上其他的具体错误指示),可以帮助定位故障原因。


Link Status:Link状态指示位。Bit2=1代表端口Link up,0则代表端口Link down。实际应用中一般都是通过Bit2来判断端口的状态。而且,一般的MAC芯片也是通过轮询PHY的这个寄存器值来判断端口的Link状态的(这个过程可能有不同的名称,比如BCM叫做Link Scan,而Marvell叫做PHY Polling。)如前所述,在AN Enable的情况下,Link Status的信息只有在Auto-Negotiation Complete指示已经完成的情况下才是正确可靠的,否则有可能出错。


Jabber Detect:Jabber 检测指示位。IEEE802.3对Jabber的解释是"A condition wherein a station transmits for a period of time longer than the maximum permissible packet length, usually due to a fault condition"。这一位指示的是Link Partner发送的时间超过了规定的最大长度。值得注意的是,Jabber Detect只有在10BASE-T模式下才有意义,100和1000M模式是没有定义Jabber这一功能的。


相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
2156 0
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
315 2
|
机器学习/深度学习 算法 5G
基于DNN深度神经网络的OFDM+QPSK信号检测与误码率matlab仿真
本内容展示了基于深度神经网络(DNN)的OFDM-QPSK信号检测算法在Matlab2022a中的仿真效果。通过构建包含多层全连接层和ReLU激活函数的DNN模型,结合信号预处理与特征提取,实现了复杂通信环境下的高效信号检测。仿真结果对比了传统LS、MMSE方法与DNN方法在不同信噪比(SNR)条件下的误码率(BER)和符号错误率(SER),验证了DNN方法的优越性能。核心程序涵盖了QPSK调制、导频插入、OFDM发射、信道传输及DNN预测等关键步骤,为现代通信系统提供了可靠的技术支持。
257 0
|
SQL 数据采集 人工智能
“服务器老被黑?那是你没上AI哨兵!”——聊聊基于AI的网络攻击检测那些事儿
“服务器老被黑?那是你没上AI哨兵!”——聊聊基于AI的网络攻击检测那些事儿
564 12
|
机器学习/深度学习 人工智能 运维
AI“捕风捉影”:深度学习如何让网络事件检测更智能?
AI“捕风捉影”:深度学习如何让网络事件检测更智能?
609 8
|
机器学习/深度学习 数据采集 算法
基于yolov2和googlenet网络的疲劳驾驶检测算法matlab仿真
本内容展示了基于深度学习的疲劳驾驶检测算法,包括算法运行效果预览(无水印)、Matlab 2022a 软件版本说明、部分核心程序(完整版含中文注释与操作视频)。理论部分详细阐述了疲劳检测原理,通过对比疲劳与正常状态下的特征差异,结合深度学习模型提取驾驶员面部特征变化。具体流程包括数据收集、预处理、模型训练与评估,使用数学公式描述损失函数和推理过程。课题基于 YOLOv2 和 GoogleNet,先用 YOLOv2 定位驾驶员面部区域,再由 GoogleNet 分析特征判断疲劳状态,提供高准确率与鲁棒性的检测方法。
|
机器学习/深度学习 存储 算法
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
460 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
|
运维 监控 安全
公司监控软件:SAS 数据分析引擎驱动网络异常精准检测
在数字化商业环境中,企业网络系统面临复杂威胁。SAS 数据分析引擎凭借高效处理能力,成为网络异常检测的关键技术。通过统计分析、时间序列分析等方法,SAS 帮助企业及时发现并处理异常流量,确保网络安全和业务连续性。
334 11
|
安全 Linux 网络安全
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息。本文分三部分介绍 nmap:基本原理、使用方法及技巧、实际应用及案例分析。通过学习 nmap,您可以更好地了解网络拓扑和安全状况,提升网络安全管理和渗透测试能力。
1085 5

热门文章

最新文章