diff --git a/src/vnsw/agent/pkt/flow_table.cc b/src/vnsw/agent/pkt/flow_table.cc index 378622aca0f..58d4db78ce8 100644 --- a/src/vnsw/agent/pkt/flow_table.cc +++ b/src/vnsw/agent/pkt/flow_table.cc @@ -1510,8 +1510,13 @@ void FlowEntry::InitRevFlow(const PktFlowInfo *info, const PktInfo *pkt, data_.flow_dest_vrf = info->flow_source_vrf; data_.flow_source_plen_map = info->flow_dest_plen_map; data_.flow_dest_plen_map = info->flow_source_plen_map; - data_.dest_vrf = info->nat_dest_vrf; data_.vrf = info->dest_vrf; + + if (!info->nat_done) { + data_.dest_vrf = info->flow_source_vrf; + } else { + data_.dest_vrf = info->nat_dest_vrf; + } if (info->ecmp) { set_flags(FlowEntry::EcmpFlow); } else { diff --git a/src/vnsw/agent/pkt/test/test_flow_util.h b/src/vnsw/agent/pkt/test/test_flow_util.h index 09eaa341560..e11db26bf19 100644 --- a/src/vnsw/agent/pkt/test/test_flow_util.h +++ b/src/vnsw/agent/pkt/test/test_flow_util.h @@ -343,6 +343,35 @@ class VerifyVrf : public FlowVerify { std::string dest_vrf_; }; +class VerifyDestVrf : public FlowVerify { +public: + VerifyDestVrf(std::string src_vrf, std::string dest_vrf): + src_vrf_(src_vrf), dest_vrf_(dest_vrf) {}; + virtual ~VerifyDestVrf() {}; + + void Verify(FlowEntry *fe) { + const VrfEntry *src_vrf = + Agent::GetInstance()->vrf_table()->FindVrfFromName(src_vrf_); + EXPECT_TRUE(src_vrf != NULL); + + const VrfEntry *dest_vrf = + Agent::GetInstance()->vrf_table()->FindVrfFromName(dest_vrf_); + EXPECT_TRUE(dest_vrf != NULL); + + EXPECT_TRUE(fe->data().flow_source_vrf == dest_vrf->vrf_id()); + + if (true) { + FlowEntry *rev = fe->reverse_flow_entry(); + EXPECT_TRUE(rev != NULL); + EXPECT_TRUE(rev->data().flow_source_vrf == src_vrf->vrf_id()); + } + }; + +private: + std::string src_vrf_; + std::string dest_vrf_; +}; + struct VerifyNat : public FlowVerify { public: VerifyNat(std::string nat_sip, std::string nat_dip, uint32_t proto, diff --git a/src/vnsw/agent/pkt/test/test_pkt_flow.cc b/src/vnsw/agent/pkt/test/test_pkt_flow.cc index 9ee6c290f4f..d9e3ee31e81 100644 --- a/src/vnsw/agent/pkt/test/test_pkt_flow.cc +++ b/src/vnsw/agent/pkt/test/test_pkt_flow.cc @@ -579,14 +579,16 @@ TEST_F(FlowTest, FlowAdd_1) { flow0->id()), { new VerifyVn("vn5", "vn5"), - new VerifyVrf("vrf5", "vrf5") + new VerifyVrf("vrf5", "vrf5"), + new VerifyDestVrf("vrf5", "vrf5") } }, { TestFlowPkt(Address::INET, vm2_ip, vm1_ip, 1, 0, 0, "vrf5", flow1->id()), { new VerifyVn("vn5", "vn5"), - new VerifyVrf("vrf5", "vrf5") + new VerifyVrf("vrf5", "vrf5"), + new VerifyDestVrf("vrf5", "vrf5") } }, //Add a TCP forward and reverse flow @@ -594,14 +596,16 @@ TEST_F(FlowTest, FlowAdd_1) { "vrf5", flow0->id()), { new VerifyVn("vn5", "vn5"), - new VerifyVrf("vrf5", "vrf5") + new VerifyVrf("vrf5", "vrf5"), + new VerifyDestVrf("vrf5", "vrf5") } }, { TestFlowPkt(Address::INET, vm2_ip, vm1_ip, IPPROTO_TCP, 200, 1000, "vrf5", flow1->id()), { new VerifyVn("vn5", "vn5"), - new VerifyVrf("vrf5", "vrf5") + new VerifyVrf("vrf5", "vrf5"), + new VerifyDestVrf("vrf5", "vrf5") } } };