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. }

目录
相关文章
|
4月前
|
Ubuntu Linux 网络安全
在Linux云服务器上限制特定IP进行SSH远程连接的设置
温馨提示,修改iptables规则时要格外小心,否则可能导致无法远程访问你的服务器。最好在掌握足够技术知识和理解清楚操作含义之后再进行。另外,在已经配置了防火墙的情况下,例如ufw(Ubuntu Firewall)或firewalld,需要按照相应的防火墙的规则来设置。
179 24
|
5月前
|
安全 Linux
阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip
公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
414 28
|
5月前
|
人工智能 Kubernetes Ubuntu
linux配置IP
linux配置IP
476 1
|
8月前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
296 11
|
11月前
|
Web App开发 资源调度 网络协议
Linux系统之部署IP工具箱MyIP
【10月更文挑战第5天】使用Docker部署Radicale日历和联系人应用Linux系统之部署IP工具箱MyIP
380 1
Linux系统之部署IP工具箱MyIP
|
10月前
|
缓存 网络协议 Linux
Linux ip命令常用操作
Linux的 `ip`命令是一个强大且灵活的网络管理工具,能够执行从基本的网络接口配置到高级的路由和VLAN管理等多种操作。通过熟练掌握这些常用操作,用户可以更加高效地管理和配置Linux系统的网络环境。无论是在日常管理还是故障排除中,`ip`命令都是必不可少的工具。
194 2
|
11月前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
391 0
Linux C/C++之TCP / UDP通信
|
11月前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
399 1
|
存储 Linux Shell
在Linux中,如何使用脚本,实现判断 192.168.1.0/24 网络里,当前在线的 IP 有哪些?能ping 通则 认为在线。
在Linux中,如何使用脚本,实现判断 192.168.1.0/24 网络里,当前在线的 IP 有哪些?能ping 通则 认为在线。
|
机器学习/深度学习 Ubuntu Linux
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?

热门文章

最新文章