该代码是一个 conn_not_found 函数,其作用是在连接跟踪表中查找指定的连接。如果找到了,就返回对应的连接;否则,就创建一个新连接并返回。
该函数首先检查传入的数据包是否有效,如果无效,就将它的状态设置为 CS_INVALID,并返回 NULL。
然后,该函数设置数据包的状态为 CS_NEW,并检查是否有 alg_exp(即是否需要应用 ALG)。如果有,就将数据包的状态设置为 CS_RELATED。
接着,该函数检查是否需要创建新连接。如果需要,就获取连接跟踪表的连接数限制,并检查当前连接数是否已达到限制。如果已达到,则返回 NULL。
如果未达到连接数限制,就继续创建新连接。首先,该函数获取连接所属的哈希桶,并调用 new_conn 函数创建一个新连接。然后,该函数为连接设置一些属性,例如反向键、关联 ALG 等。如果需要应用 NAT,则还会创建一个 nat_info 结构体,并将 conn_for_un_nat_copy 参数指定的连接复制到该结构体中。最后,该函数将新连接插入到哈希表中,并增加连接计数器。
如果创建新连接失败,则删除刚刚创建的连接,并返回 NULL。如果需要应用 NAT,还要将 conn_for_un_nat_copy 设置为 CT_CONN_TYPE_UN_NAT 类型,并清空其中的 nat_info 和 alg 字段。
最后,如果创建新连接因为 tuple space exhaustion 失败,则删除刚刚创建的连接,并返回 NULL。同时,该函数打印一条警告信息,提示 NAT 资源已经耗尽,需要使用防火墙和/或分区来保护系统。