CmResult COFPSwitchConfig::StreamTo(ACE_OutputCDR &os) { CmResult lRet = CM_ERROR_FAILURE; lRet = COFPMessage::StreamTo(os); if (CM_FAILED(lRet)) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFPSwitchConfig::StreamTo, COFPMessage::StreamTo fail\n"))); return lRet; } os<<m_wFlags; os<<m_wMissSendLen; bool bGood = os.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); return CM_OK; }
CmResult COFPSwitchConfig::StreamFrom(ACE_InputCDR &is) { CmResult lRet = CM_ERROR_FAILURE; lRet = COFPMessage::StreamFrom(is); if (CM_FAILED(lRet)) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFPSwitchConfig::StreamFrom, COFPMessage::StreamFrom fail\n"))); return lRet; } is>>m_wFlags; is>>m_wMissSendLen; bool bGood = is.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); return CM_OK; }
CmResult COFP10PacketOutMsg::StreamTo(ACE_OutputCDR &os) { CmResult lRet = CM_ERROR_FAILURE; lRet = COFPMessage::StreamTo(os); if (CM_FAILED(lRet)) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP10PacketOutMsg::StreamTo, COFPMessage::StreamTo fail\n"))); return lRet; } os<<m_tMember.buffer_id; os<<m_tMember.in_port; os<<m_tMember.actions_len; bool bGood = os.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); std::list<COFP10Action *>::const_iterator it = m_action_list.begin(); while (it != m_action_list.end()) { lRet = (*it)->StreamTo(os); CM_ASSERT_RETURN(CM_SUCCEEDED(lRet), CM_ERROR_FAILURE); it++; } if (m_PacketData) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("COFP10PacketOutMsg::StreamTo, m_PacketData->total_length() = %u\n"), m_PacketData->total_length())); std::string str = m_PacketData->flatten_chained(); os.write_char_array(str.c_str(), str.length()); } bGood = os.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); return CM_OK; }
CmResult COFP13PacketOutMsg::StreamTo(ACE_OutputCDR &os) { CmResult lRet = CM_ERROR_FAILURE; ACE_CDR::Octet pad[6]; lRet = COFPMessage::StreamTo(os); if (CM_FAILED(lRet)) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13PacketOutMsg::StreamTo, COFPMessage::StreamTo fail\n"))); return lRet; } ACE_DEBUG((LM_DEBUG, ACE_TEXT("COFP13PacketOutMsg::StreamTo():\n"))); ACE_DEBUG((LM_DEBUG, ACE_TEXT("msgLen=%u\n"), GetMessageLength())); os<<m_buffer_id; os<<m_in_port; os<<m_actions_len; os.write_octet_array(pad, sizeof(pad)); bool bGood = os.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); ACE_DEBUG((LM_DEBUG, ACE_TEXT("m_actions_len=%u\n"), m_actions_len)); #if 0 while(!m_action_list.empty()) { CCmComAutoPtr<COpenFlowProtAction> action; action = m_action_list.front(); m_action_list.pop_front(); action->EncodeAction(os); } #endif ACE_UINT16 i = 0; std::list<COFP13Action *>::const_iterator it = m_action_list.begin(); while(it != m_action_list.end()) { lRet = (*it)->StreamTo(os); CM_ASSERT_RETURN(CM_SUCCEEDED(lRet), CM_ERROR_FAILURE); ACE_DEBUG((LM_DEBUG, ACE_TEXT("action[%u]'s length=%u\n"), i++, (*it)->GetActionLen())); bGood = os.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); it++; } // just for debugging ACE_UINT32 length = sizeof(m_buffer_id)+sizeof(m_in_port)+sizeof(m_actions_len)+sizeof(m_pad); ACE_DEBUG((LM_DEBUG, ACE_TEXT("length=%u\n"), length)); ACE_INT32 dataLen = GetStreamLen()-COFPMessage::GetStreamLen()-length-m_actions_len; ACE_DEBUG((LM_DEBUG, ACE_TEXT("dataLen=%d\n"), dataLen)); if (m_PacketData) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("m_PacketData->total_length() = %u\n"), m_PacketData->total_length())); std::string str = m_PacketData->flatten_chained(); bGood = os.write_char_array(str.c_str(), str.length()); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); } return CM_OK; }
CmResult COFP13PacketOutMsg::StreamFrom(ACE_InputCDR &is) { ACE_INT32 remainActLen = 0; ACE_INT32 packet_length = 0; ACE_CDR::Octet pad[6]; CmResult lRet = CM_ERROR_FAILURE; lRet = COFPMessage::StreamFrom(is); if (CM_FAILED(lRet)) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13PacketOutMsg::StreamFrom(), COFPMessage::StreamFrom fail\n"))); return lRet; } ACE_DEBUG((LM_DEBUG, ACE_TEXT("COFP13PacketOutMsg::StreamFrom(): \n"))); is>>m_buffer_id; is>>m_in_port; is>>m_actions_len; is.read_octet_array(pad, sizeof(pad)); bool bGood = is.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); ACE_DEBUG((LM_DEBUG, ACE_TEXT("m_actions_len=%u\n"), m_actions_len)); if (m_actions_len>0) { remainActLen = m_actions_len; ACE_UINT16 i = 0; while (remainActLen > 0) { COFP13Action *action = nullptr; CmResult result = COFP13Action::DecodeAction(is, action); if (CM_SUCCEEDED(result)) { m_action_list.push_back(action); ACE_DEBUG((LM_DEBUG, ACE_TEXT("action[%u], len=%u\n"), i++, action->GetStreamLen())); remainActLen = remainActLen - (action->GetStreamLen()); } else { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13Action::DecodeAction failed.\n"))); return CM_ERROR_FAILURE; } } } ACE_UINT32 length = sizeof(m_buffer_id)+sizeof(m_in_port)+sizeof(m_actions_len)+sizeof(m_pad); ACE_DEBUG((LM_DEBUG, ACE_TEXT("length=%u\n"), length)); packet_length = m_wLength-COFPMessage::GetStreamLen()-length-m_actions_len; ACE_DEBUG((LM_DEBUG, ACE_TEXT("packet_length=%d, GetStreamLen=%u\n"), packet_length, GetStreamLen())); if (packet_length < 0) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13PacketOutMsg::StreamFrom, error, length=%u, actionlength=%u\n"), length, m_actions_len)); return CM_ERROR_FAILURE; } ACE_Message_Block data(packet_length); ACE_DEBUG((LM_DEBUG, ACE_TEXT("COFP13PacketOutMsg::StreamFrom, wr_ptr=%p, space=%u\n"), data.wr_ptr(), data.space())); bGood = is.read_char_array(data.wr_ptr(), packet_length); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); data.wr_ptr((size_t)packet_length); if (m_PacketData) { m_PacketData->append(data.duplicate()); } else { m_PacketData = data.duplicate(); } return CM_OK; }
CmResult COFP10PacketOutMsg::StreamFrom(ACE_InputCDR &is) { CmResult lRet = CM_ERROR_FAILURE; lRet = COFPMessage::StreamFrom(is); if (CM_FAILED(lRet)) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP10PacketOutMsg::StreamFrom, COFPMessage::StreamFrom fail\n"))); return lRet; } is>>m_tMember.buffer_id; is>>m_tMember.in_port; is>>m_tMember.actions_len; bool bGood = is.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); if (m_tMember.actions_len > 0) { ACE_INT16 swListLen = m_tMember.actions_len; ACE_UINT16 i = 0; while (swListLen > 0) { COFP10Action *action = nullptr; lRet = COFP10Action::DecodeAction(is, action); if (CM_SUCCEEDED(lRet)) { m_action_list.push_back(action); ACE_DEBUG((LM_DEBUG, ACE_TEXT("action[%u], len=%u\n"), i++, action->GetActionLen())); swListLen -= action->GetActionLen(); } else { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP10PacketOutMsg::StreamFrom, COFP10Action::DecodeAction failed\n"))); return CM_ERROR_FAILURE; } } } ACE_INT16 swDataLen = m_wLength - COFPMessage::GetStreamLen() - sizeof(m_tMember) - m_tMember.actions_len; if (swDataLen < 0) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP10PacketOutMsg::StreamFrom, packet data len(%d) is invalid\n"), swDataLen)); ACE_ASSERT(0); return CM_ERROR_FAILURE; } if (swDataLen == 0) { m_wDataLen = 0; return CM_OK; } ACE_Message_Block Data(swDataLen); ACE_DEBUG((LM_DEBUG, ACE_TEXT("COFP10PacketOutMsg::StreamFrom, wr_ptr = %p, space = %u\n"), Data.wr_ptr(), Data.space())); bGood = is.read_char_array(Data.wr_ptr(), swDataLen); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); Data.wr_ptr((size_t)swDataLen); if (m_PacketData) { m_PacketData->append(Data.duplicate()); } else { m_PacketData = Data.duplicate(); } m_wDataLen += swDataLen; return CM_OK; }
CmResult COFP13TableFeatureProp::DecodeMPTFP(ACE_InputCDR &is, COFP13TableFeatureProp * &prop) { ACE_UINT16 type; bool bGood = is.pre_read(&type, sizeof(type)); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); ACE_CDR::swap_2(reinterpret_cast<const char *>(&type), reinterpret_cast<char *>(&type)); COFP13TableFeatureProp *propData = nullptr; ACE_DEBUG((LM_DEBUG, ACE_TEXT("COFP13TableFeatureProp::DecodeMPTFP, type=%u\n"), type)); switch (type) { case OFPTFPT_INSTRUCTIONS: case OFPTFPT_INSTRUCTIONS_MISS: { propData = new COFP13TableFeaturePropInstruct(type); break; } case OFPTFPT_EXPERIMENTER: case OFPTFPT_EXPERIMENTER_MISS: { propData = new COFP13TableFeaturePropExperimenter(type); break; } case OFPTFPT_NEXT_TABLES: case OFPTFPT_NEXT_TABLES_MISS: { propData = new COFP13TableFeaturePropNextTables(type); } case OFPTFPT_WRITE_ACTIONS: case OFPTFPT_WRITE_ACTIONS_MISS: case OFPTFPT_APPLY_ACTIONS: case OFPTFPT_APPLY_ACTIONS_MISS: { propData = new COFP13TableFeaturePropActions(type); } case OFPTFPT_MATCH: case OFPTFPT_WILDCARDS: case OFPTFPT_WRITE_SETFIELD: case OFPTFPT_WRITE_SETFIELD_MISS: case OFPTFPT_APPLY_SETFIELD: case OFPTFPT_APPLY_SETFIELD_MISS: { propData = new COFP13TableFeaturePropOXM(type); } default: { break; } } CM_ASSERT_RETURN(propData != nullptr, CM_ERROR_OUT_OF_MEMORY); CmResult rv = propData->StreamFrom(is); if (CM_FAILED(rv)) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13TableFeatureProp::DecodeMPTFP error\n"))); return CM_ERROR_FAILURE; } prop = propData; return CM_OK; }
// Logic of StreamTo is similar to StreamFrom. CmResult COFP13HelloMsg::StreamTo(ACE_OutputCDR &os) { bool bGood = false; ACE_UINT16 i = 0; CmResult lRet = CM_ERROR_FAILURE; lRet = COFPMessage::StreamTo(os); if (CM_FAILED(lRet)) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13HelloMsg::StreamTo, COFPMessage::StreamTo fail\n"))); return lRet; } if (m_wLength < COFPMessage::GetStreamLen()) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13HelloMsg::StreamTo(): m_wLength(%u) is less than OFP_MESSAGE_HDR_SIZE(%u).\n"), m_wLength, COFPMessage::GetStreamLen())); return CM_ERROR_FAILURE; } ACE_UINT16 data_size = m_wElemListLen; //m_wLength-OPENFLOW_MESSAGE_HDR_SIZE; ACE_UINT16 iter_size = 0; const ACE_CDR::Octet *pElem = m_pElemList; while (iter_size < m_wElemListLen) { ACE_UINT16 elem_type = GetHelloElemType(pElem); ACE_UINT16 elem_size = GetHelloElemLen(pElem); // elem size, excluding paddings os<<elem_type; os<<elem_size; bGood = os.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); ACE_DEBUG((LM_DEBUG, ACE_TEXT("COFP13HelloMsg::StreamTo(): encode hello elem %u\n"), i++)); ACE_DEBUG((LM_DEBUG, ACE_TEXT("elem_type=%u, elem_size=%u\n"), elem_type, elem_size)); if (elem_size < 4) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13HelloMsg::StreamTo(): elem_size(%u) error, less than 4."), elem_size)); return CM_ERROR_FAILURE; } if ((elem_size + 7)/8*8 > data_size) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13HelloMsg::StreamTo(): (elem_size + 7)/8*8=%u, greater than data_size(%u)\n"), (elem_size + 7)/8*8, data_size)); return CM_ERROR_FAILURE; } if (elem_type != OFPHET_VERSIONBITMAP) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13HelloMsg::StreamTo(): elem_type(%u) isnot OFPHET_VERSIONBITMAP(%u).\n"), elem_type, OFPHET_VERSIONBITMAP)); return CM_ERROR_FAILURE; } ACE_UINT16 bitmap_size = elem_size-4; CM_ASSERT_RETURN((bitmap_size/4*4 == bitmap_size), CM_ERROR_INVALID_ARG); ACE_UINT16 iter_bitmap_size = 0; ACE_UINT16 bitmap_index = 0; while (iter_bitmap_size < bitmap_size)//(bitmap_size > 0) { ACE_UINT32 bitmap = GetVerBMHelloElemBitmap(pElem, bitmap_index); os<<bitmap; bGood = os.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); ACE_DEBUG((LM_DEBUG, ACE_TEXT("COFP13HelloMsg::StreamTo, bitmap[%u]=%u\n"), bitmap_index++, bitmap)); //bitmap_size -= sizeof(bitmap); iter_bitmap_size += sizeof(bitmap); } // deal with paddings ACE_UINT16 pad_length = (elem_size + 7)/8*8 - elem_size; bGood = os.write_octet_array(pElem + 4 + sizeof(ACE_UINT32) * bitmap_index, pad_length); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); iter_size += (elem_size + pad_length); data_size -= (elem_size + pad_length); pElem += (elem_size + pad_length); } return CM_OK; }
CmResult COFP13HelloMsg::StreamFrom(ACE_InputCDR &is) { CmResult lRet = CM_ERROR_FAILURE; ACE_UINT16 i = 0; bool bGood; lRet = COFPMessage::StreamFrom(is); if (CM_FAILED(lRet)) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13HelloMsg::StreamFrom(), COFPMessage::StreamFrom fail\n"))); return lRet; } if (m_wLength < COFPMessage::GetStreamLen()) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13HelloMsg::StreamFrom(): "), ACE_TEXT("m_wLength(%u) is less than COFPMessage::GetStreamLen()(%u).\n"), m_wLength, COFPMessage::GetStreamLen())); return CM_ERROR_FAILURE; } ACE_UINT16 wElemListLen = m_wLength - COFPMessage::GetStreamLen(); ACE_UINT16 data_size = wElemListLen; ACE_UINT16 iter_size = 0; ACE_CDR::Octet *pElem = m_pElemList; while (iter_size < wElemListLen) { ACE_UINT16 elem_type = 0; ACE_UINT16 elem_size = 0; // length of the element, excluding paddings is>>elem_type; is>>elem_size; bGood = is.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); ACE_DEBUG((LM_DEBUG, ACE_TEXT("COFP13HelloMsg::StreamFrom(): parse hello elem %u.\n"), i++)); ACE_DEBUG((LM_DEBUG, ACE_TEXT("elem_type=%u, elem_size=%u\n"), elem_type, elem_size)); SetHelloElemType(pElem, elem_type); SetHelloElemLen(pElem, elem_size); if (elem_size < 4) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13HelloMsg::StreamFrom(): elem_size(%u) error, less than 4.\n"), elem_size)); return CM_ERROR_FAILURE; } if (((elem_size + 7)/8*8) > data_size) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13HelloMsg::StreamFrom(): "), ACE_TEXT("((elem_size + 7)/8*8)=%u, greater than data_size(%u)\n"), ((elem_size + 7)/8*8), data_size)); return CM_ERROR_FAILURE; } if (elem_type != OFPHET_VERSIONBITMAP) { ACE_ERROR((LM_ERROR, ACE_TEXT("COFP13HelloMsg::StreamFrom(): elem_type(%u) isnot OFPHET_VERSIONBITMAP(%u)\n"), elem_type, OFPHET_VERSIONBITMAP)); return CM_ERROR_FAILURE; } ACE_UINT16 bitmap_size = elem_size-4; CM_ASSERT_RETURN((bitmap_size/4*4 == bitmap_size), CM_ERROR_INVALID_ARG); ACE_UINT16 iter_bitmap_size = 0; ACE_UINT16 bitmap_index = 0; while (iter_bitmap_size < bitmap_size)//(bitmap_size > 0) { ACE_UINT32 bitmap = 0; is>>bitmap; bGood = is.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); ACE_DEBUG((LM_DEBUG, ACE_TEXT("bitmap[%u]=%u\n"), bitmap_index, bitmap)); SetVerBMHelloElemBitmap(pElem, bitmap_index++, bitmap); //bitmap_size -= sizeof(bitmap); iter_bitmap_size += sizeof(bitmap); } // deal with paddings ACE_UINT16 pad_size = (elem_size + 7)/8*8 - elem_size; is.read_octet_array(pElem + 4 + bitmap_index * sizeof(ACE_UINT32), pad_size); bGood = is.good_bit(); CM_ASSERT_RETURN(bGood, CM_ERROR_FAILURE); data_size -= (elem_size + pad_size); iter_size += (elem_size + pad_size); pElem += (elem_size + pad_size); m_wElemListLen += (elem_size + pad_size); } return CM_OK; }
TEST_F(CCmDns6ManagerTest,Dns6CancelResolveFail) { CmResult rv = m_pDns6Manger->CancelResolve(m_pDns6Observer); EXPECT_TRUE(CM_FAILED(rv)); }