CH394Q 检测IP冲突机制及处理
CH394如何检测IP冲突?
1.依据芯片自身的IP冲突中断来检测
原理:对芯片设置完IP、网关和掩码后,芯片会直接占用此IP,如果检测到网络环境中有其他设备通告已使用此IP,芯片则会产生IP冲突中断告知用户。
特点:实现简单,无需用户操作,由芯片自动完成一系列动作,但缺点是“被动”检测,只有当其他占用相同IP的设备主动发出ARP包,芯片才能得知有IP冲突的情况。
芯片手册:CH394DS1.PDF - 南京沁恒微电子股份有限公司
手册说明如下:

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
浙公网安备 33010602011771号