37 int32_t BondingIsBond(uint16_t pid)
39 struct rte_eth_dev_info di;
40 int32_t ret = rte_eth_dev_info_get(pid, &di);
42 SCLogError(
"%s: unable to get device info (err: %s)", DPDKGetPortNameByPortID(pid),
47 return strcmp(di.driver_name,
"net_bonding") == 0 ? 0 : 1;
50 uint16_t BondingMemberDevicesGet(
51 uint16_t bond_pid, uint16_t bonded_devs[], uint16_t bonded_devs_length)
54 #if RTE_VERSION >= RTE_VERSION_NUM(23, 11, 0, 0)
56 #if RTE_VERSION < RTE_VERSION_NUM(24, 11, 0, 0) // DPDK 23.11 - 24.07
57 #pragma GCC diagnostic push
58 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
61 int32_t
len = rte_eth_bond_members_get(bond_pid, bonded_devs, bonded_devs_length);
63 #if RTE_VERSION < RTE_VERSION_NUM(24, 11, 0, 0)
64 #pragma GCC diagnostic pop
68 int32_t
len = rte_eth_bond_slaves_get(bond_pid, bonded_devs, bonded_devs_length);
72 FatalError(
"%s: no bonded devices found", DPDKGetPortNameByPortID(bond_pid));
74 FatalError(
"%s: unable to get bonded devices (err: %s)", DPDKGetPortNameByPortID(bond_pid),
80 "%s: bond port not supported in DPDK installation", DPDKGetPortNameByPortID(bond_pid));
87 static int BondingMemberCountCb(
88 const char *key __rte_unused,
const char *value __rte_unused,
void *opaque)
90 uint16_t *
cnt = opaque;
106 static uint16_t BondingMemberDevCountFromDevargs(
const struct rte_eth_dev_info *dev_info)
108 if (dev_info->device == NULL) {
112 #if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
113 const struct rte_devargs *devargs = rte_dev_devargs(dev_info->device);
115 const struct rte_devargs *devargs = dev_info->device->devargs;
117 if (devargs == NULL || devargs->args == NULL) {
121 struct rte_kvargs *kvargs = rte_kvargs_parse(devargs->args, NULL);
122 if (kvargs == NULL) {
128 #if RTE_VERSION >= RTE_VERSION_NUM(23, 11, 0, 0)
129 ret = rte_kvargs_process(kvargs,
"member", BondingMemberCountCb, &count);
131 ret = rte_kvargs_process(kvargs,
"slave", BondingMemberCountCb, &count);
134 rte_kvargs_free(kvargs);
135 return ret == 0 ? count : 0;
138 uint32_t BondingMempoolSizeCalculate(
139 uint16_t bond_pid,
const struct rte_eth_dev_info *dev_info, uint32_t curr_mempool_size)
141 if (curr_mempool_size == 0) {
145 uint16_t
cnt = BondingMemberDevCountFromDevargs(dev_info);
148 return curr_mempool_size;
149 }
else if (curr_mempool_size > UINT32_MAX /
cnt) {
150 FatalError(
"%s: mempool size too large to adjust for %u bonded devices",
151 DPDKGetPortNameByPortID(bond_pid),
cnt);
154 return curr_mempool_size *
cnt;
157 int32_t BondingAllDevicesSameDriver(uint16_t bond_pid)
159 uint16_t bonded_devs[RTE_MAX_ETHPORTS] = { 0 };
160 uint16_t
len = BondingMemberDevicesGet(bond_pid, bonded_devs, RTE_MAX_ETHPORTS);
162 const char *driver_name = NULL, *first_driver_name = NULL;
163 struct rte_eth_dev_info di = { 0 };
165 for (uint16_t i = 0; i <
len; i++) {
166 int32_t ret = rte_eth_dev_info_get(bonded_devs[i], &di);
168 FatalError(
"%s: unable to get device info (err: %s)",
169 DPDKGetPortNameByPortID(bonded_devs[i]), rte_strerror(-ret));
172 first_driver_name = di.driver_name;
174 driver_name = di.driver_name;
175 if (strncmp(first_driver_name, driver_name,
176 MIN(strlen(first_driver_name), strlen(driver_name))) != 0) {
190 const char *BondingDeviceDriverGet(uint16_t bond_pid)
192 uint16_t bonded_devs[RTE_MAX_ETHPORTS] = { 0 };
193 BondingMemberDevicesGet(bond_pid, bonded_devs, RTE_MAX_ETHPORTS);
195 struct rte_eth_dev_info di = { 0 };
196 int32_t ret = rte_eth_dev_info_get(bonded_devs[0], &di);
198 FatalError(
"%s: unable to get device info (err: %s)",
199 DPDKGetPortNameByPortID(bonded_devs[0]), rte_strerror(-ret));
201 return di.driver_name;