全部博文(436)
分类: LINUX
2010-10-29 19:13:03
EHCO请求(type=8)和EHCO(type=0)主要用来测试发送方通过网络到达接收方之间的通信,在许多主机中,这个功能叫做ping。其报文格式如下:
ECHO请求和应答报文格式
0 7 8 15 16 31
类型 |
代码 |
校验和 |
标识符 |
序号 | |
数据 |
/* Handle ICMP_ECHO ("ping") requests. */
//处理ICMP_ECHO(“ping”)的要求 回应/请求应答报文
static void
icmp_echo(struct icmphdr *icmph, struct sk_buff *skb, struct device *dev unsigned long saddr, unsigned long daddr, int len,
struct options *opt)//传递参数,其中包含ICMP头部,首部信息,硬件帧头空间,
源IP地址,目的IP地址,IP数据包长度,
{
struct icmphdr *icmphr;
struct sk_buff *skb2;
int size, offset;
size = sizeof(struct sk_buff) + dev->hard_header_len + 64 + len;
skb2 = alloc_skb(size, GFP_ATOMIC);//为数据包分配空间
if (skb2 == NULL) {//首部信息为空
skb->sk = NULL;
kfree_skb(skb, FREE_READ); //往IP头部开始读出数据
return;
}
skb2->sk = NULL;
skb2->mem_addr = skb2;
skb2->mem_len = size;
skb2->free = 1;
//此段函数完成建立连接功能 若成功则发送 若不成功返回错误
/* Build Layer 2-3 headers for message back to source *//为返回源地址的消息建立数据链路层和网络层的头部信息.
offset = ip_build_header(skb2, daddr, saddr, &dev, // 建立IP报头
IPPROTO_ICMP, opt, len, skb->ip_hdr->tos,255);
if (offset < 0) {
printk("ICMP: Could not build IP Header for ICMP ADDRESS Response\n");//如果偏移量小于0,说明该IP包不存在
kfree_skb(skb2,FREE_WRITE);
skb->sk = NULL;
kfree_skb(skb, FREE_READ);
return;
}
如果OFFSET<0输出“无法建立的IP地址的ICMP应答头”
然后释放SKB2 SKB->SK为空
/* Re-adjust length according to actual IP header size. *重新调整长度按实际的IP报头的大小/
由于分片,需对数据包重新调整
skb2->len = offset + len } ;