ZBLOG

具体分析这段代码 static struct conn * conn_not_found(struct conntrack *ct, struct dp_packet *pkt, struct conn_lookup_ctx *ctx, bool commit, long long now, const struct nat_action_info_t *nat_action_info, struct...

这段代码实现了在连接跟踪表中查找一个不存在的连接。如果需要创建新的连接,那么会检查当前连接数是否达到了上限,如果没有达到,则会创建一个新连接,并将其插入到连接跟踪表中。

具体来说,该函数接受以下参数:

  • ct:连接跟踪表的指针。
  • pkt:要处理的数据包。
  • ctx:连接跟踪上下文信息。
  • commit:是否需要创建新的连接。
  • now:当前时间戳。
  • nat_action_info:NAT动作信息。
  • conn_for_un_nat_copy:用于un-NAT的连接副本。
  • helper:ALG助手。
  • alg_exp:ALG表达式。
  • ct_alg_ctl:ct_alg_ctl类型。

函数的主体部分如下:

  1. 首先,通过调用valid_new函数检查传入的数据包是否有效。如果无效,则将数据包的ct_state设为CS_INVALID,并返回NULL。

  2. 如果数据包有效,则将数据包的ct_state设为CS_NEW。如果存在alg_exp,则将CS_RELATED标志位置为1。

  3. 如果需要创建新的连接,首先检查当前连接数是否达到了上限。如果已经达到了上限,则直接返回NULL。

  4. 然后,通过调用port_conn_info_lookup函数查找端口连接信息。如果找到了对应的端口连接信息,并且该端口连接达到了速率限制,则返回NULL。

  5. 否则,通过调用new_conn函数创建一个新的连接,并将其插入到连接跟踪表中。如果需要使用ALG助手,则将连接的alg字段设为相应的字符串。如果存在alg_exp,则将连接的相关标志位和其他属性设为相应的值。

  6. 如果需要进行NAT转换,则通过调用nat_select_range_tuple函数选择一个可用的NAT地址,并将连接相关的信息填写到conn_for_un_nat_copy中。然后,将当前连接的类型设置为CT_CONN_TYPE_UN_NAT,使得在数据包un-NAT时可以找到对应的连接。接着,将创建好的新连接插入到连接跟踪表中。

  7. 最后,将连接数加1,并返回创建好的连接的指针。如果因为元组空间耗尽而无法进行NAT转换,则会删除之前创建的连接,并返回NULL。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=358

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?