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(&pkt, 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);
> +             }
> +
> +             /* Save interface default output queue */
> +             if (gbl_args->appl.mode == APPL_MODE_PKT_QUEUE)
> +                     gbl_args->outq_def[i] = odp_pktio_outq_getdef(pktio);
> +
> +             ret = odp_pktio_start(pktio);
>               if (ret) {
>                       LOG_ERR("Error: unable to start %s\n",
>                               gbl_args->appl.if_names[i]);
> @@ -542,6 +563,29 @@ static int drop_err_pkts(odp_packet_t pkt_tbl[],
> unsigned len)
>  }
> 
>  /**
> + * Fill packets' eth src addresses according to the destination port
> + *
> + * @param pkt_tbl  Array of packets
> + * @param num      Number of packets in the array
> + * @param dst_port Destination port
> + */
> +static void fill_src_eth_addrs(odp_packet_t pkt_tbl[], unsigned num,
> +                            int dst_port)
> +{
> +     odp_packet_t pkt;
> +     odph_ethhdr_t *eth;
> +     unsigned i;
> +
> +     for (i = 0; i < num; ++i) {
> +             pkt = pkt_tbl[i];
> +             if (odp_packet_has_eth(pkt)) {
> +                     eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
> +                     eth->src = gbl_args->port_eth_addr[dst_port];
> +             }
> +     }
> +}
> +
> +/**
>   * Parse and store the command line arguments
>   *
>   * @param argc       argument count
> --
> 1.9.1
> 
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to