Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/grpc/proto
Submodule proto updated 1 files
+3 −0 api/ofdpa.proto
63 changes: 7 additions & 56 deletions src/netlink/knet_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -67,19 +67,9 @@ int knet_manager::create_portdev(uint32_t port_id, const std::string &port_name,

if (!dev_exists && !dev_name_exists) {
// create a new tap device
int netif_id;
char mac_string[18];
sprintf(mac_string, "%02x:%02x:%02x:%02x:%02x:%02x", hwaddr[0], hwaddr[1],
hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
try {
{
std::lock_guard<std::mutex> lock{tn_mutex};

netif_id = get_next_netif_id();
if (netif_id < 0)
return netif_id;

knet_devs.insert(std::make_pair(port_id, netif_id));
auto rv = port_names2id.emplace(std::make_pair(port_name, port_id));

if (!rv.second) {
Expand All @@ -92,31 +82,13 @@ int knet_manager::create_portdev(uint32_t port_id, const std::string &port_name,
LOG(FATAL) << __FUNCTION__ << ": failed to insert hwaddr";
}

r = system(("/usr/sbin/client_drivshell knet netif create port=" +
std::to_string(port_id) + " ifname=" + port_name +
" mac=" + mac_string + " keeprxtag=yes")
.c_str());
if (!WIFEXITED(r) || WEXITSTATUS(r) != 0)
r = swi->port_knet_create(port_id);
if (r != 0)
LOG(FATAL) << __FUNCTION__
<< ": failed to create knet interface for port_id "
<< port_id;
r = system(
("/usr/sbin/client_drivshell knet filter create dt=netif did=" +
std::to_string(netif_id) + " ip=" + std::to_string(port_id))
.c_str());
if (!WIFEXITED(r) || WEXITSTATUS(r) != 0)
LOG(FATAL) << __FUNCTION__
<< ": failed to create knet filter for port_id "
<< port_id;
netif_ids_in_use[netif_id] = true;
<< ": failed to create knet netif for port_id " << port_id;
change_port_status(port_name, false);
}

LOG(INFO) << __FUNCTION__
<< ": created device having the following details: port_id="
<< port_id << " portname=" << port_name
<< " netif_id=" << netif_id;

} catch (std::exception &e) {
LOG(ERROR) << __FUNCTION__ << ": failed to create portdev " << port_name;
r = -EINVAL;
Expand All @@ -132,14 +104,6 @@ int knet_manager::create_portdev(uint32_t port_id, const std::string &port_name,
int knet_manager::destroy_portdev(uint32_t port_id,
const std::string &port_name) {
int ret = 0;
auto it = knet_devs.find(port_id);
if (it == knet_devs.end()) {
LOG(WARNING) << __FUNCTION__ << ": called for invalid port_id=" << port_id
<< " port_name=" << port_name;
return 0;
}

uint32_t netif_id = it->second;

std::lock_guard<std::mutex> lock{tn_mutex};
port_deleted.push_back(port_id);
Expand All @@ -157,23 +121,10 @@ int knet_manager::destroy_portdev(uint32_t port_id,
port_names2id.erase(port_names_it);
}

// filter id 1 is the RxAPI, so filter API ids are always one off
ret = system(("/usr/sbin/client_drivshell knet filter destroy " +
std::to_string(netif_id + 1))
.c_str());
if (!WIFEXITED(ret) || WEXITSTATUS(ret) != 0)
LOG(WARNING) << __FUNCTION__ << ": failed to remove filter with id "
<< netif_id + 1;
ret = system(("/usr/sbin/client_drivshell knet netif destroy " +
std::to_string(netif_id))
.c_str());
if (!WIFEXITED(ret) || WEXITSTATUS(ret) != 0)
LOG(WARNING) << __FUNCTION__ << ": failed to remove knet netif with id "
<< netif_id;

netif_ids_in_use[netif_id] = false;
knet_devs.erase(it);

ret = swi->port_knet_delete(port_id);
if (ret != 0)
LOG(WARNING) << __FUNCTION__ << ": failed to remove knet netif for port_id "
<< port_id;
return 0;
}

Expand Down
1 change: 1 addition & 0 deletions src/netlink/nbi_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ void nbi_impl::resend_state() noexcept { nl->resend_state(); }

void nbi_impl::register_switch(switch_interface *swi) noexcept {
this->swi = swi;
port_man->register_switch(swi);
nl->register_switch(swi);
}

Expand Down
7 changes: 7 additions & 0 deletions src/netlink/port_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ class port_manager {
std::lock_guard<std::mutex> lock(tn_mutex);
return port_names2id;
}
void register_switch(switch_interface *swi) noexcept { this->swi = swi; }

void unregister_switch(switch_interface *swi) noexcept {
this->swi = nullptr;
}

uint32_t get_port_id(int ifindex) const noexcept {
// XXX TODO add assert wrt threading
Expand Down Expand Up @@ -108,6 +113,8 @@ class port_manager {
std::map<uint32_t, rofl::caddress_ll> id_to_hwaddr;

const rofl::caddress_ll nulladdr;

switch_interface *swi;
};

} // namespace basebox
8 changes: 8 additions & 0 deletions src/of-dpa/controller.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2686,4 +2686,12 @@ int controller::ofdpa_stg_create(uint16_t vlan_id) noexcept {
return rv;
}

int controller::port_knet_create(uint32_t port_id) noexcept {
return ofdpa->ofdpaPortKnetCreate(port_id);
}

int controller::port_knet_delete(uint32_t port_id) noexcept {
return ofdpa->ofdpaPortKnetDelete(port_id);
}

} // namespace basebox
2 changes: 2 additions & 0 deletions src/of-dpa/controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,8 @@ class controller : public rofl::crofbase,
int port_set_move_learn(
uint32_t port_id,
sai_bridge_port_fdb_learning_t l2_learn) noexcept override;
int port_knet_create(uint32_t port_id) noexcept override;
int port_knet_delete(uint32_t port_id) noexcept override;
int lag_create(uint32_t *lag_id, std::string name,
uint8_t mode) noexcept override;
int lag_remove(uint32_t lag_id) noexcept override;
Expand Down
36 changes: 36 additions & 0 deletions src/of-dpa/ofdpa_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -575,4 +575,40 @@ ofdpa::OfdpaStatus::OfdpaStatusCode ofdpa_client::ofdpaRxRateSet(int32_t pps) {
return response.status();
}

ofdpa::OfdpaStatus::OfdpaStatusCode
ofdpa_client::ofdpaPortKnetCreate(uint32_t port_id) {
::OfdpaStatus response;
::ClientContext context;
::PortNum request;

context.set_wait_for_ready(true);

request.set_port_num(port_id);

::Status rv = stub_->ofdpaPortKnetCreate(&context, request, &response);
if (not rv.ok()) {
return ofdpa::OfdpaStatus::OFDPA_E_RPC;
}

return response.status();
}

ofdpa::OfdpaStatus::OfdpaStatusCode
ofdpa_client::ofdpaPortKnetDelete(uint32_t port_id) {
::OfdpaStatus response;
::ClientContext context;
::PortNum request;

context.set_wait_for_ready(true);

request.set_port_num(port_id);

::Status rv = stub_->ofdpaPortKnetDelete(&context, request, &response);
if (not rv.ok()) {
return ofdpa::OfdpaStatus::OFDPA_E_RPC;
}

return response.status();
}

} // namespace basebox
3 changes: 3 additions & 0 deletions src/of-dpa/ofdpa_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ class ofdpa_client {
uint8_t mode);
ofdpa::OfdpaStatus::OfdpaStatusCode ofdpaRxRateSet(int32_t pps);

ofdpa::OfdpaStatus::OfdpaStatusCode ofdpaPortKnetCreate(uint32_t port_id);
ofdpa::OfdpaStatus::OfdpaStatusCode ofdpaPortKnetDelete(uint32_t port_id);

private:
ofdpa::OfdpaStatus::OfdpaStatusCode
ofdpaTunnelPortCreate(const ::ofdpa::TunnelPortCreate &request);
Expand Down
3 changes: 3 additions & 0 deletions src/sai.h
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,9 @@ class switch_interface {
/* @ port { */
virtual int port_set_config(uint32_t port_id, const rofl::caddress_ll &mac,
bool up) noexcept = 0;

virtual int port_knet_create(uint32_t port_id) noexcept = 0;
virtual int port_knet_delete(uint32_t port_id) noexcept = 0;
/* @} */

/* @ control { */
Expand Down