Skip to content

Commit

Permalink
[ovsp4rt] Update internal API to return status
Browse files Browse the repository at this point in the history
- Modified the functions in the internal C++ API to return
  absl::Status. Explicitly ignored return status in the C
  API wrappers. Status is currently for use in testing.

  Note that issue #618 proposes that public APIs should
  return status.

- Moved ovsp4rt_str_to_tunnel_type() to a separate source
  file for C api functions that are not wrappers.

Signed-off-by: Derek Foster <[email protected]>
  • Loading branch information
ffoulkes committed Jan 9, 2025
1 parent 4bac68c commit 1317ec2
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 163 deletions.
2 changes: 2 additions & 0 deletions ovs-p4rt/sidecar/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,12 @@ if(BUILD_CLIENT)
target_sources(ovs_sidecar_o PRIVATE
ovsp4rt_internal_api.h
ovsp4rt_journal_api.cc
ovsp4rt_simple_api.cc
)
else()
target_sources(ovs_sidecar_o PRIVATE
ovsp4rt_internal_api.h
ovsp4rt_simple_api.cc
ovsp4rt_standard_api.cc
)
endif()
Expand Down
171 changes: 76 additions & 95 deletions ovs-p4rt/sidecar/newovsp4rt.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2223,19 +2223,19 @@ absl::Status ConfigSrcIpMacMapTableEntry(ClientInterface& client,
// learn_info is passed by value because this function may make local
// modifications to it.
//----------------------------------------------------------------------
void DoConfigFdbEntry(ClientInterface& client,
struct mac_learning_info learn_info, bool insert_entry,
const char* grpc_addr) {
absl::Status DoConfigFdbEntry(ClientInterface& client,
struct mac_learning_info learn_info,
bool insert_entry, const char* grpc_addr) {
absl::Status status;

// Start a new client session.
status = client.connect(grpc_addr);
if (!status.ok()) return;
if (!status.ok()) return status;

// Fetch P4Info object from server.
::p4::config::v1::P4Info p4info;
status = client.getPipelineConfig(&p4info);
if (!status.ok()) return;
if (!status.ok()) return status;

/* In the delete case, we do not know whether this is a Tunnel learn
* entry or a regular VSI learn entry. Check for a match in one of
Expand Down Expand Up @@ -2269,39 +2269,29 @@ void DoConfigFdbEntry(ClientInterface& client,
GetFdbTunnelTableEntry(client, learn_info, p4info, true);
if (status_or_read_response.ok()) {
// Return if entry already exists.
return;
return status_or_read_response.status();
}
}

status =
ConfigFdbTunnelTableEntry(client, learn_info, p4info, insert_entry);
if (!status.ok()) {
// Ignore errors (why?)
}
// Ignore errors (why?)
(void)ConfigFdbTunnelTableEntry(client, learn_info, p4info, insert_entry);

status = ConfigL2TunnelTableEntry(client, learn_info, p4info, insert_entry);
if (!status.ok()) {
// Ignore errors (why?)
}
// Ignore errors (why?)
(void)ConfigL2TunnelTableEntry(client, learn_info, p4info, insert_entry);

status = ConfigFdbSmacTableEntry(client, learn_info, p4info, insert_entry);
if (!status.ok()) {
// Ignore errors (why?)
}
// Ignore errors (why?)
(void)ConfigFdbSmacTableEntry(client, learn_info, p4info, insert_entry);
} else {
if (insert_entry) {
auto status_or_read_response =
GetFdbVlanTableEntry(client, learn_info, p4info, true);
if (status_or_read_response.ok()) {
// Return if entry already exists.
return;
return absl::OkStatus();
}

status =
ConfigFdbRxVlanTableEntry(client, learn_info, p4info, insert_entry);
if (!status.ok()) {
// Ignore errors (why?)
}
// Ignore errors (why?)
(void)ConfigFdbRxVlanTableEntry(client, learn_info, p4info, insert_entry);

// TODO(derek): refactor (extract method)
//
Expand All @@ -2310,7 +2300,7 @@ void DoConfigFdbEntry(ClientInterface& client,
auto response_or_status =
GetTxAccVsiTableEntry(client, learn_info.src_port, p4info);
if (!response_or_status.ok()) {
return;
return response_or_status.status();
}

::p4::v1::ReadResponse read_response =
Expand Down Expand Up @@ -2344,57 +2334,55 @@ void DoConfigFdbEntry(ClientInterface& client,
// end of refactoring
}

status =
ConfigFdbTxVlanTableEntry(client, learn_info, p4info, insert_entry);
if (!status.ok()) {
// Ignore errors (why?)
}
// Ignore errors (why?)
(void)ConfigFdbTxVlanTableEntry(client, learn_info, p4info, insert_entry);

status = ConfigFdbSmacTableEntry(client, learn_info, p4info, insert_entry);
if (!status.ok()) {
// Ignore errors (why?)
}
// Ignore errors (why?)
(void)ConfigFdbSmacTableEntry(client, learn_info, p4info, insert_entry);
}

return absl::OkStatus();
}

//----------------------------------------------------------------------
// DoConfigRxTunnelSrcEntry (ES2K)
//----------------------------------------------------------------------
void DoConfigRxTunnelSrcEntry(ClientInterface& client,
const struct tunnel_info& tunnel_info,
bool insert_entry, const char* grpc_addr) {
absl::Status DoConfigRxTunnelSrcEntry(ClientInterface& client,
const struct tunnel_info& tunnel_info,
bool insert_entry,
const char* grpc_addr) {
absl::Status status;

// Start a new client session.
status = client.connect(grpc_addr);
if (!status.ok()) return;
if (!status.ok()) return status;

// Fetch P4Info object from server.
::p4::config::v1::P4Info p4info;
status = client.getPipelineConfig(&p4info);
if (!status.ok()) return;
if (!status.ok()) return status;

status = ConfigRxTunnelSrcPortTableEntry(client, tunnel_info, p4info,
insert_entry);
if (!status.ok()) return;
return ConfigRxTunnelSrcPortTableEntry(client, tunnel_info, p4info,
insert_entry);
}

//----------------------------------------------------------------------
// DoConfigTunnelSrcPortEntry (ES2K)
//----------------------------------------------------------------------
void DoConfigTunnelSrcPortEntry(ClientInterface& client,
const struct src_port_info& tnl_sp,
bool insert_entry, const char* grpc_addr) {
absl::Status DoConfigTunnelSrcPortEntry(ClientInterface& client,
const struct src_port_info& tnl_sp,
bool insert_entry,
const char* grpc_addr) {
absl::Status status;

// Start a new client session.
status = client.connect(grpc_addr);
if (!status.ok()) return;
if (!status.ok()) return status;

// Fetch P4Info object from server.
::p4::config::v1::P4Info p4info;
status = client.getPipelineConfig(&p4info);
if (!status.ok()) return;
if (!status.ok()) return status;

::p4::v1::WriteRequest write_request;
::p4::v1::TableEntry* table_entry;
Expand All @@ -2403,8 +2391,7 @@ void DoConfigTunnelSrcPortEntry(ClientInterface& client,

PrepareSrcPortTableEntry(table_entry, tnl_sp, p4info, insert_entry);

status = client.sendWriteRequest(write_request);
if (!status.ok()) return;
return client.sendWriteRequest(write_request);
}

//----------------------------------------------------------------------
Expand All @@ -2413,26 +2400,27 @@ void DoConfigTunnelSrcPortEntry(ClientInterface& client,
// vsi_sp is passed by value because this function makes local
// modifications to it.
//----------------------------------------------------------------------
void DoConfigSrcPortEntry(ClientInterface& client, struct src_port_info vsi_sp,
bool insert_entry, const char* grpc_addr) {
absl::Status DoConfigSrcPortEntry(ClientInterface& client,
struct src_port_info vsi_sp,
bool insert_entry, const char* grpc_addr) {
absl::Status status;

// Start a new client session.
status = client.connect(grpc_addr);
if (!status.ok()) return;
if (!status.ok()) return status;

// Fetch P4Info object from server.
::p4::config::v1::P4Info p4info;
status = client.getPipelineConfig(&p4info);
if (!status.ok()) return;
if (!status.ok()) return status;

// TODO(derek): refactor (extract method)
//
// GetVsiSrcPort(ClientInterface& client, const P4Info& p4info,
// uint32_t src_port, uint32_t& vsi_port);
auto response_or_status =
GetTxAccVsiTableEntry(client, vsi_sp.src_port, p4info);
if (!response_or_status.ok()) return;
if (!response_or_status.ok()) return response_or_status.status();

::p4::v1::ReadResponse read_response = std::move(response_or_status).value();
std::vector<::p4::v1::TableEntry> table_entries;
Expand Down Expand Up @@ -2463,116 +2451,112 @@ void DoConfigSrcPortEntry(ClientInterface& client, struct src_port_info vsi_sp,
vsi_sp.src_port = host_sp;
// end of refactoring

status = ConfigureVsiSrcPortTableEntry(client, vsi_sp, p4info, insert_entry);
if (!status.ok()) return;
return ConfigureVsiSrcPortTableEntry(client, vsi_sp, p4info, insert_entry);
}

//----------------------------------------------------------------------
// DoConfigVlanEntry (ES2K)
//----------------------------------------------------------------------
void DoConfigVlanEntry(ClientInterface& client, uint16_t vlan_id,
bool insert_entry, const char* grpc_addr) {
absl::Status DoConfigVlanEntry(ClientInterface& client, uint16_t vlan_id,
bool insert_entry, const char* grpc_addr) {
absl::Status status;

// Start a new client session.
status = client.connect(grpc_addr);
if (!status.ok()) return;
if (!status.ok()) return status;

// Fetch P4Info object from server.
::p4::config::v1::P4Info p4info;
status = client.getPipelineConfig(&p4info);
if (!status.ok()) return;
if (!status.ok()) return status;

status = ConfigVlanPushTableEntry(client, vlan_id, p4info, insert_entry);
if (!status.ok()) return;
if (!status.ok()) return status;

status = ConfigVlanPopTableEntry(client, vlan_id, p4info, insert_entry);
if (!status.ok()) return;
return ConfigVlanPopTableEntry(client, vlan_id, p4info, insert_entry);
}

#elif defined(DPDK_TARGET)

//----------------------------------------------------------------------
// DoConfigFdbEntry (DPDK)
//----------------------------------------------------------------------
void DoConfigFdbEntry(ClientInterface& client,
struct mac_learning_info learn_info, bool insert_entry,
const char* grpc_addr) {
absl::Status DoConfigFdbEntry(ClientInterface& client,
struct mac_learning_info learn_info,
bool insert_entry, const char* grpc_addr) {
absl::Status status;

// Start a new client session.
status = client.connect(grpc_addr);
if (!status.ok()) return;
if (!status.ok()) return status;

// Fetch P4Info object from server.
::p4::config::v1::P4Info p4info;
status = client.getPipelineConfig(&p4info);
if (!status.ok()) return;
if (!status.ok()) return status;

if (learn_info.is_tunnel) {
status =
ConfigFdbTunnelTableEntry(client, learn_info, p4info, insert_entry);
} else if (learn_info.is_vlan) {
status =
ConfigFdbTxVlanTableEntry(client, learn_info, p4info, insert_entry);
if (!status.ok()) return;
if (!status.ok()) return status;

status =
ConfigFdbRxVlanTableEntry(client, learn_info, p4info, insert_entry);
if (!status.ok()) return;
}
return status;
}

#endif // DPDK_TARGET

//----------------------------------------------------------------------
// DoConfigTunnelEntry (common)
//----------------------------------------------------------------------
void DoConfigTunnelEntry(ClientInterface& client,
const struct tunnel_info& tunnel_info,
bool insert_entry, const char* grpc_addr) {
absl::Status DoConfigTunnelEntry(ClientInterface& client,
const struct tunnel_info& tunnel_info,
bool insert_entry, const char* grpc_addr) {
absl::Status status;

// Start a new client session.
status = client.connect(grpc_addr);
if (!status.ok()) return;
if (!status.ok()) return status;

// Fetch P4Info object from server.
::p4::config::v1::P4Info p4info;
status = client.getPipelineConfig(&p4info);
if (!status.ok()) return;
if (!status.ok()) return status;

status = ConfigEncapTableEntry(client, tunnel_info, p4info, insert_entry);
if (!status.ok()) return;
if (!status.ok()) return status;

#if defined(ES2K_TARGET)
status = ConfigDecapTableEntry(client, tunnel_info, p4info, insert_entry);
if (!status.ok()) return;
if (!status.ok()) return status;
#endif

status =
ConfigTunnelTermTableEntry(client, tunnel_info, p4info, insert_entry);
if (!status.ok()) return;
return ConfigTunnelTermTableEntry(client, tunnel_info, p4info, insert_entry);
}

#if defined(ES2K_TARGET)

//----------------------------------------------------------------------
// DoConfigIpMacMapEntry (ES2K)
//----------------------------------------------------------------------
void DoConfigIpMacMapEntry(ClientInterface& client,
const struct ip_mac_map_info& ip_info,
bool insert_entry, const char* grpc_addr) {
absl::Status DoConfigIpMacMapEntry(ClientInterface& client,
const struct ip_mac_map_info& ip_info,
bool insert_entry, const char* grpc_addr) {
absl::Status status;

// Start a new client session.
status = client.connect(grpc_addr);
if (!status.ok()) return;
if (!status.ok()) return status;

// Fetch P4Info object from server.
::p4::config::v1::P4Info p4info;
status = client.getPipelineConfig(&p4info);
if (!status.ok()) return;
if (!status.ok()) return status;

if (insert_entry) {
auto status_or_read_response = GetVmSrcTableEntry(client, ip_info, p4info);
Expand All @@ -2582,26 +2566,23 @@ void DoConfigIpMacMapEntry(ClientInterface& client,
}

if (ValidIpAddr(ip_info.src_ip_addr.ip.v4addr.s_addr)) {
status = ConfigSrcIpMacMapTableEntry(client, ip_info, p4info, insert_entry);
if (!status.ok()) {
// Ignore errors (why?)
}
// Ignore errors (why?)
(void)ConfigSrcIpMacMapTableEntry(client, ip_info, p4info, insert_entry);
}

try_dstip:
if (insert_entry) {
auto status_or_read_response = GetVmDstTableEntry(client, ip_info, p4info);
if (status_or_read_response.ok()) {
return;
return status_or_read_response.status();
}
}

if (ValidIpAddr(ip_info.src_ip_addr.ip.v4addr.s_addr)) {
status = ConfigDstIpMacMapTableEntry(client, ip_info, p4info, insert_entry);
if (!status.ok()) {
// Ignore errors (why?)
}
// Ignore errors (why?)
(void)ConfigDstIpMacMapTableEntry(client, ip_info, p4info, insert_entry);
}
return absl::OkStatus();
}

#endif // ES2K_TARGET
Expand Down
Loading

0 comments on commit 1317ec2

Please sign in to comment.