ICMP协议分析
- ICMP 数据结构
类型8的回显请求
struct icmp_echo_hdr {
u16_t _type_code;
u16_t chksum;
u16_t id;
u16_t seqno;
};
类型3的目的不可达应答
struct icmp_dur_hdr {
u16_t _type_code;
u16_t chksum;
u32_t unused;
};
类型11的超时应答
struct icmp_te_hdr {
u16_t _type_code;
u16_t chksum;
u32_t unused;
};
- ICMP 处理函数
void icmp_input(struct pbuf *p, struct netif *inp);
lwIP ICMP只接受类型为8的ECHO。函数首先从pbuf中去除IP头,获得ICMP头。只有当type为ECHO时才处理。
首先忽略源ip为广播或多播的分组(ICMP协议规定)。检查校验和是否正确。然后准备回显分组,其实就是将接受到的分组的IP源/目的地址交换,设置ICMP报头类型为0,重新计算校验和。最后发送ECHO回应。
void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t);
发送主机不可达的ICMP回应。分配一个IP分组缓冲区,然后填充成ICMP错误报文。再交至ip_output发送。
该函数被ip_input及udp_input调用,来处理ip头中无效protocol域,发送无效协议ICMP及UDP包的目的地址是广播或多播地址,发送端口不可达ICMP分组。
void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t);
发送TTL超时错误报文,和icmp_dest_unreach处理方式一样。
该函数被ip_forward调用,如果TTL为0,则发送超时ICMP分组
阅读(6180) | 评论(8) | 转发(0) |