uip源码剖析【三】——【网络层】ICMP解读

===================转载请保留头部====================

作者:souroot   来源:WEB DNA

连接:http://www.cnblogs.com/souroot/archive/2013/05/04/3059996.html

关键词:TCPIP UIP 51单片机 计算机网络 网络工程专业 手把手教你写tcpip协议栈

版权:  Q college 版权所有

=====================以下为正文=====================

先给个PC ping通单片机的效果图:

单片机ip地址:192.168.0.123

网关地址:192.168.0.1

背后的图片是串口连接的单片机,单片机收到ICMP请求后,会发送ICMP应答,我们在此在串口打印"This is STC51. We send ICMP reply!"

==============IP + ICMP报文结构体============

     只对 ICMP request(echo) 进行响应,其他ICMP报文全部丢弃:

1   /* ICMP echo (i.e., ping) processing. This is simple, we only change
2      the ICMP type from ECHO to ECHO_REPLY and adjust the ICMP
3      checksum before we return the packet. */
4   if(ICMPBUF->type != ICMP_ECHO) {
5     UIP_STAT(++uip_stat.icmp.drop);
6     UIP_STAT(++uip_stat.icmp.typeerr);
7     UIP_LOG("icmp: not icmp echo.");
8     goto drop;
9   }

  然后做三件事:把ICMP报文类型改成ICMP应答,修改ICMP校验和,互换目的IP和源IP,就可以发送出去了:

 1   ICMPBUF->type = ICMP_ECHO_REPLY;    /* 把报文改成ICMP应答(reply) */
 2 
 3   /* 修改校验和 */
 4   if(ICMPBUF->icmpchksum >= HTONS(0xffff - (ICMP_ECHO << 8))) {
 5     ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8) + 1;
 6   } else {
 7     ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8);
 8   }
 9   
10   /* Swap IP addresses. */
11   tmp16 = BUF->destipaddr[0];
12   BUF->destipaddr[0] = BUF->srcipaddr[0];
13   BUF->srcipaddr[0] = tmp16;
14   tmp16 = BUF->destipaddr[1];
15   BUF->destipaddr[1] = BUF->srcipaddr[1];
16   BUF->srcipaddr[1] = tmp16;
17 
18   UIP_STAT(++uip_stat.icmp.sent);
19   
20   goto send;
原文地址:https://www.cnblogs.com/souroot/p/3059996.html