Optimize ethernet address filling by using word copy.
Signed-off-by: Matias Elo <[email protected]>
---
test/performance/odp_l2fwd.c | 57 ++++++++++++++++++++++++++++++++++----------
1 file changed, 45 insertions(+), 12 deletions(-)
diff --git a/test/performance/odp_l2fwd.c b/test/performance/odp_l2fwd.c
index b28db31..6d1d366 100644
--- a/test/performance/odp_l2fwd.c
+++ b/test/performance/odp_l2fwd.c
@@ -92,6 +92,14 @@ typedef struct {
} thread_args_t;
/**
+ * Optimized type for storing ethernet addresses
+ */
+typedef union {
+ uint8_t u8[6];
+ uint16_t u16[3];
+} eth_addr_t;
+
+/**
* Grouping of all global data
*/
typedef struct {
@@ -102,9 +110,9 @@ typedef struct {
/** 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];
+ eth_addr_t port_eth_addr[ODP_CONFIG_PKTIO_ENTRIES];
/** Table of dst ethernet addresses */
- odph_ethaddr_t dst_eth_addr[ODP_CONFIG_PKTIO_ENTRIES];
+ eth_addr_t dst_eth_addr[ODP_CONFIG_PKTIO_ENTRIES];
/** Table of port default output queues */
odp_queue_t outq_def[ODP_CONFIG_PKTIO_ENTRIES];
/** Table of dst ports */
@@ -435,7 +443,7 @@ int main(int argc, char *argv[])
odp_shm_t shm;
odp_cpumask_t cpumask;
char cpumaskstr[ODP_CPUMASK_STR_SIZE];
- odph_ethaddr_t new_addr;
+ eth_addr_t new_addr;
odp_pktio_t pktio;
odp_pool_param_t params;
int ret;
@@ -510,7 +518,7 @@ int main(int argc, char *argv[])
gbl_args->pktios[i] = pktio;
/* Save interface ethernet address */
- if (odp_pktio_mac_addr(pktio, gbl_args->port_eth_addr[i].addr,
+ if (odp_pktio_mac_addr(pktio, gbl_args->port_eth_addr[i].u8,
ODPH_ETHADDR_LEN) != ODPH_ETHADDR_LEN) {
LOG_ERR("Error: interface ethernet address unknown\n");
exit(EXIT_FAILURE);
@@ -523,9 +531,9 @@ int main(int argc, char *argv[])
/* Save destination eth address */
if (gbl_args->appl.dst_change) {
/* 02:00:00:00:00:XX */
- memset(&new_addr, 0, sizeof(odph_ethaddr_t));
- new_addr.addr[0] = 0x02;
- new_addr.addr[5] = i;
+ memset(&new_addr, 0, sizeof(eth_addr_t));
+ new_addr.u8[0] = 0x02;
+ new_addr.u8[5] = i;
gbl_args->dst_eth_addr[i] = new_addr;
}
@@ -617,6 +625,24 @@ static int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned
len)
}
/**
+ * Word copy ethernet address
+ *
+ * @param to Destination memory address
+ * @param from Source memory address
+ */
+static void copy_eth_addr(uint16_t *to, uint16_t *from)
+{
+ uint16_t fw0, fw1, fw2;
+
+ fw0 = from[0];
+ fw1 = from[1];
+ fw2 = from[2];
+ to[0] = fw0;
+ to[1] = fw1;
+ to[2] = fw2;
+}
+
+/**
* Fill packets' eth addresses according to the destination port
*
* @param pkt_tbl Array of packets
@@ -628,6 +654,8 @@ static void fill_eth_addrs(odp_packet_t pkt_tbl[], unsigned
num, int dst_port)
odp_packet_t pkt;
odph_ethhdr_t *eth;
unsigned i;
+ uint16_t *to;
+ uint16_t *from;
if (!gbl_args->appl.dst_change && !gbl_args->appl.src_change)
return;
@@ -637,11 +665,16 @@ static void fill_eth_addrs(odp_packet_t pkt_tbl[],
unsigned num, int dst_port)
if (odp_packet_has_eth(pkt)) {
eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
- if (gbl_args->appl.src_change)
- eth->src = gbl_args->port_eth_addr[dst_port];
-
- if (gbl_args->appl.dst_change)
- eth->dst = gbl_args->dst_eth_addr[dst_port];
+ if (gbl_args->appl.src_change) {
+ from = gbl_args->port_eth_addr[dst_port].u16;
+ to = (uint16_t *)eth->src.addr;
+ copy_eth_addr(to, from);
+ }
+ if (gbl_args->appl.dst_change) {
+ from = gbl_args->dst_eth_addr[dst_port].u16;
+ to = (uint16_t *)eth->dst.addr;
+ copy_eth_addr(to, from);
+ }
}
}
}
--
1.9.1
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp