CH394Q 检测IP冲突机制及处理

CH394如何检测IP冲突?

1.依据芯片自身的IP冲突中断来检测

原理:对芯片设置完IP、网关和掩码后,芯片会直接占用此IP,如果检测到网络环境中有其他设备通告已使用此IP,芯片则会产生IP冲突中断告知用户。

特点:实现简单,无需用户操作,由芯片自动完成一系列动作,但缺点是“被动”检测,只有当其他占用相同IP的设备主动发出ARP包,芯片才能得知有IP冲突的情况。

芯片手册:CH394DS1.PDF - 南京沁恒微电子股份有限公司

手册说明如下:

image

 

 

2.针对第一种方式的缺点,用户可以通过macraw模式自行组ARP包来主动探查出网络中是否存在IP冲突的情况

具体如下:

(1)发送

代码:

 1     u8 ip_confli_flag = 0;
 2     u8 mac_test123_probe[] = {
 3             0xff,0xff,0xff,0xff,0xff,0xff,//目的MAC全FF,广播
 4             0X3C,0X01,0X02,0X03,0X04,0X05,//394芯片自身MAC
 5             0X08,0X06,//以太网协议类型,ARP
 6             0x00,0x01,//硬件类型,以太网 00 01
 7             0x08,0x00,//上层协议类型,IP协议 08 00
 8             0x06,//硬件地地址长度,6字节(以太网)
 9             0x04,//协议地址长度,4字节(IPV4)
10             0x00,0x01,//ARP操作码:1为ARP请求,2为ARP应答,3为RARP请求,4为RARP应答
11             0X3C,0X01,0X02,0X03,0X04,0X05,//发送方MAC,即394芯片自身MAC
12             0x00,0x00,0x00,0x00,//发送方IP填0
13             0x00,0x00,0x00,0x00,0x00,0x00,//接收方MAC,填全0或全FF都可以
14             0xc0,0xa8,0x33,0x7B,//接收方IP,即想要搜索是否有其他设备已经在使用的IP,此处为192.168.51.123
15     };
16 
17    CH394Q_Socket_MACRAW_Send(0,mac_test123_probe,sizeof(mac_test123_probe));
18     ip_confli_flag++;

 ARP协议解析此处不细讲,可以自行查阅资料。组包说明上面已给出注释,可以参考下。

①设置394的socket为macraw模式(仅socket0可以设置为此模式):CH394Q_MACRAWSocketInit(0,Sn_MODE_MACRAW);

②定义所发ARP_Probe(ARP嗅探)报文,并调用CH394Q_Socket_MACRAW_Send();将这一包数据发出,如上述代码所示

③计数:ip_confli_flag++;当累计发送5次或更多次,都没有收到其他设备发来的冲突回复,则认为网络中无使用特定IP的设备,394可以使用此IP。

(2)接收

 代码:

 1      macraw_real_len = CH394Q_Socket_MACRAW_Recv(sockindex, MyBuffer[sockindex], len);
 2      len = len - macraw_real_len - 2;
 3 
 4      if(ip_confli_flag < 5)
 5      {
 6        if(MyBuffer[sockindex][0] == 0x3c && MyBuffer[sockindex][1] == 0x1 &&
 7           MyBuffer[sockindex][2] == 0x2  && MyBuffer[sockindex][3] == 0x3 &&
 8           MyBuffer[sockindex][4] == 0x4  && MyBuffer[sockindex][5] == 0x5)  //对比MAC
 9           {
10               if(MyBuffer[sockindex][12] == 0x08 && MyBuffer[sockindex][13] == 0x06 )//对比协议
11               {
12                    if(MyBuffer[sockindex][20] == 0x0 && MyBuffer[sockindex][21] == 0x02 )//对比ARP类型
13                    {
14                        if(MyBuffer[sockindex][28] == 0xc0 && MyBuffer[sockindex][29] == 0xa8 &&
15                           MyBuffer[sockindex][30] == 0x33 && MyBuffer[sockindex][31] == 0x7b)//对比IP
16                        {
17                            if(MyBuffer[sockindex][32] == 0x3c && MyBuffer[sockindex][33] == 0x1 &&
18                               MyBuffer[sockindex][34] == 0x2  && MyBuffer[sockindex][35] == 0x3 &&
19                               MyBuffer[sockindex][36] == 0x4  && MyBuffer[sockindex][37] == 0x5)//对比MAC
20                            {
21                               printf("ARP CONF! -- IP Already exit %x-%x-%x-%x-%x-%x\r\n",
22                               MyBuffer[sockindex][22], MyBuffer[sockindex][23], MyBuffer[sockindex][24],
23                               MyBuffer[sockindex][25], MyBuffer[sockindex][26], MyBuffer[sockindex][27]);
24 
25                               ip_confli_flag = 5;
26                            }}}}}}

①按照例程写法,进入接收中断后,判断是macraw模式后,开始将收到的数据放入数组MyBuffer中

②对收到的数据进行解析,如果解析出来确实是其他设备告知的ARP包,则得出存在IP冲突的结论,并输出是哪一个设备MAC正在使用该IP

③将计数标志置位,退出ARP接收判断。

④后续操作比较灵活,比如可以在选择另一IP继续检测是否冲突或者直接选择开启DHCP等等,根据实际应用而定

 

代码自取:https://files.cnblogs.com/files/blogs/808422/CH394Q__ARP.zip?t=1753777453&download=true

 

posted on 2025-07-30 09:31  Lqqq123  阅读(66)  评论(0)    收藏  举报

导航