作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我写了一个发送 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->data
到 skb->tail
并查看它们是有效的 ICMP 数据包。
关于c - 使用 dev_queue_xmit 发送一个 ping 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9357626/
我想捕获 NF_IP_LOCAL_OUT Hook 中的数据包,并对其进行一些修改。之后,我使用 dev_queue_xmit() 发送数据包。不幸的是,虽然函数返回0,但数据包无法成功发送。请问如何
我写了一个发送 ping 数据包的驱动程序,但它不工作(我使用 tcpdump -i wlan0 icmp 检查)。基本上我已经使用来自用户程序的 ioctl 调用来启动传输(它的工作)但是模块代码中
我是一名优秀的程序员,十分优秀!