请教:如何直接在LINUX内核协议栈提高GRE转发包的速度?

发布于 2022-09-21 01:09:28 字数 145 浏览 12 评论 0

目前遇到一个比较紧的问题,在一个网口收到UDP包,想将其进行简单拆包后再封装(GRE封装),在另一个网口发出。
因为都是数据通道,要求的效率非常高,看到一些源码是在内核中做的,但最终会看到收发包是一些汇编调用。这样的代码具有能用性吗?
不知哪位有经验,可否给些提示?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

高速公鹿 2022-09-28 01:09:28

收包是汇编实现,那是根据特定的处理器来实现的。而对于内核与体系结构不相关的处理,都遵循了网络处理包的流程,应该说各层实现各自的功能,你只要知道在那一层拆包再封包,转发再调用下一层的接口即可。

人疚 2022-09-28 01:09:28

看了下代码,不得头绪,还请指点下主要概念和参考资料,好去查阅。以前都只是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;
}

醉南桥 2022-09-28 01:09:28

你这个是基于特定处理器实现的,这个应该是提供给发送和接收的接口。我觉得你应该从整体上认识清楚,如果整体上没有认识清楚,即使你把这两个函数的每一行代码都看懂了,你可能还是一头雾水。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文