这段代码实现了在连接跟踪表中查找一个不存在的连接。如果需要创建新的连接,那么会检查当前连接数是否达到了上限,如果没有达到,则会创建一个新连接,并将其插入到连接跟踪表中。
具体来说,该函数接受以下参数:
- 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类型。
函数的主体部分如下:
首先,通过调用valid_new函数检查传入的数据包是否有效。如果无效,则将数据包的ct_state设为CS_INVALID,并返回NULL。
如果数据包有效,则将数据包的ct_state设为CS_NEW。如果存在alg_exp,则将CS_RELATED标志位置为1。
如果需要创建新的连接,首先检查当前连接数是否达到了上限。如果已经达到了上限,则直接返回NULL。
然后,通过调用port_conn_info_lookup函数查找端口连接信息。如果找到了对应的端口连接信息,并且该端口连接达到了速率限制,则返回NULL。
否则,通过调用new_conn函数创建一个新的连接,并将其插入到连接跟踪表中。如果需要使用ALG助手,则将连接的alg字段设为相应的字符串。如果存在alg_exp,则将连接的相关标志位和其他属性设为相应的值。
如果需要进行NAT转换,则通过调用nat_select_range_tuple函数选择一个可用的NAT地址,并将连接相关的信息填写到conn_for_un_nat_copy中。然后,将当前连接的类型设置为CT_CONN_TYPE_UN_NAT,使得在数据包un-NAT时可以找到对应的连接。接着,将创建好的新连接插入到连接跟踪表中。
最后,将连接数加1,并返回创建好的连接的指针。如果因为元组空间耗尽而无法进行NAT转换,则会删除之前创建的连接,并返回NULL。