请教:如何直接在LINUX内核协议栈提高GRE转发包的速度?
目前遇到一个比较紧的问题,在一个网口收到UDP包,想将其进行简单拆包后再封装(GRE封装),在另一个网口发出。
因为都是数据通道,要求的效率非常高,看到一些源码是在内核中做的,但最终会看到收发包是一些汇编调用。这样的代码具有能用性吗?
不知哪位有经验,可否给些提示?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
收包是汇编实现,那是根据特定的处理器来实现的。而对于内核与体系结构不相关的处理,都遵循了网络处理包的流程,应该说各层实现各自的功能,你只要知道在那一层拆包再封包,转发再调用下一层的接口即可。
看了下代码,不得头绪,还请指点下主要概念和参考资料,好去查阅。以前都只是LINUX应用编程,内核编程未有涉及。
下面是几段源码,不知道是要自己写,还是有现成代码?
/*
* Send to the message ring
*/
unsigned int fast_syscall_msgsnd(unsigned int size, unsigned int code,
unsigned int stid, unsigned long long msg0,
unsigned long long msg1)
{
unsigned int status,
arg0,
arg1,
arg2,
arg3;;
arg0 = (unsigned int)(msg0>>32);
arg1 = (unsigned int)(msg0);
arg2 = (unsigned int)(msg1>>32);
arg3 = (unsigned int)(msg1);
__asm__ volatile (
"move $8, %1\n" /* t0 = (((size-1)<<16)|(code<<|stid */
"move $9, %2\n" /* t1 = arg0 */
"move $10, %3\n" /* t2 = arg1 */
"move $11, %4\n" /* t3 = arg2 */
"move $12, %5\n" /* t4 = arg3 */
"syscall 1\n" /* syscall #xlr_fast_syscall_msgsnd */
"move %0, $9\n" /* status = t1 */
: "=r"(status)
: "r"(((size-1)<<16)|(code<<|stid), "r"(arg0), "r"(arg1), "r"(arg2), "r"(arg3)
:"$8", "$9", "$10", "$11", "$12"
);
return status;
}
/*
* Receive from the message ring
*/
int fast_syscall_msgrcv(int pri, int *size, int *code, int *src_id,
unsigned long long *msg0)
{
unsigned int result,
status,
arg0,
arg1;
__asm__ volatile (
"move $8, %4\n" /* t0 = pri */
"syscall 2\n" /* syscall #xlr_fast_syscall_msgld */
"move %0, $8\n" /* result = t0 */
"move %1, $9\n" /* arg0 = t1 */
"move %2, $10\n" /* arg1 = t2 */
"move %3, $11\n" /* status = t3 */
: "=r"(result), "=r"(arg0), "=r"(arg1), "=r"(status)
: "r"(pri)
:"$8", "$9", "$10", "$11"
);
if (!result) {
*size=((status & 0xc0)>>6)+1;
*code=(status & 0xff00)>>8;
*src_id=(status & 0x7f0000)>>16;
*msg0=(((unsigned long long)arg0)<<32)|arg1;
return 0;
}
return result;
}
你这个是基于特定处理器实现的,这个应该是提供给发送和接收的接口。我觉得你应该从整体上认识清楚,如果整体上没有认识清楚,即使你把这两个函数的每一行代码都看懂了,你可能还是一头雾水。