suricata 3.1 源码分析33 (FlowWorker处理流程2 - FlowHandlePacket)

本文主要是介绍suricata 3.1 源码分析33 (FlowWorker处理流程2 - FlowHandlePacket),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

void FlowHandlePacket(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p)
{/* Get this packet's flow from the hash. FlowHandlePacket() will setup* a new flow if nescesary. If we get NULL, we're out of flow memory.* The returned flow is locked. *///获取包对应的流,找不到就新建流,返回流指针,返回空说明内存不足Flow *f = FlowGetFlowFromHash(tv, dtv, p, &p->flow);if (f == NULL)return;/* set the flow in the packet */
//设置包的标记为属于某条流p->flags |= PKT_HAS_FLOW;return;
}
Flow *FlowGetFlowFromHash(ThreadVars *tv, DecodeThreadVars *dtv, const Packet *p, Flow **dest)
{Flow *f = NULL;/* get our hash bucket and lock it */const uint32_t hash = p->flow_hash;
//获取对应的bucketFlowBucket *fb = &flow_hash[hash % flow_config.hash_size];FBLOCK_LOCK(fb);SCLogDebug("fb %p fb->head %p", fb, fb->head);/* see if the bucket already has a flow */
/*如果p->flow_hash找不到对应的FlowBucket,则新建flow挂到对
应的bucket上,并通过参数dest返回*/if (fb->head == NULL) {f = FlowGetNew(tv, dtv, p);if (f == NULL) {FBLOCK_UNLOCK(fb);return NULL;}/* flow is locked */fb->head = f;fb->tail = f;/* got one, now lock, initialize and return */FlowInit(f, p);f->flow_hash = hash;f->fb = fb;/* update the last seen timestamp of this flow */COPY_TIMESTAMP(&p->ts,&f->lastts);FlowReference(dest, f);FBLOCK_UNLOCK(fb);return f;}/* ok, we have a flow in the bucket. Let's find out if it is our flow */f = fb->head;/* see if this is the flow we are looking for */
//如果packet和bucket的第一个flow不匹配(五元组+vlan不完全相同)if (FlowCompare(f, p) == 0) {Flow *pf = NULL; /* previous flow */while (f) {pf = f;f = f->hnext;
/*若遍历整个bucket链表找不到对应的flow,则新建flow挂到对应
的bucket上,并通过参数dest返回*/if (f == NULL) {f = pf->hnext = FlowGetNew(tv, dtv, p);if (f == NULL) {FBLOCK_UNLOCK(fb);return NULL;}fb->tail = f;/* flow is locked */f->hprev = pf;/* initialize and return */FlowInit(f, p);f->flow_hash = hash;f->fb = fb;/* update the last seen timestamp of this flow */COPY_TIMESTAMP(&p->ts,&f->lastts);FlowReference(dest, f);FBLOCK_UNLOCK(fb);return f;}/*若遍历bucket链表找到对应的flow,将当前flow放到bucket的flow->head,
判断流重用,并通过参数dest返回*/if (FlowCompare(f, p) != 0) {/* we found our flow, lets put it on top of the* hash list -- this rewards active flows */if (f->hnext) {f->hnext->hprev = f->hprev;}if (f->hprev) {f->hprev->hnext = f->hnext;}if (f == fb->tail) {fb->tail = f->hprev;}f->hnext = fb->head;f->hprev = NULL;fb->head->hprev = f;fb->head = f;/* found our flow, lock & return */FLOWLOCK_WRLOCK(f);if (unlikely(TcpSessionPacketSsnReuse(p, f, f->protoctx) == 1)) {f = TcpReuseReplace(tv, dtv, fb, f, hash, p);if (f == NULL) {FBLOCK_UNLOCK(fb);return NULL;}}/* update the last seen timestamp of this flow */COPY_TIMESTAMP(&p->ts,&f->lastts);FlowReference(dest, f);FBLOCK_UNLOCK(fb);return f;}}}/* lock & return */
/*如果packet和bucket的第一个flow匹配(五元组+vlan相同),
判断流重用,并通过参数dest返回*/FLOWLOCK_WRLOCK(f);if (unlikely(TcpSessionPacketSsnReuse(p, f, f->protoctx) == 1)) {f = TcpReuseReplace(tv, dtv, fb, f, hash, p);if (f == NULL) {FBLOCK_UNLOCK(fb);return NULL;}}/* update the last seen timestamp of this flow */COPY_TIMESTAMP(&p->ts,&f->lastts);FlowReference(dest, f);FBLOCK_UNLOCK(fb);return f;
}

这篇关于suricata 3.1 源码分析33 (FlowWorker处理流程2 - FlowHandlePacket)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740966

相关文章

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery