关于去包头的问题?
client将所有出外网的数据包都加上了一个自定义的包头(ip+udp),共28字节,我在总出口网关上将自定义包头去掉,用的是
memmove((unsigned char *)iph,(unsigned char *)((unsigned char *)iph+28),ntohs(iph->tot_len)-28);
memset((unsigned char *)iph+to_len,'\0',28);
skb_trim((*pskb),to_len);
运行成功了,可是效率是正常下载的1/3,原因可能是由于memmove存在大量的内存copy。
由于对linux内核以及sk_buff结构体的各个指针的含义,以及sk_buff的空间分配方式不是很了解,我想请问各位高手是否可以利用移动指针的方式解决这种问题,以避免memmove带来的大量的内存copy
谢谢了!
问题点数:100、回复次数:4Top
1 楼ericzhangali(另一个空间)回复于 2005-09-23 13:58:50 得分 0
不了解,顶一下Top
2 楼slone(slone)回复于 2005-09-24 13:26:00 得分 0
不用管那一块数据,将skb->data 指针下压,数据段长度缩短
skb_pull((*pskb), 28)Top
3 楼gaoxianfeng(高)回复于 2005-09-29 14:22:38 得分 0
是啊 数据不需要拷贝的 移动指针就可以了
Top
4 楼lirun(笨笨狗)回复于 2005-09-30 02:02:57 得分 0
是啊.不用拷贝,用 unsigned char *p_iph = (unsigned char *)((unsigned char *)iph + 28) 不就可以了吗?Top




