mirror of https://github.com/OISF/suricata
parent
fee79ff3c4
commit
c4b0c2888d
@ -0,0 +1,120 @@
|
|||||||
|
/* Copyright (C) 2023 Open Information Security Foundation
|
||||||
|
*
|
||||||
|
* You can copy, redistribute or modify this Program under the terms of
|
||||||
|
* the GNU General Public License version 2 as published by the Free
|
||||||
|
* Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* version 2 along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \author Lukas Sismis <lukas.sismis@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UTIL_DPDK_BONDING_C
|
||||||
|
#define UTIL_DPDK_BONDING_C
|
||||||
|
|
||||||
|
#include "suricata-common.h"
|
||||||
|
#include "util-dpdk-bonding.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_DPDK
|
||||||
|
|
||||||
|
#include "util-dpdk.h"
|
||||||
|
#include "util-debug.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the port is Bond or not by evaluating device driver name
|
||||||
|
* @param pid port ID
|
||||||
|
* @return 0 - the device si Bond PMD, 1 - regular device, <0 error
|
||||||
|
*/
|
||||||
|
int32_t BondingIsBond(uint16_t pid)
|
||||||
|
{
|
||||||
|
struct rte_eth_dev_info di;
|
||||||
|
int32_t ret = rte_eth_dev_info_get(pid, &di);
|
||||||
|
if (ret < 0) {
|
||||||
|
SCLogError("%s: unable to get device info (err: %s)", DPDKGetPortNameByPortID(pid),
|
||||||
|
rte_strerror(-ret));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return strcmp(di.driver_name, "net_bonding") == 0 ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t BondingMemberDevicesGet(
|
||||||
|
uint16_t bond_pid, uint16_t bonded_devs[], uint16_t bonded_devs_length)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_DPDK_BOND
|
||||||
|
int32_t len = rte_eth_bond_slaves_get(bond_pid, bonded_devs, bonded_devs_length);
|
||||||
|
if (len == 0)
|
||||||
|
FatalError("%s: no bonded devices found", DPDKGetPortNameByPortID(bond_pid));
|
||||||
|
else if (len < 0)
|
||||||
|
FatalError("%s: unable to get bonded devices (err: %s)", DPDKGetPortNameByPortID(bond_pid),
|
||||||
|
rte_strerror(-len));
|
||||||
|
|
||||||
|
return len;
|
||||||
|
#else
|
||||||
|
FatalError(
|
||||||
|
"%s: bond port not supported in DPDK installation", DPDKGetPortNameByPortID(bond_pid));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t BondingAllDevicesSameDriver(uint16_t bond_pid)
|
||||||
|
{
|
||||||
|
uint16_t bonded_devs[RTE_MAX_ETHPORTS] = { 0 };
|
||||||
|
uint16_t len = BondingMemberDevicesGet(bond_pid, bonded_devs, RTE_MAX_ETHPORTS);
|
||||||
|
|
||||||
|
const char *driver_name = NULL, *first_driver_name = NULL;
|
||||||
|
struct rte_eth_dev_info di = { 0 };
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < len; i++) {
|
||||||
|
int32_t ret = rte_eth_dev_info_get(bonded_devs[i], &di);
|
||||||
|
if (ret < 0)
|
||||||
|
FatalError("%s: unable to get device info (err: %s)",
|
||||||
|
DPDKGetPortNameByPortID(bonded_devs[i]), rte_strerror(-ret));
|
||||||
|
|
||||||
|
if (i == 0) {
|
||||||
|
first_driver_name = di.driver_name;
|
||||||
|
} else {
|
||||||
|
driver_name = di.driver_name;
|
||||||
|
if (strncmp(first_driver_name, driver_name,
|
||||||
|
MIN(strlen(first_driver_name), strlen(driver_name))) != 0) {
|
||||||
|
return -EINVAL; // inconsistent drivers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates to the driver that is actually used by the bonded ports
|
||||||
|
* \param bond_pid
|
||||||
|
* \return driver name, FatalError otherwise
|
||||||
|
*/
|
||||||
|
const char *BondingDeviceDriverGet(uint16_t bond_pid)
|
||||||
|
{
|
||||||
|
uint16_t bonded_devs[RTE_MAX_ETHPORTS] = { 0 };
|
||||||
|
BondingMemberDevicesGet(bond_pid, bonded_devs, RTE_MAX_ETHPORTS);
|
||||||
|
|
||||||
|
struct rte_eth_dev_info di = { 0 };
|
||||||
|
int32_t ret = rte_eth_dev_info_get(bonded_devs[0], &di);
|
||||||
|
if (ret < 0)
|
||||||
|
FatalError("%s: unable to get device info (err: %s)",
|
||||||
|
DPDKGetPortNameByPortID(bonded_devs[0]), rte_strerror(-ret));
|
||||||
|
|
||||||
|
return di.driver_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* HAVE_DPDK */
|
||||||
|
|
||||||
|
#endif /* UTIL_DPDK_BONDING_C */
|
@ -0,0 +1,39 @@
|
|||||||
|
/* Copyright (C) 2023 Open Information Security Foundation
|
||||||
|
*
|
||||||
|
* You can copy, redistribute or modify this Program under the terms of
|
||||||
|
* the GNU General Public License version 2 as published by the Free
|
||||||
|
* Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* version 2 along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \author Lukas Sismis <lukas.sismis@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UTIL_DPDK_BONDING_H
|
||||||
|
#define UTIL_DPDK_BONDING_H
|
||||||
|
|
||||||
|
#include "suricata-common.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_DPDK
|
||||||
|
|
||||||
|
int32_t BondingIsBond(uint16_t pid);
|
||||||
|
uint16_t BondingMemberDevicesGet(
|
||||||
|
uint16_t bond_pid, uint16_t bonded_devs[], uint16_t bonded_devs_length);
|
||||||
|
int32_t BondingAllDevicesSameDriver(uint16_t bond_pid);
|
||||||
|
const char *BondingDeviceDriverGet(uint16_t bond_pid);
|
||||||
|
|
||||||
|
#endif /* HAVE_DPDK */
|
||||||
|
|
||||||
|
#endif /* UTIL_DPDK_BONDING_H */
|
Loading…
Reference in New Issue