gpt4 book ai didi

c - 使用 dev_queue_xmit 发送一个 ping 数据包

转载 作者:太空狗 更新时间:2023-10-29 12:36:50 27 4
gpt4 key购买 nike

我写了一个发送 ping 数据包的驱动程序,但它不工作(我使用 tcpdump -i wlan0 icmp 检查)。基本上我已经使用来自用户程序的 ioctl 调用来启动传输(它的工作)但是模块代码中存在一些问题,以下是我的传输代码:

case WLAN_TRANSMIT :
icmp.type = ICMP_ECHO;
icmp.code = 0;
icmp.un.echo.sequence = i++;
icmp.un.echo.id = current->pid & 0xFFFF;
printk(KERN_ALERT"ID::%X\n",icmp.un.echo.id);
ip4.protocol = 0x01; //for icmp protocol
ip4.tos = 0x00;
ip4.frag_off = 0;
ip4.daddr = in_aton(procfs_buffer);
ip4.saddr = in_aton(ifr->ifr_addr.sa_data);
len = sizeof(data);
skb = dev_alloc_skb(1500);
skb->dev = __dev_get_by_name(&init_net,"wlan0");
skb_reserve(skb,NET_IP_ALIGN); //header of 2 bytes; increments tail and data pointer
skb->data = skb_put(skb,sizeof(len)); // increments all pointer or adds data
memcpy(data,skb->data,len);
wdev = skb->dev;
skb->transport_header =skb_push(skb,sizeof(icmp));
memset(skb->transport_header,0,sizeof(struct icmphdr));
memcpy(skb->transport_header,&icmp,sizeof(struct icmphdr));

skb->network_header=skb_push(skb,sizeof(ip4));
memset(skb->network_header,0,sizeof(struct iphdr));
memcpy(skb->network_header,&ip4,sizeof(struct iphdr));
// printk("i::%d\n",i);
// skb->mac_header = skb_push(skb,6*sizeof(0xFF));
//skb->mac_header = ()
skb->mac_header = skb->dev->dev_addr;
if(dev_queue_xmit(skb)==NET_XMIT_SUCCESS)
printk(KERN_ALERT"success");

我正在使用 dev_queue_xmit 。

问候

卡兰

最佳答案

skb->mac_header = skb->dev->dev_addr 看起来不对。
MAC header 必须复制到数据包中,在 IP header 之前,并且 skb->data 必须指向它。在此上下文中设置 skb->mac_header 毫无意义。

我也没有看到您计算 IP 和 ICMP 校验和(我认为 ICMP 校验和是可选的,但 IP 校验和是强制性的)。

我真的分不清是不是全部了。
您应该看到 dev_queue_xmit 的返回值是什么,并打印数据包内容,从 skb->dataskb->tail 并查看它们是有效的 ICMP 数据包。

关于c - 使用 dev_queue_xmit 发送一个 ping 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9357626/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com