免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11840 | 回复: 14
打印 上一主题 下一主题

Linux kernel raw socket [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-20 12:57 |只看该作者 |倒序浏览
20可用积分
请教各位一个问题:kernel会将收到的数据包复制一份传送给raw socket.  我想找到kernel中执行这个操作的地方,因为我想对这个数据包的拷贝做一些改动后再传给raw socket, 但是找了好久都没有找到. 先谢谢各位了

最佳答案

查看完整内容

感觉从套接字层面上应该是raw_recvmsg函数,其调用过程如下:raw_recvmsg->skb_recv_datagram->skb_dequeue其中skb->dequeue应该就是从数据包接收的队列中取出一个数据包的。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2010-01-20 12:57 |只看该作者
感觉从套接字层面上应该是raw_recvmsg函数,其调用过程如下:
raw_recvmsg->skb_recv_datagram->skb_dequeue

其中skb->dequeue应该就是从数据包接收的队列中取出一个数据包的。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2010-01-20 13:07 |只看该作者
那你能找到raw socket内核部分对应的代码吗?

论坛徽章:
0
4 [报告]
发表于 2010-01-20 13:15 |只看该作者
不知道int raw_rcv(struct sock *sk, struct sk_buff *skb)是不是你要的
net/ipv4/raw.c?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2010-01-20 13:18 |只看该作者
这个格式raw proto结构的定义。其中有接受数据包的函数,net/ipv4/raw.c。
struct proto raw_prot = {
        .name                   = "RAW",
        .owner                   = THIS_MODULE,
        .close                   = raw_close,
        .connect           = ip4_datagram_connect,
        .disconnect           = udp_disconnect,
        .ioctl                   = raw_ioctl,
        .init                   = raw_init,
        .setsockopt           = raw_setsockopt,
        .getsockopt           = raw_getsockopt,
        .sendmsg           = raw_sendmsg,
        .recvmsg           = raw_recvmsg,
        .bind                   = raw_bind,
        .backlog_rcv           = raw_rcv_skb,
        .hash                   = raw_v4_hash,
        .unhash                   = raw_v4_unhash,
        .obj_size           = sizeof(struct raw_sock),
#ifdef CONFIG_COMPAT
        .compat_setsockopt = compat_raw_setsockopt,
        .compat_getsockopt = compat_raw_getsockopt,
#endif
};

[ 本帖最后由 Godbach 于 2010-1-20 15:30 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2010-01-20 13:47 |只看该作者
在ip_local_deliver_finish中调用的raw_local_deliver,递交数据包的动作在此完成

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2010-01-20 13:50 |只看该作者
原帖由 peimichael 于 2010-1-20 13:47 发表
在ip_local_deliver_finish中调用的raw_local_deliver,递交数据包的动作在此完成


应该不经过IP层,就可以取到数据了

论坛徽章:
0
8 [报告]
发表于 2010-01-20 14:06 |只看该作者
AF_INET的raw socket是要经过ip的,
如果是AF_PACKET族套接字的话在netif_receive_skb函数中对于ptype_all和ptype_base两个表的查找就包括了查找相应的raw接收函数

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2010-01-20 15:15 |只看该作者
首先谢谢大家的回复,给了我很有用的提示。

3楼所说的raw_rcv()是针对IP封包的,对非IP封包的就不行了,比如我所要的802.3的以太帧。
6楼说的和3楼的是一样的,也只是对IP封包。

Godbach说的很正确(5楼),谢谢!

    内核创建了一个用于数据接收的数据结构struct msghdr{},并作为参数传递给函数sock_recvmsg(),sock_recvmsg()函数调用了函数sock->ops->recvmsg(),该指针指向函数inet_recvmsg()。inet_recvmsg()函数也很简单,基本上只是调用了函数sk->prot->recvmsg(),该指针指向函数raw_recvmsg()。
    在函数raw_recvmsg()中,首先通过函数skb_recv_datagram()接收sk_buff{}结构的数据,然后调用函数skb_copy_datagram_iovec()将数据从sk_buff{}结构中复制到内核分配的那个struct msghdr{}结构中。
函数skb_recv_datagram()要做的工作是调用函数wait_for_packet()一直等待sk->receive_queue队列上的数据到来

所以我只要在数据挂到这个队列上时做修改就可以了。

再次感谢各位的帮忙!!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
10 [报告]
发表于 2010-01-20 15:29 |只看该作者
对了,LZ说的这种raw socket指的是基于IP层的raw包吧。也就是不区分TCP,UDP,ICMP等协议
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP