suricata 3.1 源码分析26 (数据包VLAN解码)

suricata 3.1 源码分析26 (数据包VLAN解码)
由于VLAN可能嵌套,因此Packet结构体中使用以下相应字段进行记录: 字段含义vlan_idx当前的vlan层数,初始为0,最多为2,即最多只能嵌套一层VLAN,否则会报错。vlan_id[2]记录每一层的VLAN ID(共12位,可表示4096个VLAN),通过GET_VLAN_ID获得。vlanh[2]记录每一层的VLAN头指针(VLANHdr *类型)。 /** * \internal * \brief this function is used to decode IEEE802.1q packets * * \param tv...

suricata 3.1 源码分析24 (数据包解码模块执行)

suricata 3.1 源码分析24 (数据包解码模块执行)
/** * \brief This function passes off to link type decoders. * * DecodePcap reads packets from the PacketQueue and passes * them off to the proper link type decoder. * * \param t pointer to ThreadVars * \param p pointer to the current packet * \param data pointer that gets cast into PcapThreadVars for ptv * \param pq pointer to the current PacketQueue */...

suricata 3.1 源码分析23 (数据包解码模块注册及初始化)

suricata 3.1 源码分析23 (数据包解码模块注册及初始化)
th,td,tr{border:1px solid #eee;text-align:center;padding:10px;}/* css注释:只对table标签设置红色边框样式 */ 简介 Suricata的解码模块与数据包获取模块是一一对应的,例如DecodePcap对应ReceivePcap,DecodeAFP对应ReceiveAFP。 然而,我们知道数据包格式都是协议规定的,因此核心的数据包解码流程一定会是固定的。例如,对于常规的以太网包IPV4包TCP包,无非是DecodeEthernet->DecodeIPV4->...

suricata 3.1 源码分析22 (数据包处理2)

suricata 3.1 源码分析22 (数据包处理2)
对数据包进行进一步处理的TmThreadsSlotVarRun函数原型如下: TmEcode TmThreadsSlotVarRun(ThreadVars *tv, Packet *p,TmSlot *slot) 按照函数头的注释说明,这个函数被从母函数中拉出来独立存在的原因是,为了能够对其进行递归调用。函数主流程是一个遍历所有slot的for循环, /** * \brief Separate run function so we can call it recursively. * * \todo Deal with post_pq for slots beyond t...

suricata 3.1 源码分析21 (数据包处理1)

suricata 3.1 源码分析21 (数据包处理1)
进一步的数据包处理是在TmThreadsSlotProcessPkt中完成,其原型为: static inline TmEcode TmThreadsSlotProcessPkt(ThreadVars *tv, TmSlot *s, Packet *p) 其中,s就是前面一路传下来的slot,而p为当前要处理的Packet。 /** * \brief Process the rest of the functions (if any) and queue. */ static inline TmEcode TmThreadsSlotProcessPkt(ThreadVars *tv, TmSlot *s, Packet *p) { T...

suricata 3.1 源码分析20 (数据包封装)

suricata 3.1 源码分析20 (数据包封装)
th,td,tr{border:1px solid #eee;text-align:center;padding:10px;}/* css注释:只对table标签设置红色边框样式 */ 在Suricata中,用来封装数据包的结构体为Packet,核心字段如下: 字段 含义 src/dst、sp/dp、proto 五元组信息:源/目的地址,源/目的端口号,传输层协议(TCP/UDP/…)。 flow 数据包所属的流指针(类型为Flow_ *)。 ip4h、ip6h 网络层数据指针。 tcph、udph、sctph、icmp...

suricata 3.1 源码分析19 (数据包获取)

suricata 3.1 源码分析19 (数据包获取)
初始化完成后,TmThreadsSlotPktAcqLoop函数将进入一个while循环,调用slot的PktAcqLoop函数获取并处理数据包。对应的模块函数原型为: TmEcode ReceivePcapLoop(ThreadVars *tv, void *data, void *slot) 其中,data即为初始化阶段生成的PcapThreadVars结构体,而slot就是包含该模块的那个slot,传入进来的目的主要是获取线程中后续的slot(这里对应DecodePcap),以调用后续的数据包处理流程。 /** * ...

suricata 3.1 源码分析18 (模块注册及初始化)

suricata 3.1 源码分析18 (模块注册及初始化)
th,td,tr{border:1px solid #eee;text-align:center;padding:10px;} /* css注释:只对table标签设置红色边框样式 */ |Suricata支持多种数据包源:pcap(实时/文件)、nfq、ipfw、mpipe、af-packet、pfring、dag(实时/文件)、napatech。 每种数据包源的支持都对应于一个线程模块(Thread Module),得益于这种其模块化的架构,增加一个新的数据源支持只需要添加一个新的线程模块即可。 这里,我将主要...

suricata 3.1 源码分析17 (流管理2)

suricata 3.1 源码分析17 (流管理2)
TmThreadsManagement static void *TmThreadsManagement(void *td) { /* block usr2. usr2 to be handled by the main thread only */ UtilSignalBlock(SIGUSR2); ThreadVars *tv = (ThreadVars *)td; //流管理中tv = tv_flowmgr (上文提到的) TmSlot *s = (TmSlot *)tv->tm_slots; //流管理中 s = tmm_modules[TMM_FLOWMANAGER] TmEcode r = TM_ECODE_OK; ...
Copyright © 九毛的官方博客 保留所有权利.   Theme  Ality

用户登录