Skip to content

Commit

Permalink
Integration with TDI layer
Browse files Browse the repository at this point in the history
Signed-off-by: Sabeel Ansari <sabeel.ansari@intel.com>
  • Loading branch information
5abeel committed Jan 31, 2025
1 parent 2f154bc commit d0238fd
Show file tree
Hide file tree
Showing 8 changed files with 124 additions and 28 deletions.
13 changes: 9 additions & 4 deletions stratum/hal/bin/tdi/es2k/es2k_main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@
#include "stratum/hal/lib/tdi/es2k/es2k_port_manager.h"
#include "stratum/hal/lib/tdi/es2k/es2k_sde_wrapper.h"
#include "stratum/hal/lib/tdi/es2k/es2k_switch.h"
#include "stratum/hal/lib/tdi/es2k/es2k_virtual_port_manager.h"
#include "stratum/hal/lib/tdi/tdi_action_profile_manager.h"
#include "stratum/hal/lib/tdi/tdi_counter_manager.h"
#include "stratum/hal/lib/tdi/tdi_fixed_function_manager.h"
#include "stratum/hal/lib/tdi/tdi_ipsec_manager.h"
#include "stratum/hal/lib/tdi/tdi_packetio_manager.h"
#include "stratum/hal/lib/tdi/tdi_pre_manager.h"
#include "stratum/hal/lib/tdi/tdi_table_manager.h"
#include "stratum/hal/lib/tdi/es2k/es2k_virtual_port_manager.h"
#include "stratum/lib/macros.h"
#include "stratum/lib/security/auth_policy_checker.h"
#include "stratum/lib/security/credentials_manager.h"
Expand Down Expand Up @@ -145,9 +145,14 @@ ::util::Status Main(absl::Notification* ready_sync,

auto virtual_port_manager = Es2kVirtualPortManager::CreateSingleton();

auto chassis_manager = Es2kChassisManager::CreateInstance(mode,
port_manager,
virtual_port_manager);
auto chassis_manager = Es2kChassisManager::CreateInstance(
mode, port_manager, virtual_port_manager);

// Es2kVirtualPortManager needs reference to SetTdiSdeInterface &
// TdiFixedFunctionManager
virtual_port_manager->SetTdiSdeInterface(sde_wrapper);
virtual_port_manager->SetTdiFixedFunctionManager(
fixed_function_manager.get());

auto ipsec_manager = TdiIpsecManager::CreateInstance(
sde_wrapper, fixed_function_manager.get());
Expand Down
2 changes: 1 addition & 1 deletion stratum/hal/lib/tdi/es2k/es2k_chassis_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -744,7 +744,7 @@ ::util::StatusOr<DataResponse> Es2kChassisManager::GetVirtualPortData(
case Request::kVportMacAddress: {
ASSIGN_OR_RETURN(auto mac_address,
es2k_virtual_port_manager_->GetMacAddress(
request.vport_oper_status().global_resource_id()));
request.vport_mac_address().global_resource_id()));
resp.mutable_mac_address()->set_mac_address(mac_address);
break;
}
Expand Down
57 changes: 49 additions & 8 deletions stratum/hal/lib/tdi/es2k/es2k_virtual_port_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "stratum/glue/status/statusor.h"
#include "stratum/hal/lib/common/common.pb.h"
#include "stratum/hal/lib/common/utils.h"
#include "stratum/hal/lib/tdi/tdi_constants.h"
#include "stratum/hal/lib/tdi/tdi_sde_common.h"
#include "stratum/hal/lib/tdi/tdi_status.h"
#include "stratum/lib/channel/channel.h"
Expand All @@ -34,12 +35,16 @@ extern "C" {
#include "ipu_types/ipu_types.h"
}

#define VPORT_STATE_TABLE_NAME \
"openconfig-virtual-ports.virtual-ports.virtual-port.state"

namespace stratum {
namespace hal {
namespace tdi {

Es2kVirtualPortManager* Es2kVirtualPortManager::singleton_ = nullptr;

#if 0
namespace {

// A callback function executed in SDE port state change thread context.
Expand All @@ -63,6 +68,8 @@ ipu_status_t sde_port_status_callback(ipu_dev_id_t device,

} // namespace

#endif

Es2kVirtualPortManager* Es2kVirtualPortManager::CreateSingleton() {
absl::WriterMutexLock l(&init_lock_);
if (!singleton_) {
Expand All @@ -77,25 +84,59 @@ Es2kVirtualPortManager* Es2kVirtualPortManager::GetSingleton() {
return singleton_;
}

void Es2kVirtualPortManager::SetTdiSdeInterface(TdiSdeInterface* tdi_sde_intf) {
tdi_sde_interface_ = tdi_sde_intf;
}

void Es2kVirtualPortManager::SetTdiFixedFunctionManager(
TdiFixedFunctionManager* tdi_fixed_func_mgr) {
tdi_fixed_function_manager_ = tdi_fixed_func_mgr;
}

::util::StatusOr<uint32> Es2kVirtualPortManager::GetVSI(
uint32 global_resource_id) {
// TODO: Retrieve vport VSI from SDE
uint32 vsi = 432;
return vsi;
uint64 data;
ASSIGN_OR_RETURN(auto session, tdi_sde_interface_->CreateSession());
auto status = tdi_fixed_function_manager_->FetchVportTableData(
session, VPORT_STATE_TABLE_NAME, global_resource_id, kVsi, &data);
if (!status.ok()) {
return MAKE_ERROR(ERR_AT_LEAST_ONE_OPER_FAILED)
<< "One or more read operations failed.";
}
return static_cast<uint32>(data);
}

::util::StatusOr<PortState> Es2kVirtualPortManager::GetPortState(
uint32 global_resource_id) {
// TODO: Retrieve vport oper-status from SDE
return PORT_STATE_DOWN;
uint64 data;
ASSIGN_OR_RETURN(auto session, tdi_sde_interface_->CreateSession());
auto status = tdi_fixed_function_manager_->FetchVportTableData(
session, VPORT_STATE_TABLE_NAME, global_resource_id, kOperStatus, &data);
if (!status.ok()) {
return MAKE_ERROR(ERR_AT_LEAST_ONE_OPER_FAILED)
<< "One or more read operations failed.";
}
return static_cast<PortState>(data);
}

// Stratum's common.proto uses uint64 for MacAddress
::util::StatusOr<uint64> Es2kVirtualPortManager::GetMacAddress(
uint32 global_resource_id) {
// TODO: Retrieve vport mac-address from SDE
uint64 kDummyMacAddress = 0x112233445566ull;
return kDummyMacAddress;
uint64 data;
ASSIGN_OR_RETURN(auto session, tdi_sde_interface_->CreateSession());
auto status = tdi_fixed_function_manager_->FetchVportTableData(
session, VPORT_STATE_TABLE_NAME, global_resource_id, kMacAddress, &data);
if (!status.ok()) {
return MAKE_ERROR(ERR_AT_LEAST_ONE_OPER_FAILED)
<< "One or more read operations failed.";
}

// Return mac-address with correct byte order
uint64 swapped_mac = ((data & 0xFF) << 40) | ((data & 0xFF00) << 24) |
((data & 0xFF0000) << 8) | ((data & 0xFF000000) >> 8) |
((data & 0xFF00000000) >> 24) |
((data & 0xFF0000000000) >> 40);
return swapped_mac;
}

::util::Status Es2kVirtualPortManager::OnPortStatusEvent(int device, int port,
Expand Down
12 changes: 12 additions & 0 deletions stratum/hal/lib/tdi/es2k/es2k_virtual_port_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#include <vector>

#include "absl/synchronization/mutex.h"
#include "stratum/hal/lib/tdi/tdi_fixed_function_manager.h"
#include "stratum/hal/lib/tdi/tdi_sde_interface.h"
#include "stratum/hal/lib/tdi/tdi_virtual_port_manager.h"

// Suppress clang errors
Expand All @@ -26,6 +28,9 @@ class Es2kVirtualPortManager : public TdiVirtualPortManager {
Es2kVirtualPortManager() {}
virtual ~Es2kVirtualPortManager() {}

void SetTdiSdeInterface(TdiSdeInterface* tdi_sde_intf);
void SetTdiFixedFunctionManager(TdiFixedFunctionManager* tdi_fixed_func_mgr);

::util::StatusOr<uint32> GetVSI(uint32 global_resource_id);
::util::StatusOr<PortState> GetPortState(uint32 global_resource_id);
// Stratum's common.proto uses uint64 for MacAddress
Expand All @@ -51,6 +56,13 @@ class Es2kVirtualPortManager : public TdiVirtualPortManager {
protected:
// The singleton instance.
static Es2kVirtualPortManager* singleton_ GUARDED_BY(init_lock_);

private:
// Pointer to TdiSdeInterface implementation.
TdiSdeInterface* tdi_sde_interface_; // not owned by this class.

// Pointer to FixedFunctionManager. (not owned by this class)
TdiFixedFunctionManager* tdi_fixed_function_manager_;
};

} // namespace tdi
Expand Down
8 changes: 7 additions & 1 deletion stratum/hal/lib/tdi/tdi_constants.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// Copyright 2020-present Open Networking Foundation
// Copyright 2022-2023 Intel Corporation
// Copyright 2022-2023,2025 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#ifndef STRATUM_HAL_LIB_TDI_TDI_CONSTANTS_H_
Expand Down Expand Up @@ -62,6 +62,12 @@ constexpr char kIpsecSaLtHard[] = "sa-lifetime-hard";
constexpr char kIpsecSaLtSoft[] = "sa-lifetime-soft";
constexpr char kIpsecFetchSpi[] = "rx-spi";

// vport related consts used in fixed functions
constexpr char kGlobalResourceId[] = "global-resource-id";
constexpr char kVsi[] = "vsi";
constexpr char kOperStatus[] = "oper-status";
constexpr char kMacAddress[] = "mac-address";

// TNA specific limits
constexpr uint16 kMaxCloneSessionId = 1015;
constexpr uint16 kMaxMulticastGroupId = 65535;
Expand Down
28 changes: 27 additions & 1 deletion stratum/hal/lib/tdi/tdi_fixed_function_manager.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2023 Intel Corporation
// Copyright 2023,2025 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#include "stratum/hal/lib/tdi/tdi_fixed_function_manager.h"
Expand Down Expand Up @@ -57,6 +57,10 @@ TdiFixedFunctionManager::CreateInstance(OperationMode mode,
new TdiFixedFunctionManager(mode, tdi_sde_interface, device));
}

//////////////////////////////////
// IPsec fixed-function TDI calls
//////////////////////////////////

::util::Status TdiFixedFunctionManager::InitNotificationTableWithCallback(
std::string table_name,
void (*ipsec_notif_cb)(uint32_t, uint32_t, bool, uint8_t, char*, bool,
Expand Down Expand Up @@ -169,6 +173,28 @@ ::util::Status TdiFixedFunctionManager::BuildSadbTableData(
return ::util::OkStatus();
}

//////////////////////////////////////////
// Virtual-ports fixed-function TDI calls
//////////////////////////////////////////
::util::Status TdiFixedFunctionManager::FetchVportTableData(
std::shared_ptr<TdiSdeInterface::SessionInterface> session,
std::string table_name, uint32 global_resource_id, const char* param_name,
uint64* data) {
absl::ReaderMutexLock l(&lock_);

ASSIGN_OR_RETURN(uint32 table_id, tdi_sde_interface_->GetTableId(table_name));
ASSIGN_OR_RETURN(auto table_key,
tdi_sde_interface_->CreateTableKey(table_id));
RETURN_IF_ERROR(table_key->SetExact(kGlobalResourceId, global_resource_id));
ASSIGN_OR_RETURN(auto table_data,
tdi_sde_interface_->CreateTableData(table_id, 0));
RETURN_IF_ERROR(tdi_sde_interface_->GetTableEntry(
device_, session, table_id, table_key.get(), table_data.get()));
RETURN_IF_ERROR(table_data->GetParam(std::string(param_name), data));

return ::util::OkStatus();
}

} // namespace tdi
} // namespace hal
} // namespace stratum
9 changes: 8 additions & 1 deletion stratum/hal/lib/tdi/tdi_fixed_function_manager.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2023 Intel Corporation
// Copyright 2023,2025 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#ifndef STRATUM_HAL_LIB_TDI_TDI_FIXED_FUNCTION_MANAGER_H_
Expand All @@ -9,6 +9,7 @@
#include "stratum/glue/status/statusor.h"
#include "stratum/hal/lib/common/common.pb.h"
#include "stratum/hal/lib/tdi/tdi.pb.h"
#include "stratum/hal/lib/tdi/tdi_constants.h"
#include "stratum/hal/lib/tdi/tdi_sde_interface.h"

namespace stratum {
Expand All @@ -35,6 +36,12 @@ class TdiFixedFunctionManager {
std::shared_ptr<TdiSdeInterface::SessionInterface> session,
std::string table_name, uint32* spi) LOCKS_EXCLUDED(lock_);

// Fetch value from the TDI table
::util::Status FetchVportTableData(
std::shared_ptr<TdiSdeInterface::SessionInterface> session,
std::string table_name, uint32 global_resource_id, const char* param_name,
uint64* data) LOCKS_EXCLUDED(lock_);

// Creates a Fixed function table manager instance.
static std::unique_ptr<TdiFixedFunctionManager> CreateInstance(
OperationMode mode, TdiSdeInterface* tdi_sde_interface, int device);
Expand Down
23 changes: 11 additions & 12 deletions stratum/hal/lib/yang/yang_parse_tree_virtual_port.cc
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,13 @@ void SetUpVirtualPortFetchVSI(TreeNode* node, YangParseTree* tree) {
auto* request = req.add_requests()->mutable_vport_vsi();
::gnmi::Path* path_ptr = const_cast<::gnmi::Path*>(&path);

// std::cout << "path=" << path_ptr->DebugString() << std::endl;
uint32 glort_id = static_cast<uint32>(
uint32 global_resource_id = static_cast<uint32>(
std::stoul(val.at(0))); // only one will be present at index 0
request->set_global_resource_id(glort_id);
request->set_global_resource_id(global_resource_id);

// In-place definition of method retrieving data from generic response
// and saving into 'resp' local variable.
uint32 resp{};
uint64 resp{};
DataResponseWriter writer([&resp](const DataResponse& in) {
if (!in.has_vport_vsi()) return false;
resp = in.vport_vsi().vsi();
Expand Down Expand Up @@ -68,14 +67,14 @@ void SetUpVirtualPortFetchOperStatus(TreeNode* node, YangParseTree* tree) {
const std::vector<std::string>& val,
GnmiSubscribeStream* stream) {
DataRequest req;
auto* request = req.add_requests()->mutable_vport_vsi();
auto* request = req.add_requests()->mutable_vport_oper_status();
::gnmi::Path* path_ptr = const_cast<::gnmi::Path*>(&path);

uint32 glort_id = static_cast<uint32>(
uint32 global_resource_id = static_cast<uint32>(
std::stoul(val.at(0))); // only one will be present at index 0
request->set_global_resource_id(glort_id);
request->set_global_resource_id(global_resource_id);

uint32 resp{};
uint64 resp{};
DataResponseWriter writer([&resp](const DataResponse& in) {
if (!in.has_oper_status()) return false;
resp = in.oper_status().state();
Expand All @@ -101,14 +100,14 @@ void SetUpVirtualPortFetchMacAddress(TreeNode* node, YangParseTree* tree) {
const std::vector<std::string>& val,
GnmiSubscribeStream* stream) {
DataRequest req;
auto* request = req.add_requests()->mutable_vport_vsi();
auto* request = req.add_requests()->mutable_vport_mac_address();
::gnmi::Path* path_ptr = const_cast<::gnmi::Path*>(&path);

uint32 glort_id = static_cast<uint32>(
uint32 global_resource_id = static_cast<uint32>(
std::stoul(val.at(0))); // only one will be present at index 0
request->set_global_resource_id(glort_id);
request->set_global_resource_id(global_resource_id);

uint32 resp{};
uint64 resp{};
DataResponseWriter writer([&resp](const DataResponse& in) {
if (!in.has_mac_address()) return false;
resp = in.mac_address().mac_address();
Expand Down

0 comments on commit d0238fd

Please sign in to comment.