免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 独孤九贱
打印 上一主题 下一主题

iptables 源码分析 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2005-12-07 13:10 |只看该作者
原帖由 mq110 于 2005-12-7 12:42 发表


内核进程和用户进程 共享内存了 你如何实现互斥???

你说的<<Unix环境高级编程>>只是提到了System V 共享内存的方式。他是用户态的。。不是我说的内核进程和用户进程共享内存的方式。


可能我误解你的意思了!

但是偶认为,包过滤函数与用户空间操作函数之间共享规则:
1、可以通过共享空间来完成的,在Win下边做防火墙,偶就是这样子做的;至于linux下内核与用户进程共享内存的互斥,到是没有做过。实现不行,用最笨的方法,自己实现互斥锁应该是可以的吧,回头我做做测试先。

2、netfilter在实现的时候,应该是使用 find_table_lock来实现的,不过偶没有认真地跟下去看这个函数了。如果我没有分析错的话,iptables通过调用setsockopt函数,进过层层调用,最后是
nf_sockopts(),它事实上是操作了:
static struct nf_sockopt_ops ipt_sockopts
= { { NULL, NULL }, PF_INET, IPT_BASE_CTL, IPT_SO_SET_MAX+1, do_ipt_set_ctl,
    IPT_BASE_CTL, IPT_SO_GET_MAX+1, do_ipt_get_ctl, 0, NULL  };

因为在这个结构中,封装了set/get函数。比如get,它把内核空间的规则拷贝到用户这间:
static int
do_ipt_get_ctl(struct sock *sk, int cmd, void *user, int *len)
……
        case IPT_SO_GET_ENTRIES: {
                struct ipt_get_entries get;

                if (*len < sizeof(get)) {
                        duprintf("get_entries: %u < %u\n", *len, sizeof(get));
                        ret = -EINVAL;
                } else if (copy_from_user(&get, user, sizeof(get)) != 0) {
                        ret = -EFAULT;
                } else if (*len != sizeof(struct ipt_get_entries) + get.size) {
                        duprintf("get_entries: %u != %u\n", *len,
                                 sizeof(struct ipt_get_entries) + get.size);
                        ret = -EINVAL;
                } else
                        ret = get_entries(&get, user);
                break;
        }
进入get_entries
static int
get_entries(const struct ipt_get_entries *entries,
            struct ipt_get_entries *uptr)
{
        int ret;
        struct ipt_table *t;


        t = find_table_lock(entries->name, &ret, &ipt_mutex);
        if (t) {
                duprintf("t->private->number = %u\n",
                         t->private->number);
                if (entries->size == t->private->size)
                        ret = copy_entries_to_user(t->private->size,
                                                   t, uptr->entrytable);
                else {
                        duprintf("get_entries: I've got %u not %u!\n",
                                 t->private->size,
                                 entries->size);
                        ret = -EINVAL;
                }
                up(&ipt_mutex);
        } else
                duprintf("get_entries: Can't find %s!\n",
                         entries->name);

        return ret;
}

find_table_lock用于返回查找的表的元素,同时第三个参数应该即为互斥锁,应该就是你所关心的。不过前一遍看它时并没有仔细地分析它。我看完第二遍的时候,或许可以写个详尽的分析出来。

[ 本帖最后由 独孤九贱 于 2005-12-7 13:16 编辑 ]

论坛徽章:
0
22 [报告]
发表于 2005-12-07 13:16 |只看该作者
原帖由 mq110 于 2005-12-7 12:42 发表


内核进程和用户进程 共享内存了 你如何实现互斥???

你说的<<Unix环境高级编程>>只是提到了System V 共享内存的方式。他是用户态的。。不是我说的内核进程和用户进程共享内存的方式。



内核和用户可以实现内存共享、并且同步的,不过我也没思路,只记得linuxforum有个人在wheelz版主的指点下做出来了,wheelz版主还给了个小例子──可惜我没保存,这两天linuxforum又上不去。


一般常用的通讯方式有这么几种:1, 注册一个字符设备,实现read/write等---相当于驱动了一个物理上不存在的设备;2, proc文件系统;3, 系统调用,改写某个sys_ni_syscall或者添加新的syscal或者reuse某个已有的syscall;4, netlink,可以man 7 netlink查看,手册中说:netlink, PF_NETLINK - Communication between kernel and user,不过我没接触过,不知道好不好用。

我知道的就这么多了

论坛徽章:
0
23 [报告]
发表于 2005-12-07 13:19 |只看该作者
原帖由 albcamus 于 2005-12-7 13:16 发表



内核和用户可以实现内存共享、并且同步的,不过我也没思路,只记得linuxforum有个人在wheelz版主的指点下做出来了,wheelz版主还给了个小例子──可惜我没保存,这两天linuxforum又上不去。


一般常用的 ...


OK,我也试试先……

至防火墙规则,其实把规则放在过滤函数那里,用户空间到时去拷贝也是可以的,而且简单,互斥可以自己简单地实现……

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
24 [报告]
发表于 2005-12-07 13:23 |只看该作者
原帖由 albcamus 于 2005-12-7 13:16 发表



内核和用户可以实现内存共享、并且同步的,不过我也没思路,只记得linuxforum有个人在wheelz版主的指点下做出来了,wheelz版主还给了个小例子──可惜我没保存,这两天linuxforum又上不去。


一般常用的 ...


哪个例子我保存了 需要的话给你发上来。
我就是想改进 wheelz版主的例子 。来做一个通用的内核进程 和 用户进程共享内存的通用方法。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
25 [报告]
发表于 2005-12-07 13:27 |只看该作者
想法 是内核分配内存。然后存入/proc 文件系统 一个内存地址。用户空间的进程读这个地址。。然后就可以共享内存了。。现在只是不知道如何互斥的操作。。

ps:这几天linuxforum上不去 好是郁闷。。
我比较同意 白金兄的观点。。其实分析netfilter架构。以及tcp/ip协议栈 来实现自己的架构比较好。。

论坛徽章:
0
26 [报告]
发表于 2005-12-07 13:28 |只看该作者

回复 24楼 mq110 的帖子

关于用netlink来做,这篇贴子写得非常好啊:

http://www-128.ibm.com/developer ... cn-newsletter-linux

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
27 [报告]
发表于 2005-12-07 13:28 |只看该作者
或许我应该换个思路了。。
注册字符设备 驱动 这个方式比较好。实现起来也不麻烦。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
28 [报告]
发表于 2005-12-07 13:30 |只看该作者
原帖由 独孤九贱 于 2005-12-7 13:28 发表
关于用netlink来做,这篇贴子写得非常好啊:

http://www-128.ibm.com/developer ... cn-newsletter-linux


多谢多谢。

论坛徽章:
0
29 [报告]
发表于 2005-12-07 13:35 |只看该作者
原帖由 mq110 于 2005-12-7 13:30 发表


多谢多谢。


不用谢了,好像那个很现成,正符合你要求。
我正在请教偶老大,内核态与用户空间用shm做怎么互斥。试验去了。

刚转到linux下边来一两个月,还是个新手,不明白的地方很多,我贴代码的本来目的,就是想多几个人一起讨论学习,上次贴《snort源码分析》就把各人打击惨了,可能是研究它的人太少了。呵呵,以后多交流了……

论坛徽章:
0
30 [报告]
发表于 2005-12-07 13:35 |只看该作者
TCP/IP协议栈我在网上找了一些资料,仍然未惬人意。 特别是由于缺少印刷的图书, 进展很慢。
大家可以在emule上找一本叫做the Linux Networking Architectures: Design and Implementation of Network Protocols in the Linux Kernel的书,德国人写的,可惜英文译本不是很好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP