diff --git a/src/grpc/proto b/src/grpc/proto index d81de3cd..38e13009 160000 --- a/src/grpc/proto +++ b/src/grpc/proto @@ -1 +1 @@ -Subproject commit d81de3cdc5d03a26d86d3259607f686fc6b7b4c4 +Subproject commit 38e1300990444be8cec6cec231455f3dcbe58d1a diff --git a/src/netlink/knet_manager.cc b/src/netlink/knet_manager.cc index 9ed1ffab..925ed5f7 100644 --- a/src/netlink/knet_manager.cc +++ b/src/netlink/knet_manager.cc @@ -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 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) { @@ -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; @@ -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 lock{tn_mutex}; port_deleted.push_back(port_id); @@ -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; } diff --git a/src/netlink/nbi_impl.cc b/src/netlink/nbi_impl.cc index 1b1b25eb..2138bf2c 100644 --- a/src/netlink/nbi_impl.cc +++ b/src/netlink/nbi_impl.cc @@ -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); } diff --git a/src/netlink/port_manager.h b/src/netlink/port_manager.h index a9c0e629..220de14e 100644 --- a/src/netlink/port_manager.h +++ b/src/netlink/port_manager.h @@ -46,6 +46,11 @@ class port_manager { std::lock_guard 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 @@ -108,6 +113,8 @@ class port_manager { std::map id_to_hwaddr; const rofl::caddress_ll nulladdr; + + switch_interface *swi; }; } // namespace basebox diff --git a/src/of-dpa/controller.cc b/src/of-dpa/controller.cc index a69de497..d9a2e1c6 100644 --- a/src/of-dpa/controller.cc +++ b/src/of-dpa/controller.cc @@ -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 diff --git a/src/of-dpa/controller.h b/src/of-dpa/controller.h index 3b0b3113..ff553b41 100644 --- a/src/of-dpa/controller.h +++ b/src/of-dpa/controller.h @@ -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; diff --git a/src/of-dpa/ofdpa_client.cc b/src/of-dpa/ofdpa_client.cc index 364b5325..5b5c3c49 100644 --- a/src/of-dpa/ofdpa_client.cc +++ b/src/of-dpa/ofdpa_client.cc @@ -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 diff --git a/src/of-dpa/ofdpa_client.h b/src/of-dpa/ofdpa_client.h index 8fff1e43..c653056f 100644 --- a/src/of-dpa/ofdpa_client.h +++ b/src/of-dpa/ofdpa_client.h @@ -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); diff --git a/src/sai.h b/src/sai.h index 1c623f31..8fc8ede7 100644 --- a/src/sai.h +++ b/src/sai.h @@ -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 { */