From owner-freebsd-net@freebsd.org Tue Jun 14 15:14:57 2016 Return-Path: Delivered-To: freebsd-net@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8A10BB69F15 for ; Tue, 14 Jun 2016 15:14:57 +0000 (UTC) (envelope-from schoeffm@in.tum.de) Received: from mailman.ysv.freebsd.org (mailman.ysv.freebsd.org [IPv6:2001:1900:2254:206a::50:5]) by mx1.freebsd.org (Postfix) with ESMTP id 74B0E2718 for ; Tue, 14 Jun 2016 15:14:57 +0000 (UTC) (envelope-from schoeffm@in.tum.de) Received: by mailman.ysv.freebsd.org (Postfix) id 7010DB69F14; Tue, 14 Jun 2016 15:14:57 +0000 (UTC) Delivered-To: net@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 6FA8CB69F13 for ; Tue, 14 Jun 2016 15:14:57 +0000 (UTC) (envelope-from schoeffm@in.tum.de) Received: from mail-out1.informatik.tu-muenchen.de (mail-out1.informatik.tu-muenchen.de [131.159.0.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 14BD62717 for ; Tue, 14 Jun 2016 15:14:55 +0000 (UTC) (envelope-from schoeffm@in.tum.de) Received: (Authenticated sender: schoeffm) by mail.in.tum.de (Postfix) with ESMTPSA id D9B771C1131 for ; Tue, 14 Jun 2016 17:08:54 +0200 (CEST) From: Dominik Schoeffmann Subject: Netmap Checksum Offloading To: net@freebsd.org Message-ID: <57601DFA.2040008@in.tum.de> Date: Tue, 14 Jun 2016 17:08:42 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="c2ilmUOL4VmDEpGuPjGWmDn46sh7vDw5d" X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jun 2016 15:14:57 -0000 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --c2ilmUOL4VmDEpGuPjGWmDn46sh7vDw5d Content-Type: multipart/mixed; boundary="ojWM2RfT27D5rxalIH6m7sQf9oPQ8T9jk" From: Dominik Schoeffmann To: net@freebsd.org Message-ID: <57601DFA.2040008@in.tum.de> Subject: Netmap Checksum Offloading --ojWM2RfT27D5rxalIH6m7sQf9oPQ8T9jk Content-Type: multipart/mixed; boundary="------------070703060403080105060100" This is a multi-part message in MIME format. --------------070703060403080105060100 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Dear Netmap Developers, during the course of my bachelor's thesis, I modified a packet generator called MoonGen [1] in order to utilize netmap. One key component was to flexibly offload checksums for different kinds of packets (IPv4, UDP, TCP). The ixgbe netmap patch was modified [2] in order to construct context descriptors and suitable data descriptors. This is implemented in less than 250 LoC (including pseudo-header calculations). The man page states, that checksum offloading is available via ethtool, although a solution inside the netmap API might be a cleaner way for applications to actually use these features. Attached is a graph showing the performance implication of using offloading in the current implementation. As can be seen, offloading has only a minor impact. When regarding this data (and comparing it to other frameworks), please keep in mind, that internally a lot of per-packet effort is needed due to the software architecture of the packet generator. The question being: Would it not make sense to include checksum offloading inside of netmap in order to accomodate applications operating on layer 3 and above? As these programs need to calculate the checksums in software, it would be just as fast to move these calculations to the kernel for NICs without checksum offloading support (and the kernel would act as a librar= y). The problem which currently is imposed by the fact, that netmap exports the complete ring, is that context descriptors disrupt the data descriptors, which is unpleasant for the application. But you may find the data interesting nevertheless. Best Regards, Dominik Schoeffmann [1] https://github.com/dschoeffm/MoonGen/tree/netmap [2] https://github.com/dschoeffm/netmap/tree/mg-chksum-offloading --------------070703060403080105060100 Content-Type: application/pdf; name="netmap-offloading.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="netmap-offloading.pdf" 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 7BsPjuixdrLETSYLs2l2D/WNIA+UxstJx3IZ38EV4yhIPO/u9optT3MawrCmEmJHvhQ1D6yT 0d9eDbyKDAsy0n2lZ0r0WDtFYs1kATrN7s38Jk0/IeTvxl74khCvKPbW8VPChPv/3S8J31xy PX956cf5n5e4n6/4md93lydYE86/XGJq57+B0c//uxzx/DV/MycVPFmtCH1jn18tJvxCrnFl 785/uORy/selJPq/X+TjOmgf/I/eAt98Rnn/M7cE+/t83whQhbcCuBXAceuptnnx8vPXL7xo Xr6gw7WuwOPb8/wCC9aZWidDsoO/63zoI5A+4coUxQFoU+I08R6u1/kNV4IxxRdAbMKCAhNj 7twaAAtMPaw4m5m/IVMHTM75h3mz+KnTZ+YsH8S+Wv0SwK2T4kvraSW/SejNR79ZTRXqKAWH v+NEuD/V/nJ5ivn86eWp1PMf4d9tP/8GZ1o+/x5+oG/s53/PIPwytWacjRVmIzi+vhxtmuH8 98tT5bn5r0vazx9sRt28/uCxBpjJ/XBjzQ4c64+/UqLOMA1xRPpYhHsXvxjGr3V4dNl0o6sB NHpanE2St9EFZqM/dKTRRagb0UaXbRtdDaDWafGl9X50NaFXjC5sgrUPHF38S7R8vHZ07wzf y6NnlzQ8bBXfpkQ3bOygR/T55RblZaXE0emNEndUHfRCiQeKTTdQGkADocXZJHkbKPyroDR0 oKCpaT5WPFBs20BpALdOii+t9wOlCb1moAosiREHqsL+0/PdgXrgYfuV0bpLcTxy0DUI7TZy 7KC/dX49LVMHmJo46kQY6VHo6l0XPrZ0PMkOOlxals0iJw5xwE55HFY6TXBR8WkGN5wawE2T 4kvT/XBqNq8Zzr6lNlfVgq+4xt3h/AG37R9hCHuR3TsmHcKGQ9juDuHn4f+AycSMCmVuZHN0 cmVhbQplbmRvYmoKNCAwIG9iagogICA0Mjk0CmVuZG9iagoyIDAgb2JqCjw8CiAgIC9FeHRH U3RhdGUgPDwKICAgICAgL2EwIDw8IC9DQSAxIC9jYSAxID4+CiAgID4+CiAgIC9YT2JqZWN0 IDw8IC94NiA2IDAgUiA+PgogICAvRm9udCA8PAogICAgICAvZi0wLTAgNSAwIFIKICAgPj4K Pj4KZW5kb2JqCjcgMCBvYmoKPDwgL1R5cGUgL1BhZ2UKICAgL1BhcmVudCAxIDAgUgogICAv TWVkaWFCb3ggWyAwIDAgMzc1LjM4MzM2MiAyNTcuNjc5ODEgXQogICAvQ29udGVudHMgMyAw IFIKICAgL0dyb3VwIDw8CiAgICAgIC9UeXBlIC9Hcm91cAogICAgICAvUyAvVHJhbnNwYXJl bmN5CiAgICAgIC9JIHRydWUKICAgICAgL0NTIC9EZXZpY2VSR0IKICAgPj4KICAgL1Jlc291 cmNlcyAyIDAgUgo+PgplbmRvYmoKNiAwIG9iago8PCAvTGVuZ3RoIDkgMCBSCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9Gb3JtCiAg IC9CQm94IFsgNjIgMTAxIDM0NSAyMzMgXQogICAvUmVzb3VyY2VzIDggMCBSCj4+CnN0cmVh bQp4nF3STUrGQAwG4P2cIid4ze9k5gSC4EJdigtBEEQX4sLrm/aTOnVRGl7C5Jk2n42J0XO4 SRXTUiPo/pqunplev5pAZoTRd/Xd1PPWHp+qj+mlCdMtdUV2JWGnD5qJ6UFiHSOU3qsyiFbS B7rKllRlXEn1skUlygYfjVQEJn1LrLo7qdZw3o7RNAz3aqlpMysxnmC1ShziY0vcUUdRU6lm 3aKHtl0pWGavYrvUoRW4rOCB/ZDDm4E+4+SdsJSTN+BpqzeQuXI10T1WrnZ45MJVVYRn27lM /52xD/2DumGKn6SzbrtAtUaJnqBqODs7+PKhF6jlGVoDxzhBBzTGLxRTwydtu1Pv+kkremCc 0MHwLit61ty5roNK4kI60PWleN0GY5RqVZuA2Vd1JXFJjm2oqFvu6rv2A9OFk9gKZW5kc3Ry ZWFtCmVuZG9iago5IDAgb2JqCiAgIDMxNQplbmRvYmoKOCAwIG9iago8PAogICAvRXh0R1N0 YXRlIDw8CiAgICAgIC9hMCA8PCAvQ0EgMSAvY2EgMSA+PgogICA+Pgo+PgplbmRvYmoKMTAg MCBvYmoKPDwgL0xlbmd0aCAxMSAwIFIKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aDEgNjgyMAo+PgpzdHJlYW0KeJzlWIl/U1W+/527ZWna3jRJtxRIGprypJ0W0haoHYQn RZERkUVTpEClCGWolrZCUVbZQihWEcFh9436KC7cXh0hRZ36hrJ05jFVGRVEBlzeKFOfTwcF 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 MCBvYmoKICAgMzU4CmVuZG9iagoxNCAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IK ICAgL0ZvbnROYW1lIC9XU1JDQkwrUm9ib3RvLVJlZ3VsYXIKICAgL0ZvbnRGYW1pbHkgKFJv Ym90bykKICAgL0ZsYWdzIDMyCiAgIC9Gb250QkJveCBbIC03MzYgLTI3MCAxMTQ4IDEwNTYg XQogICAvSXRhbGljQW5nbGUgMAogICAvQXNjZW50IDkyNwogICAvRGVzY2VudCAtMjQ0CiAg IC9DYXBIZWlnaHQgMTA1NgogICAvU3RlbVYgODAKICAgL1N0ZW1IIDgwCiAgIC9Gb250Rmls ZTIgMTAgMCBSCj4+CmVuZG9iago1IDAgb2JqCjw8IC9UeXBlIC9Gb250CiAgIC9TdWJ0eXBl IC9UcnVlVHlwZQogICAvQmFzZUZvbnQgL1dTUkNCTCtSb2JvdG8tUmVndWxhcgogICAvRmly c3RDaGFyIDMyCiAgIC9MYXN0Q2hhciAxMjIKICAgL0ZvbnREZXNjcmlwdG9yIDE0IDAgUgog ICAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwogICAvV2lkdGhzIFsgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDU2NiAwIDAgMCAwIDU2MSA1NjEgNTYxIDU2MSA1NjEgNTYxIDU2MSAwIDU2 MSAwIDAgMCAwIDAgMCAwIDAgMCA2MjIgMCA2NTUgMCAwIDAgMCAyNzEgMCAwIDAgODczIDAg MCA2MzAgMCAwIDAgMCA2NDggMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDU0MyAwIDUyMyAwIDUy OSAwIDAgNTUwIDI0MiAwIDUwNiAwIDg3NiA1NTEgNTcwIDU2MSAwIDAgNTE1IDMyNiA1NTEg NDg0IDAgMCAwIDQ5NSBdCiAgICAvVG9Vbmljb2RlIDEyIDAgUgo+PgplbmRvYmoKMSAwIG9i ago8PCAvVHlwZSAvUGFnZXMKICAgL0tpZHMgWyA3IDAgUiBdCiAgIC9Db3VudCAxCj4+CmVu ZG9iagoxNSAwIG9iago8PCAvQ3JlYXRvciAoY2Fpcm8gMS4xNC4yIChodHRwOi8vY2Fpcm9n cmFwaGljcy5vcmcpKQogICAvUHJvZHVjZXIgKGNhaXJvIDEuMTQuMiAoaHR0cDovL2NhaXJv Z3JhcGhpY3Mub3JnKSkKPj4KZW5kb2JqCjE2IDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nCiAg IC9QYWdlcyAxIDAgUgo+PgplbmRvYmoKeHJlZgowIDE3CjAwMDAwMDAwMDAgNjU1MzUgZiAK MDAwMDAxMDg0OCAwMDAwMCBuIAowMDAwMDA0NDA5IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAw MDAgbiAKMDAwMDAwNDM4NiAwMDAwMCBuIAowMDAwMDEwMzg4IDAwMDAwIG4gCjAwMDAwMDQ3 NzMgMDAwMDAgbiAKMDAwMDAwNDU0NiAwMDAwMCBuIAowMDAwMDA1MjcxIDAwMDAwIG4gCjAw MDAwMDUyNDkgMDAwMDAgbiAKMDAwMDAwNTM0MyAwMDAwMCBuIAowMDAwMDA5NjM0IDAwMDAw IG4gCjAwMDAwMDk2NTggMDAwMDAgbiAKMDAwMDAxMDA5NSAwMDAwMCBuIAowMDAwMDEwMTE4 IDAwMDAwIG4gCjAwMDAwMTA5MTMgMDAwMDAgbiAKMDAwMDAxMTA0MSAwMDAwMCBuIAp0cmFp bGVyCjw8IC9TaXplIDE3CiAgIC9Sb290IDE2IDAgUgogICAvSW5mbyAxNSAwIFIKPj4Kc3Rh cnR4cmVmCjExMDk0CiUlRU9GCg== --------------070703060403080105060100-- --ojWM2RfT27D5rxalIH6m7sQf9oPQ8T9jk-- --c2ilmUOL4VmDEpGuPjGWmDn46sh7vDw5d Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJXYB36AAoJEJiuUT5oYfea1VYP/iX/gu3TiUPUNkvt3evn1d6J v47kDlUdkenQPt0LuJk4/DLw4DBrjdfGP1pA/O2s0Jq8+rQqXn1qMUvY1DgkP3RH G43UtE6OWlMG9x3SlAlNfYo4nCNTfREGcE/iSpvC6GAzKkI9/9nlTvGTwhC+K+lO vcP5i8B62YYpg599TbIUnzLSGoazy+SIOtnEYKFswMZOxS6E1/lgtSDlYobI+cv4 N1tvZrJ+ONXrJHgbP7pqki8qrwNfJoh4QQls+7rwp+U/CQvKmxLdGSCmaBHxT0qN MuF7bITwbQuuguNECXd1EUgbfoAuUs8WQUR5oiFwEW7emzSpJ2AvgTiYkPstfi2O 322MMyZ4XDrB8P8RZbJmBP17b7lNtI4MmruZNu3ePvceX1eUQupLqNY87//LZQW7 aIqebKrkzguYhwR/Oa8Di7EET92P4vDsm9HSwGIIukVXpsNQnyN37/iuJ8dKwZtk 0TqobaOrSmUcwJps5BRRf08oxX88H+c/FDYo+lVtLDuwgbampx8n4mxM8P7GYoJA YUJ3aCwhk2L3iRChCpQN6Q8BD3u8w1RviFiJcqBLrth9O3UczY0P4IJT/jSF0c6V 76qdzXmeFWPQw4RS1kCC255Y21qLqzCaIP/CxDlkGugQoSn8IhpXt2ivzf+rQEIy jZyA5VwqTmn3dac99Eoh =to2t -----END PGP SIGNATURE----- --c2ilmUOL4VmDEpGuPjGWmDn46sh7vDw5d--