Re: [lng-odp] [PATCH v2] test: l2fwd: fill correct source ethernet address
Ping > -Original Message- > From: Savolainen, Petri (Nokia - FI/Espoo) > Sent: Friday, September 18, 2015 9:49 AM > To: Elo, Matias (Nokia - FI/Espoo) <matias@nokia.com>; lng- > o...@lists.linaro.org > Subject: RE: [lng-odp] [PATCH v2] test: l2fwd: fill correct source ethernet > address > > Reviewed-by: Petri Savolainen <petri.savolai...@nokia.com> > > > -Original Message- > > From: lng-odp [mailto:lng-odp-boun...@lists.linaro.org] On Behalf Of > > EXT Matias Elo > > Sent: Thursday, September 17, 2015 11:27 AM > > To: lng-odp@lists.linaro.org > > Subject: [lng-odp] [PATCH v2] test: l2fwd: fill correct source ethernet > > address > > > > When running l2fwd in a VM using SR-IOV the host may drop > > packets if the source MAC address is not the same as that > > of the VF NIC. Modify test application so that the source > > MAC address is always filled correctly. > > > > Signed-off-by: Matias Elo <matias@nokia.com> > > --- > > > > V2: Compare odp_pktio_mac_addr() return value to ODPH_ETHADDR_LEN > > > > test/performance/odp_l2fwd.c | 74 > +++- > > > > 1 file changed, 59 insertions(+), 15 deletions(-) > > > > diff --git a/test/performance/odp_l2fwd.c > > b/test/performance/odp_l2fwd.c > > index 64fc1b2..cb31544 100644 > > --- a/test/performance/odp_l2fwd.c > > +++ b/test/performance/odp_l2fwd.c > > @@ -105,6 +105,10 @@ typedef struct { > > thread_args_t thread[MAX_WORKERS]; > > /** Table of pktio handles */ > > odp_pktio_t pktios[ODP_CONFIG_PKTIO_ENTRIES]; > > + /** Table of port ethernet addresses */ > > + odph_ethaddr_t port_eth_addr[ODP_CONFIG_PKTIO_ENTRIES]; > > + /** Table of port default output queues */ > > + odp_queue_t outq_def[ODP_CONFIG_PKTIO_ENTRIES]; > > } args_t; > > > > /** Global pointer to args */ > > @@ -113,8 +117,10 @@ static args_t *gbl_args; > > static odp_barrier_t barrier; > > > > /* helper funcs */ > > -static inline odp_queue_t lookup_dest_q(odp_packet_t pkt); > > +static inline int lookup_dest_port(odp_packet_t pkt); > > static int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned len); > > +static void fill_src_eth_addrs(odp_packet_t pkt_tbl[], unsigned num, > > + int dst_port); > > static void parse_args(int argc, char *argv[], appl_args_t > > *appl_args); > > static void print_info(char *progname, appl_args_t *appl_args); > > static void usage(char *progname); > > @@ -126,7 +132,7 @@ static void usage(char *progname); > > */ > > static void *pktio_queue_thread(void *arg) > > { > > - int thr; > > + int thr, dst_port; > > odp_queue_t outq_def; > > odp_packet_t pkt; > > odp_event_t ev; > > @@ -152,9 +158,12 @@ static void *pktio_queue_thread(void *arg) > > continue; > > } > > > > - outq_def = lookup_dest_q(pkt); > > + dst_port = lookup_dest_port(pkt); > > + > > + fill_src_eth_addrs(, 1, dst_port); > > > > /* Enqueue the packet for output */ > > + outq_def = gbl_args->outq_def[dst_port]; > > if (odp_queue_enq(outq_def, ev)) { > > printf(" [%i] Queue enqueue failed.\n", thr); > > odp_packet_free(pkt); > > @@ -169,12 +178,12 @@ static void *pktio_queue_thread(void *arg) > > } > > > > /** > > - * Lookup the destination pktio for a given packet > > + * Lookup the destination port for a given packet > > */ > > -static inline odp_queue_t lookup_dest_q(odp_packet_t pkt) > > +static inline int lookup_dest_port(odp_packet_t pkt) > > { > > - int i, src_idx, dst_idx; > > - odp_pktio_t pktio_src, pktio_dst; > > + int i, src_idx; > > + odp_pktio_t pktio_src; > > > > pktio_src = odp_packet_input(pkt); > > > > @@ -185,10 +194,7 @@ static inline odp_queue_t > > lookup_dest_q(odp_packet_t pkt) > > if (src_idx == -1) > > LOG_ABORT("Failed to determine pktio input\n"); > > > > - dst_idx = (src_idx % 2 == 0) ? src_idx+1 : src_idx-1; > > - pktio_dst = gbl_args->pktios[dst_idx]; > > - > > - return odp_pktio_outq_getdef(pktio_dst); > > + return (src_idx % 2 == 0) ? src_idx + 1 : src_idx - 1; > > } > > > > /** > > @@ -233,6 +239,8 @@ static void *pktio_ifburst_thread(void *arg) > >
Re: [lng-odp] [PATCH v2] test: l2fwd: fill correct source ethernet address
Merged, Maxim. On 09/18/15 09:48, Savolainen, Petri (Nokia - FI/Espoo) wrote: Reviewed-by: Petri Savolainen <petri.savolai...@nokia.com> -Original Message- From: lng-odp [mailto:lng-odp-boun...@lists.linaro.org] On Behalf Of EXT Matias Elo Sent: Thursday, September 17, 2015 11:27 AM To: lng-odp@lists.linaro.org Subject: [lng-odp] [PATCH v2] test: l2fwd: fill correct source ethernet address When running l2fwd in a VM using SR-IOV the host may drop packets if the source MAC address is not the same as that of the VF NIC. Modify test application so that the source MAC address is always filled correctly. Signed-off-by: Matias Elo <matias@nokia.com> --- V2: Compare odp_pktio_mac_addr() return value to ODPH_ETHADDR_LEN test/performance/odp_l2fwd.c | 74 +++- 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/test/performance/odp_l2fwd.c b/test/performance/odp_l2fwd.c index 64fc1b2..cb31544 100644 --- a/test/performance/odp_l2fwd.c +++ b/test/performance/odp_l2fwd.c @@ -105,6 +105,10 @@ typedef struct { thread_args_t thread[MAX_WORKERS]; /** Table of pktio handles */ odp_pktio_t pktios[ODP_CONFIG_PKTIO_ENTRIES]; + /** Table of port ethernet addresses */ + odph_ethaddr_t port_eth_addr[ODP_CONFIG_PKTIO_ENTRIES]; + /** Table of port default output queues */ + odp_queue_t outq_def[ODP_CONFIG_PKTIO_ENTRIES]; } args_t; /** Global pointer to args */ @@ -113,8 +117,10 @@ static args_t *gbl_args; static odp_barrier_t barrier; /* helper funcs */ -static inline odp_queue_t lookup_dest_q(odp_packet_t pkt); +static inline int lookup_dest_port(odp_packet_t pkt); static int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned len); +static void fill_src_eth_addrs(odp_packet_t pkt_tbl[], unsigned num, + int dst_port); static void parse_args(int argc, char *argv[], appl_args_t *appl_args); static void print_info(char *progname, appl_args_t *appl_args); static void usage(char *progname); @@ -126,7 +132,7 @@ static void usage(char *progname); */ static void *pktio_queue_thread(void *arg) { - int thr; + int thr, dst_port; odp_queue_t outq_def; odp_packet_t pkt; odp_event_t ev; @@ -152,9 +158,12 @@ static void *pktio_queue_thread(void *arg) continue; } - outq_def = lookup_dest_q(pkt); + dst_port = lookup_dest_port(pkt); + + fill_src_eth_addrs(, 1, dst_port); /* Enqueue the packet for output */ + outq_def = gbl_args->outq_def[dst_port]; if (odp_queue_enq(outq_def, ev)) { printf(" [%i] Queue enqueue failed.\n", thr); odp_packet_free(pkt); @@ -169,12 +178,12 @@ static void *pktio_queue_thread(void *arg) } /** - * Lookup the destination pktio for a given packet + * Lookup the destination port for a given packet */ -static inline odp_queue_t lookup_dest_q(odp_packet_t pkt) +static inline int lookup_dest_port(odp_packet_t pkt) { - int i, src_idx, dst_idx; - odp_pktio_t pktio_src, pktio_dst; + int i, src_idx; + odp_pktio_t pktio_src; pktio_src = odp_packet_input(pkt); @@ -185,10 +194,7 @@ static inline odp_queue_t lookup_dest_q(odp_packet_t pkt) if (src_idx == -1) LOG_ABORT("Failed to determine pktio input\n"); - dst_idx = (src_idx % 2 == 0) ? src_idx+1 : src_idx-1; - pktio_dst = gbl_args->pktios[dst_idx]; - - return odp_pktio_outq_getdef(pktio_dst); + return (src_idx % 2 == 0) ? src_idx + 1 : src_idx - 1; } /** @@ -233,6 +239,8 @@ static void *pktio_ifburst_thread(void *arg) /* Drop packets with errors */ pkts_ok = drop_err_pkts(pkt_tbl, pkts); if (pkts_ok > 0) { + fill_src_eth_addrs(pkt_tbl, pkts_ok, dst_idx); + int sent = odp_pktio_send(pktio_dst, pkt_tbl, pkts_ok); sent = sent > 0 ? sent : 0; @@ -380,6 +388,7 @@ int main(int argc, char *argv[]) odp_shm_t shm; odp_cpumask_t cpumask; char cpumaskstr[ODP_CPUMASK_STR_SIZE]; + odp_pktio_t pktio; odp_pool_param_t params; int ret; @@ -452,12 +461,24 @@ int main(int argc, char *argv[]) odp_pool_print(pool); for (i = 0; i < gbl_args->appl.if_count; ++i) { - gbl_args->pktios[i] = create_pktio(gbl_args- appl.if_names[i], - pool, gbl_args->appl.mode); - if (gbl_args->pktios[i] == ODP_PKTIO_INVALID) + pktio = create_pktio(gbl_args->appl.if_names[i], +pool, gbl_args->appl.mode); + if (pktio == ODP_PKTIO_INVALID)
Re: [lng-odp] [PATCH v2] test: l2fwd: fill correct source ethernet address
Reviewed-by: Petri Savolainen <petri.savolai...@nokia.com> > -Original Message- > From: lng-odp [mailto:lng-odp-boun...@lists.linaro.org] On Behalf Of > EXT Matias Elo > Sent: Thursday, September 17, 2015 11:27 AM > To: lng-odp@lists.linaro.org > Subject: [lng-odp] [PATCH v2] test: l2fwd: fill correct source ethernet > address > > When running l2fwd in a VM using SR-IOV the host may drop > packets if the source MAC address is not the same as that > of the VF NIC. Modify test application so that the source > MAC address is always filled correctly. > > Signed-off-by: Matias Elo <matias@nokia.com> > --- > > V2: Compare odp_pktio_mac_addr() return value to ODPH_ETHADDR_LEN > > test/performance/odp_l2fwd.c | 74 +++- > > 1 file changed, 59 insertions(+), 15 deletions(-) > > diff --git a/test/performance/odp_l2fwd.c > b/test/performance/odp_l2fwd.c > index 64fc1b2..cb31544 100644 > --- a/test/performance/odp_l2fwd.c > +++ b/test/performance/odp_l2fwd.c > @@ -105,6 +105,10 @@ typedef struct { > thread_args_t thread[MAX_WORKERS]; > /** Table of pktio handles */ > odp_pktio_t pktios[ODP_CONFIG_PKTIO_ENTRIES]; > + /** Table of port ethernet addresses */ > + odph_ethaddr_t port_eth_addr[ODP_CONFIG_PKTIO_ENTRIES]; > + /** Table of port default output queues */ > + odp_queue_t outq_def[ODP_CONFIG_PKTIO_ENTRIES]; > } args_t; > > /** Global pointer to args */ > @@ -113,8 +117,10 @@ static args_t *gbl_args; > static odp_barrier_t barrier; > > /* helper funcs */ > -static inline odp_queue_t lookup_dest_q(odp_packet_t pkt); > +static inline int lookup_dest_port(odp_packet_t pkt); > static int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned len); > +static void fill_src_eth_addrs(odp_packet_t pkt_tbl[], unsigned num, > +int dst_port); > static void parse_args(int argc, char *argv[], appl_args_t > *appl_args); > static void print_info(char *progname, appl_args_t *appl_args); > static void usage(char *progname); > @@ -126,7 +132,7 @@ static void usage(char *progname); > */ > static void *pktio_queue_thread(void *arg) > { > - int thr; > + int thr, dst_port; > odp_queue_t outq_def; > odp_packet_t pkt; > odp_event_t ev; > @@ -152,9 +158,12 @@ static void *pktio_queue_thread(void *arg) > continue; > } > > - outq_def = lookup_dest_q(pkt); > + dst_port = lookup_dest_port(pkt); > + > + fill_src_eth_addrs(, 1, dst_port); > > /* Enqueue the packet for output */ > + outq_def = gbl_args->outq_def[dst_port]; > if (odp_queue_enq(outq_def, ev)) { > printf(" [%i] Queue enqueue failed.\n", thr); > odp_packet_free(pkt); > @@ -169,12 +178,12 @@ static void *pktio_queue_thread(void *arg) > } > > /** > - * Lookup the destination pktio for a given packet > + * Lookup the destination port for a given packet > */ > -static inline odp_queue_t lookup_dest_q(odp_packet_t pkt) > +static inline int lookup_dest_port(odp_packet_t pkt) > { > - int i, src_idx, dst_idx; > - odp_pktio_t pktio_src, pktio_dst; > + int i, src_idx; > + odp_pktio_t pktio_src; > > pktio_src = odp_packet_input(pkt); > > @@ -185,10 +194,7 @@ static inline odp_queue_t > lookup_dest_q(odp_packet_t pkt) > if (src_idx == -1) > LOG_ABORT("Failed to determine pktio input\n"); > > - dst_idx = (src_idx % 2 == 0) ? src_idx+1 : src_idx-1; > - pktio_dst = gbl_args->pktios[dst_idx]; > - > - return odp_pktio_outq_getdef(pktio_dst); > + return (src_idx % 2 == 0) ? src_idx + 1 : src_idx - 1; > } > > /** > @@ -233,6 +239,8 @@ static void *pktio_ifburst_thread(void *arg) > /* Drop packets with errors */ > pkts_ok = drop_err_pkts(pkt_tbl, pkts); > if (pkts_ok > 0) { > + fill_src_eth_addrs(pkt_tbl, pkts_ok, dst_idx); > + > int sent = odp_pktio_send(pktio_dst, pkt_tbl, > pkts_ok); > > sent = sent > 0 ? sent : 0; > @@ -380,6 +388,7 @@ int main(int argc, char *argv[]) > odp_shm_t shm; > odp_cpumask_t cpumask; > char cpumaskstr[ODP_CPUMASK_STR_SIZE]; > + odp_pktio_t pktio; > odp_pool_param_t params; > int ret; > > @@ -452,12 +461,24 @@ int main(int argc, char *argv[]) > odp_pool_print(pool); > > for (i = 0; i < gbl_args->appl.if_count; ++i) { &
[lng-odp] [PATCH v2] test: l2fwd: fill correct source ethernet address
When running l2fwd in a VM using SR-IOV the host may drop packets if the source MAC address is not the same as that of the VF NIC. Modify test application so that the source MAC address is always filled correctly. Signed-off-by: Matias Elo--- V2: Compare odp_pktio_mac_addr() return value to ODPH_ETHADDR_LEN test/performance/odp_l2fwd.c | 74 +++- 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/test/performance/odp_l2fwd.c b/test/performance/odp_l2fwd.c index 64fc1b2..cb31544 100644 --- a/test/performance/odp_l2fwd.c +++ b/test/performance/odp_l2fwd.c @@ -105,6 +105,10 @@ typedef struct { thread_args_t thread[MAX_WORKERS]; /** Table of pktio handles */ odp_pktio_t pktios[ODP_CONFIG_PKTIO_ENTRIES]; + /** Table of port ethernet addresses */ + odph_ethaddr_t port_eth_addr[ODP_CONFIG_PKTIO_ENTRIES]; + /** Table of port default output queues */ + odp_queue_t outq_def[ODP_CONFIG_PKTIO_ENTRIES]; } args_t; /** Global pointer to args */ @@ -113,8 +117,10 @@ static args_t *gbl_args; static odp_barrier_t barrier; /* helper funcs */ -static inline odp_queue_t lookup_dest_q(odp_packet_t pkt); +static inline int lookup_dest_port(odp_packet_t pkt); static int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned len); +static void fill_src_eth_addrs(odp_packet_t pkt_tbl[], unsigned num, + int dst_port); static void parse_args(int argc, char *argv[], appl_args_t *appl_args); static void print_info(char *progname, appl_args_t *appl_args); static void usage(char *progname); @@ -126,7 +132,7 @@ static void usage(char *progname); */ static void *pktio_queue_thread(void *arg) { - int thr; + int thr, dst_port; odp_queue_t outq_def; odp_packet_t pkt; odp_event_t ev; @@ -152,9 +158,12 @@ static void *pktio_queue_thread(void *arg) continue; } - outq_def = lookup_dest_q(pkt); + dst_port = lookup_dest_port(pkt); + + fill_src_eth_addrs(, 1, dst_port); /* Enqueue the packet for output */ + outq_def = gbl_args->outq_def[dst_port]; if (odp_queue_enq(outq_def, ev)) { printf(" [%i] Queue enqueue failed.\n", thr); odp_packet_free(pkt); @@ -169,12 +178,12 @@ static void *pktio_queue_thread(void *arg) } /** - * Lookup the destination pktio for a given packet + * Lookup the destination port for a given packet */ -static inline odp_queue_t lookup_dest_q(odp_packet_t pkt) +static inline int lookup_dest_port(odp_packet_t pkt) { - int i, src_idx, dst_idx; - odp_pktio_t pktio_src, pktio_dst; + int i, src_idx; + odp_pktio_t pktio_src; pktio_src = odp_packet_input(pkt); @@ -185,10 +194,7 @@ static inline odp_queue_t lookup_dest_q(odp_packet_t pkt) if (src_idx == -1) LOG_ABORT("Failed to determine pktio input\n"); - dst_idx = (src_idx % 2 == 0) ? src_idx+1 : src_idx-1; - pktio_dst = gbl_args->pktios[dst_idx]; - - return odp_pktio_outq_getdef(pktio_dst); + return (src_idx % 2 == 0) ? src_idx + 1 : src_idx - 1; } /** @@ -233,6 +239,8 @@ static void *pktio_ifburst_thread(void *arg) /* Drop packets with errors */ pkts_ok = drop_err_pkts(pkt_tbl, pkts); if (pkts_ok > 0) { + fill_src_eth_addrs(pkt_tbl, pkts_ok, dst_idx); + int sent = odp_pktio_send(pktio_dst, pkt_tbl, pkts_ok); sent = sent > 0 ? sent : 0; @@ -380,6 +388,7 @@ int main(int argc, char *argv[]) odp_shm_t shm; odp_cpumask_t cpumask; char cpumaskstr[ODP_CPUMASK_STR_SIZE]; + odp_pktio_t pktio; odp_pool_param_t params; int ret; @@ -452,12 +461,24 @@ int main(int argc, char *argv[]) odp_pool_print(pool); for (i = 0; i < gbl_args->appl.if_count; ++i) { - gbl_args->pktios[i] = create_pktio(gbl_args->appl.if_names[i], - pool, gbl_args->appl.mode); - if (gbl_args->pktios[i] == ODP_PKTIO_INVALID) + pktio = create_pktio(gbl_args->appl.if_names[i], +pool, gbl_args->appl.mode); + if (pktio == ODP_PKTIO_INVALID) exit(EXIT_FAILURE); + gbl_args->pktios[i] = pktio; - ret = odp_pktio_start(gbl_args->pktios[i]); + /* Save interface ethernet address */ + if (odp_pktio_mac_addr(pktio, gbl_args->port_eth_addr[i].addr, + ODPH_ETHADDR_LEN) != ODPH_ETHADDR_LEN) { + LOG_ERR("Error: interface ethernet address unknown\n"); + exit(EXIT_FAILURE); + } + +