From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0084.outbound.protection.outlook.com [104.47.32.84]) by dpdk.org (Postfix) with ESMTP id C09F658CB for ; Wed, 31 May 2017 15:45:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=u88RzxEgNo+35D5Tjr7kbKikVQDkeRqbPaEGbzPECWc=; b=nNL/dlfngtHOGBXBB0ZtLORW73L6Qi3ie9GvPIvrElMrVBoefZOQSJrZRchoiW8lkWraTrs2WAPieETLEsOSUhLxCP7JbrNqGwMCKqYWguG5xxWIXWEURuPKNIa1LZ3Vd24HrhCTNNVs8zyp//Y512sK2rJXEtuEMHzPPCPORMA= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=caviumnetworks.com; Received: from jerin (111.93.218.67) by CY1PR0701MB1727.namprd07.prod.outlook.com (10.163.21.141) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1124.9; Wed, 31 May 2017 13:45:27 +0000 Date: Wed, 31 May 2017 19:15:11 +0530 From: Jerin Jacob To: Cristian Dumitrescu Cc: dev@dpdk.org, thomas.monjalon@6wind.com, balasubramanian.manoharan@cavium.com, hemant.agrawal@nxp.com, shreyansh.jain@nxp.com Message-ID: <20170531134509.GA13104@jerin> References: <1488589820-206947-2-git-send-email-cristian.dumitrescu@intel.com> <1495213972-109148-1-git-send-email-cristian.dumitrescu@intel.com> <1495213972-109148-3-git-send-email-cristian.dumitrescu@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1495213972-109148-3-git-send-email-cristian.dumitrescu@intel.com> User-Agent: Mutt/1.8.2 (2017-04-18) X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: MA1PR01CA0099.INDPRD01.PROD.OUTLOOK.COM (10.174.56.143) To CY1PR0701MB1727.namprd07.prod.outlook.com (10.163.21.141) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY1PR0701MB1727: X-MS-Office365-Filtering-Correlation-Id: 46c652c1-be19-4cc3-00ba-08d4a82b4cf2 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131423075)(201703031133081); SRVR:CY1PR0701MB1727; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1727; 3:bQuB82Y6mlNfkiJ6ijfOi6lng2DcjtSljzcsSU7awyvASFx25jPJdK6Xfe3RGOWt3vY2hnbVffWQukHwe6CEAu2rBgD5EQQy3cMO0caMGTIkIl59+kTZ8EGYDUZCJAbj77BAXr5DcSbCe6IeJkm/9i/IG/XajPGlp6AvCioOMQBmk/LLhtt/gOzhlHumY/KMECYhtECupDG69jjNdHmiUYDE1y5LgUJmVJkq8mRO4jYRUzDisFhYYPjCIMBNBkpNIeu5Xp8umeIApN5IaI+LuR9GeJ4kxc89tYkYhxhrsJ53aDVu6OQfGPjNSjfFOgUkqYfHDZCrFIClzJswnLWDzg==; 25:CmJjsBSM/sW7JhpLmzx9m3Fr958NrgTQOuJlCHuzxnD73m0Kab5ItGwPT15bsU+ndGZSbZatzanxMwYMm6ecDawABPXu/VyGpoj4GR114lRTBaetAEbvttWP6h1uKIRWewE2wiIIDEqT2VMLOO30Ucjtuyw+2SSbSELGtYluDZGzld/S8MiFdWYlN2oWULT9YdyXiK6T239HZktGR5WAZQj1Bh9dW4kG4WjS6xfPpmYfFaaudRGcUg6NDoT21qqF0/78TRsorwKFupIjrTFrfkpztu0Q+HhailEI4r+HIYWTqzFLP07gtMOHH8YUpc7/FnTNoNIFeNYZKU4wpXfm9XKuS/wocmdtiUi/4fy+xIFkifamHMagoZY5xpw/a81G8SeHfnLetTVI/qXS03vystA1mW9HmC/dnZvcc2VkXXN3zYR8JEHzGHQSPo6P85QRC69l5KAvCinoe2SNT9tsqOxnOI1vi0I1E9/bcsie1xg= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1727; 31:Rz0E/4yIDG/yFa6XwqFFmQdjIYYjPxbQgPogBP+QQDMXUw4OQlVGz5Hcn2IBvlpKbZ4dT2ApOzvwsn7jbw8TAnGw//PToYappDSXPjjsPgTetMhgqoG//SiwMmV/e2PTvnUB9Iq+Jw/S91GOogMfcGqxvskt8hMWLx0adRBCvgKbig7Hxh6aQgwc1cKHuQXGjoqC6s0d6+RYJmuwQyyjdWsjXsmPgHUJnBZHGE7z3K0=; 20:QKiWMgZ64q0MNFQLjGDkwkPpzCTrZYcJbA5dxfGd1cQ/8GdkI4aDLaNsQsq7tYNu9M5v/JanPXcF5sr1Bs863dz+EILcTxi0HATh4RUXU5oCFapmeRCnAVtVK+rXBDtnMwR4UPo3H3+i3F+MtG478Hb1YQmi0NQMVmdlheCkt/mdYmEe5RnWUNwnn1Q5Bu7gzR4W8rmbAt2nCQHkXbKoqDps7KVX8/NcIw4ACXpuoHMPU4q/nihJY5dVddFALY1/Gkspmb7dRTRsoBm0a+Q5Y49vxYbTdKIqTdyByJuG8d22BiesD053INPkD1dYrglnIKHHTJ8bWI2l4oLP4VK0qhkSHdfKNIaaBTSbntHyrLDDoS4lPw9SobGJzxu6rkAClSLiZ+WTTsbSgp79HgU6VGaE4vQGWUsIWz/uvx89eKtbtrwyLiMVRbktNCF9Y/MGHBEMDbQA703CK0WhDTrrsUnI0tu92abJui4GzfPpapziA4kNkuJAYIbjU3ENLePv+NqCTYuvRaFMU5DEM98GPXXVyUjRAxiBIvO+a+UAKD14oKkqs2PcjyBvptgoPxksJ4GS8+8oEZzX3KnroXCVsiPAcRuH2Xb8DTg1yyMtXDA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700073)(100105000095)(100000701073)(100105300095)(100000702073)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(100000703073)(100105400095)(10201501046)(3002001)(93006095)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123562025)(20161123564025)(20161123560025)(20161123558100)(6072148)(100000704073)(100105200095)(100000705073)(100105500095); SRVR:CY1PR0701MB1727; BCL:0; PCL:0; RULEID:(100000800073)(100110000095)(100000801073)(100110300095)(100000802073)(100110100095)(100000803073)(100110400095)(100000804073)(100110200095)(100000805073)(100110500095); SRVR:CY1PR0701MB1727; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTFQUjA3MDFNQjE3Mjc7NDo3dlVBejFhckFyZGJTK2o4UTBhcnZ4dW4r?= =?utf-8?B?cENJZWhPRjNPNSsrdStZRENhK3I0YjRMbkNZMUZQWXQrVC9DblFWMFVieVVS?= =?utf-8?B?cnlDcjVjRytkYS9tZVl0OWxrUWo4aURQRll0ekZOa25NUFVVWXVjV2oybWly?= =?utf-8?B?ZkVvb1Z0VnVKaXlZbzQxemJnbEo1TXE2aXgwZUM0ZEZRWENHcmsrWHpNR1Rp?= =?utf-8?B?ZXpyVTRtZC9yODZ3NFEzb05naHZDY3Y0RHc0R1lFZW15YmpNTEh1Zmt6bDFE?= =?utf-8?B?NzJWZ1dyblVJb3k4Z0dsVDVkajEydTFSOFZxWHArblYwU3JLZTgvZ2pRVER3?= =?utf-8?B?NWhVVnNlUFhKMDdZZXB5UjA0WTJJQmNua2hIR3VvVTJDaHhHUDVLdVlqa1Br?= =?utf-8?B?eGtrTENVanVnM1NTSWlKV21GVzZWUERFbHFsWHNhWVZZUHZZQWhaRHZJcVNC?= =?utf-8?B?cWQ0MkpRVXlVT2F6ZzJaTVRIUkdHNWFVNzRFemV4bkVTaDhJdzQxY1lPL0k2?= =?utf-8?B?WUhjdW5IcXJmeDJlMTd2R3d1djZ6RExWMHdpNFhTMHJsQ2czNEMxaHpyUEFk?= =?utf-8?B?aUFDRWx0YXBnUnZPeUFkUS9sdlRTRG1BZzlDeXBvOWpEMmpMRmFuMThTN1Jw?= =?utf-8?B?akM1dUZHVDhaUE42RXAwc1Y1UmlqZkFEekZGN1pYbWsyTGRQSEhRR2wrNGla?= =?utf-8?B?VE9oOWdneVN2QWFPejZQZCtBdFVNQzQ5Tm9zN1krQlNhb2lLRE55UTZocW5J?= =?utf-8?B?ZEYvR2N0allQZlFnNndwTndFcWV1azlIQnhQRUxSUWpldEtiZ052OVVaOWxY?= =?utf-8?B?Znl5OSt6SVJFWUFxUnlZdGE2T2lEZUNCN3Y5NGZoZU8vR0JNOGxFTEZONDYr?= =?utf-8?B?VUR0YW5Ic0tLc1AvZHlKeXJaN0RtUUtDZUxFVkFKaTZWVUorYm03K2k0OHds?= =?utf-8?B?ZVZtMGhRcUtnOVQ1NTRON0gyTm83QmR4TFMyUDNIV3BzVStuR0lMQ2E2M1Yr?= =?utf-8?B?TFFSNE1DZHhQazM3K2dPRlhaRGlGM05EZDE2dUJPbFQ4MUxOZEJZYnVhMGNt?= =?utf-8?B?b1JtU21QS2l2V1RGdWE5RDcrOVFpSUs2OGNGNlQ0VXNnWllDbVQ4SmFrOTNG?= =?utf-8?B?RG1vaXBhZEh4eGVDMWtrTEhrNFVGeldERGlQanBnL0RsclpXTkhsS0pVdXhZ?= =?utf-8?B?U21nd2dNR29CNDE2TnJreWJYK01uRWN6blNnRlc2WDhZZDNkQzU2MVk3azAx?= =?utf-8?B?KzVxaTdQb2hNeE1kQTdwT1I2eFpiYVlvZGZReXB2NkdlbllBM0NpOVpoY09z?= =?utf-8?B?aENBbUszUnN4c2lzVUdpK1pRNUtSaFl3Q2ZzZnVUM3hNMDNuUDQwZG9oZWZv?= =?utf-8?B?RUlpOEJGOTkyN2EwNFpyUVVqbGJFRUZ6aTR5NzlNNlNnRnBjckp3bTA4SGNi?= =?utf-8?B?T2JBZVlpY0dCUk1rNkYxQVRTNzE1STJuUlN3NzRsU0NHc29JRkxBV3RYT0Nh?= =?utf-8?B?R0EzQ1FNMEJ5SXh1WVhUVDZwNWVZMk9mV1pWUnNKd2RBZ1dWaFp0c2V4VmNF?= =?utf-8?B?ZVZtWWZRUzdQVnJ2WDlSY25zVm9HUVlPV3Q3dHlIWHIwcW1hUm4vcWpKSlpE?= =?utf-8?Q?BytpofqcqNisGHD7zd4nb?= X-Forefront-PRVS: 0324C2C0E2 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(39450400003)(39840400002)(39410400002)(39400400002)(39850400002)(13464003)(66066001)(42882006)(6916009)(5009440100003)(23676002)(72206003)(2950100002)(2906002)(2870700001)(33656002)(189998001)(478600001)(229853002)(50466002)(50986999)(4326008)(54356999)(76176999)(110136004)(25786009)(38730400002)(6666003)(4001350100001)(6496005)(1076002)(6116002)(83506001)(6246003)(7736002)(3846002)(8676002)(5660300001)(42186005)(55016002)(33716001)(53936002)(9686003)(8656002)(47776003)(81166006)(305945005)(18370500001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0701MB1727; H:jerin; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTFQUjA3MDFNQjE3Mjc7MjM6UEFPZUU5YTQ3bnN6Q0M1WjNlSW5PWThK?= =?utf-8?B?WTZFVFZueXpkVFh6akZqay83ZGxCRXY5MVY5c2JDUkg3cmFHbXRYVmdmQVBs?= =?utf-8?B?QmNFcmhUcVVld1pCR0h6SU1xRklCTEYycVV1UnIyTDZCU2htQ09oTHVVeTZ1?= =?utf-8?B?b1pKc0p1eEI2U3N6QnI3N0FSbmJTRzd5cEpTdjdZTFFkYWFVZW1HNFpDWkZZ?= =?utf-8?B?WXYvek10WkpndnhpbGdPTWs5YnU4U2JMalRXSjdZMmtBckRhbm5KYnVoc0dM?= =?utf-8?B?K2FJK2I5QXFOM3Y2Skh2d1R2anZhQ2R1WUVxWCtMSStLN2NGcXA0VjhGSlhp?= =?utf-8?B?R2hSMFZkeVNXa1NCZVVVbElBM2dyMGE3eHB3bW1ET2lpTjZUUU4wbW1XWnZF?= =?utf-8?B?ZXNnSXBUbGhleTN6QWlITWtMNWhCRFVzVHJhcGx2WWErYndvMUdWaGRTNWZJ?= =?utf-8?B?RVFxYlNSVUJGRk1XNk1sbVVDYXNXcXJqYUkwdm5UWXFmUnV3dWJqOGI3ak93?= =?utf-8?B?bHRmalVZTXpIZ2tnRytIV1ZOUXVQcVcvdGxPZVN6SjBmZEtPRlJVTjN6TDh1?= =?utf-8?B?T25NbUdaQW12NkxRdW40MW1CWE1ZWjE4MHphWWlkdlZTV2F3ckxNMHhiM3J3?= =?utf-8?B?c2hNSEtFaC91ZmxOMzhvNmFVUHZ4WXdNOXBXbi9aKytHNTEyR0MrQU1ZZytk?= =?utf-8?B?cWcrQ2xWUXFEWERubVlnR3BQRkNIU01NQkVQSkhZTlR3YnY4dXVNNjBRdWp1?= =?utf-8?B?Yzloa2NGVHgyOXJmd2NxbzJxaHQ1TTNDTWx4TStvTmJFZndwNHFtR1VLYkpX?= =?utf-8?B?dWl5Y1ZLU1VnZ0d4WnlxT1ZhblBHMTN1T2JnM3FzblRRaVJ6VmlGVVc0TnVU?= =?utf-8?B?dWdIaFJmQWVxTDF5Tm8yYTJtNWxMR3h1S2V4emU5UXpZSmpRYVVTZU5UelIz?= =?utf-8?B?WHZWcitPWTZ1ZjRhOUNCaHdWVWRFNExrTEJhQUNxbXZ3WXNFazlYcFVRUTVE?= =?utf-8?B?cWZVdXZCVVNyTmZ6RmlmN1hRMTNnSjd6QWRBanJsWVBHOU5ZQmpyazJlTVNi?= =?utf-8?B?SFA3THhMOEdOYTBieWdjMUFsYXZtTC93TWtpdXM4WGRyc1RwbmM5SDZlMDFr?= =?utf-8?B?MmZSNlF6bWtjZ0lMekIvSEd2WlJ3clBKWDA2QmkwbjFVcG81QitEVUpmZXZZ?= =?utf-8?B?VU9FeW5CaWpjcjBhVlVNazBxTU1zeUF3SkVrUWUzMWE3ZVlFd1hFR3gwd0la?= =?utf-8?B?RnlwRGtGZTFGb0N1SXAvbWdGQ0xRakIyWkhGcXJPTU03ZFlYS0JTSUM3QzVp?= =?utf-8?B?TThpMFZFTTg4dkRWeEdpNDN5NjY0TGNRbHo2QngwMmhtN3hLNEVtbWQwNDUx?= =?utf-8?B?ZG0vNWJFVUVnWXhaZ3YyZ0ZmQXZUUG5UUEZMUXVzUDlvWnB2KzJ5VFJmc1pT?= =?utf-8?B?N0FpQVRPbmE3ZlJVZVJrcFhEUHpIMFRnSEhiNTBxaWRLR3JyUkZ6K3N6dlF3?= =?utf-8?B?dGltcURsNVNWaTIzWEFGTEU2U3pHTjlDTU5ZMXdFRkE1MG5McHFJdG9QU0Ey?= =?utf-8?B?SHFJVGlrL1liY3l5SS9PMGkvZWV1Zit6b1MvVnFBMXR4STBOamgxeHFDT01h?= =?utf-8?B?aVNkeEI2Q1FLNjJqUkZrZmhSWGZGTU5wdGpla2pyK28xRzZUaE5zb0hxVG92?= =?utf-8?Q?Y09zUfD0dm4D9WEkXyRo=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1727; 6:g1XjhBpoAJ5OPNtsXcekIaXF4Ggiah29hFvfY7dOMI36BqYtSNh0tTOoxDkX4YY3Hk9Lgv1Nfe6hGkmUoOrx+vVa8Xw3Fcd+yYcEUmlClMG44P550nryFc/ycm4clLT7QdearGAFmNIk7wPgJ57ssxOu+KJcxhGQqysWjsPp3+r2WXMOyPP2fivSE5y7Y9JwHVhk33M5+RVgbCSbBVSZBriuxSaEAwmN+DXuDiGyjfvT4CXjKnzHIZ9M8KJn1zaLTb+JW2e9MNlV10zeYG9jMnqcKR/+4i9xZM5ToUSR39d5DX1VGqS/NnOcX+9oWYVlYmqXwQdZLZdFVB2xLe36hplz0BzvjSxMZSPX9zu/SoMWARUZGNT592XV8cCOgNy3ISlFdc8C60xgCE+a4uZYxuDTXHfr759mLWxkr+PAsMD3zwijoDhM9f5lQw3D6CH9ar2BwPCORM4L9L5HIMYiKvLX9G70NidF5Jtp7WiQmueAOi6OWdkC4f+4tfxFZTSsfZMTYi4oYrUhxxmSwUrHYQ== X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1727; 5:DNPTkArkaRVQ9Ustgm8RYXu/ctJvnOyIh4CmnPPEkiKGdazpTGM2FeRI/FI4AteJ6VOCdqxsDmXx7wkoqMM/IXcVOYAuPiOTfjDjV0PocKGvR40M3ENggR8NAXZ6QHPUW5KvkhBihKhi4pL2CKoKqa14tXi6nm7j2RYzGwgct8latneiOrAdtK94e48EM1KDtEt7GsRo46Mo2RmWd5J2JNfCOI+2Bwy/hQP/azKD1jAsvLn97W30iuzZ9rAF0TBSyVhdN89m2wpQRLPnoogBC4JybbswocqEBdr0VBeNSmrTPo2gHOU/ZbneVrdNaYcSoOgYmMtN4AtiLXmTkkvmrgj5FCxh/OhyU/icBft+qbdgA/XXQWZaKOFEGaiM9EUii8faQDCUAZ95CETdH35l50L1XTGzaETUJNscQB7JMbnPLsTrc068J1c7/su+wCkDouYSi955wXp3CqEsSlROMOnxLoLEQ4sqAnZ4Zh+PSHrsWsZdH2orceXIcNYVobjW; 24:GO2oI7ecPbHV8AuEF2DYFqqCm6OTh+hEfuVK4pumwFepVdmFWtCEWGlviHCVl1Wdox5RlecHTRApbghIBjJMK9iHbVgKVn7d4hQWxAQpVFE= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1727; 7:D1B35VbMgjmldJIJqzad8I7ka0lS8HPrZ1lembcyXDpjXzY6oOB+WDs385poY7Bs+okdy7yBsi+iyHGr7OXc9E7ehPoqj3dKLXjWCQWzHyzoK2S1qByCzyga54JOmzXnpQhiAXmPtbJygN/4yYY0R5/FUwxFoJNhZ7HLQveZCpy/YmX9kY5rk9SwBHDnF0yqUrsmxONqAYhueQVLf3EKtqWBFyW42vpCi5W82CHWEz/xDWtltUbJvouIHVmcGdy+32vmoDecHYLJy3xY+SBURJomQCNacjn3E9zhK/1JSnD0ZZxLM+NKJkDNSe9BSG/60O9uYjtW8i/S6//rBkBOPg== X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 May 2017 13:45:27.4851 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0701MB1727 Subject: Re: [dpdk-dev] [PATCH v4 2/2] ethdev: add traffic management API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 31 May 2017 13:45:32 -0000 -----Original Message----- > Date: Fri, 19 May 2017 18:12:52 +0100 > From: Cristian Dumitrescu > To: dev@dpdk.org > CC: thomas.monjalon@6wind.com, jerin.jacob@caviumnetworks.com, > balasubramanian.manoharan@cavium.com, hemant.agrawal@nxp.com, > shreyansh.jain@nxp.com > Subject: [PATCH v4 2/2] ethdev: add traffic management API > X-Mailer: git-send-email 2.7.4 > > This patch introduces the generic ethdev API for the traffic manager > capability, which includes: hierarchical scheduling, traffic shaping, > congestion management, packet marking. > > Main features: > - Exposed as ethdev plugin capability (similar to rte_flow) > - Capability query API per port, per level and per node > - Scheduling algorithms: Strict Priority (SP), Weighed Fair Queuing (WFQ) > - Traffic shaping: single/dual rate, private (per node) and shared (by > multiple nodes) shapers > - Congestion management for hierarchy leaf nodes: algorithms of tail drop, > head drop, WRED; private (per node) and shared (by multiple nodes) WRED > contexts > - Packet marking: IEEE 802.1q (VLAN DEI), IETF RFC 3168 (IPv4/IPv6 ECN for > TCP and SCTP), IETF RFC 2597 (IPv4 / IPv6 DSCP) > > Signed-off-by: Cristian Dumitrescu IMO, With this version, It is reached to a reasonable shape where we can start using it as a base for next-tm if there are no other reviewers for this feature. Two major comments, 1) IMO, We don't need a separate API for rte_tm_node_add_check_level() and rte_tm_node_add().We can just keep, rte_tm_node_add() and move the level check in common code. 2) There are a lot of doxygen rendering issues in this document. I will try to enumerate them inline. Please cross check the header file with "make doc-api-html" output. With above changes, Acked-by: Jerin Jacob > > MAINTAINERS | 4 + > lib/librte_ether/Makefile | 5 +- > lib/librte_ether/rte_ether_version.map | 30 + > lib/librte_ether/rte_tm.c | 448 ++++++++ > lib/librte_ether/rte_tm.h | 1923 ++++++++++++++++++++++++++++++++ > lib/librte_ether/rte_tm_driver.h | 373 +++++++ Missing doxygen hooks in doc/api/doxy-api-index.md [rte_tm] (@ref rte_tm.h), [rte_tm_driver] (@ref rte_tm_driver.h), > 6 files changed, 2782 insertions(+), 1 deletion(-) > create mode 100644 lib/librte_ether/rte_tm.c > create mode 100644 lib/librte_ether/rte_tm.h > create mode 100644 lib/librte_ether/rte_tm_driver.h > > diff --git a/MAINTAINERS b/MAINTAINERS > index afb4cab..cdaf2ac 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -240,6 +240,10 @@ Flow API > M: Adrien Mazarguil > F: lib/librte_ether/rte_flow* > > +Traffic Management API > +M: Cristian Dumitrescu > +F: lib/librte_ether/rte_tm* Add next-tm tree here. > + > Crypto API > M: Declan Doherty > F: lib/librte_cryptodev/ > diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile > index 93fdde1..db692ae 100644 > --- a/lib/librte_ether/Makefile > +++ b/lib/librte_ether/Makefile > @@ -1,6 +1,6 @@ > # BSD LICENSE > # > -# Copyright(c) 2010-2016 Intel Corporation. All rights reserved. > +# Copyright(c) 2010-2017 Intel Corporation. All rights reserved. Good to add them the name of other companies who contributed in the specification. > # All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > @@ -45,6 +45,7 @@ LIBABIVER := 6 > > SRCS-y += rte_ethdev.c > SRCS-y += rte_flow.c > +SRCS-y += rte_tm.c > > + NULL, \ > + rte_strerror(ENOSYS)); \ > + \ > + ops->func; \ > +}) > + > +/* Get number of leaf nodes */ > +int > +rte_tm_get_number_of_leaf_nodes(uint8_t port_id, > + uint32_t *n_leaf_nodes, > + struct rte_tm_error *error) > +{ > + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; > + const struct rte_tm_ops *ops = > + rte_tm_ops_get(port_id, error); > + > + if (ops == NULL) > + return -rte_errno; > + > + if (n_leaf_nodes == NULL) { > + rte_tm_error_set(error, > + EINVAL, > + RTE_TM_ERROR_TYPE_UNSPECIFIED, > + NULL, > + rte_strerror(EINVAL)); > + return -rte_errno; > + } > + > + *n_leaf_nodes = dev->data->nb_tx_queues; > + return 0; > +} > + > +/* Check node type (leaf or non-leaf) */ > +int > +rte_tm_node_type_get(uint8_t port_id, > + uint32_t node_id, > + int *is_leaf, > + struct rte_tm_error *error) > +{ > + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; leaf node can be detected in the common code itself as it is 0 to dev->data->nb_tx_queues. > + return RTE_TM_FUNC(port_id, node_type_get)(dev, > + node_id, is_leaf, error); > +} > + > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#ifndef __INCLUDE_RTE_TM_H__ > +#define __INCLUDE_RTE_TM_H__ > + > +/** > + * @file > + * RTE Generic Traffic Manager API > + * > + * This interface provides the ability to configure the traffic manager in a > + * generic way. It includes features such as: hierarchical scheduling, > + * traffic shaping, congestion management, packet marking, etc. > + */ > + > +#include > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +/** > + * Ethernet framing overhead. > + * > + * Overhead fields per Ethernet frame: > + * 1. Preamble: 7 bytes; > + * 2. Start of Frame Delimiter (SFD): 1 byte; > + * 3. Inter-Frame Gap (IFG): 12 bytes. > + * > + * One of the typical values for the *pkt_length_adjust* field of the shaper > + * profile. > + * > + * @see struct rte_tm_shaper_params > + * > + */ > +#define RTE_TM_ETH_FRAMING_OVERHEAD 20 > + > +/** > + * Ethernet framing overhead including the Frame Check Sequence (FCS) field. > + * Useful when FCS is generated and added at the end of the Ethernet frame on > + * TX side without any SW intervention. > + * > + * One of the typical values for the pkt_length_adjust field of the shaper > + * profile. > + * > + * @see struct rte_tm_shaper_params > + */ > +#define RTE_TM_ETH_FRAMING_OVERHEAD_FCS 24 > + > +/**< Invalid WRED profile ID */ > +#define RTE_TM_WRED_PROFILE_ID_NONE UINT32_MAX > + > +/**< Invalid shaper profile ID */ > +#define RTE_TM_SHAPER_PROFILE_ID_NONE UINT32_MAX > + > +/**< Node ID for the parent of the root node */ > +#define RTE_TM_NODE_ID_NULL UINT32_MAX > + > +/** > + * Color > + */ > +enum rte_tm_color { > + RTE_TM_GREEN = 0, /**< Green */ > + RTE_TM_YELLOW, /**< Yellow */ > + RTE_TM_RED, /**< Red */ > + RTE_TM_COLORS /**< Number of colors */ > +}; > + > +/** > + * Node statistics counter type > + */ > +enum rte_tm_stats_type { > + /**< Number of packets scheduled from current node. */ > + RTE_TM_STATS_N_PKTS = 1 << 0, > + > + /**< Number of bytes scheduled from current node. */ > + RTE_TM_STATS_N_BYTES = 1 << 1, > + > + /**< Number of green packets dropped by current leaf node. */ > + RTE_TM_STATS_N_PKTS_GREEN_DROPPED = 1 << 2, > + > + /**< Number of yellow packets dropped by current leaf node. */ > + RTE_TM_STATS_N_PKTS_YELLOW_DROPPED = 1 << 3, > + > + /**< Number of red packets dropped by current leaf node. */ > + RTE_TM_STATS_N_PKTS_RED_DROPPED = 1 << 4, > + > + /**< Number of green bytes dropped by current leaf node. */ > + RTE_TM_STATS_N_BYTES_GREEN_DROPPED = 1 << 5, > + > + /**< Number of yellow bytes dropped by current leaf node. */ > + RTE_TM_STATS_N_BYTES_YELLOW_DROPPED = 1 << 6, > + > + /**< Number of red bytes dropped by current leaf node. */ > + RTE_TM_STATS_N_BYTES_RED_DROPPED = 1 << 7, > + > + /**< Number of packets currently waiting in the packet queue of current > + * leaf node. > + */ > + RTE_TM_STATS_N_PKTS_QUEUED = 1 << 8, > + > + /**< Number of bytes currently waiting in the packet queue of current > + * leaf node. > + */ > + RTE_TM_STATS_N_BYTES_QUEUED = 1 << 9, > +}; > + > + * Node statistics counters > + */ > +struct rte_tm_node_stats { > + /**< Number of packets scheduled from current node. */ > + uint64_t n_pkts; Incorrect doxygen API HTML rendering. It is rendering as "< Number of packets scheduled from current node. ^^^ Looks like comment has to come below the "uint64_t n_pkts". Applicable across the header file. > + > + /**< Number of bytes scheduled from current node. */ > + uint64_t n_bytes; > + > + /**< Statistics counters for leaf nodes only. */ > + struct { > + /**< Number of packets dropped by current leaf node per each > + * color. > + */ > + uint64_t n_pkts_dropped[RTE_TM_COLORS]; > + > + /**< Number of bytes dropped by current leaf node per each > + * color. > + */ > + uint64_t n_bytes_dropped[RTE_TM_COLORS]; > + > + /**< Number of packets currently waiting in the packet queue of > + * current leaf node. > + */ > + uint64_t n_pkts_queued; > + > + /**< Number of bytes currently waiting in the packet queue of > + * current leaf node. > + */ > + uint64_t n_bytes_queued; > + } leaf; > +}; > + > +/** > + * Traffic manager dynamic updates > + */ > +enum rte_tm_dynamic_update_type { > + /**< Dynamic parent node update. The new parent node is located on same > + * hierarchy level as the former parent node. Consequently, the node > + * whose parent is changed preserves its hierarchy level. > + */ > + RTE_TM_UPDATE_NODE_PARENT_KEEP_LEVEL = 1 << 0, > + > + /**< Dynamic parent node update. The new parent node is located on > + * different hierarchy level than the former parent node. Consequently, > + * the node whose parent is changed also changes its hierarchy level. > + */ > + RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL = 1 << 1, > + > + /**< Dynamic node add/delete. */ > + RTE_TM_UPDATE_NODE_ADD_DELETE = 1 << 2, > + > + /**< Suspend/resume nodes. */ > + RTE_TM_UPDATE_NODE_SUSPEND_RESUME = 1 << 3, > + > + /**< Dynamic switch between byte-based and packet-based WFQ weights. */ > + RTE_TM_UPDATE_NODE_WFQ_WEIGHT_MODE = 1 << 4, > + > + /**< Dynamic update on number of SP priorities. */ > + RTE_TM_UPDATE_NODE_N_SP_PRIORITIES = 1 << 5, > + > + /**< Dynamic update of congestion management mode for leaf nodes. */ > + RTE_TM_UPDATE_NODE_CMAN = 1 << 6, > + > + /**< Dynamic update of the set of enabled stats counter types. */ > + RTE_TM_UPDATE_NODE_STATS = 1 << 7, > +}; > + > +/** > + * Traffic manager get number of leaf nodes > + * > + * Each leaf node sits on on top of a TX queue of the current Ethernet port. > + * Therefore, the set of leaf nodes is predefined, their number is always equal > + * to N (where N is the number of TX queues configured for the current port) > + * and their IDs are 0 .. (N-1). > + * > + * @param[in] port_id [in] can be treated as default to avoid mentioning [in] everywhere. > + * The port identifier of the Ethernet device. > + * @param[out] n_leaf_nodes > + * Number of leaf nodes for the current port. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > +/** > + * Traffic manager node delete > + * > + * Delete an existing node. This operation fails when this node currently has > + * at least one user (i.e. child node). > + * > + * When called before rte_tm_hierarchy_commit() invocation, this function is > + * typically used to define the initial start-up hierarchy for the port. > + * Provided that dynamic hierarchy updates are supported by the current port (as > + * advertised in the port capability set), this function can be also called > + * after the rte_tm_hierarchy_commit() invocation. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see RTE_TM_UPDATE_NODE_ADD_DELETE > + */ > +int > +rte_tm_node_delete(uint8_t port_id, > + uint32_t node_id, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node suspend > + * > + * Suspend an existing node. While the node is in suspended state, no packet is > + * scheduled from this node and its descendants. The node exits the suspended > + * state through the node resume operation. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see rte_tm_node_resume() > + * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME > + */ > +int > +rte_tm_node_suspend(uint8_t port_id, > + uint32_t node_id, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node resume > + * > + * Resume an existing node that is currently in suspended state. The node > + * entered the suspended state as result of a previous node suspend operation. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see rte_tm_node_suspend() > + * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME > + */ > +int > +rte_tm_node_resume(uint8_t port_id, > + uint32_t node_id, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager hierarchy commit > + * > + * This function is called during the port initialization phase (before the > + * Ethernet port is started) to freeze the start-up hierarchy. > + * > + * This function typically performs the following steps: > + * a) It validates the start-up hierarchy that was previously defined for the > + * current port through successive rte_tm_node_add() invocations; > + * b) Assuming successful validation, it performs all the necessary port > + * specific configuration operations to install the specified hierarchy on > + * the current port, with immediate effect once the port is started. > + * > + * This function fails when the currently configured hierarchy is not supported > + * by the Ethernet port, in which case the user can abort or try out another > + * hierarchy configuration (e.g. a hierarchy with less leaf nodes), which can be > + * build from scratch (when *clear_on_fail* is enabled) or by modifying the > + * existing hierarchy configuration (when *clear_on_fail* is disabled). > + * > + * Note that this function can still fail due to other causes (e.g. not enough > + * memory available in the system, etc), even though the specified hierarchy is > + * supported in principle by the current port. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] clear_on_fail > + * On function call failure, hierarchy is cleared when this parameter is > + * non-zero and preserved when this parameter is equal to zero. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see rte_tm_node_add() > + * @see rte_tm_node_delete() > + */ > +int > +rte_tm_hierarchy_commit(uint8_t port_id, > + int clear_on_fail, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node parent update > + * > + * Restriction for root node: its parent cannot be changed. > + * > + * This function can only be called after the rte_tm_hierarchy_commit() > + * invocation. Its success depends on the port support for this operation, as > + * advertised through the port capability set. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[in] parent_node_id > + * Node ID for the new parent. Needs to be valid. > + * @param[in] priority > + * Node priority. The highest node priority is zero. Used by the SP algorithm > + * running on the parent of the current node for scheduling this child node. > + * @param[in] weight > + * Node weight. The node weight is relative to the weight sum of all siblings > + * that have the same priority. The lowest weight is zero. Used by the WFQ > + * algorithm running on the parent of the current node for scheduling this > + * child node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see RTE_TM_UPDATE_NODE_PARENT_KEEP_LEVEL > + * @see RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL > + */ > +int > +rte_tm_node_parent_update(uint8_t port_id, > + uint32_t node_id, > + uint32_t parent_node_id, > + uint32_t priority, > + uint32_t weight, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node private shaper update > + * > + * Restriction for the root node: its private shaper profile needs to be valid > + * and single rate. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[in] shaper_profile_id > + * Shaper profile ID for the private shaper of the current node. Needs to be > + * either valid shaper profile ID or RTE_TM_SHAPER_PROFILE_ID_NONE, with > + * the latter disabling the private shaper of the current node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. Missing the @see to point the capability. > + */ > +int > +rte_tm_node_shaper_update(uint8_t port_id, > + uint32_t node_id, > + uint32_t shaper_profile_id, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node shared shapers update > + * > + * Restriction for root node: cannot use any shared rate shapers. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[in] shared_shaper_id > + * Shared shaper ID. Needs to be valid. > + * @param[in] add > + * Set to non-zero value to add this shared shaper to current node or to zero > + * to delete this shared shaper from current node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. Missing the @see to point the capability. > + */ > +int > +rte_tm_node_shared_shaper_update(uint8_t port_id, > + uint32_t node_id, > + uint32_t shared_shaper_id, > + int add, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node enabled statistics counters update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[in] stats_mask > + * Mask of statistics counter types to be enabled for the current node. This > + * needs to be a subset of the statistics counter types available for the > + * current node. Any statistics counter type not included in this set is to > + * be disabled for the current node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see enum rte_tm_stats_type > + * @see RTE_TM_UPDATE_NODE_STATS Incorrect doxygen API HTML rendering. > + */ > +int > +rte_tm_node_stats_update(uint8_t port_id, > + uint32_t node_id, > + uint64_t stats_mask, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node WFQ weight mode update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid leaf node ID. > + * @param[in] wfq_weight_mode > + * WFQ weight mode for each SP priority. When NULL, it indicates that WFQ is > + * to be used for all priorities. When non-NULL, it points to a pre-allocated > + * array of *n_sp_priorities* values, with non-zero value for byte-mode and > + * zero for packet-mode. > + * @param[in] n_sp_priorities > + * Number of SP priorities. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see RTE_TM_UPDATE_NODE_WFQ_WEIGHT_MODE > + * @see RTE_TM_UPDATE_NODE_N_SP_PRIORITIES > + */ > +int > +rte_tm_node_wfq_weight_mode_update(uint8_t port_id, > + uint32_t node_id, > + int *wfq_weight_mode, > + uint32_t n_sp_priorities, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node congestion management mode update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid leaf node ID. > + * @param[in] cman > + * Congestion management mode. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see RTE_TM_UPDATE_NODE_CMAN > + */ > +int > +rte_tm_node_cman_update(uint8_t port_id, > + uint32_t node_id, > + enum rte_tm_cman_mode cman, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node private WRED context update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid leaf node ID. > + * @param[in] wred_profile_id > + * WRED profile ID for the private WRED context of the current node. Needs to > + * be either valid WRED profile ID or RTE_TM_WRED_PROFILE_ID_NONE, with the > + * latter disabling the private WRED context of the current node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + */ Missing the @see to point the capability. > +int > +rte_tm_node_wred_context_update(uint8_t port_id, > + uint32_t node_id, > + uint32_t wred_profile_id, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node shared WRED context update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid leaf node ID. > + * @param[in] shared_wred_context_id > + * Shared WRED context ID. Needs to be valid. > + * @param[in] add > + * Set to non-zero value to add this shared WRED context to current node or > + * to zero to delete this shared WRED context from current node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. Missing the @see to point the capability. > + * @see struct rte_tm_capabilities::mark_vlan_dei_supported > + */ > +int > +rte_tm_mark_vlan_dei(uint8_t port_id, > + int mark_green, > + int mark_yellow, > + int mark_red, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager packet marking - IPv4 / IPv6 ECN (IETF RFC 3168) > + * > + * IETF RFCs 2474 and 3168 reorganize the IPv4 Type of Service (TOS) field > + * (8 bits) and the IPv6 Traffic Class (TC) field (8 bits) into Differentiated > + * Services Codepoint (DSCP) field (6 bits) and Explicit Congestion > + * Notification (ECN) field (2 bits). The DSCP field is typically used to > + * encode the traffic class and/or drop priority (RFC 2597), while the ECN > + * field is used by RFC 3168 to implement a congestion notification mechanism > + * to be leveraged by transport layer protocols such as TCP and SCTP that have > + * congestion control mechanisms. > + * > + * When congestion is experienced, as alternative to dropping the packet, > + * routers can change the ECN field of input packets from 2'b01 or 2'b10 > + * (values indicating that source endpoint is ECN-capable) to 2'b11 (meaning > + * that congestion is experienced). The destination endpoint can use the > + * ECN-Echo (ECE) TCP flag to relay the congestion indication back to the > + * source endpoint, which acknowledges it back to the destination endpoint with > + * the Congestion Window Reduced (CWR) TCP flag. > + * > + * All IPv4/IPv6 packets of a given color with ECN set to 2’b01 or 2’b10 > + * carrying TCP or SCTP have their ECN set to 2’b11 if the marking feature is > + * enabled for the current color, otherwise the ECN field is left as is. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] mark_green > + * Set to non-zero value to enable marking of green packets and to zero to > + * disable it. > + * @param[in] mark_yellow > + * Set to non-zero value to enable marking of yellow packets and to zero to > + * disable it. > + * @param[in] mark_red > + * Set to non-zero value to enable marking of red packets and to zero to > + * disable it. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see struct rte_tm_capabilities::mark_ip_ecn_tcp_supported > + * @see struct rte_tm_capabilities::mark_ip_ecn_sctp_supported > + */ > +int > +rte_tm_mark_ip_ecn(uint8_t port_id, > + int mark_green, > + int mark_yellow, > + int mark_red, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager packet marking - IPv4 / IPv6 DSCP (IETF RFC 2597) > + * > + * IETF RFC 2597 maps the traffic class and the drop priority to the IPv4/IPv6 > + * Differentiated Services Codepoint (DSCP) field (6 bits). Here are the DSCP > + * values proposed by this RFC: > + * > + * Class 1 Class 2 Class 3 Class 4 > + * +----------+----------+----------+----------+ > + * Low Drop Prec | 001010 | 010010 | 011010 | 100010 | > + * Medium Drop Prec | 001100 | 010100 | 011100 | 100100 | > + * High Drop Prec | 001110 | 010110 | 011110 | 100110 | > + * +----------+----------+----------+----------+ Incorrect doxygen API HTML rendering.