linux TCP/IP协议栈 ---pskb_copy_bits()

简介: 这段代码还是比较容易理解的.就不单独解释了。 点击(此处)折叠或打开/* Copy some data bits from skb to kernel buffer. */int skb_copy_bits(const struct sk_buff *skb, int o...
这段代码还是比较容易理解的.就不单独解释了。

点击(此处)折叠或打开

  1. /* Copy some data bits from skb to kernel buffer. */

  2. int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
  3. {
  4.     int i, copy;
  5.     int start = skb_headlen(skb);    /* skb线性缓冲区长度 */

  6.     /* 偏移比skb的总长度减去要copy的长度还要大?也就是说偏移已经超出了要拷贝的
  7.      * 的起始位置,显然是一个错误。注意是copy靠后的部分。 */
  8.     if (offset > (int)skb->len - len)
  9.         goto fault;

  10.     /* Copy header. */
  11.     /* start - offset 大于0, 说明线性数据缓冲区中有数据需要copy */
  12.     if ((copy = start - offset) > 0) {
  13.         if (copy > len)
  14.             copy = len;
  15.         skb_copy_from_linear_data_offset(skb, offset, to, copy);
  16.         if ((len -= copy) == 0)
  17.             return 0;
  18.         offset += copy;
  19.         to += copy;
  20.     }
  21.     /* copy 非线性缓冲区中的数据 */
  22.     for (i = 0; i skb_shinfo(skb)->nr_frags; i++) {
  23.         int end;

  24.         BUG_TRAP(start = offset + len);

  25.         end = start + skb_shinfo(skb)->frags[i].size;
  26.         if ((copy = end - offset) > 0) {
  27.             u8 *vaddr;

  28.             if (copy > len)
  29.                 copy = len;
  30.     /* 将skb非线性数据片段映射到内核中,这样内核可以直接访问 */
  31.             vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]);
  32.             memcpy(to,
  33.              vaddr + skb_shinfo(skb)->frags[i].page_offset+
  34.              offset - start, copy);
  35.     /* 解除映射 */
  36.             kunmap_skb_frag(vaddr);

  37.             if ((len -= copy) == 0)
  38.                 return 0;
  39.             offset += copy;
  40.             to += copy;
  41.         }
  42.         start = end;
  43.     }

  44.     /* 如果还木有拷贝完...OMG...则从skb的frag_list中继续进行拷贝,由于frag_list链中全
  45.      * 是sk_buff,所以可以进行递归的调用. */
  46.     if (skb_shinfo(skb)->frag_list) {
  47.         struct sk_buff *list = skb_shinfo(skb)->frag_list;

  48.         for (; list; list = list->next) {
  49.             int end;

  50.             BUG_TRAP(start = offset + len);

  51.             end = start + list->len;
  52.             if ((copy = end - offset) > 0) {
  53.                 if (copy > len)
  54.                     copy = len;
  55.                 if (skb_copy_bits(list, offset - start,
  56.                          to, copy))
  57.                     goto fault;
  58.                 if ((len -= copy) == 0)
  59.                     return 0;
  60.                 offset += copy;
  61.                 to += copy;
  62.             }
  63.             start = end;
  64.         }
  65.     }
  66.     if (!len)
  67.         return 0;

  68. fault:
  69.     return -EFAULT;
  70. }

相关文章
|
5天前
|
存储 Shell Linux
【Shell 命令集合 磁盘管理 】⭐⭐ Linux 显示当前shell会话中的目录栈 dirs命令使用教程
【Shell 命令集合 磁盘管理 】⭐⭐ Linux 显示当前shell会话中的目录栈 dirs命令使用教程
28 0
|
5天前
|
Shell Linux C语言
【Shell 命令集合 磁盘管理 】Linux 显示当前shell会话中的目录栈 dirs命令使用教程
【Shell 命令集合 磁盘管理 】Linux 显示当前shell会话中的目录栈 dirs命令使用教程
39 1
|
5天前
|
网络协议 Linux SDN
虚拟网络设备与Linux网络协议栈
在现代计算环境中,虚拟网络设备在实现灵活的网络配置和隔离方面发挥了至关重要的作用🔧,特别是在容器化和虚拟化技术广泛应用的今天🌐。而Linux网络协议栈则是操作系统处理网络通信的核心💻,它支持广泛的协议和网络服务🌍,确保数据正确地在网络中传输。本文将深入分析虚拟网络设备与Linux网络协议栈的关联,揭示它们如何共同工作以支持复杂的网络需求。
|
5天前
|
网络协议 Java 程序员
java网络编程什么是TCP/IP协议栈?
java网络编程什么是TCP/IP协议栈?
36 2
|
6月前
|
存储 网络协议 安全
深入解析TCP/IP协议栈:了解网络通信的核心
深入解析TCP/IP协议栈:了解网络通信的核心
|
6月前
|
存储 网络协议 API
网络编程必备:深入理解TCP/IP协议栈(含posix API实现)(下)
网络编程必备:深入理解TCP/IP协议栈(含posix API实现)
|
6月前
|
网络协议 算法 API
网络编程必备:深入理解TCP/IP协议栈(含posix API实现)(上)
网络编程必备:深入理解TCP/IP协议栈(含posix API实现)
|
6月前
|
缓存 网络协议 Unix
最详细的Linux TCP/IP 协议栈源码分析
最详细的Linux TCP/IP 协议栈源码分析
|
9月前
|
存储 缓存 Linux
Linux用户态协议栈与DPDK构建高性能应用
本文深入探讨了如何利用Linux用户态协议栈与DPDK构建高性能应用的方法和技巧。在现代网络编程中,性能是至关重要的,特别是在需要处理大量并发连接的场景下。传统的内核态网络栈在面对高负载时可能会遇到性能瓶颈,而本文介绍了如何借助用户态协议栈和DPDK来突破这些限制。从零开始搭建一个基于用户态协议栈和DPDK的网络应用并不是一件容易的事情,但本文将通过实际示例和步骤指导读者完成这一过程。最后,本文总结了使用用户态协议栈和DPDK构建高性能应用的益处,并展望了这些技术在未来网络设计中的潜在作用。
361 0
Linux用户态协议栈与DPDK构建高性能应用
|
10月前
|
缓存 网络协议 Linux
网络通信的神奇之旅:解密Linux TCP网络协议栈的工作原理
深入探索Linux TCP网络协议栈的内部机制,揭开其背后的神秘面纱。通过对TCP协议在Linux系统中的实现方式进行详细解析,了解到它是如何实现可靠的数据传输、拥塞控制和流量管理等关键功能的。 从TCP协议栈的基本构建模块开始,逐步展示数据包在协议栈中的传递过程。通过剖析各个层级的功能模块,包括物理层、链路层、网络层和传输层,我们将揭示每个模块的作用和相互配合的工作方式。同时,我们还将介绍TCP连接的建立、维护和断开过程,以及与之相关的握手机制、超时重传等关键技术。
200 0
网络通信的神奇之旅:解密Linux TCP网络协议栈的工作原理