void S1mmeSession::CuOutputNode(S1APNode* p_node, uint8_t worker_id,bool timeout) { bool output_ue_release = true, out_put_pdn_connect = true; time_t last_kqi_sec = 0; for (std::vector<CuKqiInfo_T>::iterator it = p_node->cu_kqi_.begin(); it != p_node->cu_kqi_.end();) { CuOutputKqi(p_node, it->msg_type, it->ebi, last_kqi_sec, output_ue_release,worker_id); it = p_node->cu_kqi_.erase(it); } S1MMEKQI* kqi_main = p_node->FindKqi(kS1mmeProcTypeERABModification); if(kqi_main){ CuEncodeErabModification(kqi_main, p_node->GetCommonInfo(), p_node->GetUserInfo(), current_time_.tv_sec,worker_id); } kqi_main = p_node->FindKqi(kS1mmeProcTypeSecondaryRatDataUsage); if(kqi_main){ CuEncodeSecondaryRatDataUsageReport(kqi_main, p_node->GetCommonInfo(), p_node->GetUserInfo(), current_time_.tv_sec,worker_id); } kqi_main = p_node->FindKqi(kS1mmeProcTypeAttach); if (kqi_main && ((timeout && nas_default_encrypt_alg_) || (!timeout))) { S1MMEKQI* kqi_ue_release = p_node->FindKqi(kS1mmeProcTypeUEContextRelease); S1MMEKQI* kqi_pdn_connect = p_node->FindKqi(kS1mmeProcTypePdnConnect, 5); if (1) { for (uint8_t i=0; i<1; i++) { //KQIBearer* p_bearer = kqi_initial_context->GetBearer(i); //if (p_bearer == NULL) break; //p_node->GetUserInfo()->FillKQIBearer(p_bearer->ebi, p_bearer); } } CuEncodeAttach(kqi_main, p_node->GetCommonInfo(), p_node->GetUserInfo(), current_time_.tv_sec,worker_id,kqi_ue_release,kqi_pdn_connect); //output attach if (output_ue_release && kqi_ue_release && kqi_ue_release->complete_time_.tv_sec - kqi_main->complete_time_.tv_sec > 15) { //output UEContextRelease; CuEncodeUEContextRelease(kqi_ue_release,p_node->GetCommonInfo(),p_node->GetUserInfo(),current_time_.tv_sec,worker_id); output_ue_release = false; } out_put_pdn_connect = false; }什么意思
时间: 2024-03-30 18:35:17 浏览: 16
这段代码主要是将S1APNode的信息输出到CU(Control Unit)中。首先,它会遍历p_node->cu_kqi_中的每个CuKqiInfo_T对象,并调用CuOutputKqi()函数将KQI信息编码并输出到CU中。接着,它会查找S1MMEKQI对象,并调用CuEncodeErabModification()、CuEncodeSecondaryRatDataUsageReport()和CuEncodeAttach()函数将ERAB Modification、Secondary RAT Data Usage Report和Attach信息编码并输出到CU中。如果timeout为true且nas_default_encrypt_alg_不为空,还会调用CuEncodeUEContextRelease()函数将UE Context Release信息编码并输出到CU中。在输出Attach信息时,如果output_ue_release为true且kqi_ue_release不为空,且kqi_ue_release已完成的时间与kqi_main已完成的时间相差大于15秒,则会调用CuEncodeUEContextRelease()函数将UE Context Release信息编码并输出到CU中。最后,将out_put_pdn_connect设置为false。
相关问题
void S1mmeSession::CheckTimeout(uint64_t second, uint8_t worker_id) { //主map 超时, 同时伴随 辅助map 超时 bool dead_loop_major,dead_loop_hoc,dead_loop_stmsi; { S1APNode* p_cur = (S1APNode*)(p_major_map_->GetHead()); S1APKey_T* p_cur_key = p_major_map_->GetCursorKey(); S1APNode* p_next = (S1APNode*)(p_major_map_->Next()); S1APKey_T* p_next_key = p_major_map_->GetCursorKey(); while (p_next != NULL) { if (current_time_.tv_sec - p_cur->GetLastTime().tv_sec > timeout_major_) { if (handle_session_version_ == S1MME_SESSION_VERSION_CHINA_TELECOM) { CtOutputNode(p_cur,true); } else { CuOutputNode(p_cur,s1mme_worker_id_,true); } p_path_switch_map_->DeleteData(p_cur->GetMMEKey(), p_s1ap_node_allocator_); p_handover_container_map_->DeleteData(p_cur->GetContainerKey(), p_s1ap_node_allocator_); SPUserInfo& sp_user_info = p_cur->GetUserInfo(); //Todo@ydzy:超时stmsi map p_major_map->DeleteData(p_cur_key, p_s1ap_node_allocator_); p_cur = p_next; p_next = (S1APNode)(p_major_map_->Next()); p_cur_key = p_next_key; p_next_key = p_major_map_->GetCursorKey(); } else { break; } } dead_loop_major = p_major_map_->CheckDeadLoop(); }在S1mmeSession::CheckTimeout函数中增加一个超时处理函数,超时处理函数遍历新增加的hash节点,当current_time_.tv_sec-节点的last_time时,使用LogInfo函数将节点所有字段以及current_time_.tv_sec字段进行输出
好的,我理解了您的要求。以下是在S1mmeSession::CheckTimeout函数中增加一个超时处理函数的代码示例:
```
void S1mmeSession::CheckTimeout(uint64_t second, uint8_t worker_id) {
//主map 超时, 同时伴随 辅助map 超时
bool dead_loop_major,dead_loop_hoc,dead_loop_stmsi;
{
S1APNode* p_cur = (S1APNode*)(p_major_map_->GetHead());
S1APKey_T* p_cur_key = p_major_map_->GetCursorKey();
S1APNode* p_next = (S1APNode*)(p_major_map_->Next());
S1APKey_T* p_next_key = p_major_map_->GetCursorKey();
while (p_next != NULL) {
if (current_time_.tv_sec - p_cur->GetLastTime().tv_sec > timeout_major_) {
if (handle_session_version_ == S1MME_SESSION_VERSION_CHINA_TELECOM) {
CtOutputNode(p_cur,true);
} else {
CuOutputNode(p_cur,s1mme_worker_id_,true);
}
p_path_switch_map_->DeleteData(p_cur->GetMMEKey(), p_s1ap_node_allocator_);
p_handover_container_map_->DeleteData(p_cur->GetContainerKey(), p_s1ap_node_allocator_);
SPUserInfo& sp_user_info = p_cur->GetUserInfo();
//Todo@ydzy:超时stmsi map
p_major_map_->DeleteData(p_cur_key, p_s1ap_node_allocator_);
// 增加超时处理函数
if (current_time_.tv_sec - p_cur->GetLastTime().tv_sec > timeout_new_hash_node_) {
LogInfo("超时处理函数:节点超时,当前时间:%llu,节点信息:{字段1:%d,字段2:%d,字段3:%s}。",
current_time_.tv_sec, p_cur->GetField1(), p_cur->GetField2(), p_cur->GetField3().c_str());
}
p_cur = p_next;
p_next = (S1APNode)(p_major_map_->Next());
p_cur_key = p_next_key;
p_next_key = p_major_map_->GetCursorKey();
} else {
break;
}
}
dead_loop_major = p_major_map_->CheckDeadLoop();
}
}
```
其中,超时处理函数的代码如下:
```
if (current_time_.tv_sec - p_cur->GetLastTime().tv_sec > timeout_new_hash_node_) {
LogInfo("超时处理函数:节点超时,当前时间:%llu,节点信息:{字段1:%d,字段2:%d,字段3:%s}。",
current_time_.tv_sec, p_cur->GetField1(), p_cur->GetField2(), p_cur->GetField3().c_str());
}
```
当节点的last_time字段与当前时间的时间差大于timeout_new_hash_node_时,超时处理函数会将该节点的字段以及当前时间输出到日志中。您可以根据需要自行修改输出内容和格式。
void S1mmeSession::UpdateUserDataIMSI(S1APNode* p_node, uint64_t imsi) { SPUserInfo& sp_local_user_info = p_node->GetUserInfo(); if (0==imsi) { return; } #if 1 sp_local_user_info->SetIMSI(imsi); if (IsImsiAttach() && sp_local_user_info->HasSTMSI()) { ue_stmsi_map_.erase(StmsiWithMmegi_T(sp_local_user_info->GetSTMSI())); DeleteFromStmsiTimeoutMap(sp_local_user_info->GetSTMSI()); sp_local_user_info->flag_.stmsi = false; sp_local_user_info->index_.stmsi =0; }什么意思
这也是一段 C++ 代码,该函数用于更新用户的 IMSI 信息。具体实现是,首先从 S1AP 节点中获取本地用户信息(即当前用户信息),然后判断是否需要更新 IMSI 信息。如果 IMSI 为 0,则直接返回。如果 IMSI 不为 0,则更新本地用户信息中的 IMSI。接着,如果当前用户已经附着(即已经建立了连接),并且本地用户信息中存在 STMSI(临时标识),则需要将该 STMSI 从相应的映射表中删除,并且重置本地用户信息中相应的标志位和索引值。整个函数的作用就是更新用户的 IMSI 信息,并处理相关的逻辑。