Skip to content

Commit 8ad7f51

Browse files
committed
drivers/nfb: add dynfield for header metadata
1 parent 6b67521 commit 8ad7f51

File tree

4 files changed

+90
-6
lines changed

4 files changed

+90
-6
lines changed

drivers/net/nfb/nfb.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@
4040
#define RTE_NFB_DRIVER_NAME net_nfb
4141

4242
/* Device arguments */
43-
static const char * const VALID_KEYS[] = {NULL};
43+
#define NFB_ARG_RXHDR_DYNFIELD "rxhdr_dynfield"
44+
45+
static const char * const VALID_KEYS[] = {NFB_ARG_RXHDR_DYNFIELD, NULL};
4446

4547
struct eth_node{
4648
struct mdio_if_info if_info;

drivers/net/nfb/nfb_ethdev.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,43 @@ nfb_eth_dev_configure(struct rte_eth_dev *dev)
274274
int ret;
275275
struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
276276

277+
static struct rte_mbuf_dynflag df_ndp_hdr_vld = {
278+
.name = "rte_net_nfb_dynflag_header_vld",
279+
};
280+
281+
static struct rte_mbuf_dynfield df_ndp_hdr_off = {
282+
.name = "rte_net_nfb_dynfield_header_offset",
283+
.align = 2,
284+
.size = 2,
285+
};
286+
287+
static struct rte_mbuf_dynfield df_ndp_hdr_len = {
288+
.name = "rte_net_nfb_dynfield_header_len",
289+
.align = 2,
290+
.size = 2,
291+
};
292+
293+
static struct rte_mbuf_dynfield df_ndp_flags = {
294+
.name = "rte_net_nfb_dynfield_ndp_flags",
295+
.align = 2,
296+
.size = 2,
297+
};
298+
299+
if (nfb_ndp_df_header_enable) {
300+
ret = rte_mbuf_dynflag_register(&df_ndp_hdr_vld);
301+
nfb_ndp_df_header_vld = RTE_BIT64(ret);
302+
nfb_ndp_df_header_offset = rte_mbuf_dynfield_register(&df_ndp_hdr_off);
303+
nfb_ndp_df_header_length = rte_mbuf_dynfield_register(&df_ndp_hdr_len);
304+
nfb_ndp_df_flags = rte_mbuf_dynfield_register(&df_ndp_flags);
305+
306+
if (ret == -1 || nfb_ndp_df_header_offset == -1 ||
307+
nfb_ndp_df_header_length == -1 ||
308+
nfb_ndp_df_flags == -1) {
309+
ret = -rte_errno;
310+
goto err_hdr_register;
311+
}
312+
}
313+
277314
if (dev_conf->rxmode.offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP) {
278315
ret = rte_mbuf_dyn_rx_timestamp_register
279316
(&nfb_timestamp_dynfield_offset,
@@ -289,6 +326,7 @@ nfb_eth_dev_configure(struct rte_eth_dev *dev)
289326
return 0;
290327

291328
err_ts_register:
329+
err_hdr_register:
292330
nfb_eth_dev_uninit(dev);
293331
return ret;
294332
}
@@ -733,6 +771,13 @@ nfb_eth_dev_init(struct rte_eth_dev *dev, void *init_data)
733771
ret = -EINVAL;
734772
goto err_devargs_inval;
735773
}
774+
775+
if ((arg_val = rte_kvargs_get(kvlist, NFB_ARG_RXHDR_DYNFIELD))) {
776+
if (strcmp(arg_val, "1") == 0) {
777+
nfb_ndp_df_header_enable = 1;
778+
}
779+
}
780+
736781
rte_kvargs_free(kvlist);
737782
}
738783

@@ -974,3 +1019,5 @@ static struct rte_pci_driver nfb_eth_driver = {
9741019
RTE_PMD_REGISTER_PCI(RTE_NFB_DRIVER_NAME, nfb_eth_driver);
9751020
RTE_PMD_REGISTER_PCI_TABLE(RTE_NFB_DRIVER_NAME, nfb_pci_id_table);
9761021
RTE_PMD_REGISTER_KMOD_DEP(RTE_NFB_DRIVER_NAME, "* nfb");
1022+
RTE_PMD_REGISTER_PARAM_STRING(RTE_NFB_DRIVER_NAME,
1023+
NFB_ARG_RXHDR_DYNFIELD"=<0|1>");

drivers/net/nfb/nfb_rx.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212
uint64_t nfb_timestamp_rx_dynflag;
1313
int nfb_timestamp_dynfield_offset = -1;
1414

15+
int nfb_ndp_df_header_offset;
16+
int nfb_ndp_df_header_length;
17+
int nfb_ndp_df_flags;
18+
uint64_t nfb_ndp_df_header_vld;
19+
20+
int nfb_ndp_df_header_enable = 0;
21+
1522
int
1623
nfb_eth_rx_queue_start(struct rte_eth_dev *dev, uint16_t rxq_id)
1724
{

drivers/net/nfb/nfb_rx.h

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
extern uint64_t nfb_timestamp_rx_dynflag;
1919
extern int nfb_timestamp_dynfield_offset;
2020

21+
extern int nfb_ndp_df_header_offset;
22+
extern int nfb_ndp_df_header_length;
23+
extern int nfb_ndp_df_flags;
24+
extern uint64_t nfb_ndp_df_header_vld;
25+
26+
extern int nfb_ndp_df_header_enable;
27+
2128
static inline rte_mbuf_timestamp_t *
2229
nfb_timestamp_dynfield(struct rte_mbuf *mbuf)
2330
{
@@ -171,6 +178,8 @@ nfb_eth_ndp_rx(void *queue,
171178
uint16_t nb_pkts)
172179
{
173180
struct ndp_rx_queue *ndp = queue;
181+
uint16_t data_len;
182+
uint16_t hdr_len;
174183
uint16_t packet_size;
175184
uint64_t num_bytes = 0;
176185
uint16_t num_rx;
@@ -183,6 +192,10 @@ nfb_eth_ndp_rx(void *queue,
183192

184193
struct rte_mbuf *mbufs[nb_pkts];
185194

195+
uint16_t *df_hdr_off;
196+
uint16_t *df_hdr_len;
197+
uint16_t *flags;
198+
186199
if (unlikely(ndp->queue == NULL || nb_pkts == 0)) {
187200
RTE_LOG(ERR, PMD, "RX invalid arguments!\n");
188201
return 0;
@@ -212,19 +225,34 @@ nfb_eth_ndp_rx(void *queue,
212225
mbuf = mbufs[i];
213226

214227
/* get the space available for data in the mbuf */
215-
packet_size = packets[i].data_length;
228+
data_len = packets[i].data_length;
229+
hdr_len = packets[i].header_length;
230+
packet_size = data_len + hdr_len;
216231

217232
if (likely(packet_size <= buf_size)) {
218233
/* NDP packet will fit in one mbuf, go ahead and copy */
219-
rte_memcpy(rte_pktmbuf_mtod(mbuf, void *),
220-
packets[i].data, packet_size);
221-
222-
mbuf->data_len = (uint16_t)packet_size;
223234

224235
mbuf->pkt_len = packet_size;
236+
mbuf->data_len = (uint16_t)packet_size;
225237
mbuf->port = ndp->in_port;
226238
mbuf->ol_flags = 0;
227239

240+
if (nfb_ndp_df_header_enable) {
241+
df_hdr_off = RTE_MBUF_DYNFIELD(mbuf, nfb_ndp_df_header_offset, uint16_t*);
242+
df_hdr_len = RTE_MBUF_DYNFIELD(mbuf, nfb_ndp_df_header_length, uint16_t*);
243+
flags = RTE_MBUF_DYNFIELD(mbuf, nfb_ndp_df_flags, uint16_t*);
244+
245+
*df_hdr_off = mbuf->data_off;
246+
*df_hdr_len = hdr_len;
247+
*flags = packets[i].flags;
248+
249+
mbuf->ol_flags |= nfb_ndp_df_header_vld;
250+
251+
rte_memcpy(rte_pktmbuf_mtod(mbuf, void *), packets[i].header, hdr_len);
252+
}
253+
rte_pktmbuf_adj(mbuf, hdr_len);
254+
rte_memcpy(rte_pktmbuf_mtod(mbuf, void *), packets[i].data, data_len);
255+
228256
nfb_rx_fetch_timestamp(ndp, mbuf, packets[i].header, packets[i].header_length);
229257

230258
bufs[num_rx++] = mbuf;

0 commit comments

Comments
 (0)