Skip to content

Commit

Permalink
[Dvaas] Add GetControlSwitchPortConnectedToSutPort to pord id map.Mak…
Browse files Browse the repository at this point in the history
…e packet injection map test packet's port to the corresponding control switch port. (sonic-net#795)



Co-authored-by: kishanps <[email protected]>
  • Loading branch information
VSuryaprasad-HCL and kishanps authored Dec 3, 2024
1 parent ae69845 commit 3a44a1a
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 31 deletions.
13 changes: 11 additions & 2 deletions dvaas/packet_injection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -153,10 +153,19 @@ absl::StatusOr<PacketTestRuns> SendTestPacketsAndCollectOutputs(
if (packet_test_vector.input().type() == SwitchInput::DATAPLANE) {
const Packet& packet = packet_test_vector.input().packet();

// Get corresponding control switch port for the packet's ingress port.
ASSIGN_OR_RETURN(const P4rtPortId sut_ingress_port,
P4rtPortId::MakeFromP4rtEncoding(packet.port()));
ASSIGN_OR_RETURN(
const P4rtPortId control_switch_port,
parameters.mirror_testbed_port_map
.GetControlSwitchPortConnectedToSutPort(sut_ingress_port));

// Inject to egress of control switch.
RETURN_IF_ERROR(pins::InjectEgressPacket(
packet.port(), absl::HexStringToBytes(packet.hex()),
control_ir_p4info, &control_switch, injection_delay));
control_switch_port.GetP4rtEncoding(),
absl::HexStringToBytes(packet.hex()), control_ir_p4info,
&control_switch, injection_delay));
} else {
return absl::UnimplementedError(
absl::StrCat("Test vector input type not supported\n",
Expand Down
23 changes: 21 additions & 2 deletions dvaas/port_id_map.cc
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,28 @@ MirrorTestbedP4rtPortIdMap::GetSutPortConnectedToControlSwitchPort(
absl::Substitute("Control port '$0' was not found in control switch "
"to SUT P4RT port ID map.",
control_port));
} else {
return it->second;
}
return it->second;
}

absl::StatusOr<pins_test::P4rtPortId>
MirrorTestbedP4rtPortIdMap::GetControlSwitchPortConnectedToSutPort(
const pins_test::P4rtPortId& sut_port) const {
// Handle implicit identity map.
if (!control_to_sut_port_map_.has_value()) return sut_port;

// Handle explicit map.
const auto it = absl::c_find_if(*control_to_sut_port_map_,
[&](const auto& control_sut_port) {
return control_sut_port.second == sut_port;
});
if (it == control_to_sut_port_map_->end()) {
return absl::NotFoundError(
absl::Substitute("SUT port '$0' was not found in control switch "
"to control switch P4RT port ID map.",
sut_port));
}
return it->first;
}

absl::Status CheckAndStoreMappedAndUnmappedPortIds(
Expand Down
6 changes: 6 additions & 0 deletions dvaas/port_id_map.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,12 @@ class MirrorTestbedP4rtPortIdMap {
absl::StatusOr<pins_test::P4rtPortId> GetSutPortConnectedToControlSwitchPort(
const pins_test::P4rtPortId& control_port) const;

// Returns the P4RT port ID of the control switch interface connected to the
// interface on the SUT with the given P4RT port ID according to the port
// mapping.
absl::StatusOr<pins_test::P4rtPortId> GetControlSwitchPortConnectedToSutPort(
const pins_test::P4rtPortId& sut_port) const;

private:
MirrorTestbedP4rtPortIdMap(
absl::flat_hash_map<pins_test::P4rtPortId, pins_test::P4rtPortId>
Expand Down
57 changes: 30 additions & 27 deletions dvaas/port_id_map_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,17 @@ TEST(MirrorTestbedP4rtPortIdMap,
MirrorTestbedP4rtPortIdMap::CreateFromControlSwitchToSutPortMap(
{{port_1, port_2}}));

// Control -> SUT.
ASSERT_THAT(port_id_map.GetSutPortConnectedToControlSwitchPort(port_2),
StatusIs(absl::StatusCode::kNotFound));
ASSERT_THAT(port_id_map.GetSutPortConnectedToControlSwitchPort(port_3),
StatusIs(absl::StatusCode::kNotFound));

// SUT -> Control.
ASSERT_THAT(port_id_map.GetControlSwitchPortConnectedToSutPort(port_1),
StatusIs(absl::StatusCode::kNotFound));
ASSERT_THAT(port_id_map.GetControlSwitchPortConnectedToSutPort(port_3),
StatusIs(absl::StatusCode::kNotFound));
}

TEST(MirrorTestbedP4rtPortIdMap,
Expand Down Expand Up @@ -79,10 +86,17 @@ TEST(MirrorTestbedP4rtPortIdMap,
MirrorTestbedP4rtPortIdMap::CreateFromSutToControlSwitchPortMap(
{{port_1, port_2}}));

// Control -> SUT.
ASSERT_THAT(port_id_map.GetSutPortConnectedToControlSwitchPort(port_1),
StatusIs(absl::StatusCode::kNotFound));
ASSERT_THAT(port_id_map.GetSutPortConnectedToControlSwitchPort(port_3),
StatusIs(absl::StatusCode::kNotFound));

// SUT -> Control.
ASSERT_THAT(port_id_map.GetControlSwitchPortConnectedToSutPort(port_2),
StatusIs(absl::StatusCode::kNotFound));
ASSERT_THAT(port_id_map.GetControlSwitchPortConnectedToSutPort(port_3),
StatusIs(absl::StatusCode::kNotFound));
}

TEST(MirrorTestbedP4rtPortIdMap,
Expand All @@ -101,32 +115,7 @@ TEST(MirrorTestbedP4rtPortIdMap,
StatusIs(absl::StatusCode::kInvalidArgument));
}

TEST(MirrorTestbedP4rtPortIdMap,
RetrunsCorrectSutPortGivenControlPortGivenControlToSutMapping) {
ASSERT_OK_AND_ASSIGN(const auto port_1,
P4rtPortId::MakeFromP4rtEncoding("1"));
ASSERT_OK_AND_ASSIGN(const auto port_2,
P4rtPortId::MakeFromP4rtEncoding("2"));
ASSERT_OK_AND_ASSIGN(const auto port_3,
P4rtPortId::MakeFromP4rtEncoding("3"));
ASSERT_OK_AND_ASSIGN(const auto port_4,
P4rtPortId::MakeFromP4rtEncoding("4"));

ASSERT_OK_AND_ASSIGN(
const auto port_id_map,
MirrorTestbedP4rtPortIdMap::CreateFromControlSwitchToSutPortMap({
{port_1, port_2},
{port_3, port_4},
}));

ASSERT_THAT(port_id_map.GetSutPortConnectedToControlSwitchPort(port_1),
IsOkAndHolds(Eq(port_2)));
ASSERT_THAT(port_id_map.GetSutPortConnectedToControlSwitchPort(port_3),
IsOkAndHolds(Eq(port_4)));
}

TEST(MirrorTestbedP4rtPortIdMap,
RetrunsCorrectSutPortGivenControlPortGivenSutToControlMapping) {
TEST(MirrorTestbedP4rtPortIdMap, ReturnsCorrectPortGivenSutToControlMapping) {
ASSERT_OK_AND_ASSIGN(const auto port_1,
P4rtPortId::MakeFromP4rtEncoding("1"));
ASSERT_OK_AND_ASSIGN(const auto port_2,
Expand All @@ -143,23 +132,37 @@ TEST(MirrorTestbedP4rtPortIdMap,
{port_3, port_4},
}));

// Control -> SUT.
ASSERT_THAT(port_id_map.GetSutPortConnectedToControlSwitchPort(port_2),
IsOkAndHolds(Eq(port_1)));
ASSERT_THAT(port_id_map.GetSutPortConnectedToControlSwitchPort(port_4),
IsOkAndHolds(Eq(port_3)));

// SUT -> Control.
ASSERT_THAT(port_id_map.GetControlSwitchPortConnectedToSutPort(port_1),
IsOkAndHolds(Eq(port_2)));
ASSERT_THAT(port_id_map.GetControlSwitchPortConnectedToSutPort(port_3),
IsOkAndHolds(Eq(port_4)));
}

TEST(MirrorTestbedP4rtPortIdMap, RetrunsCorrectSutPortWithImplicitIdentityMap) {
TEST(MirrorTestbedP4rtPortIdMap, ReturnsCorrectPortWithImplicitIdentityMap) {
const auto port_id_map = MirrorTestbedP4rtPortIdMap::CreateIdentityMap();
ASSERT_OK_AND_ASSIGN(const auto port_1,
P4rtPortId::MakeFromP4rtEncoding("1"));
ASSERT_OK_AND_ASSIGN(const auto port_2,
P4rtPortId::MakeFromP4rtEncoding("2"));

// Control -> SUT.
ASSERT_THAT(port_id_map.GetSutPortConnectedToControlSwitchPort(port_1),
IsOkAndHolds(Eq(port_1)));
ASSERT_THAT(port_id_map.GetSutPortConnectedToControlSwitchPort(port_2),
IsOkAndHolds(Eq(port_2)));

// SUT -> Control.
ASSERT_THAT(port_id_map.GetControlSwitchPortConnectedToSutPort(port_1),
IsOkAndHolds(Eq(port_1)));
ASSERT_THAT(port_id_map.GetControlSwitchPortConnectedToSutPort(port_2),
IsOkAndHolds(Eq(port_2)));
}

} // namespace
Expand Down

0 comments on commit 3a44a1a

Please sign in to comment.