测试环境: CentOS5.3 2.6.18 工具: sendip和wireshark sendip可以发送各种数据包,确实方便.wireshark图形化的显示对于分析整个数据包还是相当不错的... 一:内核态基于Netfilter构造数据包 主要有两种方式: 1. alloc_skb申请一个skb结构体,然后根据实际的应用填充不同的成员,或者基于当前数据包的skb, 调用skb_copy() pskb_copy() skb_copy_expand()等新申请一个nskb,并且拷贝skb的内容。 2. 直接在先前接...
by ubuntuer - 内核源码 - 2016-04-06 21:45:53 阅读(64926) 回复(59)
历经两天的艰苦奋斗...无数次的死机...终于搞出来了 主要问题还是对于struct sk_buff 不熟悉,以前只对>2层的东西熟悉,mac还真是不熟悉.... dev_queue_xmit函数是无罪的,呵呵... 现在修改skb和自定义skb都已经完全做好,不仅做了修改,还可以完成连接 so cool.... 还是学到不少东西的... 我今天先休息下,改天一定把整个过程和程序整理成帖子,希望后人少走点弯路,也感谢白金兄 godbach dreamice版主们的精神支持:mrgreen: :m...
1、首先在tcp_sock里面声明了自己的一个队列sk_buff_head myself_queue; 2、然后在tcp_v4_init_sock()函数里面初始化了一下这个队列。 3、修改skb_rcv_established()函数,修改目的:复制从prequeue或sk_backlog队列里取出来的skb并添加到我自己的队列里。修改代码位置如下: if (tp->ucopy.task == current && sock_owned_by_user(sk) && !copied_early) { __set_current_state(TASK_RUNNING); ...
现在不太明白,就是skb里的第4层头指针h,是什么时候被设置好的。 我现在一个3层包(已经检查过iphdr),是不是这个时候h的指针就已经指向正确的位置了。 为何我在桥的PRE_ROUTING后(它做了3层的校验),取skb->h,这个时候我四层的是IGMP数据包。 h->tpye取的值却不正确,发现其值是46,也就是nh指向的第一个字符,也就是(h == nh)... 请各位给解疑惑
[code] //程序功能是:给没有IP选项的数据报头添加路由记录(RR)IP选项. //方法:先只是试验,所以在netfilter框架中,对于经过HOOK的数据包先拷贝一个新的newskb_buff,然后对该新结构进行处理. static unsigned int get_icmp(unsigned int hook, struct sk_buff **pskb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { struct iphdr *iph=(*pskb)->nh.iph; struct sk_buf...
Netfileter位置:NF_INET_LOCAL_IN 代码如下: struct iphdr *iph = (struct iphdr*)(sb->network_header); struct udphdr *udph =(struct udphdr*)(sb->transport_header); printk("ip header : %u\n", iph); printk("udp header : %u\n", udph); 为什么输出会是一样的? [ 115.985000] ip header : 3619803264 [ 115.988000] udp header : 3619803264 内核版本是2.6.34(Android 2.3) 谢谢大家
本帖最后由 chenshko 于 2011-09-15 10:00 编辑 在netfilter中构建nskb失败 跟踪发现是alloc_skb失败,一下内核所记录的函数调用栈日志,求高人分析下alloc_skb失败的可能原因。 内核打印了meminfo信息,难到跟swap内存空间的大小有关?[code]Sep 14 12:24:10 localhost kernel: swapper: page allocation failure. order:0, mode:0x20 Sep 14 12:24:10 localhost kernel: Pid: 0, comm: swapper Not tainted 2.6.29.6NFQ #18 ...
Guys: 4 路socket接收视频数据,每路2Mbps码流,然后将收到的数据交于硬件解码,编码,然后放置于4段共享内存中,这样的过程,跑2小时~3小时,kernel就会挂掉,检查无内在泄露。有可能是什么问题呢???Thanks! 有时提示: Badness in __kfree_skb at net/core/skbuff.c:330 Unable to handle kernel paging request at virtual address 0a050404
我使用netfilter抓取数据包,分析完后,我想构建一个skb,然后发送出去 static struct nf_hook_ops nfho; unsigned int hook_func(unsigned hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { ...
skb_put() -- 扩展缓冲区中数据区域的大小;增加len个字节 /usr/src/linux-2.6.19/include/linux/skbuff.h static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len) { unsigned char *tmp = skb->tail; skb_LINEAR_ASSERT(skb); skb->tail += len; skb->len += len; if (unlikely(skb->tail>skb->end)) skb_over_panic(skb, len, current_text_addr()); return tmp; } 本...