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

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚