summaryrefslogtreecommitdiffstats
path: root/src/bp_sim.h
diff options
context:
space:
mode:
authorMartin Weiser <martin.weiser@allegro-packets.com>2016-07-15 15:59:54 +0200
committerMartin Weiser <martin.weiser@allegro-packets.com>2016-07-15 15:59:54 +0200
commit659ba2606be997631d736070d2efd92472496a11 (patch)
treec05dd3947851fcdbb2baa36cf7b57715ed237dec /src/bp_sim.h
parent783f8a04fb04266c6d6e9a857a74962e81db96df (diff)
add option to use DPDK tx checksum offloading to generate packets with correct IP, TCP and UDP checksums
Diffstat (limited to 'src/bp_sim.h')
-rwxr-xr-xsrc/bp_sim.h58
1 files changed, 57 insertions, 1 deletions
diff --git a/src/bp_sim.h b/src/bp_sim.h
index e396a710..18db61ca 100755
--- a/src/bp_sim.h
+++ b/src/bp_sim.h
@@ -62,6 +62,10 @@ limitations under the License.
#include <trex_stateless_dp_core.h>
+#ifdef RTE_DPDK
+# include <rte_ip.h>
+#endif /* RTE_DPDK */
+
class CGenNodePCAP;
#undef NAT_TRACE_
@@ -707,6 +711,14 @@ public:
return (btGetMaskBit32(m_flags1, 7, 7) ? true : false);
}
+ void setChecksumOffloadEnable(bool enable) {
+ btSetMaskBit32(m_flags1, 8, 8, (enable ? 1 : 0) );
+ }
+
+ bool getChecksumOffloadEnable(){
+ return (btGetMaskBit32(m_flags1, 8, 8) ? true : false);
+ }
+
public:
void Dump(FILE *fd);
@@ -3106,7 +3118,15 @@ inline void CFlowPktInfo::update_pkt_info(char *p,
}
}
+#ifdef RTE_DPDK
+ if (CGlobalInfo::m_options.preview.getChecksumOffloadEnable()) {
+ ipv4->myChecksum = 0;
+ } else {
+ ipv4->updateCheckSum();
+ }
+#else
ipv4->updateCheckSum();
+#endif
}
@@ -3120,16 +3140,36 @@ inline void CFlowPktInfo::update_pkt_info(char *p,
}else{
m_tcp->setDestPort(src_port);
}
+
+#ifdef RTE_DPDK
+ if (CGlobalInfo::m_options.preview.getChecksumOffloadEnable()) {
+ /* set pseudo-header checksum */
+ m_tcp->setChecksum(PKT_NTOHS(rte_ipv4_phdr_cksum((struct ipv4_hdr *)ipv4->getPointer(),
+ PKT_TX_IPV4 | PKT_TX_IP_CKSUM | PKT_TX_TCP_CKSUM)));
+ }
+#endif
}else {
if ( m_pkt_indication.m_desc.IsUdp() ){
UDPHeader * m_udp =(UDPHeader *)(p +m_pkt_indication.getFastTcpOffset() );
BP_ASSERT(m_udp);
- m_udp->setChecksum(0);
+
if ( port_dir == CLIENT_SIDE ) {
m_udp->setSourcePort(src_port);
}else{
m_udp->setDestPort(src_port);
}
+
+#ifdef RTE_DPDK
+ if (CGlobalInfo::m_options.preview.getChecksumOffloadEnable()) {
+ /* set pseudo-header checksum */
+ m_udp->setChecksum(PKT_NTOHS(rte_ipv4_phdr_cksum((struct ipv4_hdr *) ipv4->getPointer(),
+ PKT_TX_IPV4 | PKT_TX_IP_CKSUM | PKT_TX_UDP_CKSUM)));
+ } else {
+ m_udp->setChecksum(0);
+ }
+#else
+ m_udp->setChecksum(0);
+#endif
}else{
#ifdef _DEBUG
if (!m_pkt_indication.m_desc.IsIcmp()) {
@@ -3260,6 +3300,22 @@ inline rte_mbuf_t * CFlowPktInfo::do_generate_new_mbuf(CGenNode * node){
memcpy(p,m_packet->raw,len);
+#ifdef RTE_DPDK
+ if (CGlobalInfo::m_options.preview.getChecksumOffloadEnable()) {
+ if (m_pkt_indication.m_desc.IsTcp()) {
+ m->l2_len = 14;
+ m->l3_len = 20;
+ m->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CKSUM | PKT_TX_TCP_CKSUM;
+ } else {
+ if (m_pkt_indication.m_desc.IsUdp()) {
+ m->l2_len = 14;
+ m->l3_len = 20;
+ m->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CKSUM | PKT_TX_UDP_CKSUM;
+ }
+ }
+ }
+#endif
+
update_pkt_info(p,node);
append_big_mbuf(m,node);