DPDK编程指南(翻译)( 十八)

18.IP分片及重组库

IP分段和重组库实现IPv4和IPv6报文的分片和重组。

18.1.报文分片

报文分段例程将输入报文划分成多个分片。rte_ipv4_fragment_packet()和rte_ipv6_fragment_packet()函数都假定输入mbuf数据指向报文的IP报头的开始(即L2报头已经被剥离)。为了避免复制实际数据包的数据,使用零拷贝技术(rte_pktmbuf_attach)。对于每个片段,将创建两个新的mbuf:

  • Direct mbuf:mbuf将包含新片段的L3头部。
  • Indirect mbuf:源数据包附加到mbuf。数据字段指向原始数据包数据的附加数据偏移量开始处。

然后将L3头部从原始mbuf复制到“direct”mbuf并更新以反映新的碎片状态。 请注意,对于IPv4,不会重新计算头校验和,其值设置为零。

最后,通过mbuf的下next字段将每个片段的“dirext”和“indirect”mbuf链接在一起,以构成新片段的数据包。

调用者可以明确指定哪些mempools应用于从中分配“direct”和“indirect”mbufs。

有关direct和indirect mbufs的信息,请参阅直接和间接缓冲区。

18.2.报文重组

18.2.1.IP分片表

报文分片表中维护已经接收到的数据包片段的信息。

每个IP数据包由三个字段:<源IP地址>,<目标IP地址>,<ID>唯一标识。

请注意,报文分片表上的所有更新/查找操作都不是线程安全的。因此,如果不同的执行上下文(线程/进程)要同时访问同一个表,那么必须提供一些外部同步机制。

每个表项可以保存最多RTE_LIBRTE_IP_FRAG_MAX(默认值为4)片段的数据包的信息。

代码示例,演示了创建新的片段表:

frag_cycles = (rte_get_tsc_hz() + MS_PER_S - 1) / MS_PER_S * max_flow_ttl;
bucket_num = max_flow_num + max_flow_num / 4;
frag_tbl = rte_ip_frag_table_create(max_flow_num, bucket_entries, max_flow_num, frag_cycles, socket_id);

内部片段表是一个简单的哈希表。 基本思想是使用两个哈希函数和<bucket_entries> *关联性。 这为每个Key在散列表中提供了2 * <bucket_entries>可能的位置。当发生冲突并且所有2 * <bucket_entries>都被占用时,ip_frag_tbl_add()只是返回失败,而不是将现有的Key重新插入到另外的位置。

此外,驻留在表中的条目如果比<max_cycles>更长,被认为是无效的,可以被新的条目删除/替换。

请注意,重新组合需要分配很多mbuf。在任何给定时间(2 * bucket_entries * RTE_LIBRTE_IP_FRAG_MAX * <每个数据包的最大mbufs数>>)可以存储在等待剩余片段的Fragment Table中。

18.2.2.报文重组

报文分组处理和重组由rte_ipv4_frag_reassemble_packet()/rte_ipv6_frag_reassemble_packet()完成。它们返回一个指向有效mbuf的指针,它包含重新组合的数据包,或者返回NULL(如果数据包由于某种原因而无法重新组合)。

这些功能包括:

  1. 搜索片段表,输入数据包的<IPv4源地址,IPv4目的地址,数据包ID>。
  2. 如果找到该条目,则检查该条目是否已经超时。如果是,则释放所有以前收到的碎片,并从条目中删除有关它们的信息。
  3. 如果没有找到这样的Key的条目,那么尝试通过以下两种方法之一创建一个新的:
    a) 用作空条目。
    b) 删除一个超时条目,与它mbufs关联的空闲mbufs,并在其中存储一个带有指定键的新条目。
  4. 使用新的片段信息更新条目,并检查是否可以重新组合数据包(数据包的条目包含所有片段)。
    a) 如果是,则重新组装数据包,将表的条目标记为空,并将重新组装的mbuf返回给调用者。
    b) 如果否,则向调用者返回一个NULL。

如果在分组处理的任何阶段遇到错误(例如:不能将新条目插入片段表或无效/超时片段),则该函数将释放所有与分组片段相关联的标记表条目 作为无效并将NULL返回给调用者。

18.2.3. 调试日志及统计收集
RTE_LIBRTE_IP_FRAG_TBL_STAT配置宏用于控制片段表的统计信息收集。默认情况下未启用。

RTE_LIBRTE_IP_FRAG_DEBUG控制IP片段处理和重组的调试日志记录。默认情况下禁用。请注意,在日志记录包含大量详细信息时,会减慢数据包处理速度,并可能导致丢失大量数据包。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,053评论 0 8
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,062评论 6 174
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 5,956评论 1 13
  • 网络层简介 1. 概念 为解决经由多条链路的交付问题,从而设计了网络层。其主要负责主机到主机的交付,并且在分组经过...
    顾慎为阅读 3,103评论 0 0
  • 3我是一个身体一直很弱的人,从2008年确诊得了慢性肾小球型肾炎,医生说要住院开刀做肾脏穿刺,查一下我是不是免疫型...
    棉花糖_7410阅读 678评论 0 0