This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "".
The branch, caterpillar has been updated via 6f2053214cf0bd5ef2694a082cb51cb220132d2f (commit) via bac8c43d569198ec5a37ff3404fb764ad633bf7b (commit) via 257b08b35ceea41bad5a7f1c626496cf111e657a (commit) via 27a7923236030fed0272cc9072f0cde62496e91d (commit) via bfa24c0b7f035a84dd30e161673e97df244a926f (commit) via 7f80bdf3a851c1b37e5826327ab5415ac5abe7a4 (commit) via f74f2facaa16b35618c220f5652dbdb295c527e1 (commit) via eeb098456bc51314cd6520d05f82f92353ba4a02 (commit) via 379d527e891e1ad246b0bb796e6fc938618758c4 (commit) via 637a332968967672395f1d41d809d0eba8d8dbd1 (commit) via 24847c049d1a3ead549f0ccb5c7da5fbdedaa794 (commit) via 70217ce609bd28e1982ec9caae2b4d91fca4074d (commit) via e2023d4f1767d2358c97bc4aab4b21086dba1421 (commit) via 72aa3ae9e181a90718b42da85561638cf7f3d480 (commit) via 5865787680be13b47b777e8b0b64646755be41e0 (commit) via c90cbf70a08d8d7124af226086e0525bcf4a9e50 (commit) via 70f5c00a0713856daae879ebe3652d44c5d783f2 (commit) via b72a57524cd02abc873c15a451c40e9cb2dd6ee5 (commit) via c0bf89cf3c36c7f0504e78fe6b337e50e7dc17d4 (commit) via 9c0c41b80fa0f7f7316115fd2228eec57dde5814 (commit) via 2596adf51485f1d996e1e084e6f63dbe68b582a3 (commit) via 545a65fc7064c13deda58fb86b1863365c318500 (commit) via 84c37a0fa947f1a81eef5aff225ecdf73ad3387c (commit) via b95ccd3db6eeb7358a877541747e06354429acdd (commit) via 9a46e749c6da2d4a4aef7337ab8247b0cd0c2be9 (commit) via 8e826373dcbe52eca0036deab60b4fb83917e237 (commit) via ae02d6ca65ef5f484258c8ce4d477a06151713b6 (commit) via 716b3335f9e3003dcb2d79404c91b21551c2077b (commit) via 01ec93bbfffe740b1a12213ac201c89dd9f2ef71 (commit) via 7c458a44a785ab664f2f92ed14845fa8ece6e0ec (commit) via bbdc120cdca0ceb37cb20baa6e85796733083221 (commit) via c3c110cb114012c22796eb96f17facb3c1f021b8 (commit) via fdae7a0f9b597289579463c5464877c307d9c318 (commit) via e98c15a9d2ee9d1dd21e3d6c3d9829581d8328c0 (commit) via 1f4a5f79557186df79c2091dcc73b6e783c95f74 (commit) via 6c4ecdb73aa869e4733b9b323d9dc4c625a63e58 (commit) via 6be7adab1a16a62e871bc4ed4f3c926645b2ecd0 (commit) via f7e4949e65f29f043115df1a171e0e49a4830ef6 (commit) via 984686b0763495c6dd97d2094f292fc7e01937d0 (commit) via e678e44fe99ada59b80097f97e22b0546bcdadc8 (commit) via 27480d82bd93a881ae683a3c314c11042a68ce29 (commit) via fbcf3e60c699c5f450fd6a4e7a5c78980b3512c5 (commit) via 4a6bae575eb67aa5a484d70d765f6283ea76c183 (commit) via b63e52ee345ae1d69435deded1391167d311bff3 (commit) via 9cb360c18f3948c14bb902351a0ace971479c336 (commit) via 99300f9db4c368e7519c52af93c93d702790b2b4 (commit) via 9ea61da809269644ac6332a1b0f53be68a7e26d7 (commit) via 91b127d61530bcf0e8c5399b3d4117ef2389ca12 (commit) via b122176ee59494dd957f0f5ff41d4b55a1477e13 (commit) via 22193a06524fa8dc43dfd106cf7eab46745b86f4 (commit) via 6582992616b1d95844d41ba93aeb0bb6c7dd6bd7 (commit) via 5911355121d94a192c9336b036cebb3734a78db2 (commit) via d48d55d846c3e711c2632a66db485f9079a768cf (commit) via 3c2b4804a2c3bca57febe2aea8a56b586c44f035 (commit) via a4767f0cbe844cd7f61f43557f0f90eaa2969192 (commit) via 7915f861ea56bbb0f5a0c22d93a7b4ff6b3c76e2 (commit) via 741bdb906e946d22194ab5676c9ea06e3debb2a1 (commit) via ac8b5f2a26edfa6249e134572a151dbd36c8dce6 (commit) via 89b0cbaa9cf4b8d6e93258f4dc2fd5084f3287b3 (commit) via f4e4b30454d6d961d0401717a11c6da06a889a7b (commit) via beb496bad99c91f639ea0aefaed7d4d30ec1368c (commit) via 3f069804f73c39e3bf98a998bbccd169f6c948f7 (commit) via 9836cf55fa6a5177f95fed5f10c01af0254303ce (commit) via a841f6b5448b4190230047dc7307f80ff77d01f5 (commit) via 3ce9d6ab16d064b0f83508e2f0b2e476d64b15e1 (commit) via d7ec85bbba32e9747307bd1cd76a061a39e7c731 (commit) via a001621520f769f835ce963d1e7ef8c1af74ad66 (commit) via 33afa2d1d4f6df342214dd9d9e4aab4433da3d7d (commit) via 29e5037571610ee49830dd64a43a47a8ccbadb87 (commit) via 988ae5930a9db1ceb88e46a84a116e67b0108307 (commit) via 5a4502fc6bc53e6503169da3028f456b64811a0b (commit) via ccb6eb85729ad0657b5c852cb2a6ddb519d60898 (commit) via f3b6be23045a924b8d8034a9a490b4fe5928684e (commit) via d4ad3409a51f94df403e0ae27e25baab2b0a1bf4 (commit) via 2bbecec83bc1d8ca1b45f98214d2dbbe13950e25 (commit) via db250be8b7363b24708ebc9476aa26fe1754d3c0 (commit) via 39730f7e46405a44abee01532547fed530c6f906 (commit) via 2c92ee7ef4198ba7b7ab67cf079c2262e70414d2 (commit) via d35f27a2c613e5fa66a6d854b662b435f0e4f402 (commit) via db2587a9a5ade3e9ad3f4e3355db2d4639e100b0 (commit) via 0f628d448a0055cfff6ea759790c60520bbff6b8 (commit) via 42e8e9ac8bf029fb94c4b0d79dba115ba7450958 (commit) via 8d3786410c269d5e9838bacb9dd0a4b0524824ef (commit) via be3696f3617fb05bf55347a724e422814b1be19b (commit) via e3f0ac3bb039d95af55176828539ebfd2697f932 (commit) via ffee6ee63f437bab54151da5f31d54385c3247af (commit) via 22e7c58bf12540c95168f079f6b39375c96f6e94 (commit) via aa698a07e99416663b9b829926efefde1c4e0abb (commit) via 34ba6c32491c9b18f78f49855d76c5e60555dd6e (commit) via 0c8009e48f6bcb254ba06a85e9226d1a0459a36e (commit) via d70c5f1ce3e98c3a7409312ccfdc3ce0087a2d49 (commit) via 47932d20fdf72f73e5de4961569fda760200edc6 (commit) via 585af294de9194f2e5e0bd53b4d5e12eba8ba1ba (commit) via 9fd7bf5ec2096b65248d9be983130396de1c32eb (commit) via 539b6fb552d171d202880c3f5ee6e7ca509db98a (commit) via faa8498d122fcce6321140d9f1c062ebc2bc3d79 (commit) via 94bcafaaccc3aba545cc112da8ff9fd828a25a98 (commit) via 84d5cf917d301d91246f013c3e51da35fa26b903 (commit) via 0689cde60fa90e5ddd24d07fec08ea95251d6db5 (commit) via a8ce5f13b5cbf1583fef04d687cef94d18357520 (commit) via e93535eed4262b76597c193a169fbc94fd91bb25 (commit) via b4b6cdaa390cef0e5a42e6c8fc0f605d7879bee5 (commit) via 96ad2312bfc2d1d0d1d23e61113da55d31b7fbc1 (commit) via 55f928652f0b6accc8ba82fc68eeaebb2fd1426d (commit) via 3c5a55ba323f36a255615983afdb21b17f8b1597 (commit) via 3dc3b1fbfb71b0c81e6ce047f48f51d4e13e81dc (commit) via 4cbcb2d11673fdde483753db67343018aa09e3ad (commit) via 14156f2feae2aa5a2835cf6ff0a3b4a2d7dae4df (commit) via 5399f2f78624599910c574e3c7247378118a8af4 (commit) via cd2dfa966f8c08c99feda2d0622ecc27c0361245 (commit) via f831c691a20ca2d0ffbbf707f43eee7600bca6b6 (commit) via e1883c9e050a5cc3ad838c02f943113f3b1e2383 (commit) via 627c9f51e2de51c3bb20f59161ac8ea1b6c2703f (commit) via edf998617f1744a9a92ed0ebb4905149f5731ed5 (commit) via bece10957f7d85107a71662e308dba8fc1d6c578 (commit) via 08d0c1658cd13bb174cc9c01f132bc98d004efa7 (commit) via 60feb6af342d581f798308563b975974986d9a3c (commit) via 503bc79ee960ea4caa72d639cbc5a42c7524a790 (commit) via cfeb9fa2519ede1f34e3a814079a62095f23e64e (commit) via bd9ab1c7a6ba3ecf4532e36b7d431a6c2df2c72b (commit) via 4d2c80472c0623b406f25c07fcca42849f41d847 (commit) via 3d10b69994b9a4629ae5858c4f13b8fc73137fc3 (commit) via 96874082fe02560068588af59817fa2152982638 (commit) via ad317cdf97c0f19d27bca380d06617937a0e548d (commit) via 7f1ea3704569c50a48f1029c0bd8f3f0bf84f43e (commit) via c99bed8f3a710d25d824cdcb1d109f974650906d (commit) via cd46d6263073efb18c69a621d9cc6c50da76359d (commit) via 3768a6331899a4b17dcd89ec82b0295fb1ef667a (commit) via 6a7c5313178504d4c0d211de231c52b795e26c5f (commit) via c9528e9576a391ee865f7efb3df5fb9a69602c40 (commit) via 77ff03881d844a9d6a4bc773086bd8aaecace541 (commit) via 53b114eac3815099760186f90b64a201d7fac69b (commit) via 1bb6291e4e9050d476fefb02f11024898847e2b7 (commit) via 5e064cd9fa626b8fe7cc6d695b5bbf5065e0e54e (commit) via e3cef11dd0161d49dddc09d8e6263722825953f7 (commit) via 520c170d758f2d37554631bf1467ec50e027cd3e (commit) via f73cd6de167b16bae0256fee65c77d11ee18699e (commit) via 1e2435a49ca5380143546f33aebc32e0b935bc54 (commit) via 2237981c5e20dd4efb2e181ad59785e6f9f099bb (commit) via 6c0942658b564835e200def502c053f63d55c400 (commit) via 4b06ab1aadb653958dd49b62899929e2720b5c9f (commit) via ea2c187b7ba3ca3b9e21624b139c871c2bd8f11c (commit) via fdcaa6d73a4c577ea92d69d95d851c1b2de86c61 (commit) via fac80a8a4b26b863a85266cd62fb07a5e2cd84e4 (commit) via 13171a0c3f83e905a99250fdfca925231dcaa7e2 (commit) via 4b5776e8e8bbec6340392af74b7ee7a18c191b52 (commit) via 76b9155ed01abcd3287b659d35b9217f77b81cc2 (commit) via d59a6b8a1b049ab3e978accbd420eb25993a5997 (commit) via 8609d2eba06d8e964daff5cb8ecb81bb802ea585 (commit) via cd793bfd9667e25db7cb1dbd9c276374e0ee879b (commit) via 09188114d855456920113c8d6889c5c1e2451d75 (commit) via 8296d0e9a91e2a435ec780052e22095563dfbf12 (commit) via d831814b8d0a1d7817f014aae91031dafd1ceeb6 (commit) via ee5d0385064f4bacb511cfd497abcd014930ffaa (commit) via 5d44e562a5c0c1252dbfd11b49c87084767da2e2 (commit) via 634b380b63de53c65b92c214d91aaf03785d69db (commit) via b1749baf2590f402ba3cbd23385b9056c99f3839 (commit) via a37fda78cb7c7d4804c0d9ae1c67801977ce1de5 (commit) via 0fe531c4ec9d49f562f91056eab29f81b98f63f6 (commit) via 8bd76909bea5d4d3a7917d00269a493628c96d5e (commit) via 4c23114ed39db175beaa317f63b782fad02b2c6f (commit) via 88fd84e7e613ce93fc078320b312d2aa8c388a8c (commit) via 2503425036ca2ee48003ef20fcb87003e5d1e956 (commit) via 49ebafae0edebbc750742d8874ad0a7588286dea (commit) via 0e62cd70d258fd5b7caea6f43f026f4659d39390 (commit) via 818129881b9a83cfc2551effb60919f4f9be01d4 (commit) via fff8ec28ee93217492ac6fa34e43c5552f7b7e15 (commit) via dffefdb3b1bf7e8ac5c7b402ae7e839e1b41dad2 (commit) via 4e4dc3e4f331314f23eac818143cc82a4244b796 (commit) via de56e68c3d3b9206c105c2e3018294363ab2cd42 (commit) via 7270611af0c37dcb431d772e0ab1aaac58e5236c (commit) via be604963afff4ff3c9d3eff167c43e5dd3cd37f1 (commit) via 8b3bf1783f1feb8769878e10c34d4767eca3afd5 (commit) via 4e283f819b10df4a0dd8dd7a7ccb9c7c8747d9d6 (commit) via 7c10aec5077c5acdf0169af664aa0a17a490ad8b (commit) via 35f6dbf2eb39ffb8c497983566925d642c23079a (commit) via 0c65d440d34974b7bde20d7d7bbca2c9ef9c98ae (commit) via c82a1ccd1c7bf8c734d350de467559900c476bc1 (commit) via 16bf7fb7a31206b3548b9e3dcfe407dd16ddca1a (commit) via bcda7bc8eb9f8654e87197581cba58dbeffe43de (commit) via c714404d01fd74dbfb524cbb487f24321659dba7 (commit) via 209922afc188329f8ed7576c3a838875496f5df1 (commit) via 97c6a2af4436684eca9cc6bb40fa21d0c09298b5 (commit) via c2bb5dbaae47c2ac48fa0462459d8333afc79ba7 (commit) via 6db9c2295f0257cde59e13da7af791be780f7878 (commit) via 4d12b321aaf08b44e19a5ec025ba246471933454 (commit) via dabd1ea4a14d52156f5f4ffcb1f04a0db6b18976 (commit) via 42bc2b39d470a0c737f445f178737f1bcbbb0c2c (commit) via 294adda76f482498f35b8a69e7f7958fb0dcbc9b (commit) via 5c186339be9301e258f5fea7b8bab660540a8baf (commit) via ca75ed66bb693cb9990022355cb57d00e086e9a0 (commit) via c93a573288b75f4d514a4051be28f05060ebbae9 (commit) via b65bae91b7451102b2c3b8e79412887e24801f36 (commit) via a8e5f4e9f4565ba8527aa175a35f424eaa6c9141 (commit) via 6d8f0b61fc7e12e2de314d8fd23096d909fe3a35 (commit) via 99183cf318a3ae5486db92f2cd570ef0259119a2 (commit) via 9531b4a10640e32c432ddd3ae3be5005f2b87b2b (commit) via 39cbe8bd3cf8789caacf2579f74f081f70a05c69 (commit) via 2cf09b42f93c77210a8edc9a7e1607b491e7e176 (commit) via fb536bdf830231860062a3e5f2c4155f225009c9 (commit) via 2d09e90e4475d98da2a465eb7184eb887e67a419 (commit) via c441e8533af2ab0db05229bf3ecdc7887a78ef87 (commit) via 538a3db2f1062b7fa9b9dd79db46433f7d031e94 (commit) via 33c27fe26b72ee1f4d545f6cce2384c05acba3b2 (commit) via e388657fadbd8840bb674ad2d88a8a4b3bd60609 (commit) via d72a93af55e15af4d75e2269f99403ce331bd288 (commit) via 7db70a7e350617fac989c565d22fc834353b0668 (commit) via b041ee919ad847ca3bab74418a32b419465729fa (commit) via f620eecbba931ee236839897d172eb741a779ca9 (commit) via fac529df6f6afada02670a711879c093612cf012 (commit) via 9b062f2cecb2f9a99b35a10c024840a1cb16bd83 (commit) via 700b934a6b2f0f388fb75612edb46f86ed6c7de5 (commit) via 9f6467880e3d9dea79889f8e57e6f2d11c22e059 (commit) via bc4174b04d46c3c7da6634c106154971dbbd9b38 (commit) via 87d92f03e7b24fd80de0438a9ae4b84afd526e87 (commit) via 84951a4e29650344e5bb7258c5976011416c8e83 (commit) via 50d09b872d62302c88f5745c47cb92405f9cf6d4 (commit) via fb80eb7d5daf322e5646d0fcdf1217563b913d6f (commit) via dbb1e310c824593e479bba0831e7a405d3e6f6e9 (commit) via b159a9a38f366464f7ea8195009d4dcc9da97ea3 (commit) via 8624e3e500b80a1f139460dfa4a59da258c24f7f (commit) via e1d708f9c17d1754daaa0a653b66d4b005e36988 (commit) via ae4515e6456ba569ae6bdda7f58ef28908abd8bb (commit) via 2db592a0bbbe5ba3d18205897b7f7cdc8b896b02 (commit) via 1af98e5850d1762e3d69123ee20bc3169f1a8c92 (commit) via f43d6e36990869225c51d85c8aa9bca5c94c6945 (commit) via 3858a6cae919ee96f6cf527fb4cedc0aa9dc479f (commit) via f02a50f41ca0e9cf6124bec087263a987329c101 (commit) via 3db812914c6ac18de4d776c7c9b1b03a238eba8a (commit) via 91271377c79d15d8e60453a7dee2476eca535709 (commit) via 9e3484aa5bceeabbad0d53acc4b17ef7449df8a3 (commit) via 2fb70ec74047ef82af22e7af222aa43ca3e0240c (commit) via a6f482bbebf372ceee7a073c94127f6e2631be04 (commit) via fe3ed7ccc4b618163b62d03c0fbc6d904f01999e (commit) via ce7921e4ee7391c20e4b762756a1a4ebc56c4fa4 (commit) via 9b093d8245821662fcd57f77ac1046b0d096ad46 (commit) via 76a066bda45519dab18d10e6cced04ce455672cc (commit) via 30f549ee9e8a2425c7f94282397c8b8f0932e91e (commit) via f0e205b65731ba269977cf7cb335a8693ae7de88 (commit) via 28ece4769e57ec9283d22db5e4181dfd8fea0ae8 (commit) via e3b53ffa66a3482298a7662c32068218e761f9a6 (commit) via 0951c9e658035be064c50a3793c6d681db92acb3 (commit) via 83602ddb9b41d79119dc68aa229ead5aa09fec4e (commit) via c203135a9fbe3a65347432e1a5758825bd83b91b (commit) via 82f89a2866eca60db7ad6f02cba358f308f421db (commit) via 9c6c0e2a934dbb1b6213236ba7993453a3ab010f (commit) via 65e56fb8a19051557d777b9c63647d1cdfff7e2c (commit) via 766233eb31169fdb0f9befe7bf0686cd1a4ec770 (commit) via e04743159a34818bea16ae5cf7fe6c490c77ebb8 (commit) via 96a21df1ba01ce775b754f791770050796dc9d8e (commit) via 4330bf15d9074f12cca6bde89e7cbbb9d53c4186 (commit) via 4760421bca7e022ff72854fed029216aafaf8136 (commit) via 424a86c940df70b00b74af8baddda831c0d2a320 (commit) via e74be68dac7f77c112c37f2a19b5aba5eb72516e (commit) via 999cbfb7878cc88ec0612958db5d213874f72a0e (commit) via 362f275e33c0486653aaabc474e123dd5c0e5586 (commit) via ea404c1892f58a753199d5f8b54084db5d67d570 (commit) via d3f61fe721ba26adf596ab52696d37809727fe9d (commit) via ca3820fd802d3edbb8a46383d039dd1d0b1d1f6d (commit) via 197a7f05b21ee9c2071f657ece032f57822afd77 (commit) via 986f103e38f4be7f54fdbe85c54618437629301d (commit) via 6fe2ad138d85c36c1b76ffe3ce6690c815b78341 (commit) via 3d504f54fa19a3037ae9b441b74ed4188a959921 (commit) via 9a8f2f65248ecac1629d7bb7827c3d9bb9ade9bc (commit) via 9096e0d49310749f63c29dda2c4530ff9e3e93e8 (commit) via da68724697c1a11b2a352f29cbeeb98a20511ea5 (commit) via 90105d86a883b06bb8b72f8bc0f3a145fb8842de (commit) via b6ac7022bcc2d1acb886109015ac41ada725038e (commit) via 1fbac51168ef9f46a5a9ca062122848c21234856 (commit) via 4fe8cc16bd453c47247ad89eb8c2679f14f456a9 (commit) via 96bba0c6eb7b712122049307873153bb24816be6 (commit) via 5ad45a67a5f68f0c805ee937a4f40573458928db (commit) via ad71c32dbb378adc15418bbad753d4d537fecb02 (commit) via 8fa327a86f51f97a19c38ffdce137d4557729572 (commit) via e151c23ab096f4428ec275a90a9d7b5ec6a9c391 (commit) via 2703fccc5e6101bcb4d7bfee0eb2a63ee90a0466 (commit) via 6cfea6b326cb06255f23b34be925b6c40e100a71 (commit) via e26a15c3123c3e9962db593cc65d7cf625c0a268 (commit) via 98014a53753e8dd6df9709b70a053a992e267507 (commit) via 01ca8a43a28b76befa2f8e792d8dd5d6b29f10bb (commit) via a7b3fbd7cd6dbfab9e1d677d1b81052d895e9415 (commit) via ff2f1849d06e759b549c00c2d8458f3f792e5ba5 (commit) via 413bb9a108aff69e88fb37c30e29843db6e3aa07 (commit) via 82280dc2d18734ae026390adbe32ad6f5a51f87a (commit) via 14d4252ae15316c29285369d7512da1e8a0b83be (commit) via 94958105863e833243fd8ca708aefb78d1ddd569 (commit) via ef3cdb9685503d407c181323e62134c66957987b (commit) via 5cfc0497f23b97622f90972442cee2b9d373382f (commit) via c8f6bc2cf7ffda2ecafce9f91403394ef7e5b857 (commit) via 1a19f6e74f95796243ae08607d4212857c45d5bd (commit) via 536d5bc32dc634b4069bf66b9f1bcf8b09b48483 (commit) via 281fc66b246707ed808f3d2248458c6a49a907e6 (commit) via deff2b9d387869657b0f43fe16cd846a5414d587 (commit) via da7dd623bb7fe35cb1e56cc4ea77ba16e96a844a (commit) via 09a290fe85764378e036bfdbbf620b4028e42137 (commit) via 9b9e3e2122ffb4ae43c6793c77bb947f775c124e (commit) via 0a35cfafa7553fbf06ebfec52591a7374596b30d (commit) via bdcea409b3bd6618ef90021462b7635a76c44e7e (commit) via d3fa57f28af14cef166882707c9e442cc7d5fbdd (commit) via ebe1dae396dd674d61e299bf0668a260368e8bd2 (commit) via 7f92fe1b0fc6256b9b9fd43216f4b42286dd1ae3 (commit) via cd3e488ab624ee7b89b2410f71485b2522f633b0 (commit) via a04031a1813691fac3b60b6ea78bd121918b40aa (commit) via bc8f3afd80be00ceebed883b93226e3e80cfb6f5 (commit) via e5ebc5d2fef1d2d28fac9ce4cf2e2afd3323d55c (commit) via 7293df2fba9245b01e4b5621bc6349eba99fcace (commit) via 884d0078fa0ade33733847ab621fbc33873ccdbc (commit) via 8d95e56faacf77db7a155ec1982ffd1652e480e0 (commit) via 435d105ecef6610c3f8fe9ab7209e05a627a4ec8 (commit) via 115ff722755cbe893a9a3681beeb8e885da02829 (commit) via 5abc8c9534b8a0fa6cc6c8da360d7e1a85634165 (commit) via 44b81ffa802eeac296616a025947d60a36d6b027 (commit) via ecfb87017bef0b26e93f1bace026cf48446923ab (commit) via 539a905ddc94fba661da0b70f733927365ef8b49 (commit) via ef4de71a554a4199a2189c44244dc31dee4a6cfc (commit) via 74a1f7e8f9a45e12b3db2fe78e38582d8a9dc97b (commit) via 023dc1907622ff9bd2c62fbc01fb7de658d8ddf3 (commit) via b35e2e7c543b9db958c72cedba9ed294c2ae7810 (commit) via 4fe49b7f3b8e26cae19d7d18b4ca34c1727b4dbb (commit) via 47c69bf74db7db943a905db53fa6f2a9e418314c (commit) via 932abadf6842106590c5c7f4ffe1594cbde720c1 (commit) via 98fa07f85f736027a8cc5768b5ce5835b97b4570 (commit) via d5542bd04f25525334311bdac08f6dd4e613a404 (commit) via 9f5ac67b1aa3d0239332ad7e7de410c4e9412492 (commit) via 4ed1ca5d9b48914dea07ed657dce9a77115d6d87 (commit) via 8ed1480f077821fcd0eb1716d5ca5e3f9eb93dcc (commit) via ab6aaa6e8bf50430b4d4a4a674751f110631fbf4 (commit) via 9e4c797a41fd7ed3b11f5e49b6d88933675ea4c8 (commit) via 08dc9d2008fa31418d4e8b53b8d4b32c18630256 (commit) via b742308f29903a494870840085e4a32ba7c6980b (commit) via 69de1a1603356f790de61c7beda2f9b0a1f8db94 (commit) via ba16f1b6085222c9a4f179031e66c2a5eb7204dd (commit) via 21f60ee8bb59c5dbf78befb83df3c33c5b5baa70 (commit) via 9754556ea86a2d3450fedf367d20924d6cca2215 (commit) via 3233e078003eb124250d6b9f5fd4138a50870ec6 (commit) via 4e876bca6624bf36d39e7e6bd93fd23c95aca12c (commit) via 6b7ce30b12ceb15cbbd97f0533e1e39cd76a8737 (commit) via 12f8d0b9b1d30668323e54882956d7e8ae914bc1 (commit) via 8192001c1c52a5721cf049b350a5091e17600c7b (commit) via 0c02ce4f2c9a40faf4318d38b5ea255628bc7074 (commit) via 950200107ec8661dc5675eb9c523bbe91aa2db46 (commit) via 03d79c56cd03f53e1581088b1424ca2f99928350 (commit) via c952f9f2ba0710c2c3204a35205d9f84a853b4c6 (commit) via 892b932e0c47d4c17c91c0c75b57b9d1ba08666c (commit) via 2792cbb20255d567ce525337c7144ceb3b2ac619 (commit) via ab5dd0def3d6b3b710a6ffa0fdc596cab2484736 (commit) via aa03ee5d9f6521072e163fb146105d088fa6738d (commit) via ecbdfec22efbcd516f383a9b6e69d07913f4040e (commit) via b9295d11b3616ba9ed579ce90da67851d65e0374 (commit) via 7f3f8cfc9fa2b9184135ad38c8ca3bc11cb0b3cd (commit) via 56432c4402d369a1ac5f7543e0066f084c6e5fb8 (commit) via fafd3bbc4539b97ff2beb27ec477a545b3301c55 (commit) via f68996fa18fea82642688f360aaa214e22975ac2 (commit) via 1487af649635433427867c5faa44c1c470675733 (commit) via 181b03913c93ff363f374871083a0d00f027dcb5 (commit) via cd764e15c2712c7d440529bc4a7a8b2791a99614 (commit) via d35c7a52dd1f2340b64c799c9280b3c8991d704c (commit) via 3cfe54f6b46cc27f5fc986a9ac125221ded8cc39 (commit) via b71637ebb55b2c3025bbdaec4c8851df85663976 (commit) via 9764134a7ab4d43d847e032b567c92ee5741efc9 (commit) via a57744162fc659eef5d5d34b58ac31aa010dc0cb (commit) via 7dfd88da00d0430580ca372d4ef93fa607b34c5c (commit) via ef7d5719af375c7a571995a6e5c3530dbd7b4d18 (commit) via 0d2b97a3dcd9748f9d46c591b3971f4654362c79 (commit) via 3b97253899e71243962989f11aaaf7a738dfefbf (commit) via 38f4f323da8192474418fe819399c9df21ea233c (commit) via 5267db6c37390456fa10fa61e732ed87468d5e7c (commit) via 70304d2ce7f3bec9d632298d98beb029b6428680 (commit) via 4cb508a8f7d7f868b58488e01f6281e7b7728c5c (commit) via e6175e64d3307f55aa10f8eba4950a643938e338 (commit) via b3aa07b59eeeadb318b932f911ae32379683dbd6 (commit) via 873c3ac262c93026c76dcba9016985cc19eaf694 (commit) via 518f5ccef90a4a1dca81589da222b75429c1bbd4 (commit) via 93d5c935fe8b7b64fe6f6018ca5080b7722be7dc (commit) via 78edc4c9425a8f79e76f38f5fabbdbd55d0438d8 (commit) via 0fb31f8e9a7fbfe9ed0977589f4c7f1ab1ff0f47 (commit) via c4c540e374ac18cda622f970f47664ff1e83aba9 (commit) via cff3e6cf290cdcc79e777ed27ee3a034f8fe2900 (commit) via 34bdbfe3d8c87f87a2da2078376fc47bf89e21fc (commit) via 32953251dbeb570a5c8797913d0b590c581d9ac9 (commit) via b6d8f2ae7f701aec08834067f4c553ff9b13cbec (commit) via 95e770e2c463724a500bfc0615d2cc63f625e3a5 (commit) via 99f8355d30b17e017138fde66aa0eb34872e65c2 (commit) via 1a4828a94afca2b6e077f83e9e7bca06a200586e (commit) via 7b9a80439b5dae3919269c7c47a010faacc11c72 (commit) via cbb6ff4116e9d47de0e1dee0b34d9af3e182efff (commit) via 25447a8b0fb509a1b853fc13aad29ca83de3a272 (commit) via 956c049a9f8735d3d6227e1d758f17da0186f192 (commit) via 02c9efe968d8f8b7da50561adc24d1e05019f596 (commit) via 40e85bc5b7bd77062a1c3d629c577a4e4e2ae4c5 (commit) via d95e91d3ec45dc3cfc4e25507ce1336d25ce5cc5 (commit) via bfc3069651c55bc31318f49e387d6fea61cf5a08 (commit) via 583adaf0ca462c3013f2ff5e5e22215444a28134 (commit) via 45bda762fdb43884aecde48cf9a383543da4b565 (commit) via d8e18da1b8d6f932c7649c535200e6684907258f (commit) via fb721ee8a241830ad2384cabae6559b90f0bddc4 (commit) via fe537d494813efcbf41b2e7be8849c186efe97fa (commit) via 00e97b43a6450e483f5775d92fe2288cb6805530 (commit) via 9573acb3da062bb0251c752c3790d4016b763342 (commit) via 30030780e347248eb6bbf9710829d9d711cc28c9 (commit) via 0023723a37fdb2dd5bbb526f4abb18dd706f27f3 (commit) via f422878461784abeddbc142cd0e7b307d771f5ca (commit) via 2ca10a68a2f150724dea690a6b9cd52a01156a2f (commit) via 5fa8ce3861acb807bd3a6b3a4eff1b7fe102c16f (commit) via c45d8a887666f1fabe73859723fc24188c3bce14 (commit) via 0c31364968b9c615d668388682e666806bcd2dd6 (commit) via a781cc2773b10264d82eecba65150fd01fb1ace9 (commit) via 7b9d96d6fba4edf68ba7ed80b240345b02757b57 (commit) via 5ad75e12050feffb6c473944fba3b84a44cce6ee (commit) via 2b991ab104173e9d1fbe82ef0591e5f5a0ecf4f1 (commit) via dffee30626e777af2fdd65bb509c1994e8db6a7b (commit) via ce14976cfca5da561ea447a3bf20f7311db08828 (commit) via 3ef84c7b7f99d5e0e7438b96c57593e813da8161 (commit) via e884f6db879d8c2c208892728580da13a73f1ecd (commit) via 96e9605bac4b68e51a5edb956547440484bbc550 (commit) via c1062fff5a358b13e9434dcd9ef0252c9c983a40 (commit) via 19193d629c85602e4d8c0b29897462b4223934de (commit) via 81ed733db4cafba894785ffe6c7aa4568b64ed91 (commit) via ecdb9238f6face4f97067d37127352786eb8df2a (commit) via c642dc8f9b311209d50ae4f1963c88d2cf6c05b1 (commit) via 5816a0be2141187d50c5c865b3754ba52718f607 (commit) via d78ccf9058f81ea838d1c6af9e9d69bf0c80efb1 (commit) via d52ad54660d0a07d32418f1e3374d8a62d0fefad (commit) via c087b86656e95dd3d760af165cb66464f7f5a466 (commit) via e9d60da192588bbd041230b1431030ca19a18959 (commit) via 9cb761fe020b76dbdd7acbcc541f6f1c0d8d90d7 (commit) via 250a492789120f128cb3004a8dacfb7b9d1cf99c (commit) via 342c869a157bcd7ef655b12b96e8b5fc20fea839 (commit) via 59c8dc22f2d216aabe0de7e591b75cc35d5bf842 (commit) via ed299d6b54c89e5535e6b2ac52e3a0e87aeebf6a (commit) via 483de1f3cd4a7f0197e17c3c2387696a742274cd (commit) via 41624953a37f20b2c08c479e710f52a86e829f61 (commit) via ce2122df54a67451741cb7f459278174e079276f (commit) via 08fcfc4a4770e6e9118a324762034e8f2c95abf7 (commit) via 5e07b9615e2d999c7a6b4825a8c556cf52a67d59 (commit) via 60557ade7d0f60ea2f7ffd7b3a30eb9b3d9521b2 (commit) via cf597d834e1334ad732c4584455d0a43a8346964 (commit) via db101b0ff8ce728984736fdce70edb2c6cbc5cc0 (commit) via 5e1170eb07b5b097efbeef42ec4ebc92ef21b09c (commit) via 430aca1f52ef19747a9cbbdc9fd6a19034bc899d (commit) via aae51fd0f29d5746f2aa6153bfd0b571aed14369 (commit) via 91be2c86b3f00891ffac173d1a39d86038d1eb9c (commit) via 4caae92593e353802b8894959fe658c09763eaf8 (commit) via 4bf15b16e4fe26ff397e8c8d12d068cc289337d6 (commit) via 096b11e8693a6dd7e681e8b21fb8ba46a1712e54 (commit) via 0ff9ae964f0d249afd566f33a104afdcb704bd77 (commit) via a22d4f28052264dab9e1485aaef5f6e9a420a682 (commit) via 2f89dc63b509228d354737e0f15fc740945508fc (commit) via 0fde7618654c49cedf78ea2ee119fe032d9f77ca (commit) via 98e397a5c1b3ab42801861d847c8053b89113f6e (commit) via 712796ca0c2a5bc32621de80ae6a9fe9cecd0d92 (commit) via 4f2ebb270c30a46c97355da84587a2220281798c (commit) via 1f2bfb175ea39f6a358bb40d92efd21f709f1dd8 (commit) via 62f4a34301f57a39e4bdacab4b45f29596b76ede (commit) via dccf4d8fcba4f912d4844b6d4a30f045b1e12651 (commit) via cd289985b5247fe9f1d1f58753717bd5659bd7d0 (commit) via 38fb73d6ed79d649fdec726ca4bacc93747daa9b (commit) via 5b915893c793ffb3d49152d480d084dba32a5a74 (commit) via f1449d2555fbfa3d72aeb79d3ad6d2f199e83731 (commit) via 5d6aea3f7186a4533ffb7a2bc4858a1d339ebbb4 (commit) via 260ca880b76151b66919cf0f3c149c2ba9ede24e (commit) via 4c4052f894b8df5784d2aae2e36b96796ee020fd (commit) via 9e388b884efed8d653cf453f6516f34019d02305 (commit) via 11da2d3bc8871379321048a5e951e142aa594b9d (commit) via 192693591500302fd5232eee92144dba204abaaf (commit) via 75f0096e1af7eca556e9f1c896f7cc34cc325edc (commit) via 3c02836d9d9ca16b1277bdd30e523779b9fe8374 (commit) via bb003e11ae7bfacc1fb1e9b8276dd49a32a31b4e (commit) via b5dfcef4586e0a1618c202aaeb7e863c17cc4d06 (commit) via 6b5cdc77eb9759a2349b10372a964648559bc92c (commit) via bb0ec2f991bc5b295928e87c8b9bc0efb92479d3 (commit) via ffcd7991e44109464fb8a71f9ee10546ea5b84b0 (commit) via 6881620135a179911a5839d4be97423a8d80e5ab (commit) via e118bc6c2084c306968cb5d947649eca4a8029ba (commit) via f55bd7c695d142cfb2306b5f156bc401ba11473b (commit) via 6e09adf147ad3ccb4df1cc988d20d31c3246d2aa (commit) via 1b285bbdd1abbec9853e1bc51bdb6ee02643b1a7 (commit) via 37b4da286aeff3321084e62045d0b3ab10c07399 (commit) via e02d9f43ea8675db5ad5202ef605e6dd8014abb5 (commit) via 442638dd1514f8dda882d48fbb1ebc88ef9af430 (commit) via c6573eb58dcf0d0316ada1e91ae1993100c4d559 (commit) via aab8ff7237c117e9ed63a8b7d595aca7f5665ff9 (commit) via c15a810b7a47f2e07200f83aa534163ca06e2b16 (commit) via aef79483e3d3e517b4cf2d71b3c22985326532c0 (commit) via f49d7bad7316ed0be807f37984908fc37da68004 (commit) via 811281a22b6274b7f41b926a9cfbe09e48a366bd (commit) via 5329e5211c447b9b823149baf76112eedfeb07fb (commit) via ce058b8fdde37cc302bcf589f458dab7b8d3e365 (commit) via 5d6a9f036cdeeb79215328a63b2dc63962e292a0 (commit) via 4459e1bd35534dd1b6a313890c74086c0e86c617 (commit) via 163f57de92d66336433cf5638538828e10053655 (commit) via fe1f56c168423800534b85d61f319d1dc327b49b (commit) via 9163719bd4c04321592dad9da7f26539f49c8b7a (commit) via 7e9004e87bab2eacd82d449286a84ae7a8cb75ab (commit) via d593398b2d55faf1e07f124a4c807c006eb856ea (commit) via 4af5396e77ff170c80ec3720028493ed2c9f4826 (commit) via fc020907bee7ec2ba976bc02399f6fd47f110d65 (commit) via f4d6c91588b414fcb70abcc83941e8e4c1cd2f5e (commit) via 2cfe11680ecc2186339183e94f291ce586740f8b (commit) via bb6abbb8a5a8f92a7b18c7c2b3336be1ef264e11 (commit) via 45d422099d86461c48871879e0f7abbf37acfd5c (commit) via 614161c1a440d13d866975dc13df13cde2e8b3f3 (commit) via 279621af7fd8bf2b84b16acce85ff5bf040e7771 (commit) via 29195afb96cd539e4d4a94bd3d64336acf34bcaa (commit) via b653ea8ac54aea1a81ce9f49d4ec60f81bec2d2d (commit) via 3c8f24c52d80bd7e032ba3a1788c8dbc4d5ea0ad (commit) via 9b98d35daf7736b34e51400c6a7e32bf81537ce6 (commit) via 774b652640be4ab7147db0a337f84ce8d602b665 (commit) via 8999344484a2c3b4c08b84c5b27e2b355fa312d5 (commit) via e475a06dba8b79eace4131ea7327e87a10546351 (commit) via c5fbca288838d39f3f6434d381acb25f12c1dc9e (commit) via 22921366d8a2f9155d43f7022d645c6d364c8b58 (commit) via 0278905b45145a168f5b63afa0dbf0be30e808be (commit) via da0198f610f10c8af2c19eb4148001d1759eb401 (commit) via 6b24e0905df12ba075d86e471a48035f6c7b91ef (commit) via c8f25051021015221ec8d46cf2e06914eb8ca868 (commit) via 5f095cc66bc3fcafe8f44ed7348ef127f40c9026 (commit) via 3d6cf1de61e0b5c846317b3ffcbd0cfd07531b90 (commit) via 43d7f57b9f9f24526330c51fda8554d52414b82f (commit) via c4a8f43ff08b954d14857c5a59544f8d914205e3 (commit) via f972ef61a9693b7895cb7f85084c1c53c3b13131 (commit) via b6b667b1e95635a6ba77a19078d7d28013bcde1d (commit) via bae53291795e9c19cbfde9c0d0e11a19d9870623 (commit) via dd31792d10772c3e41519fc0b6d68cf13b0fe9d4 (commit) via 0e04be4851ecc94da8b4cac3c576260c0518c936 (commit) via d59c00c5f0255a5f1fc462332eef291bb2993f64 (commit) via 29c7a054f7151d33795a0d8d7df5594bf4fddb55 (commit) via 2dd964e170d71078cfe03d4c9e00c6f592b4326b (commit) via 449c693b2678bc29577b64fb76003bb10b86db6e (commit) via b13eba4e9b9cb814f115627addf763322fe22a76 (commit) via ea9f2aa440a653a77cbcadc2862c5af298205272 (commit) via 5e840b83992bba2f64750bb3a4599478d6ea9260 (commit) from c6440178415ef0c26ff4f9a1539fc294161d8a2d (commit)
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- commit 6f2053214cf0bd5ef2694a082cb51cb220132d2f Author: Yi He yi.he@linaro.org Date: Wed Feb 14 10:13:54 2018 +0800
linux-gen: fix typos in master merge
Fix typos while merging master into caterpillar
Signed-off-by: Yi He yi.he@linaro.org
diff --git a/example/Makefile.am b/example/Makefile.am index 5b2d4f80..2ea244cf 100644 --- a/example/Makefile.am +++ b/example/Makefile.am @@ -11,8 +11,6 @@ SUBDIRS = classifier \ switch \ time \ timer \ - traffic_mgmt \ - ddf_ifs \ - ddf_app + traffic_mgmt
noinst_HEADERS = example_debug.h diff --git a/example/m4/configure.m4 b/example/m4/configure.m4 index 891f40fb..1ce0cb11 100644 --- a/example/m4/configure.m4 +++ b/example/m4/configure.m4 @@ -21,6 +21,4 @@ AC_CONFIG_FILES([example/classifier/Makefile example/time/Makefile example/timer/Makefile example/traffic_mgmt/Makefile - example/ddf_ifs/Makefile - example/ddf_app/Makefile example/Makefile]) diff --git a/platform/linux-generic/libodp-linux.pc.in b/platform/linux-generic/libodp-linux.pc.in index 5125f83a..3784a7d4 100644 --- a/platform/linux-generic/libodp-linux.pc.in +++ b/platform/linux-generic/libodp-linux.pc.in @@ -7,5 +7,5 @@ Name: libodp-linux Description: The ODP packet processing engine Version: @PKGCONFIG_VERSION@ Libs: -L${libdir} -lodp-linux -Libs.private: @OPENSSL_STATIC_LIBS@ @DPDK_LIBS@ @PCAP_LIBS@ @PTHREAD_LIBS@ @TIMER_LIBS@ -lpthread @ATOMIC_LIBS@ +Libs.private: @OPENSSL_STATIC_LIBS@ @DPDK_LIBS@ @PCAP_LIBS@ @PTHREAD_LIBS@ @TIMER_LIBS@ -lpthread @ATOMIC_LIBS@ @LIBCONFIG_LIBS@ Cflags: -I${includedir} diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index b4a9fa36..1051b5db 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -866,7 +866,7 @@ static uint32_t dpdk_mtu_get(pktio_entry_t *pktio_entry)
static uint32_t dpdk_frame_maxlen(pktio_entry_t *pktio_entry) { - pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk; + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data;
return pkt_dpdk->mtu; } @@ -1692,9 +1692,7 @@ static int dpdk_promisc_mode_get(pktio_entry_t *pktio_entry) static int dpdk_capability(pktio_entry_t *pktio_entry, odp_pktio_capability_t *capa) { - pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; - - *capa = pkt_dpdk->capa; + *capa = pktio_entry->s.capa; return 0; }
diff --git a/platform/linux-generic/pktio/null.c b/platform/linux-generic/pktio/null.c index afee4326..67837797 100644 --- a/platform/linux-generic/pktio/null.c +++ b/platform/linux-generic/pktio/null.c @@ -194,7 +194,6 @@ static pktio_ops_module_t null_pktio_ops = { .capability = null_capability, .pktin_ts_res = NULL, .pktin_ts_from_ns = NULL, - .config = NULL, .input_queues_config = null_inqueues_config, .output_queues_config = null_outqueues_config, .link_status = NULL, diff --git a/test/validation/Makefile.am b/test/validation/Makefile.am index 17e0444b..b4970a52 100644 --- a/test/validation/Makefile.am +++ b/test/validation/Makefile.am @@ -1,4 +1,8 @@ if test_vald - SUBDIRS = api \ - drv + SUBDIRS = api +# driver tests use internal symbols from libodp-linux which are +# not available when linking with libodp-linux.so +if STATIC_APPS + SUBDIRS += drv +endif endif
commit bac8c43d569198ec5a37ff3404fb764ad633bf7b Merge: c6440178 257b08b3 Author: Yi He yi.he@linaro.org Date: Tue Feb 13 18:02:31 2018 +0800
Merge branch 'master' into caterpillar
Signed-off-by: Yi He yi.he@linaro.org
diff --cc .travis.yml index f5a67781,e36c7bcb..4c1ca767 --- a/.travis.yml +++ b/.travis.yml @@@ -40,8 -21,8 +21,9 @@@ addons - gcc - clang-3.8 - automake autoconf libtool libssl-dev graphviz mscgen + - codespell - libpcap-dev + - libconfig-dev - libnuma-dev # coverity_scan: # project: diff --cc DEPENDENCIES index 008c4df4,6f374ca9..8f76807f --- a/DEPENDENCIES +++ b/DEPENDENCIES @@@ -19,9 -19,9 +19,9 @@@ Prerequisites for building the OpenData
3. Required libraries
- Libraries currently required to link: openssl, libconfig - Libraries currently required to link: openssl, libatomic ++ Libraries currently required to link: openssl, libatomic, libconfig
-3.1 OpenSSL native compile +3.1 OpenSSL and libconf native compile
For native compilation, simply load the necessary libraries using the appropriate tool set. diff --cc Makefile.am index 0d04f98b,dab8ca8c..ff924530 --- a/Makefile.am +++ b/Makefile.am @@@ -23,8 -18,12 +23,14 @@@ SUBDIRS = test \ $(PLATFORM_TEST_DIR)
+DIST_SUBDIRS = $(SUBDIRS) + @DX_RULES@
- EXTRA_DIST = bootstrap $(DX_CONFIG) CHANGELOG config/README + EXTRA_DIST = bootstrap CHANGELOG config/README + + distcheck-hook: + if test -n "$(DX_CLEANFILES)" ; \ + then \ + $(MAKE) doxygen-doc ; \ + fi diff --cc Makefile.inc index 00000000,c887b2ee..c42f0781 mode 000000,100644..100644 --- a/Makefile.inc +++ b/Makefile.inc @@@ -1,0 -1,18 +1,20 @@@ + ODP_INCLUDES = \ + -I$(top_builddir)/include \ - -I$(top_srcdir)/include ++ -I$(top_srcdir)/include \ ++ -I$(top_srcdir)/frameworks/modular \ ++ -I$(top_srcdir)/platform/@with_platform@ + + if ODP_ABI_COMPAT + ODP_INCLUDES += \ + -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ + else + ODP_INCLUDES += \ + -I$(top_srcdir)/platform/@with_platform@/include \ + -I$(top_srcdir)/platform/@with_platform@/arch/@ARCH_DIR@ \ + -I$(top_srcdir)/platform/@with_platform@/include-abi + endif + + HELPER_INCLUDES = \ + -I$(top_srcdir)/helper/include + + LIB = $(top_builddir)/lib diff --cc configure.ac index 3f509232,7b90b212..db9481f7 --- a/configure.ac +++ b/configure.ac @@@ -93,6 -93,44 +93,43 @@@ CC_VERSION_MAJOR=$(echo $CC_VERSION | c CC_VERSION_MINOR=$(echo $CC_VERSION | cut -d'.' -f2) CC_VERSION_PATCH=$(echo $CC_VERSION | cut -d'.' -f3)
+ ########################################################################## + # Default warning setup + ########################################################################## + ODP_CFLAGS="$ODP_CFLAGS -W -Wall -Werror" + ODP_CXXFLAGS="$ODP_CXXFLAGS -W -Wall -Werror" + + ODP_CHECK_CFLAG([-Wstrict-prototypes]) + ODP_CHECK_CFLAG([-Wmissing-prototypes]) + ODP_CHECK_CFLAG([-Wmissing-declarations]) + ODP_CHECK_CFLAG([-Wold-style-definition]) + ODP_CHECK_CFLAG([-Wpointer-arith]) + ODP_CHECK_CFLAG([-Wcast-align]) + ODP_CHECK_CFLAG([-Wnested-externs]) + ODP_CHECK_CFLAG([-Wcast-qual]) + ODP_CHECK_CFLAG([-Wformat-nonliteral]) + ODP_CHECK_CFLAG([-Wformat-security]) + ODP_CHECK_CFLAG([-Wundef]) + ODP_CHECK_CFLAG([-Wwrite-strings]) + ODP_CHECK_CFLAG([-Wformat-truncation=0]) + ODP_CHECK_CFLAG([-Wformat-overflow=0]) + -ODP_CFLAGS="$ODP_CFLAGS -std=c99" + ODP_CXXFLAGS="$ODP_CXXFLAGS -std=c++11" + + # Extra flags for example to suppress certain warning types + ODP_CFLAGS="$ODP_CFLAGS $ODP_CFLAGS_EXTRA" + + ########################################################################## + # Check if compiler supports cmpxchng16 on x86-based architectures + ########################################################################## + case "${host}" in + i?86? | x86*) + if test "${CC}" != "gcc" -o ${CC_VERSION_MAJOR} -ge 5; then + ODP_CHECK_CFLAG([-mcx16]) + fi + ;; + esac + ########################################################################## # Allow valgrind suite to run against the defined tests ########################################################################## @@@ -163,43 -225,40 +225,59 @@@ AC_ARG_WITH([platform]
AC_SUBST([with_platform])
- ########################################################################## - # Include m4 files - ########################################################################## - m4_include([./doc/m4/configure.m4]) - m4_include([./example/m4/configure.m4]) - m4_include([./helper/m4/configure.m4]) - m4_include([./test/m4/configure.m4]) - +########################################################################## +# Set SDK install path +########################################################################## +AC_ARG_WITH([sdk-install-path], +AC_HELP_STRING([--with-sdk-install-path=DIR path to external libs and headers], + [(or in the default path if not specified).]), +[SDK_INSTALL_PATH=$withval SDK_INSTALL_PATH_=1],[SDK_INSTALL_PATH_=]) + +AC_SUBST(SDK_INSTALL_PATH) + ########################################################################## # Run platform specific checks and settings ########################################################################## +IMPLEMENTATION_NAME="" AS_IF([test "${with_platform}" = "linux-generic"], - [m4_include([./platform/linux-generic/m4/configure.m4])], - [AC_MSG_ERROR([UNSUPPORTED PLATFORM: ${with_platform}])]) + [m4_include([./platform/linux-generic/m4/configure.m4])] + [IMPLEMENTATION_NAME="linux-generic"] + [ODP_CFLAGS="$ODP_CFLAGS -std=c99"] + [ODP_LIB_STR="odp-linux"], + [test "${with_platform}" = "linux-dpdk"], + [m4_include([./platform/linux-dpdk/m4/configure.m4])] + [IMPLEMENTATION_NAME="linux-dpdk"] + [ODP_CFLAGS="$ODP_CFLAGS -std=gnu99"] + [ODP_LIB_STR="odp-dpdk"], + [echo "UNSUPPORTED PLATFORM: ${with_platform}"])
-AC_DEFINE_UNQUOTED([IMPLEMENTATION_NAME], ["$IMPLEMENTATION_NAME"], - [Define to the name of the implementation]) +ODP_CFLAGS="$ODP_CFLAGS -DIMPLEMENTATION_NAME=$IMPLEMENTATION_NAME" +AC_SUBST(ODP_LIB_STR)
+ ########################################################################## + # Build examples/tests dynamically + ########################################################################## + AC_ARG_ENABLE([static-applications], + [AS_HELP_STRING([--disable-static-applications], + [disable static linking of examples and tests] + [ with ODP])], [], + [enable_static_applications=yes]) + AM_CONDITIONAL([STATIC_APPS], [test "x$enable_static_applications" != "xno"]) + if test "x$DPDK_SHARED" = "xyes" -a "x$enable_static_applications" != "xno" ; + then + AC_MSG_WARN([Static linking of examples and tests might fail when ] + [shared DPDK is detected. If build fails please retry with ] + [--disable-static-applications]) + fi + + ########################################################################## + # Include m4 files + ########################################################################## + m4_include([./doc/m4/configure.m4]) + m4_include([./example/m4/configure.m4]) + m4_include([./helper/m4/configure.m4]) + m4_include([./test/m4/configure.m4]) + ########################################################################## # Set the install directory for test binaries/scripts ########################################################################## diff --cc example/Makefile.inc index 31bf7c43,3c8060da..22196296 --- a/example/Makefile.inc +++ b/example/Makefile.inc @@@ -1,7 -1,14 +1,14 @@@ + include $(top_srcdir)/Makefile.inc + TESTS_ENVIRONMENT = EXEEXT=${EXEEXT}
- LIB = $(top_builddir)/lib - LDADD = $(LIB)/lib$(ODP_LIB_STR).la $(LIB)/libodphelper.la $(DPDK_PMDS) -LDADD = $(LIB)/libodp-linux.la $(LIB)/libodphelper.la ++LDADD = $(LIB)/lib$(ODP_LIB_STR).la $(LIB)/libodphelper.la + + # Do not link to DPDK twice in case of dynamic linking with ODP + if STATIC_APPS + LDADD += $(DPDK_LIBS_LT) + endif + AM_CFLAGS = \ -I$(srcdir) \ -I$(top_srcdir)/example \ diff --cc example/ddf_app/Makefile.am index 9b865ce0,00000000..cbe71985 mode 100644,000000..100644 --- a/example/ddf_app/Makefile.am +++ b/example/ddf_app/Makefile.am @@@ -1,10 -1,0 +1,12 @@@ +include $(top_srcdir)/example/Makefile.inc + ++AM_CFLAGS += -I$(top_srcdir)/platform/@with_platform@/include ++ +bin_PROGRAMS = odp_ddf_app$(EXEEXT) +odp_ddf_app_LDFLAGS = $(AM_LDFLAGS) $(DPDK_LIBS) -static -Wl,--export-dynamic +odp_ddf_app_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/example + +noinst_HEADERS = \ + $(top_srcdir)/example/example_debug.h + +dist_odp_ddf_app_SOURCES = odp_ddf_app.c diff --cc example/ddf_ifs/Makefile.am index c5f7d628,00000000..9d27e501 mode 100644,000000..100644 --- a/example/ddf_ifs/Makefile.am +++ b/example/ddf_ifs/Makefile.am @@@ -1,27 -1,0 +1,23 @@@ - LIB = $(top_builddir)/lib - - AM_CPPFLAGS = -I$(srcdir) \ - -I$(top_srcdir)/include \ - -I$(top_srcdir)/platform/@with_platform@/include \ - -I$(top_srcdir)/platform/@with_platform@/arch/@ARCH_DIR@ ++include $(top_srcdir)/example/Makefile.inc + ++AM_CFLAGS += -I$(top_srcdir)/platform/@with_platform@/include +lib_LTLIBRARIES = $(LIB)/libddf_ifs.la + +noinst_HEADERS = \ + $(srcdir)/ddf_ifs.h \ + $(srcdir)/ddf_ifs_enumr_class.h \ + $(srcdir)/ddf_ifs_enumr_dpdk.h \ + $(srcdir)/ddf_ifs_enumr_generic.h \ + $(srcdir)/ddf_ifs_dev_dpdk.h \ + $(srcdir)/ddf_ifs_devio_direct.h \ + $(srcdir)/ddf_ifs_driver.h \ + $(srcdir)/ddf_ifs_api.h + +__LIB__libddf_ifs_la_SOURCES = \ + ddf_ifs.c \ + ddf_ifs_enumr_class.c \ + ddf_ifs_enumr_dpdk.c \ + ddf_ifs_enumr_generic.c \ + ddf_ifs_dev_dpdk.c \ + ddf_ifs_devio_direct.c \ + ddf_ifs_driver.c diff --cc include/Makefile.am index b7c31c1f,aa330b8d..5aa05b9a --- a/include/Makefile.am +++ b/include/Makefile.am @@@ -1,8 -1,61 +1,62 @@@ include_HEADERS = \ odp.h \ - odp_api.h + odp_api.h \ + odp_drv.h
+ odpincludedir= $(includedir)/odp + odpinclude_HEADERS = \ + odp/visibility_begin.h \ + odp/visibility_end.h + + odpapiincludedir= $(includedir)/odp/api/ + odpapiinclude_HEADERS = \ + odp/api/align.h \ + odp/api/atomic.h \ + odp/api/barrier.h \ + odp/api/buffer.h \ + odp/api/byteorder.h \ + odp/api/chksum.h \ + odp/api/classification.h \ + odp/api/cpu.h \ + odp/api/cpumask.h \ + odp/api/crypto.h \ + odp/api/debug.h \ + odp/api/deprecated.h \ + odp/api/errno.h \ + odp/api/event.h \ + odp/api/feature.h \ + odp/api/hash.h \ + odp/api/hints.h \ + odp/api/init.h \ + odp/api/ipsec.h \ + odp/api/packet.h \ + odp/api/packet_flags.h \ + odp/api/packet_io.h \ + odp/api/packet_io_stats.h \ + odp/api/pool.h \ + odp/api/queue.h \ + odp/api/random.h \ + odp/api/rwlock.h \ + odp/api/rwlock_recursive.h \ + odp/api/schedule.h \ + odp/api/schedule_types.h \ + odp/api/shared_memory.h \ + odp/api/spinlock.h \ + odp/api/spinlock_recursive.h \ + odp/api/std_clib.h \ + odp/api/std_types.h \ + odp/api/support.h \ + odp/api/sync.h \ + odp/api/system_info.h \ + odp/api/thread.h \ + odp/api/threshold.h \ + odp/api/thrmask.h \ + odp/api/ticketlock.h \ + odp/api/time.h \ + odp/api/timer.h \ + odp/api/traffic_mngr.h \ + odp/api/version.h + odpapispecincludedir= $(includedir)/odp/api/spec odpapispecinclude_HEADERS = \ odp/api/spec/align.h \ @@@ -54,49 -108,85 +109,106 @@@ nodist_odpapispecinclude_HEADERS = odp/api/spec/deprecated.h \ odp/api/spec/version.h
+odpdrvspecincludedir= $(includedir)/odp/drv/spec +odpdrvspecinclude_HEADERS = \ + odp/drv/spec/align.h \ + odp/drv/spec/atomic.h \ + odp/drv/spec/barrier.h \ + odp/drv/spec/byteorder.h \ + odp/drv/spec/compiler.h \ + odp/drv/spec/driver.h \ + odp/drv/spec/hints.h \ + odp/drv/spec/shm.h \ + odp/drv/spec/spinlock.h \ + odp/drv/spec/std_types.h \ + odp/drv/spec/sync.h + +subsystemspecincludedir= $(includedir)/subsystem/spec +subsystemspecinclude_HEADERS = \ + subsystem/spec/buffer_subsystem.h \ + subsystem/spec/pool_subsystem.h \ + subsystem/spec/queue_subsystem.h \ + subsystem/spec/schedule_subsystem.h + - odpapiabidefaultincludedir= $(includedir)/odp/arch/default/api/abi + odpapiabidefaultincludedir= $(includedir)/odp/api/abi-default odpapiabidefaultinclude_HEADERS = \ - odp/arch/default/api/abi/buffer.h \ - odp/arch/default/api/abi/classification.h \ - odp/arch/default/api/abi/crypto.h \ - odp/arch/default/api/abi/event.h \ - odp/arch/default/api/abi/packet.h \ - odp/arch/default/api/abi/pool.h \ - odp/arch/default/api/abi/queue.h \ - odp/arch/default/api/abi/shared_memory.h + odp/api/abi-default/align.h \ + odp/api/abi-default/atomic.h \ + odp/api/abi-default/barrier.h \ + odp/api/abi-default/buffer.h \ + odp/api/abi-default/byteorder.h \ + odp/api/abi-default/classification.h \ + odp/api/abi-default/cpu.h \ + odp/api/abi-default/cpumask.h \ + odp/api/abi-default/crypto.h \ + odp/api/abi-default/debug.h \ + odp/api/abi-default/event.h \ + odp/api/abi-default/init.h \ + odp/api/abi-default/ipsec.h \ + odp/api/abi-default/packet.h \ + odp/api/abi-default/packet_flags.h \ + odp/api/abi-default/packet_io.h \ + odp/api/abi-default/pool.h \ + odp/api/abi-default/queue.h \ + odp/api/abi-default/rwlock.h \ + odp/api/abi-default/rwlock_recursive.h \ + odp/api/abi-default/schedule.h \ + odp/api/abi-default/schedule_types.h \ + odp/api/abi-default/shared_memory.h \ + odp/api/abi-default/spinlock.h \ + odp/api/abi-default/spinlock_recursive.h \ + odp/api/abi-default/std_clib.h \ + odp/api/abi-default/std_types.h \ + odp/api/abi-default/sync.h \ + odp/api/abi-default/thread.h \ + odp/api/abi-default/thrmask.h \ + odp/api/abi-default/ticketlock.h \ + odp/api/abi-default/time.h \ + odp/api/abi-default/timer.h \ + odp/api/abi-default/traffic_mngr.h \ + odp/api/abi-default/version.h
- odpapiabiarchincludedir= $(includedir)/odp/arch/@ARCH_ABI@/odp/api/abi + # Insall ABI headers only if required + if ODP_ABI_COMPAT + + odpapiabiarchincludedir = $(archincludedir)/odp/api/abi if ARCH_IS_ARM odpapiabiarchinclude_HEADERS = \ + odp/arch/arm32-linux/odp/api/abi/align.h \ + odp/arch/arm32-linux/odp/api/abi/atomic.h \ + odp/arch/arm32-linux/odp/api/abi/barrier.h \ odp/arch/arm32-linux/odp/api/abi/buffer.h \ + odp/arch/arm32-linux/odp/api/abi/byteorder.h \ odp/arch/arm32-linux/odp/api/abi/classification.h \ + odp/arch/arm32-linux/odp/api/abi/cpu.h \ + odp/arch/arm32-linux/odp/api/abi/cpumask.h \ odp/arch/arm32-linux/odp/api/abi/crypto.h \ + odp/arch/arm32-linux/odp/api/abi/debug.h \ odp/arch/arm32-linux/odp/api/abi/event.h \ + odp/arch/arm32-linux/odp/api/abi/init.h \ + odp/arch/arm32-linux/odp/api/abi/ipsec.h \ odp/arch/arm32-linux/odp/api/abi/packet.h \ + odp/arch/arm32-linux/odp/api/abi/packet_flags.h \ + odp/arch/arm32-linux/odp/api/abi/packet_io.h \ odp/arch/arm32-linux/odp/api/abi/pool.h \ odp/arch/arm32-linux/odp/api/abi/queue.h \ - odp/arch/arm32-linux/odp/api/abi/shared_memory.h + odp/arch/arm32-linux/odp/api/abi/rwlock.h \ + odp/arch/arm32-linux/odp/api/abi/rwlock_recursive.h \ + odp/arch/arm32-linux/odp/api/abi/schedule.h \ + odp/arch/arm32-linux/odp/api/abi/schedule_types.h \ + odp/arch/arm32-linux/odp/api/abi/shared_memory.h \ + odp/arch/arm32-linux/odp/api/abi/spinlock.h \ + odp/arch/arm32-linux/odp/api/abi/spinlock_recursive.h \ + odp/arch/arm32-linux/odp/api/abi/std_clib.h \ + odp/arch/arm32-linux/odp/api/abi/std_types.h \ + odp/arch/arm32-linux/odp/api/abi/sync.h \ + odp/arch/arm32-linux/odp/api/abi/thread.h \ + odp/arch/arm32-linux/odp/api/abi/thrmask.h \ + odp/arch/arm32-linux/odp/api/abi/ticketlock.h \ + odp/arch/arm32-linux/odp/api/abi/time.h \ + odp/arch/arm32-linux/odp/api/abi/timer.h \ + odp/arch/arm32-linux/odp/api/abi/traffic_mngr.h \ + odp/arch/arm32-linux/odp/api/abi/version.h endif if ARCH_IS_AARCH64 odpapiabiarchinclude_HEADERS = \ diff --cc include/odp/api/abi-default/atomic.h index 00000000,796e512e..c0bb29a3 mode 000000,100644..100644 --- a/include/odp/api/abi-default/atomic.h +++ b/include/odp/api/abi-default/atomic.h @@@ -1,0 -1,70 +1,72 @@@ + /* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + + /** + * @file + * + * ODP atomic operations + */ + + #ifndef ODP_ABI_ATOMIC_H_ + #define ODP_ABI_ATOMIC_H_ + + #ifdef __cplusplus + extern "C" { + #endif + + #include <odp/api/std_types.h> + #include <odp/api/align.h> + + /** + * @internal + * Atomic 32-bit unsigned integer + */ + struct odp_atomic_u32_s { + uint32_t v; /**< Actual storage for the atomic variable */ + } ODP_ALIGNED(sizeof(uint32_t)); /* Enforce alignment! */ + + #if __GCC_ATOMIC_LLONG_LOCK_FREE >= 2 + + /** + * @internal + * Atomic 64-bit unsigned integer + */ + struct odp_atomic_u64_s { + uint64_t v; /**< Actual storage for the atomic variable */ + } ODP_ALIGNED(sizeof(uint64_t)); /* Enforce alignment! */ + + #else + + /** + * @internal + * Use embedded lock for atomic 64-bit variable implementation + */ + #define ODP_ATOMIC_U64_LOCK 1 + + /** + * @internal + * Atomic 64-bit unsigned integer + */ + struct odp_atomic_u64_s { + uint64_t v; /**< Actual storage for the atomic variable */ + /* Some architectures do not support lock-free operations on 64-bit + * data types. We use a spin lock to ensure atomicity. */ + char lock; /**< Spin lock (if needed) used to ensure atomic access */ + } ODP_ALIGNED(sizeof(uint64_t)); /* Enforce alignment! */ + + #endif + + typedef struct odp_atomic_u64_s odp_atomic_u64_t; + + typedef struct odp_atomic_u32_s odp_atomic_u32_t; + ++#define ODP_ATOMIC_INIT(a) { .v = a } ++ + #ifdef __cplusplus + } + #endif + + #endif diff --cc include/odp/api/abi-default/rwlock.h index 00000000,3542c388..e85fc323 mode 000000,100644..100644 --- a/include/odp/api/abi-default/rwlock.h +++ b/include/odp/api/abi-default/rwlock.h @@@ -1,0 -1,34 +1,36 @@@ + /* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + + /** + * @file + * + * ODP rwlock + */ + + #ifndef ODP_ABI_RWLOCK_H_ + #define ODP_ABI_RWLOCK_H_ + + #ifdef __cplusplus + extern "C" { + #endif + + #include <odp/api/atomic.h> + + /** @internal */ + typedef struct odp_rwlock_s { + odp_atomic_u32_t cnt; /**< lock count + 0 lock not taken + -1 write lock taken + >0 read lock(s) taken */ + } odp_rwlock_t; + ++#define ODP_RWLOCK_UNLOCKED { .cnt = ODP_ATOMIC_INIT(0) } ++ + #ifdef __cplusplus + } + #endif + + #endif diff --cc platform/Makefile.inc index 327a9540,a39cf69b..d17ddd4d --- a/platform/Makefile.inc +++ b/platform/Makefile.inc @@@ -1,6 -1,10 +1,7 @@@ - LIB = $(top_builddir)/lib + include $(top_srcdir)/Makefile.inc
+ pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libodp-linux.pc - VPATH = $(srcdir) $(builddir) -lib_LTLIBRARIES = $(LIB)/libodp-linux.la
AM_LDFLAGS = -version-number '$(ODP_LIBSO_VERSION)'
diff --cc platform/linux-dpdk/Makefile.am index c2cfa3d0,00000000..6e1652a6 mode 100644,000000..100644 --- a/platform/linux-dpdk/Makefile.am +++ b/platform/linux-dpdk/Makefile.am @@@ -1,377 -1,0 +1,375 @@@ +include $(top_srcdir)/platform/Makefile.inc +include $(top_srcdir)/platform/@with_platform@/Makefile.inc + - pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libodp-dpdk.pc - +lib_LTLIBRARIES = $(LIB)/libodp-dpdk.la + +PLAT_CFLAGS = +if ARCH_IS_X86 +PLAT_CFLAGS += -msse4.2 +endif + +if SDK_INSTALL_PATH_ +PLAT_CFLAGS += -include $(SDK_INSTALL_PATH)/include/rte_config.h +else +PLAT_CFLAGS += -include /usr/include/dpdk/rte_config.h +endif + +AM_CPPFLAGS = $(PLAT_CFLAGS) +AM_CPPFLAGS += -I$(top_srcdir)/platform/linux-dpdk/include +AM_CPPFLAGS += -I$(top_srcdir)/platform/linux-generic/include +AM_CPPFLAGS += -I$(srcdir)/include +AM_CPPFLAGS += -I$(top_srcdir)/include +AM_CPPFLAGS += -I$(top_srcdir)/frameworks/modular +AM_CPPFLAGS += -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ +AM_CPPFLAGS += -I$(top_builddir)/include +AM_CPPFLAGS += -Iinclude +AM_CPPFLAGS += -I$(srcdir) +AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/arch/$(ARCH_DIR) +AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/arch/default +AM_CPPFLAGS += -DSYSCONFDIR="@sysconfdir@" + +AM_CPPFLAGS += $(DPDK_CPPFLAGS) +AM_CPPFLAGS += $(OPENSSL_CPPFLAGS) +AM_CPPFLAGS += $(LIBCONFIG_CFLAGS) + +include_HEADERS = \ + $(top_srcdir)/include/odp.h \ + $(top_srcdir)/include/odp_api.h \ + $(top_srcdir)/include/odp_drv.h + +odpincludedir= $(includedir)/odp +odpinclude_HEADERS = \ + $(srcdir)/include/odp/visibility_begin.h \ + $(srcdir)/include/odp/visibility_end.h + +odpapiincludedir= $(includedir)/odp/api +odpapiinclude_HEADERS = \ + $(srcdir)/include/odp/api/align.h \ + $(srcdir)/include/odp/api/atomic.h \ + $(srcdir)/include/odp/api/barrier.h \ + $(srcdir)/include/odp/api/buffer.h \ + $(srcdir)/include/odp/api/byteorder.h \ + $(srcdir)/include/odp/api/classification.h \ + $(srcdir)/include/odp/api/compiler.h \ + $(srcdir)/include/odp/api/cpu.h \ + $(srcdir)/include/odp/api/cpumask.h \ + $(srcdir)/include/odp/api/crypto.h \ + $(srcdir)/include/odp/api/debug.h \ + $(srcdir)/include/odp/api/deprecated.h \ + $(srcdir)/include/odp/api/errno.h \ + $(srcdir)/include/odp/api/event.h \ + $(srcdir)/include/odp/api/feature.h \ + $(srcdir)/include/odp/api/hash.h \ + $(srcdir)/include/odp/api/hints.h \ + $(srcdir)/include/odp/api/init.h \ + $(srcdir)/include/odp/api/ipsec.h \ + $(srcdir)/include/odp/api/packet_flags.h \ + $(srcdir)/include/odp/api/packet.h \ + $(srcdir)/include/odp/api/packet_io.h \ + $(srcdir)/include/odp/api/packet_io_stats.h \ + $(srcdir)/include/odp/api/pool.h \ + $(srcdir)/include/odp/api/queue.h \ + $(srcdir)/include/odp/api/random.h \ + $(srcdir)/include/odp/api/rwlock.h \ + $(srcdir)/include/odp/api/rwlock_recursive.h \ + $(srcdir)/include/odp/api/schedule.h \ + $(srcdir)/include/odp/api/schedule_types.h \ + $(srcdir)/include/odp/api/shared_memory.h \ + $(srcdir)/include/odp/api/spinlock.h \ + $(srcdir)/include/odp/api/spinlock_recursive.h \ + $(srcdir)/include/odp/api/std_clib.h \ + $(srcdir)/include/odp/api/std_types.h \ + $(srcdir)/include/odp/api/support.h \ + $(srcdir)/include/odp/api/sync.h \ + $(srcdir)/include/odp/api/system_info.h \ + $(srcdir)/include/odp/api/thread.h \ + $(srcdir)/include/odp/api/thrmask.h \ + $(srcdir)/include/odp/api/ticketlock.h \ + $(srcdir)/include/odp/api/time.h \ + $(srcdir)/include/odp/api/timer.h \ + $(srcdir)/include/odp/api/traffic_mngr.h \ + $(srcdir)/include/odp/api/version.h + +if ARCH_IS_ARM +odpapiinclude_HEADERS += $(srcdir)/arch/arm/odp/api/cpu_arch.h +endif +if ARCH_IS_MIPS64 +odpapiinclude_HEADERS += $(srcdir)/arch/mips64/odp/api/cpu_arch.h +endif +if ARCH_IS_POWERPC +odpapiinclude_HEADERS += $(srcdir)/arch/powerpc/odp/api/cpu_arch.h +endif +if ARCH_IS_X86 +odpapiinclude_HEADERS += $(srcdir)/arch/x86/odp/api/cpu_arch.h +endif + +odpapiplatincludedir= $(includedir)/odp/api/plat +odpapiplatinclude_HEADERS = \ + $(builddir)/include/odp/api/plat/static_inline.h \ + $(srcdir)/include/odp/api/plat/atomic_inlines.h \ + $(srcdir)/include/odp/api/plat/atomic_types.h \ + $(srcdir)/include/odp/api/plat/barrier_types.h \ + $(srcdir)/include/odp/api/plat/buffer_types.h \ + $(srcdir)/include/odp/api/plat/byteorder_inlines.h \ + $(srcdir)/include/odp/api/plat/byteorder_types.h \ + $(srcdir)/include/odp/api/plat/classification_types.h \ + $(srcdir)/include/odp/api/plat/cpumask_types.h \ + $(srcdir)/include/odp/api/plat/crypto_types.h \ + $(srcdir)/include/odp/api/plat/event_types.h \ + $(srcdir)/include/odp/api/plat/init_types.h \ + $(srcdir)/include/odp/api/plat/ipsec_types.h \ + $(srcdir)/include/odp/api/plat/packet_flag_inlines.h \ + $(srcdir)/include/odp/api/plat/packet_flag_inlines_api.h \ + $(srcdir)/include/odp/api/plat/packet_inlines.h \ + $(srcdir)/include/odp/api/plat/packet_inlines_api.h \ + $(srcdir)/include/odp/api/plat/packet_io_types.h \ + $(srcdir)/include/odp/api/plat/packet_types.h \ + $(srcdir)/include/odp/api/plat/pool_types.h \ + $(srcdir)/include/odp/api/plat/queue_types.h \ + $(srcdir)/include/odp/api/plat/rwlock_types.h \ + $(srcdir)/include/odp/api/plat/rwlock_recursive_types.h \ + $(srcdir)/include/odp/api/plat/schedule_types.h \ + $(srcdir)/include/odp/api/plat/shared_memory_types.h \ + $(srcdir)/include/odp/api/plat/spinlock_types.h \ + $(srcdir)/include/odp/api/plat/spinlock_recursive_types.h \ + $(srcdir)/include/odp/api/plat/std_clib_inlines.h \ + $(srcdir)/include/odp/api/plat/strong_types.h \ + $(srcdir)/include/odp/api/plat/sync_inlines.h \ + $(srcdir)/include/odp/api/plat/thread_types.h \ + $(srcdir)/include/odp/api/plat/thrmask_types.h \ + $(srcdir)/include/odp/api/plat/ticketlock_inlines.h \ + $(srcdir)/include/odp/api/plat/ticketlock_inlines_api.h \ + $(srcdir)/include/odp/api/plat/ticketlock_types.h \ + $(srcdir)/include/odp/api/plat/time_types.h \ + $(srcdir)/include/odp/api/plat/timer_types.h \ + $(srcdir)/include/odp/api/plat/traffic_mngr_types.h \ + $(srcdir)/include/odp/api/plat/version_types.h + +odpdrvincludedir = $(includedir)/odp/drv +odpdrvinclude_HEADERS = \ + $(srcdir)/include/odp/drv/align.h \ + $(srcdir)/include/odp/drv/atomic.h \ + $(srcdir)/include/odp/drv/barrier.h \ + $(srcdir)/include/odp/drv/byteorder.h \ + $(srcdir)/include/odp/drv/compiler.h \ + $(srcdir)/include/odp/drv/driver.h \ + $(srcdir)/include/odp/drv/hints.h \ + $(srcdir)/include/odp/drv/shm.h \ + $(srcdir)/include/odp/drv/spinlock.h \ + $(srcdir)/include/odp/drv/std_types.h \ + $(srcdir)/include/odp/drv/sync.h + +odpdrvplatincludedir = $(includedir)/odp/drv/plat +odpdrvplatinclude_HEADERS = \ + $(srcdir)/include/odp/drv/plat/atomic_types.h \ + $(srcdir)/include/odp/drv/plat/barrier_types.h \ + $(srcdir)/include/odp/drv/plat/byteorder_types.h \ + $(srcdir)/include/odp/drv/compiler.h \ + $(srcdir)/include/odp/drv/plat/driver_types.h \ + $(srcdir)/include/odp/drv/plat/shm_types.h \ + $(srcdir)/include/odp/drv/plat/spinlock_types.h \ + $(srcdir)/include/odp/drv/plat/strong_types.h + + +noinst_HEADERS = \ + ${top_srcdir}/platform/linux-generic/include/_fdserver_internal.h \ + ${top_srcdir}/platform/linux-generic/include/_ishm_internal.h \ + ${top_srcdir}/platform/linux-generic/include/_ishmphy_internal.h \ + ${top_srcdir}/platform/linux-generic/include/_ishmpool_internal.h \ + ${top_srcdir}/platform/linux-generic/include/drv_driver_internal.h\ + ${top_srcdir}/platform/linux-generic/include/odp_align_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_atomic_internal.h \ + ${srcdir}/include/odp_buffer_inlines.h \ + ${srcdir}/include/odp_buffer_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_bitmap_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_classification_internal.h \ + ${srcdir}/include/odp_config_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_debug_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_classification_datamodel.h \ + ${top_srcdir}/platform/linux-generic/include/odp_classification_inlines.h \ + ${top_srcdir}/platform/linux-generic/include/odp_classification_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_crypto_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_forward_typedefs_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_ipsec_internal.h \ + ${srcdir}/pktio/dpdk.h \ + ${srcdir}/include/odp_packet_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pktio_ops_ipc.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pktio_ops_subsystem.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pktio_ops_socket.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pktio_ops_loopback.h \ + ${top_srcdir}/platform/linux-generic/include/odp_name_table_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_packet_io_internal.h \ + ${srcdir}/include/odp_errno_define.h \ + ${top_srcdir}/platform/linux-generic/include/odp_packet_io_ring_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_packet_io_pool.h \ + ${top_srcdir}/platform/linux-generic/include/odp_packet_io_pool_access.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pkt_queue_internal.h \ + ${srcdir}/include/odp_pool_internal.h \ + ${srcdir}/include/odp_posix_extensions.h \ + ${top_srcdir}/platform/linux-generic/include/odp_queue_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_queue_if.h \ + ${top_srcdir}/platform/linux-generic/include/odp_ring_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_schedule_if.h \ + ${top_srcdir}/platform/linux-generic/include/odp_sorted_list_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_shm_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_time_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_timer_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_timer_wheel_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_traffic_mngr_internal.h \ + ${srcdir}/include/protocols/eth.h \ + ${srcdir}/include/protocols/ip.h \ + ${srcdir}/include/protocols/ipsec.h \ + ${srcdir}/include/protocols/tcp.h \ + ${srcdir}/include/protocols/udp.h \ + ${srcdir}/Makefile.inc + +__LIB__libodp_dpdk_la_SOURCES = \ + ../linux-generic/_fdserver.c \ + ../linux-generic/_ishm.c \ + ../linux-generic/_ishmphy.c \ + ../linux-generic/_ishmpool.c \ + ../linux-generic/_modules.c \ + ../linux-generic/odp_atomic.c \ + ../linux-generic/odp_barrier.c \ + ../linux-generic/odp_bitmap.c \ + buffer/dpdk.c \ + ../linux-generic/odp_byteorder.c \ + ../linux-generic/odp_chksum.c \ + ../linux-generic/odp_classification.c \ + ../linux-generic/odp_cpu.c \ + ../linux-generic/odp_cpumask.c \ + ../linux-generic/odp_cpumask_task.c \ + odp_crypto.c \ + odp_errno.c \ + ../linux-generic/odp_event.c \ + ../linux-generic/odp_hash.c \ + odp_init.c \ + ../linux-generic/odp_impl.c \ + ../linux-generic/odp_ipsec.c \ + ../linux-generic/odp_ipsec_events.c \ + ../linux-generic/odp_ipsec_sad.c \ + ../linux-generic/odp_name_table.c \ + odp_packet.c \ + pktio/dpdk.c \ + ../linux-generic/pktio/subsystem.c \ + odp_packet_flags.c \ + ../linux-generic/odp_packet_io.c \ + ../linux-generic/odp_packet_io_pool.c \ + ../linux-generic/pktio/loopback.c \ + ../linux-generic/odp_pkt_queue.c \ + pool/dpdk.c \ + ../linux-generic/odp_queue_if.c \ + ../linux-generic/queue/subsystem.c \ + ../linux-generic/odp_rwlock.c \ + ../linux-generic/odp_rwlock_recursive.c \ + ../linux-generic/pool/subsystem.c \ + ../linux-generic/buffer/subsystem.c \ + ../linux-generic/odp_schedule_if.c \ + ../linux-generic/schedule/generic.c \ + ../linux-generic/schedule/iquery.c \ + ../linux-generic/schedule/scalable.c \ + ../linux-generic/schedule/scalable_ordered.c \ + ../linux-generic/schedule/sp.c \ + ../linux-generic/schedule/subsystem.c \ + ../linux-generic/odp_shared_memory.c \ + ../linux-generic/odp_sorted_list.c \ + ../linux-generic/odp_spinlock.c \ + ../linux-generic/odp_spinlock_recursive.c \ + odp_std_clib.c \ + ../linux-generic/odp_sync.c \ + ../linux-generic/odp_system_info.c \ + odp_thread.c \ + ../linux-generic/odp_thrmask.c \ + ../linux-generic/odp_ticketlock.c \ + odp_time.c \ + ../linux-generic/odp_timer.c \ + ../linux-generic/odp_timer_wheel.c \ + ../linux-generic/odp_traffic_mngr.c \ + ../linux-generic/odp_version.c \ + ../linux-generic/odp_weak.c \ + ../linux-generic/drv_atomic.c \ + ../linux-generic/drv_barrier.c \ + ../linux-generic/drv_driver.c \ + ../linux-generic/drv_shm.c \ + ../linux-generic/drv_spinlock.c + +if ARCH_IS_ARM +__LIB__libodp_dpdk_la_SOURCES += arch/arm/odp_cpu_arch.c \ + arch/arm/odp_cpu_cycles.c \ + arch/arm/odp_global_time.c \ + arch/arm/odp_sysinfo_parse.c +endif +if ARCH_IS_AARCH64 +__LIB__libodp_dpdk_la_SOURCES += arch/default/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/aarch64/odp_global_time.c \ + arch/default/odp_sysinfo_parse.c +endif +if ARCH_IS_MIPS64 +__LIB__libodp_dpdk_la_SOURCES += arch/mips64/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/default/odp_global_time.c \ + arch/mips64/odp_sysinfo_parse.c +endif +if ARCH_IS_POWERPC +__LIB__libodp_dpdk_la_SOURCES += arch/powerpc/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/default/odp_global_time.c \ + arch/powerpc/odp_sysinfo_parse.c +endif +if ARCH_IS_X86 +__LIB__libodp_dpdk_la_SOURCES += arch/x86/cpu_flags.c \ + arch/x86/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/x86/odp_global_time.c \ + arch/x86/odp_sysinfo_parse.c +endif + +pool/dpdk.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +buffer/dpdk.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +if ODP_SCHEDULE_SCALABLE +../linux-generic/schedule/scalable.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +if ODP_SCHEDULE_SP +../linux-generic/schedule/sp.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +if ODP_SCHEDULE_IQUERY +../linux-generic/schedule/iquery.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +../linux-generic/schedule/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +endif +endif +endif +if ODP_SCHEDULE_SCALABLE +__LIB__libodp_dpdk_la_SOURCES += ../linux-generic/queue/scalable.c +../linux-generic/queue/scalable.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +__LIB__libodp_dpdk_la_SOURCES += ../linux-generic/queue/generic.c +../linux-generic/queue/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +endif + +# Build modular framework into odp-linux library +modularframeworkdir = $(top_srcdir)/frameworks/modular +noinst_HEADERS += $(modularframeworkdir)/list.h \ + $(modularframeworkdir)/odp_module.h + +__LIB__libodp_dpdk_la_SOURCES += ../../frameworks/modular/odp_module.c + +__LIB__libodp_dpdk_la_LIBADD = $(ATOMIC_LIBS) +__LIB__libodp_dpdk_la_LIBADD += $(DPDK_LIBS) +__LIB__libodp_dpdk_la_LIBADD += $(OPENSSL_LIBS) +__LIB__libodp_dpdk_la_LIBADD += $(PTHREAD_LIBS) +__LIB__libodp_dpdk_la_LIBADD += $(TIMER_LIBS) +__LIB__libodp_dpdk_la_LIBADD += $(LIBCONFIG_LIBS) + +# Create symlink for ABI header files. Application does not need to use the arch +# specific include path for installed files. +install-data-hook: + if [ -h $(DESTDIR)$(prefix)/include/odp/api/abi ]; then \ + : ; \ + else \ + $(LN_S) -rf $(DESTDIR)$(prefix)/include/odp/arch/@ARCH_ABI@/odp/api/abi \ + $(DESTDIR)$(prefix)/include/odp/api/abi; \ + fi diff --cc platform/linux-dpdk/include/odp/api/align.h index 10c13402,00000000..f771e3a2 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/align.h +++ b/platform/linux-dpdk/include/odp/api/align.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/align.h ++../../../../linux-generic/include-abi/odp/api/abi/align.h diff --cc platform/linux-dpdk/include/odp/api/atomic.h index e6d28fdf,00000000..88b8e118 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/atomic.h +++ b/platform/linux-dpdk/include/odp/api/atomic.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/atomic.h ++../../../../linux-generic/include-abi/odp/api/abi/atomic.h diff --cc platform/linux-dpdk/include/odp/api/barrier.h index 72a22f10,00000000..07015ec4 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/barrier.h +++ b/platform/linux-dpdk/include/odp/api/barrier.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/barrier.h ++../../../../linux-generic/include-abi/odp/api/abi/barrier.h diff --cc platform/linux-dpdk/include/odp/api/buffer.h index 6587bdcb,00000000..a3625fbf mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/buffer.h +++ b/platform/linux-dpdk/include/odp/api/buffer.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/buffer.h ++../../../../linux-generic/include-abi/odp/api/abi/buffer.h diff --cc platform/linux-dpdk/include/odp/api/byteorder.h index cef6d89b,00000000..07f1c60d mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/byteorder.h +++ b/platform/linux-dpdk/include/odp/api/byteorder.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/byteorder.h ++../../../../linux-generic/include-abi/odp/api/abi/byteorder.h diff --cc platform/linux-dpdk/include/odp/api/classification.h index 43cf9362,00000000..691e763f mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/classification.h +++ b/platform/linux-dpdk/include/odp/api/classification.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/classification.h ++../../../../linux-generic/include-abi/odp/api/abi/classification.h diff --cc platform/linux-dpdk/include/odp/api/cpumask.h index 49ca0f2c,00000000..f2dd3e59 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/cpumask.h +++ b/platform/linux-dpdk/include/odp/api/cpumask.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/cpumask.h ++../../../../linux-generic/include-abi/odp/api/abi/cpumask.h diff --cc platform/linux-dpdk/include/odp/api/crypto.h index d69e8a0e,00000000..1f7b9fdb mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/crypto.h +++ b/platform/linux-dpdk/include/odp/api/crypto.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/crypto.h ++../../../../linux-generic/include-abi/odp/api/abi/crypto.h diff --cc platform/linux-dpdk/include/odp/api/debug.h index 2814f8f5,00000000..6a20cf10 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/debug.h +++ b/platform/linux-dpdk/include/odp/api/debug.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/debug.h ++../../../../linux-generic/include-abi/odp/api/abi/debug.h diff --cc platform/linux-dpdk/include/odp/api/event.h index 674d3539,00000000..c06347df mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/event.h +++ b/platform/linux-dpdk/include/odp/api/event.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/event.h ++../../../../linux-generic/include-abi/odp/api/abi/event.h diff --cc platform/linux-dpdk/include/odp/api/init.h index 0f4bd6c0,00000000..275f8963 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/init.h +++ b/platform/linux-dpdk/include/odp/api/init.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/init.h ++../../../../linux-generic/include-abi/odp/api/abi/init.h diff --cc platform/linux-dpdk/include/odp/api/ipsec.h index eaf507cf,00000000..4d380f46 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/ipsec.h +++ b/platform/linux-dpdk/include/odp/api/ipsec.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/ipsec.h ++../../../../linux-generic/include-abi/odp/api/abi/ipsec.h diff --cc platform/linux-dpdk/include/odp/api/packet_io.h index 1e0d9e41,00000000..57862ca3 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/packet_io.h +++ b/platform/linux-dpdk/include/odp/api/packet_io.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/packet_io.h ++../../../../linux-generic/include-abi/odp/api/abi/packet_io.h diff --cc platform/linux-dpdk/include/odp/api/pool.h index dc61addf,00000000..f0550105 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/pool.h +++ b/platform/linux-dpdk/include/odp/api/pool.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/pool.h ++../../../../linux-generic/include-abi/odp/api/abi/pool.h diff --cc platform/linux-dpdk/include/odp/api/queue.h index de33df69,00000000..aba5f140 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/queue.h +++ b/platform/linux-dpdk/include/odp/api/queue.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/queue.h ++../../../../linux-generic/include-abi/odp/api/abi/queue.h diff --cc platform/linux-dpdk/include/odp/api/rwlock.h index 8730e75e,00000000..06b09b04 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/rwlock.h +++ b/platform/linux-dpdk/include/odp/api/rwlock.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/rwlock.h ++../../../../linux-generic/include-abi/odp/api/abi/rwlock.h diff --cc platform/linux-dpdk/include/odp/api/rwlock_recursive.h index 7e8ef995,00000000..d0ae4b39 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/rwlock_recursive.h +++ b/platform/linux-dpdk/include/odp/api/rwlock_recursive.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/rwlock_recursive.h ++../../../../linux-generic/include-abi/odp/api/abi/rwlock_recursive.h diff --cc platform/linux-dpdk/include/odp/api/schedule.h index 144acd72,00000000..7cdc2ff1 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/schedule.h +++ b/platform/linux-dpdk/include/odp/api/schedule.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/schedule.h ++../../../../linux-generic/include-abi/odp/api/abi/schedule.h diff --cc platform/linux-dpdk/include/odp/api/schedule_types.h index 4fcc5907,00000000..dd4b4204 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/schedule_types.h +++ b/platform/linux-dpdk/include/odp/api/schedule_types.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/schedule_types.h ++../../../../linux-generic/include-abi/odp/api/abi/schedule_types.h diff --cc platform/linux-dpdk/include/odp/api/shared_memory.h index 2f79b276,00000000..31854009 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/shared_memory.h +++ b/platform/linux-dpdk/include/odp/api/shared_memory.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/shared_memory.h ++../../../../linux-generic/include-abi/odp/api/abi/shared_memory.h diff --cc platform/linux-dpdk/include/odp/api/spinlock.h index 276271a1,00000000..2ed22567 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/spinlock.h +++ b/platform/linux-dpdk/include/odp/api/spinlock.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/spinlock.h ++../../../../linux-generic/include-abi/odp/api/abi/spinlock.h diff --cc platform/linux-dpdk/include/odp/api/spinlock_recursive.h index b738f8b1,00000000..fe8a12fc mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/spinlock_recursive.h +++ b/platform/linux-dpdk/include/odp/api/spinlock_recursive.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/spinlock_recursive.h ++../../../../linux-generic/include-abi/odp/api/abi/spinlock_recursive.h diff --cc platform/linux-dpdk/include/odp/api/std_types.h index 2cc6bb77,00000000..122143d8 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/std_types.h +++ b/platform/linux-dpdk/include/odp/api/std_types.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/std_types.h ++../../../../linux-generic/include-abi/odp/api/abi/std_types.h diff --cc platform/linux-dpdk/include/odp/api/sync.h index 06b6852f,00000000..f108ed5a mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/sync.h +++ b/platform/linux-dpdk/include/odp/api/sync.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/sync.h ++../../../../linux-generic/include-abi/odp/api/abi/sync.h diff --cc platform/linux-dpdk/include/odp/api/thread.h index f3f731ed,00000000..adc59a8b mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/thread.h +++ b/platform/linux-dpdk/include/odp/api/thread.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/thread.h ++../../../../linux-generic/include-abi/odp/api/abi/thread.h diff --cc platform/linux-dpdk/include/odp/api/thrmask.h index 709adaaf,00000000..16f2bbc9 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/thrmask.h +++ b/platform/linux-dpdk/include/odp/api/thrmask.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/thrmask.h ++../../../../linux-generic/include-abi/odp/api/abi/thrmask.h diff --cc platform/linux-dpdk/include/odp/api/ticketlock.h index a8a5d832,00000000..08298c4c mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/ticketlock.h +++ b/platform/linux-dpdk/include/odp/api/ticketlock.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/ticketlock.h ++../../../../linux-generic/include-abi/odp/api/abi/ticketlock.h diff --cc platform/linux-dpdk/include/odp/api/time.h index c0743d88,00000000..f22fa45b mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/time.h +++ b/platform/linux-dpdk/include/odp/api/time.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/time.h ++../../../../linux-generic/include-abi/odp/api/abi/time.h diff --cc platform/linux-dpdk/include/odp/api/timer.h index c81bfbed,00000000..5ba9f5d6 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/timer.h +++ b/platform/linux-dpdk/include/odp/api/timer.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/timer.h ++../../../../linux-generic/include-abi/odp/api/abi/timer.h diff --cc platform/linux-dpdk/include/odp/api/traffic_mngr.h index e9faa26d,00000000..4205bea4 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/traffic_mngr.h +++ b/platform/linux-dpdk/include/odp/api/traffic_mngr.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/traffic_mngr.h ++../../../../linux-generic/include-abi/odp/api/abi/traffic_mngr.h diff --cc platform/linux-dpdk/include/odp/api/version.h index da44655a,00000000..c22070c2 mode 120000,000000..120000 --- a/platform/linux-dpdk/include/odp/api/version.h +++ b/platform/linux-dpdk/include/odp/api/version.h @@@ -1,1 -1,0 +1,1 @@@ - ../../../../linux-generic/include/odp/api/version.h ++../../../../linux-generic/include-abi/odp/api/abi/version.h diff --cc platform/linux-dpdk/include/odp_buffer_inlines.h index 05c8d931,00000000..fa923916 mode 100644,000000..100644 --- a/platform/linux-dpdk/include/odp_buffer_inlines.h +++ b/platform/linux-dpdk/include/odp_buffer_inlines.h @@@ -1,61 -1,0 +1,51 @@@ +/* Copyright (c) 2014, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * Inline functions for ODP buffer mgmt routines - implementation internal + */ + +#ifndef ODP_BUFFER_INLINES_H_ +#define ODP_BUFFER_INLINES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <odp_buffer_internal.h> + +static inline odp_buffer_t odp_hdr_to_buf(odp_buffer_hdr_t *hdr) +{ + return (odp_buffer_t)hdr; +} + +static inline odp_buffer_hdr_t *buf_hdl_to_hdr(odp_buffer_t buf) +{ + return (odp_buffer_hdr_t *)(void *)buf; +} + +static inline odp_buffer_t buf_from_buf_hdr(odp_buffer_hdr_t *hdr) +{ + return (odp_buffer_t)hdr; +} + +static inline odp_event_type_t _odp_buffer_event_type(odp_buffer_t buf) +{ + return buf_hdl_to_hdr(buf)->event_type; +} + +static inline void _odp_buffer_event_type_set(odp_buffer_t buf, int ev) +{ + buf_hdl_to_hdr(buf)->event_type = ev; +} + - static inline odp_event_subtype_t _odp_buffer_event_subtype(odp_buffer_t buf) - { - return buf_hdl_to_hdr(buf)->event_subtype; - } - - static inline void _odp_buffer_event_subtype_set(odp_buffer_t buf, int ev) - { - buf_hdl_to_hdr(buf)->event_subtype = ev; - } - +#ifdef __cplusplus +} +#endif + +#endif diff --cc platform/linux-dpdk/m4/configure.m4 index 8c5e0670,00000000..08a6102a mode 100644,000000..100644 --- a/platform/linux-dpdk/m4/configure.m4 +++ b/platform/linux-dpdk/m4/configure.m4 @@@ -1,177 -1,0 +1,177 @@@ +# Enable -fvisibility=hidden if using a gcc that supports it +OLD_CFLAGS="$CFLAGS" +AC_MSG_CHECKING([whether $CC supports -fvisibility=hidden]) +VISIBILITY_CFLAGS="-fvisibility=hidden" +CFLAGS="$CFLAGS $VISIBILITY_CFLAGS" +AC_LINK_IFELSE([AC_LANG_PROGRAM()], AC_MSG_RESULT([yes]), + [VISIBILITY_CFLAGS=""; AC_MSG_RESULT([no])]); + +AC_SUBST(VISIBILITY_CFLAGS) +# Restore CFLAGS; VISIBILITY_CFLAGS are added to it where needed. +CFLAGS=$OLD_CFLAGS + +AC_MSG_CHECKING(for GCC atomic builtins) +AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [[int main() { + int v = 1; + __atomic_fetch_add(&v, 1, __ATOMIC_RELAXED); + __atomic_fetch_sub(&v, 1, __ATOMIC_RELAXED); + __atomic_store_n(&v, 1, __ATOMIC_RELAXED); + __atomic_load_n(&v, __ATOMIC_RELAXED); + return 0; + } + ]])], + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no) + echo "GCC-style __atomic builtins not supported by the compiler." + echo "Use newer version. For gcc > 4.7.0" + exit -1) + +dnl Check for libconfig (required) +PKG_CHECK_MODULES([LIBCONFIG], [libconfig >= 1.3.2]) + +dnl Check whether -latomic is needed +use_libatomic=no + +AC_MSG_CHECKING(whether -latomic is needed for 64-bit atomic built-ins) +AC_LINK_IFELSE( + [AC_LANG_SOURCE([[ + static int loc; + int main(void) + { + int prev = __atomic_exchange_n(&loc, 7, __ATOMIC_RELAXED); + return 0; + } + ]])], + [AC_MSG_RESULT(no)], + [AC_MSG_RESULT(yes) + AC_CHECK_LIB( + [atomic], [__atomic_exchange_8], + [use_libatomic=yes], + [AC_MSG_CHECKING([__atomic_exchange_8 is not available])]) + ]) + +AC_MSG_CHECKING(whether -latomic is needed for 128-bit atomic built-ins) +AC_LINK_IFELSE( + [AC_LANG_SOURCE([[ + static __int128 loc; + int main(void) + { + __int128 prev; + prev = __atomic_exchange_n(&loc, 7, __ATOMIC_RELAXED); + return 0; + } + ]])], + [AC_MSG_RESULT(no)], + [AC_MSG_RESULT(yes) + AC_CHECK_LIB( + [atomic], [__atomic_exchange_16], + [use_libatomic=yes], + [AC_MSG_CHECKING([cannot detect support for 128-bit atomics])]) + ]) + +if test "x$use_libatomic" = "xyes"; then + ATOMIC_LIBS="-latomic" +fi +AC_SUBST([ATOMIC_LIBS]) + +# linux-generic PCAP support is not relevant as the code doesn't use +# linux-generic pktio at all. And DPDK has its own PCAP support anyway +AM_CONDITIONAL([HAVE_PCAP], [false]) +AM_CONDITIONAL([netmap_support], [false]) +AM_CONDITIONAL([mdev_support], [false]) +AM_CONDITIONAL([PKTIO_DPDK], [false]) - m4_include([platform/linux-dpdk/m4/odp_pthread.m4]) ++ODP_PTHREAD +ODP_TIMER +ODP_OPENSSL +m4_include([platform/linux-dpdk/m4/odp_modules.m4]) +m4_include([platform/linux-dpdk/m4/odp_schedule.m4]) + +m4_include([platform/linux-dpdk/m4/performance.m4]) + +########################################################################## +# DPDK build variables +########################################################################## +DPDK_DRIVER_DIR=/usr/lib/$(uname -m)-linux-gnu +AS_CASE($host_cpu, [x86_64], [DPDK_CPPFLAGS="$DPDK_CPPFLAGS -msse4.2"]) +if test "x${SDK_INSTALL_PATH}" = "x"; then + DPDK_CPPFLAGS="$DPDK_CPPFLAGS -I/usr/include/dpdk" +else + DPDK_DRIVER_DIR=$SDK_INSTALL_PATH/lib + DPDK_CPPFLAGS="$DPDK_CPPFLAGS -I$SDK_INSTALL_PATH/include" + DPDK_LDFLAGS="$DPDK_CPPFLAGS -L$SDK_INSTALL_PATH/lib" +fi + +# Check if we should link against the static or dynamic DPDK library +AC_ARG_ENABLE([shared-dpdk], + [ --enable-shared-dpdk link against the shared DPDK library], + [if test "x$enableval" = "xyes"; then + shared_dpdk=true + fi]) + +########################################################################## +# Save and set temporary compilation flags +########################################################################## +OLD_LDFLAGS=$LDFLAGS +OLD_CPPFLAGS=$CPPFLAGS +LDFLAGS="$DPDK_LDFLAGS $LDFLAGS" +CPPFLAGS="$DPDK_CPPFLAGS $CPPFLAGS -pthread" + +########################################################################## +# Check for DPDK availability +########################################################################## +AC_CHECK_HEADERS([rte_config.h], [], + [AC_MSG_FAILURE(["can't find DPDK headers"])]) + +########################################################################## +# In case of static linking DPDK pmd drivers are not linked unless the +# --whole-archive option is used. No spaces are allowed between the +# --whole-arhive flags. +########################################################################## +if test "x$shared_dpdk" = "xtrue"; then + DPDK_LIBS="-Wl,--no-as-needed,-ldpdk,-as-needed -ldl -lm -lpcap" +else + + AS_VAR_SET([DPDK_PMDS], [-Wl,--whole-archive,]) + for filename in $DPDK_DRIVER_DIR/librte_pmd_*.a; do + cur_driver=`basename "$filename" .a | sed -e 's/^lib//'` + # rte_pmd_nfp has external dependencies which break linking + if test "$cur_driver" = "rte_pmd_nfp"; then + echo "skip linking rte_pmd_nfp" + else + AS_VAR_APPEND([DPDK_PMDS], [-l$cur_driver,]) + fi + done + AS_VAR_APPEND([DPDK_PMDS], [--no-whole-archive]) + + DPDK_LIBS="-L$DPDK_DRIVER_DIR -ldpdk -lpthread -ldl -lm -lpcap" + AC_SUBST([DPDK_PMDS]) +fi + +########################################################################## +# Restore old saved variables +########################################################################## +LDFLAGS=$OLD_LDFLAGS +CPPFLAGS=$OLD_CPPFLAGS + +AC_SUBST([DPDK_CPPFLAGS]) +AC_SUBST([DPDK_LDFLAGS]) +AC_SUBST([DPDK_LIBS]) + +AC_CONFIG_COMMANDS_PRE([dnl +AM_CONDITIONAL([PLATFORM_IS_LINUX_DPDK], + [test "${with_platform}" = "linux-dpdk"]) +]) + +AC_CONFIG_FILES([platform/linux-dpdk/Makefile + platform/linux-dpdk/libodp-dpdk.pc + platform/linux-dpdk/include/odp/api/plat/static_inline.h + platform/linux-dpdk/test/Makefile + platform/linux-dpdk/test/validation/api/pktio/Makefile]) + +########################################################################## +# Enable dpdk pktio build +########################################################################## +AC_DEFINE([ODP_PKTIO_DPDK], [1], + [Define to 1 to enable DPDK packet I/O support]) diff --cc platform/linux-dpdk/odp_crypto.c index 354c715c,00000000..45a9cfd8 mode 100644,000000..100644 --- a/platform/linux-dpdk/odp_crypto.c +++ b/platform/linux-dpdk/odp_crypto.c @@@ -1,1504 -1,0 +1,1502 @@@ +/* Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include <odp/api/crypto.h> +#include <odp_internal.h> +#include <odp/api/atomic.h> +#include <odp/api/spinlock.h> +#include <odp/api/sync.h> +#include <odp/api/debug.h> +#include <odp/api/align.h> +#include <odp/api/shared_memory.h> +#include <odp_crypto_internal.h> +#include <odp_debug_internal.h> +#include <odp/api/hints.h> +#include <odp/api/random.h> +#include <odp_packet_internal.h> +#include <rte_crypto.h> +#include <rte_cryptodev.h> + +#include <string.h> +#include <math.h> + +#include <openssl/rand.h> + +/* default number supported by DPDK crypto */ +#define MAX_SESSIONS 2048 +#define NB_MBUF 8192 + +enum crypto_chain_order { + CRYPTO_CHAIN_ONLY_CIPHER, + CRYPTO_CHAIN_ONLY_AUTH, + CRYPTO_CHAIN_CIPHER_AUTH, + CRYPTO_CHAIN_AUTH_CIPHER, + CRYPTO_CHAIN_NOT_SUPPORTED +}; + +typedef struct crypto_session_entry_s crypto_session_entry_t; +struct crypto_session_entry_s { + struct crypto_session_entry_s *next; + odp_crypto_session_param_t p; + uint64_t rte_session; + odp_bool_t do_cipher_first; + struct rte_crypto_sym_xform cipher_xform; + struct rte_crypto_sym_xform auth_xform; + struct { + uint8_t *data; + uint16_t length; + } iv; +}; + +struct crypto_global_s { + odp_spinlock_t lock; + uint8_t enabled_crypto_devs; + uint8_t enabled_crypto_dev_ids[RTE_CRYPTO_MAX_DEVS]; + crypto_session_entry_t *free; + crypto_session_entry_t sessions[MAX_SESSIONS]; + int is_crypto_dev_initialized; + struct rte_mempool *crypto_op_pool; +}; + +typedef struct crypto_global_s crypto_global_t; +static crypto_global_t *global; +static odp_shm_t crypto_global_shm; + +static inline int is_valid_size(uint16_t length, uint16_t min, + uint16_t max, uint16_t increment) +{ + uint16_t supp_size = min; + + if (length < supp_size) + return -1; + + for (; supp_size <= max; supp_size += increment) { + if (length == supp_size) + return 0; + } + + return -1; +} + +static int cipher_alg_odp_to_rte(odp_cipher_alg_t cipher_alg, + struct rte_crypto_sym_xform *cipher_xform) +{ + int rc = 0; + + switch (cipher_alg) { + case ODP_CIPHER_ALG_NULL: + cipher_xform->cipher.algo = RTE_CRYPTO_CIPHER_NULL; + break; + case ODP_CIPHER_ALG_DES: + case ODP_CIPHER_ALG_3DES_CBC: + cipher_xform->cipher.algo = RTE_CRYPTO_CIPHER_3DES_CBC; + break; + case ODP_CIPHER_ALG_AES_CBC: +#if ODP_DEPRECATED_API + case ODP_CIPHER_ALG_AES128_CBC: +#endif + cipher_xform->cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; + break; + case ODP_CIPHER_ALG_AES_GCM: +#if ODP_DEPRECATED_API + case ODP_CIPHER_ALG_AES128_GCM: +#endif + cipher_xform->cipher.algo = RTE_CRYPTO_CIPHER_AES_GCM; + break; + default: + rc = -1; + } + + return rc; +} + +static int auth_alg_odp_to_rte(odp_auth_alg_t auth_alg, + struct rte_crypto_sym_xform *auth_xform, + uint32_t auth_digest_len) +{ + int rc = 0; + + /* Process based on auth */ + switch (auth_alg) { + case ODP_AUTH_ALG_NULL: + auth_xform->auth.algo = RTE_CRYPTO_AUTH_NULL; + auth_xform->auth.digest_length = auth_digest_len; + break; +#if ODP_DEPRECATED_API + case ODP_AUTH_ALG_MD5_96: + auth_xform->auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC; + auth_xform->auth.digest_length = 12; + break; +#endif + case ODP_AUTH_ALG_MD5_HMAC: + auth_xform->auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC; + auth_xform->auth.digest_length = auth_digest_len; + break; +#if ODP_DEPRECATED_API + case ODP_AUTH_ALG_SHA256_128: + auth_xform->auth.algo = RTE_CRYPTO_AUTH_SHA256_HMAC; + auth_xform->auth.digest_length = 16; + break; +#endif + case ODP_AUTH_ALG_SHA256_HMAC: + auth_xform->auth.algo = RTE_CRYPTO_AUTH_SHA256_HMAC; + auth_xform->auth.digest_length = auth_digest_len; + break; + case ODP_AUTH_ALG_SHA1_HMAC: + auth_xform->auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; + auth_xform->auth.digest_length = auth_digest_len; + break; + case ODP_AUTH_ALG_SHA512_HMAC: + auth_xform->auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC; + auth_xform->auth.digest_length = auth_digest_len; + break; +#if ODP_DEPRECATED_API + case ODP_AUTH_ALG_AES128_GCM: + auth_xform->auth.algo = RTE_CRYPTO_AUTH_AES_GCM; + auth_xform->auth.digest_length = 16; + break; +#endif + case ODP_AUTH_ALG_AES_GCM: + auth_xform->auth.algo = RTE_CRYPTO_AUTH_AES_GCM; + auth_xform->auth.digest_length = auth_digest_len; + break; + default: + rc = -1; + } + + return rc; +} + +static crypto_session_entry_t *alloc_session(void) +{ + crypto_session_entry_t *session = NULL; + + odp_spinlock_lock(&global->lock); + session = global->free; + if (session) { + global->free = session->next; + session->next = NULL; + } + odp_spinlock_unlock(&global->lock); + + return session; +} + +static void free_session(crypto_session_entry_t *session) +{ + odp_spinlock_lock(&global->lock); + session->next = global->free; + global->free = session; + odp_spinlock_unlock(&global->lock); +} + +int odp_crypto_init_global(void) +{ + size_t mem_size; + int idx; + int16_t cdev_id, cdev_count; + int rc = -1; + unsigned cache_size = 0; + unsigned nb_queue_pairs = 0, queue_pair; + + /* Calculate the memory size we need */ + mem_size = sizeof(*global); + mem_size += (MAX_SESSIONS * sizeof(crypto_session_entry_t)); + + /* Allocate our globally shared memory */ + crypto_global_shm = odp_shm_reserve("crypto_pool", mem_size, + ODP_CACHE_LINE_SIZE, 0); + + if (crypto_global_shm != ODP_SHM_INVALID) { + global = odp_shm_addr(crypto_global_shm); + + if (global == NULL) { + ODP_ERR("Failed to find the reserved shm block"); + return -1; + } + } else { + ODP_ERR("Shared memory reserve failed.\n"); + return -1; + } + + /* Clear it out */ + memset(global, 0, mem_size); + + /* Initialize free list and lock */ + for (idx = 0; idx < MAX_SESSIONS; idx++) { + global->sessions[idx].next = global->free; + global->free = &global->sessions[idx]; + } + + global->enabled_crypto_devs = 0; + odp_spinlock_init(&global->lock); + + odp_spinlock_lock(&global->lock); + if (global->is_crypto_dev_initialized) + return 0; + + if (RTE_MEMPOOL_CACHE_MAX_SIZE > 0) { + unsigned j; + + j = ceil((double)NB_MBUF / RTE_MEMPOOL_CACHE_MAX_SIZE); + j = RTE_MAX(j, 2UL); + for (; j <= (NB_MBUF / 2); ++j) + if ((NB_MBUF % j) == 0) { + cache_size = NB_MBUF / j; + break; + } + if (odp_unlikely(cache_size > RTE_MEMPOOL_CACHE_MAX_SIZE || + (uint32_t)cache_size * 1.5 > NB_MBUF)) { + ODP_ERR("cache_size calc failure: %d\n", cache_size); + cache_size = 0; + } + } + + cdev_count = rte_cryptodev_count(); + if (cdev_count == 0) { + printf("No crypto devices available\n"); + return 0; + } + + for (cdev_id = cdev_count - 1; cdev_id >= 0; cdev_id--) { + struct rte_cryptodev_info dev_info; + + rte_cryptodev_info_get(cdev_id, &dev_info); + nb_queue_pairs = odp_cpu_count(); + if (nb_queue_pairs > dev_info.max_nb_queue_pairs) + nb_queue_pairs = dev_info.max_nb_queue_pairs; + + struct rte_cryptodev_qp_conf qp_conf; + + struct rte_cryptodev_config conf = { + .nb_queue_pairs = nb_queue_pairs, + .socket_id = SOCKET_ID_ANY, + .session_mp = { + .nb_objs = NB_MBUF, + .cache_size = cache_size + } + }; + + rc = rte_cryptodev_configure(cdev_id, &conf); + if (rc < 0) { + ODP_ERR("Failed to configure cryptodev %u", cdev_id); + return -1; + } + + qp_conf.nb_descriptors = NB_MBUF; + + for (queue_pair = 0; queue_pair < nb_queue_pairs; + queue_pair++) { + rc = rte_cryptodev_queue_pair_setup(cdev_id, + queue_pair, + &qp_conf, + SOCKET_ID_ANY); + if (rc < 0) { + ODP_ERR("Fail to setup queue pair %u on dev %u", + queue_pair, cdev_id); + return -1; + } + } + + rc = rte_cryptodev_start(cdev_id); + if (rc < 0) { + ODP_ERR("Failed to start device %u: error %d\n", + cdev_id, rc); + return -1; + } + + global->enabled_crypto_devs++; + global->enabled_crypto_dev_ids[ + global->enabled_crypto_devs - 1] = cdev_id; + } + + /* create crypto op pool */ + global->crypto_op_pool = rte_crypto_op_pool_create("crypto_op_pool", + RTE_CRYPTO_OP_TYPE_SYMMETRIC, + NB_MBUF, cache_size, 0, + rte_socket_id()); + + if (global->crypto_op_pool == NULL) { + ODP_ERR("Cannot create crypto op pool\n"); + return -1; + } + + global->is_crypto_dev_initialized = 1; + odp_spinlock_unlock(&global->lock); + + return 0; +} + +int odp_crypto_capability(odp_crypto_capability_t *capability) +{ + uint8_t i, cdev_id, cdev_count; + const struct rte_cryptodev_capabilities *cap; + enum rte_crypto_auth_algorithm cap_auth_algo; + enum rte_crypto_cipher_algorithm cap_cipher_algo; + + if (NULL == capability) + return -1; + + /* Initialize crypto capability structure */ + memset(capability, 0, sizeof(odp_crypto_capability_t)); + + cdev_count = rte_cryptodev_count(); + if (cdev_count == 0) { + ODP_ERR("No crypto devices available\n"); + return -1; + } + + for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) { + struct rte_cryptodev_info dev_info; + + rte_cryptodev_info_get(cdev_id, &dev_info); + i = 0; + cap = &dev_info.capabilities[i]; + if ((dev_info.feature_flags & + RTE_CRYPTODEV_FF_HW_ACCELERATED)) { + odp_crypto_cipher_algos_t *hw_ciphers; + + hw_ciphers = &capability->hw_ciphers; + while (cap->op != RTE_CRYPTO_OP_TYPE_UNDEFINED) { + cap_cipher_algo = cap->sym.cipher.algo; + if (cap->sym.xform_type == + RTE_CRYPTO_SYM_XFORM_CIPHER) { + if (cap_cipher_algo == + RTE_CRYPTO_CIPHER_NULL) { + hw_ciphers->bit.null = 1; + } + if (cap_cipher_algo == + RTE_CRYPTO_CIPHER_3DES_CBC) { + hw_ciphers->bit.trides_cbc = 1; + hw_ciphers->bit.des = 1; + } + if (cap_cipher_algo == + RTE_CRYPTO_CIPHER_AES_CBC) { + hw_ciphers->bit.aes_cbc = 1; +#if ODP_DEPRECATED_API + hw_ciphers->bit.aes128_cbc = 1; +#endif + } + if (cap_cipher_algo == + RTE_CRYPTO_CIPHER_AES_GCM) { + hw_ciphers->bit.aes_gcm = 1; +#if ODP_DEPRECATED_API + hw_ciphers->bit.aes128_gcm = 1; +#endif + } + } + + cap_auth_algo = cap->sym.auth.algo; + if (cap->sym.xform_type == + RTE_CRYPTO_SYM_XFORM_AUTH) { + odp_crypto_auth_algos_t *hw_auths; + + hw_auths = &capability->hw_auths; + if (cap_auth_algo == + RTE_CRYPTO_AUTH_NULL) { + hw_auths->bit.null = 1; + } + if (cap_auth_algo == + RTE_CRYPTO_AUTH_AES_GCM) { + hw_auths->bit.aes_gcm = 1; +#if ODP_DEPRECATED_API + hw_auths->bit.aes128_gcm = 1; +#endif + } + if (cap_auth_algo == + RTE_CRYPTO_AUTH_MD5_HMAC) { + hw_auths->bit.md5_hmac = 1; +#if ODP_DEPRECATED_API + hw_auths->bit.md5_96 = 1; +#endif + } + if (cap_auth_algo == + RTE_CRYPTO_AUTH_SHA256_HMAC) { + hw_auths->bit.sha256_hmac = 1; +#if ODP_DEPRECATED_API + hw_auths->bit.sha256_128 = 1; +#endif + } + if (cap_auth_algo == + RTE_CRYPTO_AUTH_SHA1_HMAC) { + hw_auths->bit.sha1_hmac = 1; + } + if (cap_auth_algo == + RTE_CRYPTO_AUTH_SHA512_HMAC) { + hw_auths->bit.sha512_hmac = 1; + } + } + cap = &dev_info.capabilities[++i]; + } + } else { + while (cap->op != RTE_CRYPTO_OP_TYPE_UNDEFINED) { + odp_crypto_cipher_algos_t *ciphers; + + ciphers = &capability->ciphers; + cap_cipher_algo = cap->sym.cipher.algo; + if (cap->sym.xform_type == + RTE_CRYPTO_SYM_XFORM_CIPHER) { + if (cap_cipher_algo == + RTE_CRYPTO_CIPHER_NULL) { + ciphers->bit.null = 1; + } + if (cap_cipher_algo == + RTE_CRYPTO_CIPHER_3DES_CBC) { + ciphers->bit.trides_cbc = 1; + ciphers->bit.des = 1; + } + if (cap_cipher_algo == + RTE_CRYPTO_CIPHER_AES_CBC) { + ciphers->bit.aes_cbc = 1; +#if ODP_DEPRECATED_API + ciphers->bit.aes128_cbc = 1; +#endif + } + if (cap_cipher_algo == + RTE_CRYPTO_CIPHER_AES_GCM) { + ciphers->bit.aes_gcm = 1; +#if ODP_DEPRECATED_API + ciphers->bit.aes128_gcm = 1; +#endif + } + } + + cap_auth_algo = cap->sym.auth.algo; + if (cap->sym.xform_type == + RTE_CRYPTO_SYM_XFORM_AUTH) { + odp_crypto_auth_algos_t *auths; + + auths = &capability->auths; + if (cap_auth_algo == + RTE_CRYPTO_AUTH_NULL) { + auths->bit.null = 1; + } + if (cap_auth_algo == + RTE_CRYPTO_AUTH_AES_GCM) { + auths->bit.aes_gcm = 1; +#if ODP_DEPRECATED_API + auths->bit.aes128_gcm = 1; +#endif + } + if (cap_auth_algo == + RTE_CRYPTO_AUTH_MD5_HMAC) { + auths->bit.md5_hmac = 1; +#if ODP_DEPRECATED_API + auths->bit.md5_96 = 1; +#endif + } + if (cap_auth_algo == + RTE_CRYPTO_AUTH_SHA256_HMAC) { + auths->bit.sha256_hmac = 1; +#if ODP_DEPRECATED_API + auths->bit.sha256_128 = 1; +#endif + } + if (cap_auth_algo == + RTE_CRYPTO_AUTH_SHA1_HMAC) { + auths->bit.sha1_hmac = 1; + } + if (cap_auth_algo == + RTE_CRYPTO_AUTH_SHA512_HMAC) { + auths->bit.sha512_hmac = 1; + } + } + cap = &dev_info.capabilities[++i]; + } + } + + /* Read from the device with the lowest max_nb_sessions */ + if (capability->max_sessions > dev_info.sym.max_nb_sessions) + capability->max_sessions = dev_info.sym.max_nb_sessions; + + if (capability->max_sessions == 0) + capability->max_sessions = dev_info.sym.max_nb_sessions; + } + + /* Make sure the session count doesn't exceed MAX_SESSIONS */ + if (capability->max_sessions > MAX_SESSIONS) + capability->max_sessions = MAX_SESSIONS; + + return 0; +} + +int odp_crypto_cipher_capability(odp_cipher_alg_t cipher, + odp_crypto_cipher_capability_t dst[], + int num_copy) +{ + odp_crypto_cipher_capability_t src[num_copy]; + int idx = 0, rc = 0; + int size = sizeof(odp_crypto_cipher_capability_t); + + uint8_t i, cdev_id, cdev_count; + const struct rte_cryptodev_capabilities *cap; + enum rte_crypto_cipher_algorithm cap_cipher_algo; + struct rte_crypto_sym_xform cipher_xform; + + rc = cipher_alg_odp_to_rte(cipher, &cipher_xform); + + /* Check result */ + if (rc) + return -1; + + cdev_count = rte_cryptodev_count(); + if (cdev_count == 0) { + ODP_ERR("No crypto devices available\n"); + return -1; + } + + for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) { + struct rte_cryptodev_info dev_info; + + rte_cryptodev_info_get(cdev_id, &dev_info); + i = 0; + cap = &dev_info.capabilities[i]; + while (cap->op != RTE_CRYPTO_OP_TYPE_UNDEFINED) { + if (cap->sym.xform_type == + RTE_CRYPTO_SYM_XFORM_CIPHER) { + cap_cipher_algo = cap->sym.cipher.algo; + if (cap_cipher_algo == cipher_xform.cipher.algo) + break; + } + cap = &dev_info.capabilities[++i]; + } + + if (cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) + continue; + + uint32_t key_size_min = cap->sym.cipher.key_size.min; + uint32_t key_size_max = cap->sym.cipher.key_size.max; + uint32_t key_inc = cap->sym.cipher.key_size.increment; + uint32_t iv_size_max = cap->sym.cipher.iv_size.max; + uint32_t iv_size_min = cap->sym.cipher.iv_size.min; + uint32_t iv_inc = cap->sym.cipher.iv_size.increment; + + for (uint32_t key_len = key_size_min; key_len <= key_size_max; + key_len += key_inc) { + for (uint32_t iv_size = iv_size_min; + iv_size <= iv_size_max; iv_size += iv_inc) { + src[idx].key_len = key_len; + src[idx].iv_len = iv_size; + idx++; + if (iv_inc == 0) + break; + } + + if (key_inc == 0) + break; + } + } + + if (idx < num_copy) + num_copy = idx; + + memcpy(dst, src, num_copy * size); + + return idx; +} + +int odp_crypto_auth_capability(odp_auth_alg_t auth, + odp_crypto_auth_capability_t dst[], + int num_copy) +{ + odp_crypto_auth_capability_t src[num_copy]; + int idx = 0, rc = 0; + int size = sizeof(odp_crypto_auth_capability_t); + + uint8_t i, cdev_id, cdev_count; + const struct rte_cryptodev_capabilities *cap; + enum rte_crypto_auth_algorithm cap_auth_algo; + struct rte_crypto_sym_xform auth_xform; + + rc = auth_alg_odp_to_rte(auth, &auth_xform, 0); + + /* Check result */ + if (rc) + return -1; + + cdev_count = rte_cryptodev_count(); + if (cdev_count == 0) { + ODP_ERR("No crypto devices available\n"); + return -1; + } + + for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) { + struct rte_cryptodev_info dev_info; + + rte_cryptodev_info_get(cdev_id, &dev_info); + i = 0; + cap = &dev_info.capabilities[i]; + while (cap->op != RTE_CRYPTO_OP_TYPE_UNDEFINED) { + cap_auth_algo = cap->sym.auth.algo; + if (cap->sym.xform_type == + RTE_CRYPTO_SYM_XFORM_AUTH) { + if (cap_auth_algo == auth_xform.auth.algo) + break; + } + cap = &dev_info.capabilities[++i]; + } + + if (cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) + continue; + + uint8_t key_size_min = cap->sym.auth.key_size.min; + uint8_t key_size_max = cap->sym.auth.key_size.max; + uint8_t increment = cap->sym.auth.key_size.increment; + uint8_t digest_size_max = cap->sym.auth.digest_size.max; + + if (key_size_min == key_size_max) { + src[idx].key_len = key_size_min; + src[idx].digest_len = digest_size_max; + src[idx].aad_len.min = cap->sym.auth.aad_size.min; + src[idx].aad_len.max = cap->sym.auth.aad_size.max; + src[idx].aad_len.inc = cap->sym.auth.aad_size.increment; + idx++; + } else { + for (uint8_t key_len = key_size_min; + key_len <= key_size_max; + key_len += increment) { + idx = (key_len - key_size_min) / increment; + src[idx].key_len = key_len; + src[idx].digest_len = digest_size_max; + src[idx].aad_len.min = + cap->sym.auth.aad_size.min; + src[idx].aad_len.max = + cap->sym.auth.aad_size.max; + src[idx].aad_len.inc = + cap->sym.auth.aad_size.increment; + idx++; + } + } + } + + if (idx < num_copy) + num_copy = idx; + + memcpy(dst, src, num_copy * size); + + return idx; +} + +static int get_crypto_dev(struct rte_crypto_sym_xform *first_xform, + enum crypto_chain_order order, + uint16_t iv_length, uint8_t *dev_id) +{ + uint8_t cdev_id, id; + const struct rte_cryptodev_capabilities *cap; + struct rte_crypto_sym_xform *auth_xform = NULL; + struct rte_crypto_sym_xform *cipher_xform = NULL; + enum rte_crypto_cipher_algorithm cap_cipher_algo; + enum rte_crypto_auth_algorithm cap_auth_algo; + enum rte_crypto_cipher_algorithm app_cipher_algo; + enum rte_crypto_auth_algorithm app_auth_algo; + + switch (order) { + case CRYPTO_CHAIN_ONLY_CIPHER: + cipher_xform = first_xform; + break; + case CRYPTO_CHAIN_ONLY_AUTH: + auth_xform = first_xform; + break; + case CRYPTO_CHAIN_CIPHER_AUTH: + cipher_xform = first_xform; + auth_xform = first_xform->next; + break; + case CRYPTO_CHAIN_AUTH_CIPHER: + auth_xform = first_xform; + cipher_xform = first_xform->next; + break; + default: + return -1; + } + + for (id = 0; id < global->enabled_crypto_devs; id++) { + struct rte_cryptodev_info dev_info; + int i = 0; + + cdev_id = global->enabled_crypto_dev_ids[id]; + rte_cryptodev_info_get(cdev_id, &dev_info); + cap = &dev_info.capabilities[i]; + while (cipher_xform && cap->op != + RTE_CRYPTO_OP_TYPE_UNDEFINED) { + if (cap->sym.xform_type == + RTE_CRYPTO_SYM_XFORM_CIPHER) { + app_cipher_algo = cipher_xform->cipher.algo; + cap_cipher_algo = cap->sym.cipher.algo; + if (cap_cipher_algo == app_cipher_algo) + break; + } + cap = &dev_info.capabilities[++i]; + } + + if (cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) + continue; + + if (cipher_xform) { + /* Check if key size is supported by the algorithm. */ + if (cipher_xform->cipher.key.length) { + if (is_valid_size( + cipher_xform->cipher.key.length, + cap->sym.cipher.key_size.min, + cap->sym.cipher.key_size.max, + cap->sym.cipher.key_size. + increment) != 0) { + ODP_ERR("Invalid cipher key length\n"); + return -1; + } + /* No size provided, use minimum size. */ + } else + cipher_xform->cipher.key.length = + cap->sym.cipher.key_size.min; + + /* Check if iv length is supported by the algorithm. */ + if (is_valid_size(iv_length, + cap->sym.cipher.iv_size.min, + cap->sym.cipher.iv_size.max, + cap->sym.cipher.iv_size. + increment) != 0) { + ODP_ERR("Invalid iv length\n"); + return -1; + } + } + + if (cipher_xform && !auth_xform) { + memcpy(dev_id, &cdev_id, sizeof(cdev_id)); + return 0; + } + + i = 0; + cap = &dev_info.capabilities[i]; + while (auth_xform && cap->op != RTE_CRYPTO_OP_TYPE_UNDEFINED) { + if ((cap->sym.xform_type == + RTE_CRYPTO_SYM_XFORM_AUTH)) { + app_auth_algo = auth_xform->auth.algo; + cap_auth_algo = cap->sym.auth.algo; + if (cap_auth_algo == app_auth_algo) + break; + } + cap = &dev_info.capabilities[++i]; + } + + if (cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) + continue; + + /* Check if key size is supported by the algorithm. */ + if (auth_xform->auth.key.length) { + if (is_valid_size(auth_xform->auth.key.length, + cap->sym.auth.key_size.min, + cap->sym.auth.key_size.max, + cap->sym.auth.key_size. + increment) != 0) { + ODP_ERR("Unsupported auth key length\n"); + return -1; + } + /* No size provided, use minimum size. */ + } else + auth_xform->auth.key.length = + cap->sym.auth.key_size.min; + + /* Check if digest size is supported by the algorithm. */ + if (auth_xform->auth.digest_length) { + if (is_valid_size(auth_xform->auth.digest_length, + cap->sym.auth.digest_size.min, + cap->sym.auth.digest_size.max, + cap->sym.auth.digest_size. + increment) != 0) { + ODP_ERR("Unsupported digest length\n"); + return -1; + } + /* No size provided, use minimum size. */ + } else + auth_xform->auth.digest_length = + cap->sym.auth.digest_size.min; + + memcpy(dev_id, &cdev_id, sizeof(cdev_id)); + return 0; + } + + return -1; +} + +static enum crypto_chain_order set_chain_order( + odp_bool_t do_cipher_first, + struct rte_crypto_sym_xform **first_xform, + struct rte_crypto_sym_xform *auth_xform, + struct rte_crypto_sym_xform *cipher_xform) +{ + /* Process based on cipher */ + /* Derive order */ + if (do_cipher_first) { + if (auth_xform->auth.algo != RTE_CRYPTO_AUTH_NULL && + cipher_xform->cipher.algo != RTE_CRYPTO_CIPHER_NULL) { + *first_xform = cipher_xform; + (*first_xform)->next = auth_xform; + return CRYPTO_CHAIN_CIPHER_AUTH; + } + } else { + if (auth_xform->auth.algo != RTE_CRYPTO_AUTH_NULL && + cipher_xform->cipher.algo != RTE_CRYPTO_CIPHER_NULL) { + *first_xform = auth_xform; + (*first_xform)->next = cipher_xform; + return CRYPTO_CHAIN_AUTH_CIPHER; + } + } + + if (auth_xform->auth.algo == RTE_CRYPTO_AUTH_NULL) { + *first_xform = cipher_xform; + (*first_xform)->next = NULL; + return CRYPTO_CHAIN_ONLY_CIPHER; + } else if (cipher_xform->cipher.algo == RTE_CRYPTO_CIPHER_NULL) { + *first_xform = auth_xform; + (*first_xform)->next = NULL; + return CRYPTO_CHAIN_ONLY_AUTH; + } + + return CRYPTO_CHAIN_NOT_SUPPORTED; +} + +int odp_crypto_session_create(odp_crypto_session_param_t *param, + odp_crypto_session_t *session_out, + odp_crypto_ses_create_err_t *status) +{ + int rc = 0; + uint8_t cdev_id = 0; + struct rte_crypto_sym_xform cipher_xform; + struct rte_crypto_sym_xform auth_xform; + struct rte_crypto_sym_xform *first_xform = NULL; + struct rte_cryptodev_sym_session *session; + enum crypto_chain_order order = CRYPTO_CHAIN_NOT_SUPPORTED; + crypto_session_entry_t *entry; + + *session_out = ODP_CRYPTO_SESSION_INVALID; + + if (rte_cryptodev_count() == 0) { + ODP_ERR("No crypto devices available\n"); + return -1; + } + + /* Allocate memory for this session */ + entry = alloc_session(); + if (entry == NULL) { + ODP_ERR("Failed to allocate a session entry"); + return -1; + } + + /* Copy parameters */ + entry->p = *param; + + /* Default to successful result */ + *status = ODP_CRYPTO_SES_CREATE_ERR_NONE; + + cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; + cipher_xform.next = NULL; + rc = cipher_alg_odp_to_rte(param->cipher_alg, &cipher_xform); + + /* Check result */ + if (rc) { + *status = ODP_CRYPTO_SES_CREATE_ERR_INV_CIPHER; + /* remove the crypto_session_entry_t */ + memset(entry, 0, sizeof(*entry)); + free_session(entry); + return -1; + } + + if (param->cipher_key.length) { + /* Cipher Data */ + cipher_xform.cipher.key.data = rte_malloc("crypto key", + param->cipher_key.length, 0); + if (cipher_xform.cipher.key.data == NULL) { + ODP_ERR("Failed to allocate memory for cipher key\n"); + /* remove the crypto_session_entry_t */ + memset(entry, 0, sizeof(*entry)); + free_session(entry); + return -1; + } + + cipher_xform.cipher.key.length = param->cipher_key.length; + memcpy(cipher_xform.cipher.key.data, + param->cipher_key.data, + param->cipher_key.length); + } else { + cipher_xform.cipher.key.length = 0; + cipher_xform.cipher.key.data = 0; + } + + auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; + auth_xform.next = NULL; + rc = auth_alg_odp_to_rte(param->auth_alg, + &auth_xform, + param->auth_digest_len); + + /* Check result */ + if (rc) { + *status = ODP_CRYPTO_SES_CREATE_ERR_INV_AUTH; + /* remove the crypto_session_entry_t */ + memset(entry, 0, sizeof(*entry)); + free_session(entry); + return -1; + } + + if (param->auth_key.length) { + /* Authentication Data */ + auth_xform.auth.key.data = rte_malloc("auth key", + param->auth_key.length, 0); + if (auth_xform.auth.key.data == NULL) { + ODP_ERR("Failed to allocate memory for auth key\n"); + /* remove the crypto_session_entry_t */ + memset(entry, 0, sizeof(*entry)); + free_session(entry); + return -1; + } + auth_xform.auth.key.length = param->auth_key.length; + memcpy(auth_xform.auth.key.data, + param->auth_key.data, + param->auth_key.length); + } else { + auth_xform.auth.key.data = 0; + auth_xform.auth.key.length = 0; + } + + + /* Derive order */ + if (ODP_CRYPTO_OP_ENCODE == param->op) { + cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; + auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; + entry->do_cipher_first = param->auth_cipher_text; + } else { + cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; + auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; + entry->do_cipher_first = !param->auth_cipher_text; + } + + order = set_chain_order(entry->do_cipher_first, + &first_xform, + &auth_xform, + &cipher_xform); + if (order == CRYPTO_CHAIN_NOT_SUPPORTED) { + ODP_ERR("Couldn't set chain order"); + /* remove the crypto_session_entry_t */ + memset(entry, 0, sizeof(*entry)); + free_session(entry); + return -1; + } + + rc = get_crypto_dev(first_xform, + order, + param->iv.length, + &cdev_id); + + if (rc) { + ODP_ERR("Couldn't find a crypto device"); + /* remove the crypto_session_entry_t */ + memset(entry, 0, sizeof(*entry)); + free_session(entry); + return -1; + } + + /* Setup session */ + session = rte_cryptodev_sym_session_create(cdev_id, first_xform); + + if (session == NULL) { + /* remove the crypto_session_entry_t */ + memset(entry, 0, sizeof(*entry)); + free_session(entry); + return -1; + } + + entry->rte_session = (intptr_t)session; + entry->cipher_xform = cipher_xform; + entry->auth_xform = auth_xform; + entry->iv.length = param->iv.length; + entry->iv.data = param->iv.data; + + /* We're happy */ + *session_out = (intptr_t)entry; + + return 0; +} + +int odp_crypto_session_destroy(odp_crypto_session_t session) +{ + struct rte_cryptodev_sym_session *rte_session = NULL; + crypto_session_entry_t *entry; + + entry = (crypto_session_entry_t *)session; + + rte_session = + (struct rte_cryptodev_sym_session *) + (intptr_t)entry->rte_session; + + rte_session = rte_cryptodev_sym_session_free(rte_session->dev_id, + rte_session); + + if (rte_session != NULL) + return -1; + + /* remove the crypto_session_entry_t */ + memset(entry, 0, sizeof(*entry)); + free_session(entry); + + return 0; +} + +int odp_crypto_operation(odp_crypto_op_param_t *param, + odp_bool_t *posted, + odp_crypto_op_result_t *result) +{ + odp_crypto_packet_op_param_t packet_param; + odp_packet_t out_pkt = param->out_pkt; + odp_crypto_packet_result_t packet_result; + odp_crypto_op_result_t local_result; + int rc; + + packet_param.session = param->session; + packet_param.override_iv_ptr = param->override_iv_ptr; + packet_param.hash_result_offset = param->hash_result_offset; + packet_param.aad.ptr = param->aad.ptr; + packet_param.aad.length = param->aad.length; + packet_param.cipher_range = param->cipher_range; + packet_param.auth_range = param->auth_range; + + rc = odp_crypto_op(¶m->pkt, &out_pkt, &packet_param, 1); + if (rc < 0) + return rc; + + rc = odp_crypto_result(&packet_result, out_pkt); + if (rc < 0) + return rc; + + /* Indicate to caller operation was sync */ + *posted = 0; + - _odp_buffer_event_subtype_set(packet_to_buffer(out_pkt), - ODP_EVENT_PACKET_BASIC); ++ packet_subtype_set(out_pkt, ODP_EVENT_PACKET_BASIC); + + /* Fill in result */ + local_result.ctx = param->ctx; + local_result.pkt = out_pkt; + local_result.cipher_status = packet_result.cipher_status; + local_result.auth_status = packet_result.auth_status; + local_result.ok = packet_result.ok; + + /* + * Be bug-to-bug compatible. Return output packet also through params. + */ + param->out_pkt = out_pkt; + + *result = local_result; + + return 0; +} + +int odp_crypto_term_global(void) +{ + int rc = 0; + int ret; + int count = 0; + crypto_session_entry_t *session; + + odp_spinlock_init(&global->lock); + odp_spinlock_lock(&global->lock); + for (session = global->free; session != NULL; session = session->next) + count++; + if (count != MAX_SESSIONS) { + ODP_ERR("crypto sessions still active\n"); + rc = -1; + } + + if (global->crypto_op_pool != NULL) + rte_mempool_free(global->crypto_op_pool); + + odp_spinlock_unlock(&global->lock); + + ret = odp_shm_free(crypto_global_shm); + if (ret < 0) { + ODP_ERR("shm free failed for crypto_pool\n"); + rc = -1; + } + + return rc; +} + +odp_random_kind_t odp_random_max_kind(void) +{ + return ODP_RANDOM_CRYPTO; +} + +int32_t odp_random_data(uint8_t *buf, uint32_t len, odp_random_kind_t kind) +{ + int rc; + + switch (kind) { + case ODP_RANDOM_BASIC: + case ODP_RANDOM_CRYPTO: + rc = RAND_bytes(buf, len); + return (1 == rc) ? (int)len /*success*/: -1 /*failure*/; + + case ODP_RANDOM_TRUE: + default: + return -1; + } +} + +int32_t odp_random_test_data(uint8_t *buf, uint32_t len, uint64_t *seed) +{ + union { + uint32_t rand_word; + uint8_t rand_byte[4]; + } u; + uint32_t i = 0, j; + uint32_t seed32 = (*seed) & 0xffffffff; + + while (i < len) { + u.rand_word = rand_r(&seed32); + + for (j = 0; j < 4 && i < len; j++, i++) + *buf++ = u.rand_byte[j]; + } + + *seed = seed32; + return len; +} + +odp_crypto_compl_t odp_crypto_compl_from_event(odp_event_t ev) +{ + /* This check not mandated by the API specification */ + if (odp_event_type(ev) != ODP_EVENT_CRYPTO_COMPL) + ODP_ABORT("Event not a crypto completion"); + return (odp_crypto_compl_t)ev; +} + +odp_event_t odp_crypto_compl_to_event(odp_crypto_compl_t completion_event) +{ + return (odp_event_t)completion_event; +} + +void odp_crypto_compl_result(odp_crypto_compl_t completion_event, + odp_crypto_op_result_t *result) +{ + (void)completion_event; + (void)result; + + /* We won't get such events anyway, so there can be no result */ + ODP_ASSERT(0); +} + +void odp_crypto_compl_free(odp_crypto_compl_t completion_event) +{ + odp_event_t ev = odp_crypto_compl_to_event(completion_event); + + odp_buffer_free(odp_buffer_from_event(ev)); +} + +void odp_crypto_session_param_init(odp_crypto_session_param_t *param) +{ + memset(param, 0, sizeof(odp_crypto_session_param_t)); +} + +uint64_t odp_crypto_session_to_u64(odp_crypto_session_t hdl) +{ + return (uint64_t)hdl; +} + +uint64_t odp_crypto_compl_to_u64(odp_crypto_compl_t hdl) +{ + return _odp_pri(hdl); +} + +odp_packet_t odp_crypto_packet_from_event(odp_event_t ev) +{ + /* This check not mandated by the API specification */ + ODP_ASSERT(odp_event_type(ev) == ODP_EVENT_PACKET); + ODP_ASSERT(odp_event_subtype(ev) == ODP_EVENT_PACKET_CRYPTO); + + return odp_packet_from_event(ev); +} + +odp_event_t odp_crypto_packet_to_event(odp_packet_t pkt) +{ + return odp_packet_to_event(pkt); +} + +static +odp_crypto_packet_result_t *get_op_result_from_packet(odp_packet_t pkt) +{ + odp_packet_hdr_t *hdr = odp_packet_hdr(pkt); + + return &hdr->crypto_op_result; +} + +int odp_crypto_result(odp_crypto_packet_result_t *result, + odp_packet_t packet) +{ + odp_crypto_packet_result_t *op_result; + + ODP_ASSERT(odp_event_subtype(odp_packet_to_event(packet)) == + ODP_EVENT_PACKET_CRYPTO); + + op_result = get_op_result_from_packet(packet); + + memcpy(result, op_result, sizeof(*result)); + + return 0; +} + +static +int odp_crypto_int(odp_packet_t pkt_in, + odp_packet_t *pkt_out, + const odp_crypto_packet_op_param_t *param) +{ + crypto_session_entry_t *entry; + odp_crypto_packet_result_t local_result; + odp_crypto_alg_err_t rc_cipher = ODP_CRYPTO_ALG_ERR_NONE; + odp_crypto_alg_err_t rc_auth = ODP_CRYPTO_ALG_ERR_NONE; + struct rte_crypto_sym_xform cipher_xform; + struct rte_crypto_sym_xform auth_xform; + struct rte_cryptodev_sym_session *rte_session = NULL; + uint8_t *data_addr, *aad_head; + struct rte_crypto_op *op; + uint32_t aad_len; + odp_bool_t allocated = false; + odp_packet_t out_pkt = *pkt_out; + odp_crypto_packet_result_t *op_result; + uint16_t rc; + + entry = (crypto_session_entry_t *)(intptr_t)param->session; + if (entry == NULL) + return -1; + + rte_session = + (struct rte_cryptodev_sym_session *) + (intptr_t)entry->rte_session; + + if (rte_session == NULL) + return -1; + + cipher_xform = entry->cipher_xform; + auth_xform = entry->auth_xform; + + /* Resolve output buffer */ + if (ODP_PACKET_INVALID == out_pkt && + ODP_POOL_INVALID != entry->p.output_pool) { + out_pkt = odp_packet_alloc(entry->p.output_pool, + odp_packet_len(pkt_in)); + allocated = true; + } + + if (pkt_in != out_pkt) { + if (odp_unlikely(ODP_PACKET_INVALID == out_pkt)) + ODP_ABORT(); + int ret; + + ret = odp_packet_copy_from_pkt(out_pkt, + 0, + pkt_in, + 0, + odp_packet_len(pkt_in)); + if (odp_unlikely(ret < 0)) + goto err; + + _odp_packet_copy_md_to_packet(pkt_in, out_pkt); + odp_packet_free(pkt_in); + pkt_in = ODP_PACKET_INVALID; + } + + data_addr = odp_packet_data(out_pkt); + + odp_spinlock_init(&global->lock); + odp_spinlock_lock(&global->lock); + op = rte_crypto_op_alloc(global->crypto_op_pool, + RTE_CRYPTO_OP_TYPE_SYMMETRIC); + if (op == NULL) { + ODP_ERR("Failed to allocate crypto operation"); + goto err; + } + + op->sym->auth.aad.data = NULL; + op->sym->cipher.iv.data = NULL; + + odp_spinlock_unlock(&global->lock); + + /* Set crypto operation data parameters */ + rte_crypto_op_attach_sym_session(op, rte_session); + op->sym->auth.digest.data = data_addr + param->hash_result_offset; + op->sym->auth.digest.phys_addr = + rte_pktmbuf_mtophys_offset((struct rte_mbuf *)out_pkt, + odp_packet_len(out_pkt) - + auth_xform.auth.digest_length); + op->sym->auth.digest.length = auth_xform.auth.digest_length; + + /* For SNOW3G algorithms, offset/length must be in bits */ + if (auth_xform.auth.algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2) { + op->sym->auth.data.offset = param->auth_range.offset << 3; + op->sym->auth.data.length = param->auth_range.length << 3; + } else { + op->sym->auth.data.offset = param->auth_range.offset; + op->sym->auth.data.length = param->auth_range.length; + } + + aad_head = param->aad.ptr; + aad_len = param->aad.length; + + if (aad_len > 0) { + op->sym->auth.aad.data = rte_malloc("aad", aad_len, 0); + if (op->sym->auth.aad.data == NULL) { + ODP_ERR("Failed to allocate memory for AAD"); + goto err_op_free; + } + + memcpy(op->sym->auth.aad.data, aad_head, aad_len); + op->sym->auth.aad.phys_addr = + rte_malloc_virt2phy(op->sym->auth.aad.data); + op->sym->auth.aad.length = aad_len; + } + + + if (entry->iv.length) { + op->sym->cipher.iv.data = rte_malloc("iv", entry->iv.length, 0); + if (op->sym->cipher.iv.data == NULL) { + ODP_ERR("Failed to allocate memory for IV"); + goto err_op_free; + } + } + + if (param->override_iv_ptr) { + memcpy(op->sym->cipher.iv.data, + param->override_iv_ptr, + entry->iv.length); + op->sym->cipher.iv.phys_addr = + rte_malloc_virt2phy(op->sym->cipher.iv.data); + op->sym->cipher.iv.length = entry->iv.length; + } else if (entry->iv.data) { + memcpy(op->sym->cipher.iv.data, + entry->iv.data, + entry->iv.length); + op->sym->cipher.iv.phys_addr = + rte_malloc_virt2phy(op->sym->cipher.iv.data); + op->sym->cipher.iv.length = entry->iv.length; + } else { + rc_cipher = ODP_CRYPTO_ALG_ERR_IV_INVALID; + } + + /* For SNOW3G algorithms, offset/length must be in bits */ + if (cipher_xform.cipher.algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2) { + op->sym->cipher.data.offset = param->cipher_range.offset << 3; + op->sym->cipher.data.length = param->cipher_range.length << 3; + + } else { + op->sym->cipher.data.offset = param->cipher_range.offset; + op->sym->cipher.data.length = param->cipher_range.length; + } + + if (rc_cipher == ODP_CRYPTO_ALG_ERR_NONE && + rc_auth == ODP_CRYPTO_ALG_ERR_NONE) { + int queue_pair = odp_cpu_id(); + + op->sym->m_src = (struct rte_mbuf *)out_pkt; + rc = rte_cryptodev_enqueue_burst(rte_session->dev_id, + queue_pair, &op, 1); + if (rc == 0) { + ODP_ERR("Failed to enqueue packet"); + goto err_op_free; + } + + rc = rte_cryptodev_dequeue_burst(rte_session->dev_id, + queue_pair, &op, 1); + + if (rc == 0) { + ODP_ERR("Failed to dequeue packet"); + goto err_op_free; + } + + out_pkt = (odp_packet_t)op->sym->m_src; + } + + /* Fill in result */ + local_result.cipher_status.alg_err = rc_cipher; + local_result.cipher_status.hw_err = ODP_CRYPTO_HW_ERR_NONE; + local_result.auth_status.alg_err = rc_auth; + local_result.auth_status.hw_err = ODP_CRYPTO_HW_ERR_NONE; + local_result.ok = + (rc_cipher == ODP_CRYPTO_ALG_ERR_NONE) && + (rc_auth == ODP_CRYPTO_ALG_ERR_NONE); + - _odp_buffer_event_subtype_set(packet_to_buffer(out_pkt), - ODP_EVENT_PACKET_CRYPTO); ++ packet_subtype_set(out_pkt, ODP_EVENT_PACKET_CRYPTO); + op_result = get_op_result_from_packet(out_pkt); + *op_result = local_result; + + rte_free(op->sym->cipher.iv.data); + rte_free(op->sym->auth.aad.data); + rte_crypto_op_free(op); + + /* Synchronous, simply return results */ + *pkt_out = out_pkt; + + return 0; + +err_op_free: + rte_free(op->sym->cipher.iv.data); + rte_free(op->sym->auth.aad.data); + rte_crypto_op_free(op); + +err: + if (allocated) { + odp_packet_free(out_pkt); + out_pkt = ODP_PACKET_INVALID; + } + + return -1; +} + +int odp_crypto_op(const odp_packet_t pkt_in[], + odp_packet_t pkt_out[], + const odp_crypto_packet_op_param_t param[], + int num_pkt) +{ + crypto_session_entry_t *entry; + int i, rc; + + entry = (crypto_session_entry_t *)(intptr_t)param->session; + ODP_ASSERT(ODP_CRYPTO_SYNC == entry->p.op_mode); + + for (i = 0; i < num_pkt; i++) { + rc = odp_crypto_int(pkt_in[i], &pkt_out[i], ¶m[i]); + if (rc < 0) + break; + } + + return i; +} + +int odp_crypto_op_enq(const odp_packet_t pkt_in[], + const odp_packet_t pkt_out[], + const odp_crypto_packet_op_param_t param[], + int num_pkt) +{ + odp_packet_t pkt; + odp_event_t event; + crypto_session_entry_t *entry; + int i, rc; + + entry = (crypto_session_entry_t *)(intptr_t)param->session; + ODP_ASSERT(ODP_CRYPTO_ASYNC == entry->p.op_mode); + ODP_ASSERT(ODP_QUEUE_INVALID != entry->p.compl_queue); + + for (i = 0; i < num_pkt; i++) { + pkt = pkt_out[i]; + rc = odp_crypto_int(pkt_in[i], &pkt, ¶m[i]); + if (rc < 0) + break; + + event = odp_packet_to_event(pkt); + if (odp_queue_enq(entry->p.compl_queue, event)) { + odp_event_free(event); + break; + } + } + + return i; +} diff --cc platform/linux-generic/Makefile.am index b3da45e2,1c2b625c..1dc0df5d --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@@ -3,82 -3,23 +3,28 @@@
include $(top_srcdir)/platform/Makefile.inc
- pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libodp-linux.pc - +lib_LTLIBRARIES = $(LIB)/libodp-linux.la + - AM_CPPFLAGS = -I$(srcdir)/include - AM_CPPFLAGS += -I$(top_srcdir)/include - AM_CPPFLAGS += -I$(top_srcdir)/frameworks/modular - AM_CPPFLAGS += -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ - AM_CPPFLAGS += -I$(top_builddir)/include - AM_CPPFLAGS += -Iinclude - AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/arch/$(ARCH_DIR) - AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform) + AM_CPPFLAGS = $(ODP_INCLUDES) + AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/include + AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/arch + AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/arch/@ARCH_DIR@ AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/arch/default - AM_CPPFLAGS += -Iinclude +AM_CPPFLAGS += -DSYSCONFDIR="@sysconfdir@"
AM_CPPFLAGS += $(OPENSSL_CPPFLAGS) AM_CPPFLAGS += $(DPDK_CPPFLAGS) AM_CPPFLAGS += $(NETMAP_CPPFLAGS) +AM_CPPFLAGS += $(LIBCONFIG_CFLAGS)
- odpincludedir= $(includedir)/odp - odpinclude_HEADERS = \ - include/odp/visibility_begin.h \ - include/odp/visibility_end.h - - odpapiincludedir= $(includedir)/odp/api - odpapiinclude_HEADERS = \ - include/odp/api/align.h \ - include/odp/api/atomic.h \ - include/odp/api/barrier.h \ - include/odp/api/buffer.h \ - include/odp/api/byteorder.h \ - include/odp/api/classification.h \ - include/odp/api/compiler.h \ - include/odp/api/chksum.h \ - include/odp/api/cpu.h \ - include/odp/api/cpumask.h \ - include/odp/api/crypto.h \ - include/odp/api/debug.h \ - include/odp/api/deprecated.h \ - include/odp/api/errno.h \ - include/odp/api/event.h \ - include/odp/api/feature.h \ - include/odp/api/hash.h \ - include/odp/api/hints.h \ - include/odp/api/init.h \ - include/odp/api/ipsec.h \ - include/odp/api/packet_flags.h \ - include/odp/api/packet.h \ - include/odp/api/packet_io.h \ - include/odp/api/packet_io_stats.h \ - include/odp/api/pool.h \ - include/odp/api/queue.h \ - include/odp/api/random.h \ - include/odp/api/rwlock.h \ - include/odp/api/rwlock_recursive.h \ - include/odp/api/schedule.h \ - include/odp/api/schedule_types.h \ - include/odp/api/shared_memory.h \ - include/odp/api/spinlock.h \ - include/odp/api/spinlock_recursive.h \ - include/odp/api/std_clib.h \ - include/odp/api/std_types.h \ - include/odp/api/support.h \ - include/odp/api/sync.h \ - include/odp/api/system_info.h \ - include/odp/api/thread.h \ - include/odp/api/thrmask.h \ - include/odp/api/ticketlock.h \ - include/odp/api/time.h \ - include/odp/api/timer.h \ - include/odp/api/traffic_mngr.h \ - include/odp/api/version.h + if PKTIO_DPDK + if ARCH_IS_X86 + AM_CFLAGS += -msse4.2 + endif + endif
+ if !ODP_ABI_COMPAT odpapiplatincludedir= $(includedir)/odp/api/plat odpapiplatinclude_HEADERS = \ include/odp/api/plat/atomic_inlines.h \ @@@ -110,45 -36,51 +41,76 @@@ include/odp/api/plat/std_clib_inlines.h \ include/odp/api/plat/strong_types.h \ include/odp/api/plat/sync_inlines.h \ - include/odp/api/plat/thread_types.h \ - include/odp/api/plat/thrmask_types.h \ + include/odp/api/plat/thread_inlines.h \ + include/odp/api/plat/thread_inlines_api.h \ include/odp/api/plat/ticketlock_inlines.h \ - include/odp/api/plat/ticketlock_inlines_api.h \ - include/odp/api/plat/ticketlock_types.h \ - include/odp/api/plat/time_types.h \ - include/odp/api/plat/timer_types.h \ - include/odp/api/plat/traffic_mngr_types.h \ - include/odp/api/plat/version_types.h - - nodist_odpapiplatinclude_HEADERS = \ - include/odp/api/plat/static_inline.h + include/odp/api/plat/ticketlock_inlines_api.h
+odpdrvincludedir = $(includedir)/odp/drv +odpdrvinclude_HEADERS = \ + include/odp/drv/align.h \ + include/odp/drv/atomic.h \ + include/odp/drv/barrier.h \ + include/odp/drv/byteorder.h \ + include/odp/drv/compiler.h \ + include/odp/drv/driver.h \ + include/odp/drv/hints.h \ + include/odp/drv/shm.h \ + include/odp/drv/spinlock.h \ + include/odp/drv/std_types.h \ + include/odp/drv/sync.h + +odpdrvplatincludedir = $(includedir)/odp/drv/plat +odpdrvplatinclude_HEADERS = \ + include/odp/drv/plat/atomic_types.h \ + include/odp/drv/plat/barrier_types.h \ + include/odp/drv/plat/byteorder_types.h \ + include/odp/drv/compiler.h \ + include/odp/drv/plat/driver_types.h \ + include/odp/drv/plat/shm_types.h \ + include/odp/drv/plat/spinlock_types.h \ + include/odp/drv/plat/strong_types.h + + odpapiabiarchincludedir = $(archincludedir)/odp/api/abi + odpapiabiarchinclude_HEADERS = \ + include-abi/odp/api/abi/align.h \ + include-abi/odp/api/abi/atomic.h \ + include-abi/odp/api/abi/barrier.h \ + include-abi/odp/api/abi/buffer.h \ + include-abi/odp/api/abi/byteorder.h \ + include-abi/odp/api/abi/classification.h \ + include-abi/odp/api/abi/cpumask.h \ + include-abi/odp/api/abi/crypto.h \ + include-abi/odp/api/abi/debug.h \ + include-abi/odp/api/abi/event.h \ + include-abi/odp/api/abi/init.h \ + include-abi/odp/api/abi/ipsec.h \ + include-abi/odp/api/abi/packet.h \ + include-abi/odp/api/abi/packet_flags.h \ + include-abi/odp/api/abi/packet_io.h \ + include-abi/odp/api/abi/pool.h \ + include-abi/odp/api/abi/queue.h \ + include-abi/odp/api/abi/rwlock.h \ + include-abi/odp/api/abi/rwlock_recursive.h \ + include-abi/odp/api/abi/schedule.h \ + include-abi/odp/api/abi/schedule_types.h \ + include-abi/odp/api/abi/shared_memory.h \ + include-abi/odp/api/abi/spinlock.h \ + include-abi/odp/api/abi/spinlock_recursive.h \ + include-abi/odp/api/abi/std_clib.h \ + include-abi/odp/api/abi/std_types.h \ + include-abi/odp/api/abi/sync.h \ + include-abi/odp/api/abi/thread.h \ + include-abi/odp/api/abi/thrmask.h \ + include-abi/odp/api/abi/ticketlock.h \ + include-abi/odp/api/abi/time.h \ + include-abi/odp/api/abi/timer.h \ + include-abi/odp/api/abi/traffic_mngr.h \ + include-abi/odp/api/abi/version.h + endif + noinst_HEADERS = \ + arch/odp_arch_time_internal.h \ include/_fdserver_internal.h \ include/_ishm_internal.h \ include/_ishmphy_internal.h \ @@@ -174,22 -104,13 +135,23 @@@ include/odp_name_table_internal.h \ include/odp_packet_internal.h \ include/odp_packet_io_internal.h \ - include/odp_packet_io_ipc_internal.h \ + include/odp_packet_io_pool.h \ + include/odp_packet_io_pool_access.h \ include/odp_packet_io_ring_internal.h \ - include/odp_packet_netmap.h \ - include/odp_packet_dpdk.h \ - include/odp_packet_socket.h \ - include/odp_packet_tap.h \ - include/odp_packet_null.h \ + pktio/common.h \ + pktio/dpdk.h \ + pktio/ethtool.h \ + pktio/mdev.h \ + pktio/sysfs.h \ + pktio/uapi_net_mdev.h \ + include/odp_pktio_ops_ipc.h \ + include/odp_pktio_ops_loopback.h \ + include/odp_pktio_ops_netmap.h \ + include/odp_pktio_ops_pcap.h \ + include/odp_pktio_ops_socket.h \ + include/odp_pktio_ops_tap.h \ ++ include/odp_pktio_ops_null.h \ + include/odp_pktio_ops_subsystem.h \ include/odp_pkt_queue_internal.h \ include/odp_pool_internal.h \ include/odp_posix_extensions.h \ @@@ -223,9 -142,7 +184,8 @@@ __LIB__libodp_linux_la_SOURCES = odp_atomic.c \ odp_barrier.c \ odp_bitmap.c \ - odp_buffer.c \ + buffer/generic.c \ + buffer/subsystem.c \ - odp_byteorder.c \ odp_chksum.c \ odp_classification.c \ odp_cpu.c \ @@@ -244,19 -161,14 +204,20 @@@ odp_packet.c \ odp_packet_flags.c \ odp_packet_io.c \ + odp_packet_io_pool.c \ + pktio/common.c \ + pktio/dpdk.c \ pktio/ethtool.c \ - pktio/io_ops.c \ + pktio/subsystem.c \ pktio/ipc.c \ - pktio/pktio_common.c \ - pktio/loop.c \ - pktio/netmap.c \ + pktio/null.c \ - pktio/dpdk.c \ + pktio/loopback.c \ + pktio/mdev.c \ + pktio/mdev/cxgb4.c \ + pktio/mdev/e1000e.c \ + pktio/mdev/i40e.c \ + pktio/netmap.c \ + pktio/ring.c \ pktio/socket.c \ pktio/socket_mmap.c \ pktio/sysfs.c \ @@@ -285,19 -199,28 +243,33 @@@ odp_timer_wheel.c \ odp_traffic_mngr.c \ odp_version.c \ - odp_weak.c + odp_weak.c \ + drv_atomic.c \ + drv_barrier.c \ + drv_driver.c \ + drv_shm.c \ + drv_spinlock.c
+ if ODP_ABI_COMPAT + __LIB__libodp_linux_la_SOURCES += \ + odp_atomic_api.c \ + odp_byteorder.c \ + odp_packet_api.c \ + odp_packet_flags_api.c \ + odp_pktio_api.c \ + odp_std_clib.c \ + odp_sync.c \ + odp_thread_api.c \ + odp_ticketlock.c + endif + if ARCH_IS_ARM - __LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_arch.c \ - arch/default/odp_cpu_cycles.c \ + __LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_cycles.c \ arch/default/odp_global_time.c \ arch/default/odp_sysinfo_parse.c - arch_odp_headers = arch/arm/odp/api/cpu_arch.h + if !ODP_ABI_COMPAT + odpapiabiarchinclude_HEADERS += arch/arm/odp/api/abi/cpu.h + endif noinst_HEADERS += arch/arm/odp_atomic.h \ arch/arm/odp_cpu.h \ arch/arm/odp_cpu_idling.h \ @@@ -354,48 -277,11 +326,48 @@@ if HAVE_PCA __LIB__libodp_linux_la_SOURCES += pktio/pcap.c endif
+pool/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +buffer/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +if ODP_SCHEDULE_SCALABLE +__LIB__libodp_linux_la_SOURCES += schedule/scalable.c \ + schedule/scalable_ordered.c +schedule/scalable.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +if ODP_SCHEDULE_SP +__LIB__libodp_linux_la_SOURCES += schedule/sp.c +schedule/sp.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +if ODP_SCHEDULE_IQUERY +__LIB__libodp_linux_la_SOURCES += schedule/iquery.c +schedule/iquery.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +__LIB__libodp_linux_la_SOURCES += schedule/generic.c +schedule/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +endif +endif +endif + +if ODP_SCHEDULE_SCALABLE +__LIB__libodp_linux_la_SOURCES += queue/scalable.c +queue/scalable.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +__LIB__libodp_linux_la_SOURCES += queue/generic.c +queue/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +endif + +# Build modular framework into odp-linux library +modularframeworkdir = $(top_srcdir)/frameworks/modular +noinst_HEADERS += $(modularframeworkdir)/list.h \ + $(modularframeworkdir)/odp_module.h + +__LIB__libodp_linux_la_SOURCES += ../../frameworks/modular/odp_module.c + __LIB__libodp_linux_la_LIBADD = $(ATOMIC_LIBS) __LIB__libodp_linux_la_LIBADD += $(OPENSSL_LIBS) - __LIB__libodp_linux_la_LIBADD += $(DPDK_LIBS) $(DPDK_PMDS) + __LIB__libodp_linux_la_LIBADD += $(DPDK_LIBS_LIBODP) __LIB__libodp_linux_la_LIBADD += $(PTHREAD_LIBS) __LIB__libodp_linux_la_LIBADD += $(TIMER_LIBS) +__LIB__libodp_linux_la_LIBADD += $(LIBCONFIG_LIBS)
if HAVE_PCAP __LIB__libodp_linux_la_LIBADD += $(PCAP_LIBS) diff --cc platform/linux-generic/buffer/generic.c index 543cc530,00000000..858388bd mode 100644,000000..100644 --- a/platform/linux-generic/buffer/generic.c +++ b/platform/linux-generic/buffer/generic.c @@@ -1,362 -1,0 +1,353 @@@ +/* Copyright (c) 2013, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + - #include <config.h> ++#include "config.h" + +#include <odp/api/buffer.h> +#include <odp_pool_internal.h> +#include <odp_buffer_internal.h> +#include <odp_buffer_inlines.h> +#include <odp_debug_internal.h> +#include <subsystem/spec/buffer_subsystem.h> + +#include <string.h> +#include <stdio.h> +#include <inttypes.h> + +static odp_buffer_t generic_buffer_from_event(odp_event_t ev) +{ + return (odp_buffer_t)ev; +} + +static odp_event_t generic_buffer_to_event(odp_buffer_t buf) +{ + return (odp_event_t)buf; +} + +static void *generic_buffer_addr(odp_buffer_t buf) +{ + odp_buffer_hdr_t *hdr = buf_hdl_to_hdr(buf); + + return hdr->seg[0].data; +} + +static uint32_t generic_buffer_size(odp_buffer_t buf) +{ + odp_buffer_hdr_t *hdr = buf_hdl_to_hdr(buf); ++ pool_t *pool = hdr->pool_ptr; + - return hdr->size; ++ return pool->seg_len; +} + +int odp_buffer_snprint(char *str, uint32_t n, odp_buffer_t buf) +{ + odp_buffer_hdr_t *hdr; + pool_t *pool; + int len = 0; + + if (!odp_buffer_is_valid(buf)) { + ODP_PRINT("Buffer is not valid.\n"); + return len; + } + + hdr = buf_hdl_to_hdr(buf); + pool = hdr->pool_ptr; + - len += snprintf(&str[len], n - len, ++ len += snprintf(&str[len], n-len, + "Buffer\n"); - len += snprintf(&str[len], n - len, ++ len += snprintf(&str[len], n-len, + " pool %" PRIu64 "\n", + odp_pool_to_u64(pool->pool_hdl)); - len += snprintf(&str[len], n - len, ++ len += snprintf(&str[len], n-len, + " addr %p\n", hdr->seg[0].data); - len += snprintf(&str[len], n - len, - " size %" PRIu32 "\n", hdr->size); - len += snprintf(&str[len], n - len, ++ len += snprintf(&str[len], n-len, ++ " size %" PRIu32 "\n", odp_buffer_size(buf)); ++ len += snprintf(&str[len], n-len, + " type %i\n", hdr->type); + + return len; +} + +static void generic_buffer_print(odp_buffer_t buf) +{ + int max_len = 512; + char str[max_len]; + int len; + - len = odp_buffer_snprint(str, max_len - 1, buf); ++ len = odp_buffer_snprint(str, max_len-1, buf); + str[len] = 0; + + ODP_PRINT("\n%s\n", str); +} + +static uint64_t generic_buffer_to_u64(odp_buffer_t hdl) +{ + return _odp_pri(hdl); +} + +odp_event_type_t _odp_buffer_event_type(odp_buffer_t buf) +{ + return buf_hdl_to_hdr(buf)->event_type; +} + +void _odp_buffer_event_type_set(odp_buffer_t buf, int ev) +{ + buf_hdl_to_hdr(buf)->event_type = ev; +} + - odp_event_subtype_t _odp_buffer_event_subtype(odp_buffer_t buf) - { - return buf_hdl_to_hdr(buf)->event_subtype; - } - - void _odp_buffer_event_subtype_set(odp_buffer_t buf, int ev) - { - buf_hdl_to_hdr(buf)->event_subtype = ev; - } - +int buffer_alloc_multi(pool_t *pool, odp_buffer_hdr_t *buf_hdr[], int max_num) +{ + ring_t *ring; + uint32_t mask, i; + pool_cache_t *cache; + uint32_t cache_num, num_ch, num_deq, burst; + odp_buffer_hdr_t *hdr; + - cache = local.cache[pool->pool_idx]; ++ cache = _pool_local_data.cache[pool->pool_idx]; + + cache_num = cache->num; + num_ch = max_num; + num_deq = 0; + burst = CACHE_BURST; + + if (odp_unlikely(cache_num < (uint32_t)max_num)) { + /* Cache does not have enough buffers */ + num_ch = cache_num; + num_deq = max_num - cache_num; + + if (odp_unlikely(num_deq > CACHE_BURST)) + burst = num_deq; + } + + /* Get buffers from the cache */ + for (i = 0; i < num_ch; i++) { + uint32_t j = cache_num - num_ch + i; + + buf_hdr[i] = buf_hdr_from_index(pool, cache->buf_index[j]); + } + + /* If needed, get more from the global pool */ + if (odp_unlikely(num_deq)) { + /* Temporary copy needed since odp_buffer_t is uintptr_t + * and not uint32_t. */ + uint32_t data[burst]; + + ring = &pool->ring->hdr; + mask = pool->ring_mask; + burst = ring_deq_multi(ring, mask, data, burst); + cache_num = burst - num_deq; + + if (odp_unlikely(burst < num_deq)) { + num_deq = burst; + cache_num = 0; + } + + for (i = 0; i < num_deq; i++) { + uint32_t idx = num_ch + i; + + hdr = buf_hdr_from_index(pool, data[i]); + odp_prefetch(hdr); + buf_hdr[idx] = hdr; + } + + /* Cache extra buffers. Cache is currently empty. */ + for (i = 0; i < cache_num; i++) + cache->buf_index[i] = data[num_deq + i]; + + cache->num = cache_num; + } else { + cache->num = cache_num - num_ch; + } + + return num_ch + num_deq; +} + +static inline void buffer_free_to_pool(pool_t *pool, + odp_buffer_hdr_t *buf_hdr[], int num) +{ + int i; + ring_t *ring; + uint32_t mask; + pool_cache_t *cache; + uint32_t cache_num; + - cache = local.cache[pool->pool_idx]; ++ cache = _pool_local_data.cache[pool->pool_idx]; + + /* Special case of a very large free. Move directly to + * the global pool. */ + if (odp_unlikely(num > CONFIG_POOL_CACHE_SIZE)) { + uint32_t buf_index[num]; + + ring = &pool->ring->hdr; + mask = pool->ring_mask; + for (i = 0; i < num; i++) + buf_index[i] = buf_hdr_to_index(buf_hdr[i]); + + ring_enq_multi(ring, mask, buf_index, num); + + return; + } + + /* Make room into local cache if needed. Do at least burst size + * transfer. */ + cache_num = cache->num; + + if (odp_unlikely((int)(CONFIG_POOL_CACHE_SIZE - cache_num) < num)) { + uint32_t index; + int burst = CACHE_BURST; + + ring = &pool->ring->hdr; + mask = pool->ring_mask; + + if (odp_unlikely(num > CACHE_BURST)) + burst = num; + if (odp_unlikely((uint32_t)num > cache_num)) + burst = cache_num; + + { + /* Temporary copy needed since odp_buffer_t is + * uintptr_t and not uint32_t. */ + uint32_t data[burst]; + + index = cache_num - burst; + + for (i = 0; i < burst; i++) + data[i] = cache->buf_index[index + i]; + + ring_enq_multi(ring, mask, data, burst); + } + + cache_num -= burst; + } + + for (i = 0; i < num; i++) + cache->buf_index[cache_num + i] = buf_hdr_to_index(buf_hdr[i]); + + cache->num = cache_num + num; +} + +void buffer_free_multi(odp_buffer_hdr_t *buf_hdr[], int num_total) +{ + pool_t *pool; + int num; + int i; + int first = 0; + + while (1) { + num = 1; + i = 1; + pool = buf_hdr[first]->pool_ptr; + + /* 'num' buffers are from the same pool */ + if (num_total > 1) { + for (i = first; i < num_total; i++) + if (pool != buf_hdr[i]->pool_ptr) + break; + + num = i - first; + } + + buffer_free_to_pool(pool, &buf_hdr[first], num); + + if (i == num_total) + return; + + first = i; + } +} + +static odp_buffer_t generic_buffer_alloc(odp_pool_t pool_hdl) +{ + odp_buffer_t buf; + pool_t *pool; + int ret; + + ODP_ASSERT(ODP_POOL_INVALID != pool_hdl); + + pool = pool_entry_from_hdl(pool_hdl); + ret = buffer_alloc_multi(pool, (odp_buffer_hdr_t **)&buf, 1); + + if (odp_likely(ret == 1)) + return buf; + + return ODP_BUFFER_INVALID; +} + +static int generic_buffer_alloc_multi(odp_pool_t pool_hdl, + odp_buffer_t buf[], int num) +{ + pool_t *pool; + + ODP_ASSERT(ODP_POOL_INVALID != pool_hdl); + + pool = pool_entry_from_hdl(pool_hdl); + + return buffer_alloc_multi(pool, (odp_buffer_hdr_t **)buf, num); +} + +static void generic_buffer_free(odp_buffer_t buf) +{ + buffer_free_multi((odp_buffer_hdr_t **)&buf, 1); +} + +static void generic_buffer_free_multi(const odp_buffer_t buf[], int num) +{ + buffer_free_multi((odp_buffer_hdr_t **)(uintptr_t)buf, num); +} + +static odp_pool_t generic_buffer_pool(odp_buffer_t buf) +{ + pool_t *pool = pool_from_buf(buf); + + return pool->pool_hdl; +} + +static int generic_buffer_is_valid(odp_buffer_t buf) +{ + pool_t *pool; + + if (buf == ODP_BUFFER_INVALID) + return 0; + + pool = pool_from_buf(buf); + + if (pool->pool_idx >= ODP_CONFIG_POOLS) + return 0; + + if (pool->reserved == 0) + return 0; + + return 1; +} + +odp_buffer_module_t generic_buffer = { + .base = { + .name = "generic_buffer", + .init_local = NULL, + .term_local = NULL, + .init_global = NULL, + .term_global = NULL, + }, + .buffer_from_event = generic_buffer_from_event, + .buffer_to_event = generic_buffer_to_event, + .buffer_addr = generic_buffer_addr, + .buffer_alloc_multi = generic_buffer_alloc_multi, + .buffer_free_multi = generic_buffer_free_multi, + .buffer_alloc = generic_buffer_alloc, + .buffer_free = generic_buffer_free, + .buffer_size = generic_buffer_size, + .buffer_is_valid = generic_buffer_is_valid, + .buffer_pool = generic_buffer_pool, + .buffer_print = generic_buffer_print, + .buffer_to_u64 = generic_buffer_to_u64, +}; + +ODP_MODULE_CONSTRUCTOR(generic_buffer) +{ + odp_module_constructor(&generic_buffer); + odp_subsystem_register_module(buffer, &generic_buffer); +} + diff --cc platform/linux-generic/include-abi/odp/api/abi/atomic.h index 00000000,67127aa4..63055131 mode 000000,100644..100644 --- a/platform/linux-generic/include-abi/odp/api/abi/atomic.h +++ b/platform/linux-generic/include-abi/odp/api/abi/atomic.h @@@ -1,0 -1,76 +1,78 @@@ + /* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + + /** + * @file + * + * ODP atomic operations + */ + + #ifndef ODP_API_ABI_ATOMIC_H_ + #define ODP_API_ABI_ATOMIC_H_ + + #ifdef __cplusplus + extern "C" { + #endif + + #include <odp/api/std_types.h> + #include <odp/api/align.h> + + /** + * @internal + * Atomic 32-bit unsigned integer + */ + struct odp_atomic_u32_s { + uint32_t v; /**< Actual storage for the atomic variable */ + } ODP_ALIGNED(sizeof(uint32_t)); /* Enforce alignment! */ + + #if __GCC_ATOMIC_LLONG_LOCK_FREE >= 2 + + /** + * @internal + * Atomic 64-bit unsigned integer + */ + struct odp_atomic_u64_s { + uint64_t v; /**< Actual storage for the atomic variable */ + } ODP_ALIGNED(sizeof(uint64_t)); /* Enforce alignment! */ + + #else + + #define ODP_ATOMIC_U64_LOCK 1 + + /** + * @internal + * Atomic 64-bit unsigned integer + */ + struct odp_atomic_u64_s { + uint64_t v; /**< Actual storage for the atomic variable */ + /* Some architectures do not support lock-free operations on 64-bit + * data types. We use a spin lock to ensure atomicity. */ + char lock; /**< Spin lock (if needed) used to ensure atomic access */ + } ODP_ALIGNED(sizeof(uint64_t)); /* Enforce alignment! */ + + #endif + + typedef struct odp_atomic_u64_s odp_atomic_u64_t; + + typedef struct odp_atomic_u32_s odp_atomic_u32_t; + ++#define ODP_ATOMIC_INIT(a) { .v = a } ++ + /** @ingroup odp_atomic + * @{ + */ + + #define _ODP_INLINE static inline + #include <odp/api/plat/atomic_inlines.h> + + /** + * @} + */ + #ifdef __cplusplus + } + #endif + + #endif diff --cc platform/linux-generic/include/odp/drv/align.h index 7636f893,00000000..bcc9f033 mode 100644,000000..100644 --- a/platform/linux-generic/include/odp/drv/align.h +++ b/platform/linux-generic/include/odp/drv/align.h @@@ -1,58 -1,0 +1,58 @@@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * ODPDRV alignments + */ + +#ifndef ODPDRV_PLAT_ALIGN_H_ +#define ODPDRV_PLAT_ALIGN_H_ + +#ifdef __cplusplus +extern "C" { +#endif + - #include <odp/api/cpu_arch.h> ++#include <odp/api/cpu.h> + +/** @ingroup odpdrv_compiler_optim + * @{ + */ + +#ifdef __GNUC__ + +#define ODPDRV_ALIGNED(x) __attribute__((__aligned__(x))) + +#define ODPDRV_PACKED __attribute__((__packed__)) + +#define ODPDRV_OFFSETOF(type, member) __builtin_offsetof(type, member) + +#define ODPDRV_FIELD_SIZEOF(type, member) sizeof(((type *)0)->member) + +#else +#error Non-gcc compatible compiler +#endif + +#define ODPDRV_CACHE_LINE_SIZE _ODP_CACHE_LINE_SIZE + +#define ODPDRV_PAGE_SIZE 4096 + +#define ODPDRV_ALIGNED_CACHE ODPDRV_ALIGNED(ODPDRV_CACHE_LINE_SIZE) + +#define ODPDRV_ALIGNED_PAGE ODPDRV_ALIGNED(ODPDRV_PAGE_SIZE) + +/** + * @} + */ + +#include <odp/drv/spec/align.h> + +#ifdef __cplusplus +} +#endif + +#endif diff --cc platform/linux-generic/include/odp_buffer_internal.h index b8e8c171,b5266938..f80f3973 --- a/platform/linux-generic/include/odp_buffer_internal.h +++ b/platform/linux-generic/include/odp_buffer_internal.h @@@ -42,7 -42,11 +42,7 @@@ typedef struct seg_entry_t } seg_entry_t;
/* Common buffer header */ - struct odp_buffer_hdr_t { + struct ODP_ALIGNED_CACHE odp_buffer_hdr_t { - - /* Buffer index in the pool */ - uint32_t index; - /* Total segment count */ uint16_t segcount;
diff --cc platform/linux-generic/include/odp_classification_inlines.h index c2e94c63,df664c70..102f53b0 --- a/platform/linux-generic/include/odp_classification_inlines.h +++ b/platform/linux-generic/include/odp_classification_inlines.h @@@ -27,6 -29,6 +29,7 @@@ extern "C" #include <odp_packet_internal.h> #include <stdio.h> #include <inttypes.h> ++#include <string.h>
/* PMR term value verification function These functions verify the given PMR term value with the value in the packet diff --cc platform/linux-generic/include/odp_config_internal.h index 3519cfc7,3a852a49..170f44e2 --- a/platform/linux-generic/include/odp_config_internal.h +++ b/platform/linux-generic/include/odp_config_internal.h @@@ -134,13 -138,8 +138,14 @@@ extern "C" */ #define ODP_CONFIG_ISHM_VA_PREALLOC_SZ (536870912L)
+/* Maximum number of shared memory blocks available on the driver interface. + * + * This the the number of separate SHM areas that can be reserved concurrently + */ +#define ODPDRV_CONFIG_SHM_BLOCKS 48 + - /* Maximum event burst size + /* + * Maximum event burst size * * This controls the burst size on various enqueue, dequeue, etc calls. Large * burst size improves throughput, but may degrade QoS (increase latency). @@@ -150,6 -154,10 +160,10 @@@ /* * Maximum number of events in a thread local pool cache */ -#define CONFIG_POOL_CACHE_SIZE 256 +#define CONFIG_POOL_CACHE_SIZE 255
+ #ifdef __cplusplus + } + #endif + #endif diff --cc platform/linux-generic/include/odp_internal.h index ece73635,4fd72144..207292cc --- a/platform/linux-generic/include/odp_internal.h +++ b/platform/linux-generic/include/odp_internal.h @@@ -116,12 -110,9 +116,14 @@@ int odp_queue_term_local(void)
int odp_crypto_init_global(void); int odp_crypto_term_global(void); + int _odp_crypto_init_local(void); + int _odp_crypto_term_local(void);
+int odp_schedule_init_global(void); +int odp_schedule_term_global(void); +int odp_schedule_init_local(void); +int odp_schedule_term_local(void); + int odp_timer_init_global(const odp_init_t *params); int odp_timer_term_global(void); int odp_timer_disarm_all(void); diff --cc platform/linux-generic/include/odp_packet_io_internal.h index 6912b851,1de0cbf9..b5dd3e98 --- a/platform/linux-generic/include/odp_packet_io_internal.h +++ b/platform/linux-generic/include/odp_packet_io_internal.h @@@ -48,8 -117,23 +48,9 @@@ struct pktio_entry /* These two locks together lock the whole pktio device */ odp_ticketlock_t rxl; /**< RX ticketlock */ odp_ticketlock_t txl; /**< TX ticketlock */ - int cls_enabled; /**< is classifier enabled */ + uint8_t cls_enabled; /**< classifier enabled */ + uint8_t chksum_insert_ena; /**< pktout checksum offload enabled */ odp_pktio_t handle; /**< pktio handle */ - union { - pkt_loop_t pkt_loop; /**< Using loopback for IO */ - pkt_sock_t pkt_sock; /**< using socket API for IO */ - pkt_sock_mmap_t pkt_sock_mmap; /**< using socket mmap - * API for IO */ - pkt_netmap_t pkt_nm; /**< using netmap API for IO */ - pkt_dpdk_t pkt_dpdk; /**< using DPDK for IO */ -#ifdef HAVE_PCAP - pkt_pcap_t pkt_pcap; /**< Using pcap for IO */ -#endif - pkt_tap_t pkt_tap; /**< using TAP for IO */ - _ipc_pktio_t ipc; /**< IPC pktio data */ - pkt_null_t pkt_null; /**< using null for IO */ - }; enum { /* Not allocated */ PKTIO_STATE_FREE = 0, @@@ -109,15 -194,53 +111,12 @@@ typedef struct pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES]; } pktio_table_t;
-typedef struct pktio_if_ops { - const char *name; - void (*print)(pktio_entry_t *pktio_entry); - int (*init_global)(void); - int (*init_local)(void); - int (*term)(void); - int (*open)(odp_pktio_t pktio, pktio_entry_t *pktio_entry, - const char *devname, odp_pool_t pool); - int (*close)(pktio_entry_t *pktio_entry); - int (*start)(pktio_entry_t *pktio_entry); - int (*stop)(pktio_entry_t *pktio_entry); - int (*stats)(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats); - int (*stats_reset)(pktio_entry_t *pktio_entry); - uint64_t (*pktin_ts_res)(pktio_entry_t *pktio_entry); - odp_time_t (*pktin_ts_from_ns)(pktio_entry_t *pktio_entry, uint64_t ns); - int (*recv)(pktio_entry_t *entry, int index, odp_packet_t packets[], - int num); - int (*recv_tmo)(pktio_entry_t *entry, int index, odp_packet_t packets[], - int num, uint64_t wait_usecs); - int (*recv_mq_tmo)(pktio_entry_t *entry[], int index[], int num_q, - odp_packet_t packets[], int num, unsigned *from, - uint64_t wait_usecs); - int (*fd_set)(pktio_entry_t *entry, int index, fd_set *readfds); - int (*send)(pktio_entry_t *entry, int index, - const odp_packet_t packets[], int num); - uint32_t (*mtu_get)(pktio_entry_t *pktio_entry); - int (*promisc_mode_set)(pktio_entry_t *pktio_entry, int enable); - int (*promisc_mode_get)(pktio_entry_t *pktio_entry); - int (*mac_get)(pktio_entry_t *pktio_entry, void *mac_addr); - int (*mac_set)(pktio_entry_t *pktio_entry, const void *mac_addr); - int (*link_status)(pktio_entry_t *pktio_entry); - int (*capability)(pktio_entry_t *pktio_entry, - odp_pktio_capability_t *capa); - int (*config)(pktio_entry_t *pktio_entry, - const odp_pktio_config_t *config); - int (*input_queues_config)(pktio_entry_t *pktio_entry, - const odp_pktin_queue_param_t *param); - int (*output_queues_config)(pktio_entry_t *pktio_entry, - const odp_pktout_queue_param_t *p); -} pktio_if_ops_t; - extern void *pktio_entry_ptr[];
- static inline int pktio_to_id(odp_pktio_t pktio) - { - return _odp_typeval(pktio) - 1; - } - static inline pktio_entry_t *get_pktio_entry(odp_pktio_t pktio) { + int idx; + if (odp_unlikely(pktio == ODP_PKTIO_INVALID)) return NULL;
@@@ -140,12 -265,46 +141,32 @@@ static inline void pktio_cls_enabled_se entry->s.cls_enabled = ena; }
-extern const pktio_if_ops_t netmap_pktio_ops; -extern const pktio_if_ops_t dpdk_pktio_ops; -extern const pktio_if_ops_t sock_mmsg_pktio_ops; -extern const pktio_if_ops_t sock_mmap_pktio_ops; -extern const pktio_if_ops_t loopback_pktio_ops; -#ifdef HAVE_PCAP -extern const pktio_if_ops_t pcap_pktio_ops; -#endif -extern const pktio_if_ops_t tap_pktio_ops; -extern const pktio_if_ops_t null_pktio_ops; -extern const pktio_if_ops_t ipc_pktio_ops; -extern const pktio_if_ops_t * const pktio_if_ops[]; - -int sysfs_stats(pktio_entry_t *pktio_entry, - odp_pktio_stats_t *stats); -int sock_stats_fd(pktio_entry_t *pktio_entry, - odp_pktio_stats_t *stats, - int fd); -int sock_stats_reset_fd(pktio_entry_t *pktio_entry, int fd); +int pktin_poll_one(int pktio_index, + int rx_queue, + odp_event_t evt_tbl[]); +int pktin_poll(int pktio_index, int num_queue, int index[]); +void pktio_stop_finalize(int pktio_index);
+ /** + * Try interrupt-driven receive + * + * @param queues Pktin queues + * @param num_q Number of queues + * @param packets Output packet slots + * @param num Number of output packet slots + * @param from Queue from which the call received packets + * @param usecs Microseconds to wait + * @param trial_successful Will receive information whether trial was successful + * + * @return >=0 on success, number of packets received + * @return <0 on failure + */ + int sock_recv_mq_tmo_try_int_driven(const struct odp_pktin_queue_t queues[], + unsigned num_q, unsigned *from, + odp_packet_t packets[], int num, + uint64_t usecs, + int *trial_successful); + #ifdef __cplusplus } #endif diff --cc platform/linux-generic/include/odp_pktio_ops_loopback.h index 93245947,00000000..5a0546c8 mode 100644,000000..100644 --- a/platform/linux-generic/include/odp_pktio_ops_loopback.h +++ b/platform/linux-generic/include/odp_pktio_ops_loopback.h @@@ -1,17 -1,0 +1,18 @@@ +/* Copyright (c) 2017, ARM Limited. All rights reserved. + * + * Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_PKTIO_OPS_LOOPBACK_H_ +#define ODP_PKTIO_OPS_LOOPBACK_H_ + +typedef struct { + odp_queue_t loopq; /**< loopback queue for "loop" device */ + odp_bool_t promisc; /**< promiscuous mode state */ ++ uint8_t idx; /**< index of "loop" device */ +} pktio_ops_loopback_data_t; + +#endif diff --cc platform/linux-generic/include/odp_pktio_ops_null.h index 00000000,00000000..2e913c2f new file mode 100644 --- /dev/null +++ b/platform/linux-generic/include/odp_pktio_ops_null.h @@@ -1,0 -1,0 +1,18 @@@ ++/* Copyright (c) 2018, ARM Limited. All rights reserved. ++ * ++ * Copyright (c) 2018, Linaro Limited ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#ifndef ODP_PKTIO_OPS_NULL_H_ ++#define ODP_PKTIO_OPS_NULL_H_ ++ ++#include <odp/api/pool.h> ++ ++typedef struct { ++ int promisc; /**< whether promiscuous mode is on */ ++} pktio_ops_null_data_t; ++ ++#endif diff --cc platform/linux-generic/include/odp_pktio_ops_socket.h index 5ed444df,00000000..b434a0df mode 100644,000000..100644 --- a/platform/linux-generic/include/odp_pktio_ops_socket.h +++ b/platform/linux-generic/include/odp_pktio_ops_socket.h @@@ -1,96 -1,0 +1,85 @@@ +/* Copyright (c) 2013, Linaro Limited + * Copyright (c) 2013, Nokia Solutions and Networks + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_PKTIO_OPS_SOCKET_H_ +#define ODP_PKTIO_OPS_SOCKET_H_ + +#include <linux/if_packet.h> +#include <linux/if_ether.h> +#include <sys/socket.h> +#include <string.h> +#include <stddef.h> + +#include <odp/api/align.h> +#include <odp/api/buffer.h> +#include <odp/api/debug.h> +#include <odp/api/pool.h> +#include <odp/api/packet.h> +#include <odp/api/packet_io.h> + +#include <linux/version.h> + +/* + * Packet socket config: + */ + +/* + * This makes sure that building for kernels older than 3.1 works + * and a fanout requests fails (for invalid packet socket option) + * in runtime if requested + */ +#ifndef PACKET_FANOUT +#define PACKET_FANOUT 18 +#define PACKET_FANOUT_HASH 0 +#endif /* PACKET_FANOUT */ + +typedef struct { + int sockfd; /**< socket descriptor */ + odp_pool_t pool; /**< pool to alloc packets from */ + uint32_t mtu; /**< maximum transmission unit */ + unsigned char if_mac[ETH_ALEN]; /**< IF eth mac addr */ +} pktio_ops_socket_data_t; + +/** packet mmap ring */ +struct ring { + struct iovec *rd; + unsigned frame_num; + int rd_num; + + int sock; + int type; + int version; + uint8_t *mm_space; + size_t mm_len; + size_t rd_len; + int flen; + + struct tpacket_req req; +}; + +ODP_STATIC_ASSERT(offsetof(struct ring, mm_space) <= ODP_CACHE_LINE_SIZE, + "ERR_STRUCT_RING"); + +/** Packet socket using mmap rings for both Rx and Tx */ +typedef struct { + /** Packet mmap ring for Rx */ - struct ring rx_ring ODP_ALIGNED_CACHE; ++ struct ring ODP_ALIGNED_CACHE rx_ring; + /** Packet mmap ring for Tx */ - struct ring tx_ring ODP_ALIGNED_CACHE; ++ struct ring ODP_ALIGNED_CACHE tx_ring; + - int sockfd ODP_ALIGNED_CACHE; ++ int ODP_ALIGNED_CACHE sockfd; + odp_pool_t pool; ++ int mtu; /**< maximum transmission unit */ + size_t frame_offset; /**< frame start offset from start of pkt buf */ + uint8_t *mmap_base; + unsigned mmap_len; + unsigned char if_mac[ETH_ALEN]; + struct sockaddr_ll ll; + int fanout; +} pktio_ops_socket_mmap_data_t; + - static inline void - ethaddr_copy(unsigned char mac_dst[], unsigned char mac_src[]) - { - memcpy(mac_dst, mac_src, ETH_ALEN); - } - - static inline int - ethaddrs_equal(unsigned char mac_a[], unsigned char mac_b[]) - { - return !memcmp(mac_a, mac_b, ETH_ALEN); - } - +#endif diff --cc platform/linux-generic/include/odp_pktio_ops_subsystem.h index f93011e9,00000000..ae8d29c2 mode 100644,000000..100644 --- a/platform/linux-generic/include/odp_pktio_ops_subsystem.h +++ b/platform/linux-generic/include/odp_pktio_ops_subsystem.h @@@ -1,94 -1,0 +1,105 @@@ +/* Copyright (c) 2017, ARM Limited. All rights reserved. + * + * Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_PKTIO_OPS_SUBSYSTEM_H_ +#define ODP_PKTIO_OPS_SUBSYSTEM_H_ +#include <odp/visibility_begin.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#include <odp_module.h> +#include <odp/api/packet_io.h> +#include <odp_packet_io_pool_access.h> + +/* ODP packet IO operations subsystem declaration */ +ODP_SUBSYSTEM_DECLARE(pktio_ops); + +/* Subsystem APIs declarations */ +ODP_SUBSYSTEM_API(pktio_ops, int, open, odp_pktio_t, + pktio_entry_t *, const char *, odp_pool_t); +ODP_SUBSYSTEM_API(pktio_ops, int, close, pktio_entry_t *); +ODP_SUBSYSTEM_API(pktio_ops, int, start, pktio_entry_t *); +ODP_SUBSYSTEM_API(pktio_ops, int, stop, pktio_entry_t *); +ODP_SUBSYSTEM_API(pktio_ops, int, stats, pktio_entry_t *, + odp_pktio_stats_t *stats); +ODP_SUBSYSTEM_API(pktio_ops, int, stats_reset, pktio_entry_t *); +ODP_SUBSYSTEM_API(pktio_ops, uint64_t, pktin_ts_res, pktio_entry_t *); +ODP_SUBSYSTEM_API(pktio_ops, odp_time_t, pktin_ts_from_ns, + pktio_entry_t *, uint64_t ns); +ODP_SUBSYSTEM_API(pktio_ops, int, recv, pktio_entry_t *, + int index, odp_packet_t packets[], int count); ++ODP_SUBSYSTEM_API(pktio_ops, int, recv_tmo, pktio_entry_t *, ++ int index, odp_packet_t packets[], int count, ++ uint64_t wait_usecs); ++ODP_SUBSYSTEM_API(pktio_ops, int, recv_mq_tmo, pktio_entry_t *entry[], ++ int index[], int num_q, odp_packet_t packets[], ++ int count, unsigned *from, uint64_t wait_usecs); ++ODP_SUBSYSTEM_API(pktio_ops, int, fd_set, pktio_entry_t *, ++ int index, fd_set *readfds); +ODP_SUBSYSTEM_API(pktio_ops, int, send, pktio_entry_t *, + int index, const odp_packet_t packets[], int count); +ODP_SUBSYSTEM_API(pktio_ops, uint32_t, mtu_get, pktio_entry_t *); +ODP_SUBSYSTEM_API(pktio_ops, int, promisc_mode_set, + pktio_entry_t *, int enable); +ODP_SUBSYSTEM_API(pktio_ops, int, promisc_mode_get, pktio_entry_t *); +ODP_SUBSYSTEM_API(pktio_ops, int, mac_get, pktio_entry_t *, void *); +ODP_SUBSYSTEM_API(pktio_ops, int, mac_set, pktio_entry_t *, const void *); +ODP_SUBSYSTEM_API(pktio_ops, int, link_status, pktio_entry_t *); +ODP_SUBSYSTEM_API(pktio_ops, int, capability, pktio_entry_t *, + odp_pktio_capability_t *); +ODP_SUBSYSTEM_API(pktio_ops, int, config, pktio_entry_t *, + const odp_pktio_config_t *); +ODP_SUBSYSTEM_API(pktio_ops, int, input_queues_config, + pktio_entry_t *, const odp_pktin_queue_param_t *); +ODP_SUBSYSTEM_API(pktio_ops, int, output_queues_config, + pktio_entry_t *, const odp_pktout_queue_param_t *); +ODP_SUBSYSTEM_API(pktio_ops, void, print, pktio_entry_t *); + +/* Declare subsystem init and term routines */ +ODP_SUBSYSTEM_API(pktio_ops, int, init_global, bool); +ODP_SUBSYSTEM_API(pktio_ops, int, init_local, bool); +ODP_SUBSYSTEM_API(pktio_ops, int, term_global, bool); +ODP_SUBSYSTEM_API(pktio_ops, int, term_local, bool); + +typedef ODP_MODULE_CLASS(pktio_ops) { + odp_module_base_t base; + + odp_api_proto(pktio_ops, open) open; + odp_api_proto(pktio_ops, close) close; + odp_api_proto(pktio_ops, start) start; + odp_api_proto(pktio_ops, stop) stop; + odp_api_proto(pktio_ops, stats) stats; + odp_api_proto(pktio_ops, stats_reset) stats_reset; + odp_api_proto(pktio_ops, pktin_ts_res) pktin_ts_res; + odp_api_proto(pktio_ops, pktin_ts_from_ns) pktin_ts_from_ns; + odp_api_proto(pktio_ops, recv) recv; ++ odp_api_proto(pktio_ops, recv_tmo) recv_tmo; ++ odp_api_proto(pktio_ops, recv_mq_tmo) recv_mq_tmo; ++ odp_api_proto(pktio_ops, fd_set) fd_set; + odp_api_proto(pktio_ops, send) send; + odp_api_proto(pktio_ops, mtu_get) mtu_get; + odp_api_proto(pktio_ops, promisc_mode_set) promisc_mode_set; + odp_api_proto(pktio_ops, promisc_mode_get) promisc_mode_get; + odp_api_proto(pktio_ops, mac_get) mac_get; + odp_api_proto(pktio_ops, mac_set) mac_set; + odp_api_proto(pktio_ops, link_status) link_status; + odp_api_proto(pktio_ops, capability) capability; + odp_api_proto(pktio_ops, config) config; + odp_api_proto(pktio_ops, input_queues_config) input_queues_config; + odp_api_proto(pktio_ops, output_queues_config) output_queues_config; + odp_api_proto(pktio_ops, print) print; +} pktio_ops_module_t; + +#ifdef __cplusplus +} +#endif + +#include <odp/visibility_end.h> +#endif diff --cc platform/linux-generic/include/odp_pool_internal.h index cf1a423f,8284bcd7..41883c14 --- a/platform/linux-generic/include/odp_pool_internal.h +++ b/platform/linux-generic/include/odp_pool_internal.h @@@ -27,9 -26,7 +27,10 @@@ extern "C" #include <odp_ring_internal.h> #include <odp/api/plat/strong_types.h>
- #define CACHE_BURST 32 ++/* Used by both pool and buffer generic implementations */ ++#define CACHE_BURST 32 + - typedef struct pool_cache_t { + typedef struct ODP_ALIGNED_CACHE pool_cache_t { uint32_t num; uint32_t buf_index[CONFIG_POOL_CACHE_SIZE];
@@@ -90,14 -89,6 +93,14 @@@ typedef struct pool_table_t
extern pool_table_t *pool_tbl;
+/* Thread local variables */ +typedef struct pool_local_t { + pool_cache_t *cache[ODP_CONFIG_POOLS]; + int thr_id; +} pool_local_t; + - extern __thread pool_local_t local; ++extern __thread pool_local_t _pool_local_data; + static inline pool_t *pool_entry(uint32_t pool_idx) { return &pool_tbl->pool[pool_idx]; @@@ -113,40 -104,6 +116,36 @@@ static inline odp_buffer_hdr_t *buf_hdl return (odp_buffer_hdr_t *)(uintptr_t)buf; }
- static inline odp_pool_t pool_index_to_handle(uint32_t pool_idx) ++static inline uint32_t buf_hdr_to_index(odp_buffer_hdr_t *buf_hdr) +{ - return _odp_cast_scalar(odp_pool_t, pool_idx); ++ pool_t *pool = buf_hdr->pool_ptr; ++ uint32_t index = ((uint8_t *)buf_hdr - pool->base_addr) ++ / pool->block_size; ++ ++ return index; +} + +static inline pool_t *pool_from_buf(odp_buffer_t buf) +{ + odp_buffer_hdr_t *buf_hdr = buf_hdl_to_hdr(buf); + + return buf_hdr->pool_ptr; +} + +static inline odp_buffer_hdr_t *buf_hdr_from_index(pool_t *pool, + uint32_t buffer_idx) +{ + uint32_t block_offset; + odp_buffer_hdr_t *buf_hdr; + + block_offset = buffer_idx * pool->block_size; + + /* clang requires cast to uintptr_t */ + buf_hdr = (odp_buffer_hdr_t *)(uintptr_t)&pool->base_addr[block_offset]; + + return buf_hdr; +} + - static inline uint32_t buf_hdr_to_index(odp_buffer_hdr_t *buf_hdr) - { - pool_t *pool = buf_hdr->pool_ptr; - uint32_t index = ((uint8_t *)buf_hdr - pool->base_addr) - / pool->block_size; - - return index; - } int buffer_alloc_multi(pool_t *pool, odp_buffer_hdr_t *buf_hdr[], int num); void buffer_free_multi(odp_buffer_hdr_t *buf_hdr[], int num_free);
diff --cc platform/linux-generic/include/odp_schedule_if.h index c7c5194c,06a70bdd..2ce48955 --- a/platform/linux-generic/include/odp_schedule_if.h +++ b/platform/linux-generic/include/odp_schedule_if.h @@@ -10,28 -14,102 +14,38 @@@ extern "C" #include <odp/api/queue.h> #include <odp_queue_if.h> #include <odp/api/schedule.h> + #include <odp_forward_typedefs_internal.h> + + /* Number of ordered locks per queue */ + #define SCHEDULE_ORDERED_LOCKS_PER_QUEUE 2
-typedef void (*schedule_pktio_start_fn_t)(int pktio_index, - int num_in_queue, - int in_queue_idx[], - odp_queue_t odpq[]); -typedef int (*schedule_thr_add_fn_t)(odp_schedule_group_t group, int thr); -typedef int (*schedule_thr_rem_fn_t)(odp_schedule_group_t group, int thr); -typedef int (*schedule_num_grps_fn_t)(void); -typedef int (*schedule_init_queue_fn_t)(uint32_t queue_index, - const odp_schedule_param_t *sched_param - ); -typedef void (*schedule_destroy_queue_fn_t)(uint32_t queue_index); -typedef int (*schedule_sched_queue_fn_t)(uint32_t queue_index); -typedef int (*schedule_unsched_queue_fn_t)(uint32_t queue_index); -typedef int (*schedule_ord_enq_multi_fn_t)(queue_t q_int, - void *buf_hdr[], int num, int *ret); -typedef int (*schedule_init_global_fn_t)(void); -typedef int (*schedule_term_global_fn_t)(void); -typedef int (*schedule_init_local_fn_t)(void); -typedef int (*schedule_term_local_fn_t)(void); -typedef void (*schedule_order_lock_fn_t)(void); -typedef void (*schedule_order_unlock_fn_t)(void); -typedef void (*schedule_order_unlock_lock_fn_t)(void); -typedef uint32_t (*schedule_max_ordered_locks_fn_t)(void); -typedef void (*schedule_save_context_fn_t)(uint32_t queue_index); - typedef struct schedule_fn_t { - int status_sync; - schedule_pktio_start_fn_t pktio_start; - schedule_thr_add_fn_t thr_add; - schedule_thr_rem_fn_t thr_rem; - schedule_num_grps_fn_t num_grps; - schedule_init_queue_fn_t init_queue; - schedule_destroy_queue_fn_t destroy_queue; - schedule_sched_queue_fn_t sched_queue; - schedule_ord_enq_multi_fn_t ord_enq_multi; - schedule_init_global_fn_t init_global; - schedule_term_global_fn_t term_global; - schedule_init_local_fn_t init_local; - schedule_term_local_fn_t term_local; - schedule_order_lock_fn_t order_lock; - schedule_order_unlock_fn_t order_unlock; - schedule_order_unlock_lock_fn_t order_unlock_lock; - schedule_max_ordered_locks_fn_t max_ordered_locks; + int status_sync; + void (*pktio_start)(int pktio_index, int num_in_queue, + int in_queue_idx[], odp_queue_t odpq[]); + int (*thr_add)(odp_schedule_group_t group, int thr); + int (*thr_rem)(odp_schedule_group_t group, int thr); + int (*num_grps)(void); + int (*init_queue)(uint32_t queue_index, + const odp_schedule_param_t *sched_param); + void (*destroy_queue)(uint32_t queue_index); + int (*sched_queue)(uint32_t queue_index); + int (*ord_enq_multi)(queue_t q_int, void *buf_hdr[], int num, int *ret); + void (*order_lock)(void); + void (*order_unlock)(void); - unsigned (*max_ordered_locks)(void); ++ void (*order_unlock_lock)(void); ++ uint32_t (*max_ordered_locks)(void);
/* Called only when status_sync is set */ - schedule_unsched_queue_fn_t unsched_queue; - schedule_save_context_fn_t save_context; - + int (*unsched_queue)(uint32_t queue_index); + void (*save_context)(uint32_t queue_index); } schedule_fn_t;
+ /* Interface towards the scheduler */ extern const schedule_fn_t *sched_fn;
-/* Interface for the scheduler */ -int sched_cb_pktin_poll(int pktio_index, int num_queue, int index[]); -int sched_cb_pktin_poll_one(int pktio_index, int rx_queue, odp_event_t evts[]); -void sched_cb_pktio_stop_finalize(int pktio_index); -odp_queue_t sched_cb_queue_handle(uint32_t queue_index); -void sched_cb_queue_destroy_finalize(uint32_t queue_index); -int sched_cb_queue_deq_multi(uint32_t queue_index, odp_event_t ev[], int num); -int sched_cb_queue_empty(uint32_t queue_index); - -/* API functions */ -typedef struct { - uint64_t (*schedule_wait_time)(uint64_t); - odp_event_t (*schedule)(odp_queue_t *, uint64_t); - int (*schedule_multi)(odp_queue_t *, uint64_t, odp_event_t [], int); - void (*schedule_pause)(void); - void (*schedule_resume)(void); - void (*schedule_release_atomic)(void); - void (*schedule_release_ordered)(void); - void (*schedule_prefetch)(int); - int (*schedule_num_prio)(void); - odp_schedule_group_t (*schedule_group_create)(const char *, - const odp_thrmask_t *); - int (*schedule_group_destroy)(odp_schedule_group_t); - odp_schedule_group_t (*schedule_group_lookup)(const char *); - int (*schedule_group_join)(odp_schedule_group_t, const odp_thrmask_t *); - int (*schedule_group_leave)(odp_schedule_group_t, - const odp_thrmask_t *); - int (*schedule_group_thrmask)(odp_schedule_group_t, odp_thrmask_t *); - int (*schedule_group_info)(odp_schedule_group_t, - odp_schedule_group_info_t *); - void (*schedule_order_lock)(uint32_t); - void (*schedule_order_unlock)(uint32_t); - void (*schedule_order_unlock_lock)(uint32_t, uint32_t); - -} schedule_api_t; - + #ifdef __cplusplus + } + #endif + #endif diff --cc platform/linux-generic/m4/configure.m4 index a0d65a31,7fa3652e..e15ec9f9 --- a/platform/linux-generic/m4/configure.m4 +++ b/platform/linux-generic/m4/configure.m4 @@@ -21,11 -16,8 +21,10 @@@ m4_include([platform/linux-generic/m4/p AC_CONFIG_COMMANDS_PRE([dnl AM_CONDITIONAL([PLATFORM_IS_LINUX_GENERIC], [test "${with_platform}" = "linux-generic"]) +]) + AC_CONFIG_FILES([platform/linux-generic/Makefile platform/linux-generic/libodp-linux.pc - platform/linux-generic/include/odp/api/plat/static_inline.h platform/linux-generic/test/Makefile platform/linux-generic/test/validation/api/shmem/Makefile platform/linux-generic/test/validation/api/pktio/Makefile diff --cc platform/linux-generic/odp_packet.c index cb20eeda,9c3be1bc..eca80cef --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@@ -6,13 -6,15 +6,16 @@@
#include "config.h"
- #include <odp/api/plat/packet_inlines.h> #include <odp/api/packet.h> + #include <odp/api/plat/packet_inlines.h> #include <odp_packet_internal.h> #include <odp_debug_internal.h> +#include <odp_pool_internal.h> #include <odp/api/hints.h> #include <odp/api/byteorder.h> + #include <odp/api/plat/byteorder_inlines.h> + #include <odp/api/packet_io.h> + #include <odp/api/plat/pktio_inlines.h>
#include <protocols/eth.h> #include <protocols/ip.h> diff --cc platform/linux-generic/odp_packet_io.c index efeac026,4eae4ed1..7573197c --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@@ -9,8 -9,8 +9,9 @@@ #include <odp_posix_extensions.h>
#include <odp/api/packet_io.h> + #include <odp/api/plat/pktio_inlines.h> #include <odp_packet_io_internal.h> +#include <odp_packet_io_pool.h> #include <odp/api/packet.h> #include <odp_packet_internal.h> #include <odp_internal.h> @@@ -30,12 -32,12 +31,13 @@@ #include <ifaddrs.h> #include <errno.h> #include <time.h> +#include <linux/if_ether.h>
- /* Sleep this many nanoseconds between pktin receive calls */ - #define SLEEP_NSEC 1000 + /* Sleep this many microseconds between pktin receive calls. Must be smaller + * than 1000000 (a million), i.e. smaller than a second. */ + #define SLEEP_USEC 1
- /* Check total sleep time about every SLEEP_CHECK * SLEEP_NSEC nanoseconds. + /* Check total sleep time about every SLEEP_CHECK * SLEEP_USEC microseconds. * Must be power of two. */ #define SLEEP_CHECK 32
diff --cc platform/linux-generic/pktio/common.c index e6eb0990,00000000..77d01ff8 mode 100644,000000..100644 --- a/platform/linux-generic/pktio/common.c +++ b/platform/linux-generic/pktio/common.c @@@ -1,462 -1,0 +1,583 @@@ +/* Copyright (c) 2013, Linaro Limited + * Copyright (c) 2013, Nokia Solutions and Networks + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include <odp_packet_io_internal.h> +#include <odp_classification_internal.h> ++#include <protocols/eth.h> +#include <pktio/ethtool.h> +#include <pktio/common.h> +#include <pktio/sysfs.h> +#include <errno.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <net/if.h> +#include <linux/ethtool.h> +#include <linux/sockios.h> +#include <linux/if_packet.h> +#include <linux/if_ether.h> + +/* + * ODP_PACKET_SOCKET_MMSG: + * ODP_PACKET_SOCKET_MMAP: + * ODP_PACKET_NETMAP: + */ +int sock_stats_reset_fd(pktio_entry_t *pktio_entry, int fd) +{ + int err = 0; + odp_pktio_stats_t cur_stats; + + if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) { + memset(&pktio_entry->s.stats, 0, + sizeof(odp_pktio_stats_t)); + return 0; + } + + memset(&cur_stats, 0, sizeof(odp_pktio_stats_t)); + + if (pktio_entry->s.stats_type == STATS_ETHTOOL) { + (void)ethtool_stats_get_fd(fd, + pktio_entry->s.name, + &cur_stats); + } else if (pktio_entry->s.stats_type == STATS_SYSFS) { + err = sysfs_netif_stats(pktio_entry->s.name, &cur_stats); + if (err != 0) + ODP_ERR("stats error\n"); + } + + if (err == 0) + memcpy(&pktio_entry->s.stats, &cur_stats, + sizeof(odp_pktio_stats_t)); + + return err; +} + +/* + * ODP_PACKET_SOCKET_MMSG: + * ODP_PACKET_SOCKET_MMAP: + * ODP_PACKET_NETMAP: + */ +int sock_stats_fd(pktio_entry_t *pktio_entry, + odp_pktio_stats_t *stats, + int fd) +{ + odp_pktio_stats_t cur_stats; + int ret = 0; + + if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) + return 0; + + memset(&cur_stats, 0, sizeof(odp_pktio_stats_t)); + if (pktio_entry->s.stats_type == STATS_ETHTOOL) { + (void)ethtool_stats_get_fd(fd, + pktio_entry->s.name, + &cur_stats); + } else if (pktio_entry->s.stats_type == STATS_SYSFS) { + sysfs_netif_stats(pktio_entry->s.name, &cur_stats); + } + + stats->in_octets = cur_stats.in_octets - + pktio_entry->s.stats.in_octets; + stats->in_ucast_pkts = cur_stats.in_ucast_pkts - + pktio_entry->s.stats.in_ucast_pkts; + stats->in_discards = cur_stats.in_discards - + pktio_entry->s.stats.in_discards; + stats->in_errors = cur_stats.in_errors - + pktio_entry->s.stats.in_errors; + stats->in_unknown_protos = cur_stats.in_unknown_protos - + pktio_entry->s.stats.in_unknown_protos; + + stats->out_octets = cur_stats.out_octets - + pktio_entry->s.stats.out_octets; + stats->out_ucast_pkts = cur_stats.out_ucast_pkts - + pktio_entry->s.stats.out_ucast_pkts; + stats->out_discards = cur_stats.out_discards - + pktio_entry->s.stats.out_discards; + stats->out_errors = cur_stats.out_errors - + pktio_entry->s.stats.out_errors; + + return ret; +} + - /* - * ODP_PACKET_SOCKET_MMSG: - * ODP_PACKET_SOCKET_MMAP: - * ODP_PACKET_NETMAP: - */ - uint32_t mtu_get_fd(int fd, const char *name) - { - struct ifreq ifr; - int ret; - - snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", name); - ret = ioctl(fd, SIOCGIFMTU, &ifr); - if (ret < 0) { - __odp_errno = errno; - ODP_DBG("ioctl(SIOCGIFMTU): %s: "%s".\n", strerror(errno), - ifr.ifr_name); - return 0; - } - return ifr.ifr_mtu; - } - +/** + * ODP_PACKET_SOCKET_MMSG: + * ODP_PACKET_SOCKET_MMAP: + * ODP_PACKET_NETMAP: + */ +int mac_addr_get_fd(int fd, const char *name, unsigned char mac_dst[]) +{ + struct ifreq ethreq; + int ret; + + memset(ðreq, 0, sizeof(ethreq)); + snprintf(ethreq.ifr_name, IF_NAMESIZE, "%s", name); + ret = ioctl(fd, SIOCGIFHWADDR, ðreq); + if (ret != 0) { + __odp_errno = errno; + ODP_ERR("ioctl(SIOCGIFHWADDR): %s: "%s".\n", strerror(errno), + ethreq.ifr_name); + return -1; + } + + memcpy(mac_dst, (unsigned char *)ethreq.ifr_ifru.ifru_hwaddr.sa_data, + ETH_ALEN); + return 0; +} + ++/* ++ * ODP_PACKET_SOCKET_MMSG: ++ * ODP_PACKET_SOCKET_MMAP: ++ * ODP_PACKET_NETMAP: ++ */ ++uint32_t mtu_get_fd(int fd, const char *name) ++{ ++ struct ifreq ifr; ++ int ret; ++ ++ snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", name); ++ ret = ioctl(fd, SIOCGIFMTU, &ifr); ++ if (ret < 0) { ++ __odp_errno = errno; ++ ODP_DBG("ioctl(SIOCGIFMTU): %s: "%s".\n", strerror(errno), ++ ifr.ifr_name); ++ return 0; ++ } ++ return ifr.ifr_mtu + _ODP_ETHHDR_LEN; ++} ++ +/* + * ODP_PACKET_SOCKET_MMSG: + * ODP_PACKET_SOCKET_MMAP: + * ODP_PACKET_NETMAP: + */ +int promisc_mode_set_fd(int fd, const char *name, int enable) +{ + struct ifreq ifr; + int ret; + + snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", name); + ret = ioctl(fd, SIOCGIFFLAGS, &ifr); + if (ret < 0) { + __odp_errno = errno; + ODP_DBG("ioctl(SIOCGIFFLAGS): %s: "%s".\n", strerror(errno), + ifr.ifr_name); + return -1; + } + + if (enable) + ifr.ifr_flags |= IFF_PROMISC; + else + ifr.ifr_flags &= ~(IFF_PROMISC); + + ret = ioctl(fd, SIOCSIFFLAGS, &ifr); + if (ret < 0) { + __odp_errno = errno; + ODP_DBG("ioctl(SIOCSIFFLAGS): %s: "%s".\n", strerror(errno), + ifr.ifr_name); + return -1; + } + return 0; +} + +/* + * ODP_PACKET_SOCKET_MMSG: + * ODP_PACKET_SOCKET_MMAP: + * ODP_PACKET_NETMAP: + */ +int promisc_mode_get_fd(int fd, const char *name) +{ + struct ifreq ifr; + int ret; + + snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", name); + ret = ioctl(fd, SIOCGIFFLAGS, &ifr); + if (ret < 0) { + __odp_errno = errno; + ODP_DBG("ioctl(SIOCGIFFLAGS): %s: "%s".\n", strerror(errno), + ifr.ifr_name); + return -1; + } + + return !!(ifr.ifr_flags & IFF_PROMISC); +} + - /* - * ODP_PACKET_SOCKET_MMSG: - * ODP_PACKET_SOCKET_MMAP: - * ODP_PACKET_NETMAP: - */ +int link_status_fd(int fd, const char *name) +{ + struct ifreq ifr; + int ret; + + snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", name); + ret = ioctl(fd, SIOCGIFFLAGS, &ifr); + if (ret < 0) { + __odp_errno = errno; + ODP_DBG("ioctl(SIOCGIFFLAGS): %s: "%s".\n", strerror(errno), + ifr.ifr_name); + return -1; + } + + return !!(ifr.ifr_flags & IFF_RUNNING); +} + +/** + * Get enabled hash options of a packet socket + * + * @param fd Socket file descriptor + * @param name Interface name + * @param flow_type Packet flow type + * @param options[out] Enabled hash options + * + * @retval 0 on success + * @retval <0 on failure + */ +static inline int get_rss_hash_options(int fd, const char *name, + uint32_t flow_type, uint64_t *options) +{ + struct ifreq ifr; + struct ethtool_rxnfc rsscmd; + + memset(&ifr, 0, sizeof(ifr)); + memset(&rsscmd, 0, sizeof(rsscmd)); + *options = 0; + + snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", name); + + rsscmd.cmd = ETHTOOL_GRXFH; + rsscmd.flow_type = flow_type; + + ifr.ifr_data = (void *)&rsscmd; + + if (ioctl(fd, SIOCETHTOOL, &ifr) < 0) + return -1; + + *options = rsscmd.data; + return 0; +} + +int rss_conf_get_fd(int fd, const char *name, + odp_pktin_hash_proto_t *hash_proto) +{ + uint64_t options; + int rss_enabled = 0; + + memset(hash_proto, 0, sizeof(odp_pktin_hash_proto_t)); + + get_rss_hash_options(fd, name, IPV4_FLOW, &options); + if ((options & RXH_IP_SRC) && (options & RXH_IP_DST)) { + hash_proto->proto.ipv4 = 1; + rss_enabled++; + } + get_rss_hash_options(fd, name, TCP_V4_FLOW, &options); + if ((options & RXH_IP_SRC) && (options & RXH_IP_DST) && + (options & RXH_L4_B_0_1) && (options & RXH_L4_B_2_3)) { + hash_proto->proto.ipv4_tcp = 1; + rss_enabled++; + } + get_rss_hash_options(fd, name, UDP_V4_FLOW, &options); + if ((options & RXH_IP_SRC) && (options & RXH_IP_DST) && + (options & RXH_L4_B_0_1) && (options & RXH_L4_B_2_3)) { + hash_proto->proto.ipv4_udp = 1; + rss_enabled++; + } + get_rss_hash_options(fd, name, IPV6_FLOW, &options); + if ((options & RXH_IP_SRC) && (options & RXH_IP_DST)) { + hash_proto->proto.ipv6 = 1; + rss_enabled++; + } + get_rss_hash_options(fd, name, TCP_V6_FLOW, &options); + if ((options & RXH_IP_SRC) && (options & RXH_IP_DST) && + (options & RXH_L4_B_0_1) && (options & RXH_L4_B_2_3)) { + hash_proto->proto.ipv6_tcp = 1; + rss_enabled++; + } + get_rss_hash_options(fd, name, UDP_V6_FLOW, &options); + if ((options & RXH_IP_SRC) && (options & RXH_IP_DST) && + (options & RXH_L4_B_0_1) && (options & RXH_L4_B_2_3)) { + hash_proto->proto.ipv6_udp = 1; + rss_enabled++; + } + return rss_enabled; +} + +/** + * Set hash options of a packet socket + * + * @param fd Socket file descriptor + * @param name Interface name + * @param flow_type Packet flow type + * @param options Hash options + * + * @retval 0 on success + * @retval <0 on failure + */ +static inline int set_rss_hash(int fd, const char *name, + uint32_t flow_type, uint64_t options) +{ + struct ifreq ifr; + struct ethtool_rxnfc rsscmd; + + memset(&rsscmd, 0, sizeof(rsscmd)); + + snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", name); + + rsscmd.cmd = ETHTOOL_SRXFH; + rsscmd.flow_type = flow_type; + rsscmd.data = options; + + ifr.ifr_data = (void *)&rsscmd; + + if (ioctl(fd, SIOCETHTOOL, &ifr) < 0) + return -1; + + return 0; +} + +int rss_conf_set_fd(int fd, const char *name, + const odp_pktin_hash_proto_t *hash_proto) +{ + uint64_t options; + odp_pktin_hash_proto_t cur_hash; + + /* Compare to currently set hash protocols */ + rss_conf_get_fd(fd, name, &cur_hash); + + if (hash_proto->proto.ipv4_udp && !cur_hash.proto.ipv4_udp) { + options = RXH_IP_SRC | RXH_IP_DST | RXH_L4_B_0_1 | RXH_L4_B_2_3; + if (set_rss_hash(fd, name, UDP_V4_FLOW, options)) + return -1; + } + if (hash_proto->proto.ipv4_tcp && !cur_hash.proto.ipv4_tcp) { + options = RXH_IP_SRC | RXH_IP_DST | RXH_L4_B_0_1 | RXH_L4_B_2_3; + if (set_rss_hash(fd, name, TCP_V4_FLOW, options)) + return -1; + } + if (hash_proto->proto.ipv6_udp && !cur_hash.proto.ipv6_udp) { + options = RXH_IP_SRC | RXH_IP_DST | RXH_L4_B_0_1 | RXH_L4_B_2_3; + if (set_rss_hash(fd, name, UDP_V6_FLOW, options)) + return -1; + } + if (hash_proto->proto.ipv6_tcp && !cur_hash.proto.ipv6_tcp) { + options = RXH_IP_SRC | RXH_IP_DST | RXH_L4_B_0_1 | RXH_L4_B_2_3; + if (set_rss_hash(fd, name, TCP_V6_FLOW, options)) + return -1; + } + if (hash_proto->proto.ipv4 && !cur_hash.proto.ipv4) { + options = RXH_IP_SRC | RXH_IP_DST; + if (set_rss_hash(fd, name, IPV4_FLOW, options)) + return -1; + } + if (hash_proto->proto.ipv6 && !cur_hash.proto.ipv6) { + options = RXH_IP_SRC | RXH_IP_DST; + if (set_rss_hash(fd, name, IPV6_FLOW, options)) + return -1; + } + return 0; +} + +int rss_conf_get_supported_fd(int fd, const char *name, + odp_pktin_hash_proto_t *hash_proto) +{ + uint64_t options; + int rss_supported = 0; + + memset(hash_proto, 0, sizeof(odp_pktin_hash_proto_t)); + + if (!get_rss_hash_options(fd, name, IPV4_FLOW, &options)) { + if (!set_rss_hash(fd, name, IPV4_FLOW, options)) { + hash_proto->proto.ipv4 = 1; + rss_supported++; + } + } + if (!get_rss_hash_options(fd, name, TCP_V4_FLOW, &options)) { + if (!set_rss_hash(fd, name, TCP_V4_FLOW, options)) { + hash_proto->proto.ipv4_tcp = 1; + rss_supported++; + } + } + if (!get_rss_hash_options(fd, name, UDP_V4_FLOW, &options)) { + if (!set_rss_hash(fd, name, UDP_V4_FLOW, options)) { + hash_proto->proto.ipv4_udp = 1; + rss_supported++; + } + } + if (!get_rss_hash_options(fd, name, IPV6_FLOW, &options)) { + if (!set_rss_hash(fd, name, IPV6_FLOW, options)) { + hash_proto->proto.ipv6 = 1; + rss_supported++; + } + } + if (!get_rss_hash_options(fd, name, TCP_V6_FLOW, &options)) { + if (!set_rss_hash(fd, name, TCP_V6_FLOW, options)) { + hash_proto->proto.ipv6_tcp = 1; + rss_supported++; + } + } + if (!get_rss_hash_options(fd, name, UDP_V6_FLOW, &options)) { + if (!set_rss_hash(fd, name, UDP_V6_FLOW, options)) { + hash_proto->proto.ipv6_udp = 1; + rss_supported++; + } + } + return rss_supported; +} + +void rss_conf_print(const odp_pktin_hash_proto_t *hash_proto) +{ int max_len = 512; + char str[max_len]; + int len = 0; + int n = max_len - 1; + + len += snprintf(&str[len], n - len, " rss conf\n"); + + if (hash_proto->proto.ipv4) + len += snprintf(&str[len], n - len, + " IPV4\n"); + if (hash_proto->proto.ipv4_tcp) + len += snprintf(&str[len], n - len, + " IPV4 TCP\n"); + if (hash_proto->proto.ipv4_udp) + len += snprintf(&str[len], n - len, + " IPV4 UDP\n"); + if (hash_proto->proto.ipv6) + len += snprintf(&str[len], n - len, + " IPV6\n"); + if (hash_proto->proto.ipv6_tcp) + len += snprintf(&str[len], n - len, + " IPV6 TCP\n"); + if (hash_proto->proto.ipv6_udp) + len += snprintf(&str[len], n - len, + " IPV6 UDP\n"); + str[len] = '\0'; + + ODP_PRINT("%s\n", str); +} ++ ++static int sock_recv_mq_tmo_select(pktio_entry_t * const *entry, ++ const int index[], ++ unsigned num_q, unsigned *from, ++ odp_packet_t packets[], int num, ++ uint64_t usecs, fd_set *readfds, ++ int maxfd) ++{ ++ struct timeval timeout; ++ unsigned i; ++ int ret; ++ ++ for (i = 0; i < num_q; i++) { ++ ret = entry[i]->s.ops->recv(entry[i], index[i], packets, num); ++ ++ if (ret > 0 && from) ++ *from = i; ++ ++ if (ret != 0) ++ return ret; ++ } ++ ++ timeout.tv_sec = usecs / (1000 * 1000); ++ timeout.tv_usec = usecs - timeout.tv_sec * (1000ULL * 1000ULL); ++ ++ if (select(maxfd + 1, readfds, NULL, NULL, ++ usecs == ODP_PKTIN_WAIT ? NULL : &timeout) == 0) ++ return 0; ++ ++ for (i = 0; i < num_q; i++) { ++ ret = entry[i]->s.ops->recv(entry[i], index[i], packets, num); ++ ++ if (ret > 0 && from) ++ *from = i; ++ ++ if (ret != 0) ++ return ret; ++ } ++ ++ return 0; ++} ++ ++int sock_recv_mq_tmo_try_int_driven(const struct odp_pktin_queue_t queues[], ++ unsigned num_q, unsigned *from, ++ odp_packet_t packets[], int num, ++ uint64_t usecs, int *trial_successful) ++{ ++ unsigned i; ++ pktio_entry_t *entry[num_q]; ++ int index[num_q]; ++ fd_set readfds; ++ int maxfd = -1; ++ int (*impl)(pktio_entry_t *entry[], int index[], int num_q, ++ odp_packet_t packets[], int num, unsigned *from, ++ uint64_t wait_usecs) = NULL; ++ int impl_set = 0; ++ ++ /* First, we get pktio entries and queue indices. We then see if the ++ implementation function pointers are the same. If they are the ++ same, impl will be set to non-NULL; otherwise it will be NULL. */ ++ ++ for (i = 0; i < num_q; i++) { ++ entry[i] = get_pktio_entry(queues[i].pktio); ++ index[i] = queues[i].index; ++ if (entry[i] == NULL) { ++ ODP_DBG("pktio entry %d does not exist\n", ++ queues[i].pktio); ++ *trial_successful = 0; ++ return -1; ++ } ++ if (entry[i]->s.ops->recv_mq_tmo == NULL && ++ entry[i]->s.ops->fd_set == NULL) { ++ *trial_successful = 0; ++ return 0; ++ } ++ if (!impl_set) { ++ impl = entry[i]->s.ops->recv_mq_tmo; ++ impl_set = 1; ++ } else { ++ if (impl != entry[i]->s.ops->recv_mq_tmo) { ++ impl = NULL; ++ break; ++ } ++ } ++ } ++ ++ /* Check whether we can call the compatible implementation */ ++ if (impl != NULL) { ++ *trial_successful = 1; ++ return impl(entry, index, num_q, packets, num, from, usecs); ++ } ++ ++ /* Get file descriptor sets of devices. maxfd will be -1 if this ++ fails. */ ++ FD_ZERO(&readfds); ++ for (i = 0; i < num_q; i++) { ++ if (entry[i]->s.ops->fd_set) { ++ int maxfd2; ++ ++ maxfd2 = entry[i]->s.ops->fd_set( ++ entry[i], queues[i].index, &readfds); ++ if (maxfd2 < 0) { ++ maxfd = -1; ++ break; ++ } ++ if (maxfd2 > maxfd) ++ maxfd = maxfd2; ++ } else { ++ maxfd = -1; ++ } ++ } ++ ++ /* Check whether we can call the select() implementation */ ++ if (maxfd >= 0) { ++ *trial_successful = 1; ++ return sock_recv_mq_tmo_select(entry, index, num_q, from, ++ packets, num, usecs, ++ &readfds, maxfd); ++ } ++ ++ /* No mechanism worked. Set trial_successful to 0 so that polling will ++ be used by the main implementation. */ ++ *trial_successful = 0; ++ return 0; ++} diff --cc platform/linux-generic/pktio/common.h index 2ea68f64,88d2306c..6c500b4d --- a/platform/linux-generic/pktio/common.h +++ b/platform/linux-generic/pktio/common.h @@@ -4,21 -5,94 +4,29 @@@ * SPDX-License-Identifier: BSD-3-Clause */
-#ifndef ODP_PACKET_SOCKET_H -#define ODP_PACKET_SOCKET_H +#ifndef ODP_PKTIO_COMMON_H_ +#define ODP_PKTIO_COMMON_H_
-#include <linux/if_packet.h> -#include <linux/if_ether.h> -#include <sys/socket.h> + #include <string.h> -#include <stddef.h> +#include <errno.h>
-#include <odp/api/align.h> -#include <odp/api/buffer.h> -#include <odp/api/debug.h> -#include <odp/api/pool.h> -#include <odp/api/packet.h> -#include <odp/api/packet_io.h> - -#include <linux/version.h> - -/* - * Packet socket config: - */ - -/* - * This makes sure that building for kernels older than 3.1 works - * and a fanout requests fails (for invalid packet socket option) - * in runtime if requested - */ -#ifndef PACKET_FANOUT -#define PACKET_FANOUT 18 -#define PACKET_FANOUT_HASH 0 -#endif /* PACKET_FANOUT */ - -typedef struct { - int sockfd; /**< socket descriptor */ - odp_pool_t pool; /**< pool to alloc packets from */ - uint32_t mtu; /**< maximum transmission unit */ - unsigned char if_mac[ETH_ALEN]; /**< IF eth mac addr */ -} pkt_sock_t; - -/** packet mmap ring */ -struct ring { - struct iovec *rd; - unsigned frame_num; - int rd_num; - - int sock; - int type; - int version; - uint8_t *mm_space; - size_t mm_len; - size_t rd_len; - int flen; - - struct tpacket_req req; -}; - -ODP_STATIC_ASSERT(offsetof(struct ring, mm_space) <= ODP_CACHE_LINE_SIZE, - "ERR_STRUCT_RING"); - -/** Packet socket using mmap rings for both Rx and Tx */ -typedef struct { - /** Packet mmap ring for Rx */ - struct ring ODP_ALIGNED_CACHE rx_ring; - /** Packet mmap ring for Tx */ - struct ring ODP_ALIGNED_CACHE tx_ring; - - int ODP_ALIGNED_CACHE sockfd; - odp_pool_t pool; - int mtu; /**< maximum transmission unit */ - size_t frame_offset; /**< frame start offset from start of pkt buf */ - uint8_t *mmap_base; - unsigned mmap_len; - unsigned char if_mac[ETH_ALEN]; - struct sockaddr_ll ll; - int fanout; -} pkt_sock_mmap_t; +/** Determine if a socket read/write error should be reported. Transient errors + * that simply require the caller to retry are ignored, the _send/_recv APIs + * are non-blocking and it is the caller's responsibility to retry if the + * requested number of packets were not handled. */ +#define SOCK_ERR_REPORT(e) (e != EAGAIN && e != EWOULDBLOCK && e != EINTR)
- /** - * Read the MTU from a packet socket - */ - uint32_t mtu_get_fd(int fd, const char *name); + static inline void + ethaddr_copy(unsigned char mac_dst[], unsigned char mac_src[]) + { + memcpy(mac_dst, mac_src, ETH_ALEN); + } + + static inline int + ethaddrs_equal(unsigned char mac_a[], unsigned char mac_b[]) + { + return !memcmp(mac_a, mac_b, ETH_ALEN); + }
/** * Read the MAC address from a packet socket diff --cc platform/linux-generic/pktio/dpdk.c index 3f716ab1,bd6920e6..b4a9fa36 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@@ -681,8 -745,10 +749,10 @@@ static inline int pkt_to_mbuf_zero(pkti const odp_packet_t pkt_table[], uint16_t num, uint16_t *copy_count) { - pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk; + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; odp_pktout_config_opt_t *pktout_cfg = &pktio_entry->s.config.pktout; + odp_pktout_config_opt_t *pktout_capa = + &pktio_entry->s.capa.config.pktout; int i; *copy_count = 0;
@@@ -928,7 -1001,12 +1005,12 @@@ static int dpdk_close(pktio_entry_t *pk rte_pktmbuf_free(pkt_dpdk->rx_cache[i].s.pkt[idx++]); }
+ #if RTE_VERSION < RTE_VERSION_NUM(17, 8, 0, 0) + if (pktio_entry->s.state != PKTIO_STATE_OPENED) + rte_eth_dev_close(pkt_dpdk->port_id); + #endif + - return 0; + return ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); }
static int dpdk_pktio_init(void) @@@ -1082,9 -1162,8 +1166,9 @@@ static int dpdk_pktio_term(void static int dpdk_input_queues_config(pktio_entry_t *pktio_entry, const odp_pktin_queue_param_t *p) { + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; odp_pktin_mode_t mode = pktio_entry->s.param.in_mode; - odp_bool_t lockless; + uint8_t lockless;
/** * Scheduler synchronizes input queue polls. Only single thread @@@ -1106,8 -1185,8 +1190,8 @@@ static int dpdk_output_queues_config(pktio_entry_t *pktio_entry, const odp_pktout_queue_param_t *p) { - pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk; + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; - odp_bool_t lockless; + uint8_t lockless;
if (p->op_mode == ODP_PKTIO_OP_MT_UNSAFE) lockless = 1; @@@ -1122,8 -1201,8 +1206,8 @@@ static void dpdk_init_capability(pktio_entry_t *pktio_entry, struct rte_eth_dev_info *dev_info) { - pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk; + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; - odp_pktio_capability_t *capa = &pkt_dpdk->capa; + odp_pktio_capability_t *capa = &pktio_entry->s.capa; int ptype_cnt; int ptype_l3_ipv4 = 0; int ptype_l4_tcp = 0; @@@ -1617,33 -1729,20 +1759,33 @@@ static pktio_ops_module_t dpdk_pktio_op .stop = dpdk_stop, .stats = dpdk_stats, .stats_reset = dpdk_stats_reset, + .pktin_ts_res = NULL, + .pktin_ts_from_ns = NULL, .recv = dpdk_recv, .send = dpdk_send, - .mtu_get = dpdk_mtu_get, + .link_status = dpdk_link_status, + .mtu_get = dpdk_frame_maxlen, .promisc_mode_set = dpdk_promisc_mode_set, .promisc_mode_get = dpdk_promisc_mode_get, .mac_get = dpdk_mac_addr_get, .mac_set = NULL, - .link_status = dpdk_link_status, .capability = dpdk_capability, - .pktin_ts_res = NULL, - .pktin_ts_from_ns = NULL, .config = NULL, .input_queues_config = dpdk_input_queues_config, - .output_queues_config = dpdk_output_queues_config + .output_queues_config = dpdk_output_queues_config, + .print = NULL, };
+ODP_MODULE_CONSTRUCTOR(dpdk_pktio_ops) +{ + odp_module_constructor(&dpdk_pktio_ops); + + odp_subsystem_register_module(pktio_ops, &dpdk_pktio_ops); +} + +/* Temporary variable to enable link this module, + * will remove in Makefile scheme changes. + */ +int enable_link_dpdk_pktio_ops = 0; + #endif /* ODP_PKTIO_DPDK */ diff --cc platform/linux-generic/pktio/ethtool.c index 119ad75a,7d9869bf..a48f0db8 --- a/platform/linux-generic/pktio/ethtool.c +++ b/platform/linux-generic/pktio/ethtool.c @@@ -13,6 -13,6 +13,7 @@@ #include <netinet/in.h> #include <linux/sockios.h> #include <linux/ethtool.h> ++#include <string.h> #include <errno.h> #include <net/if.h>
diff --cc platform/linux-generic/pktio/ipc.c index 4ca7d64e,95b52664..493d9bae --- a/platform/linux-generic/pktio/ipc.c +++ b/platform/linux-generic/pktio/ipc.c @@@ -603,17 -579,16 +604,17 @@@ static int ipc_pktio_recv(pktio_entry_ }
static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry, - const odp_packet_t pkt_table[], int len) + const odp_packet_t pkt_table[], int num) { + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; _ring_t *r; void **rbuf_p; int ret; int i; - uint32_t ready = odp_atomic_load_u32(&pktio_entry->s.ipc.ready); + uint32_t ready = odp_atomic_load_u32(&pkt_ipc->ready); - odp_packet_t pkt_table_mapped[len]; /**< Ready to send packet has to be + odp_packet_t pkt_table_mapped[num]; /**< Ready to send packet has to be * in memory mapped pool. */ - uintptr_t offsets[len]; + uintptr_t offsets[num];
if (odp_unlikely(!ready)) return 0; @@@ -623,10 -598,9 +624,10 @@@ /* Copy packets to shm shared pool if they are in different * pool, or if they are references (we can't share across IPC). */ - for (i = 0; i < len; i++) { + for (i = 0; i < num; i++) { odp_packet_t pkt = pkt_table[i]; - pool_t *ipc_pool = pool_entry_from_hdl(pktio_entry->s.ipc.pool); + pool_t *ipc_pool = pool_entry_from_hdl( + pkt_ipc->pool); odp_packet_hdr_t *pkt_hdr; pool_t *pool;
@@@ -675,11 -649,13 +676,11 @@@
/* Put packets to ring to be processed by other process. */ rbuf_p = (void *)&offsets[0]; - r = pktio_entry->s.ipc.tx.send; + r = pkt_ipc->tx.send; - ret = _ring_mp_enqueue_burst(r, rbuf_p, len); + ret = _ring_mp_enqueue_burst(r, rbuf_p, num); if (odp_unlikely(ret < 0)) { ODP_ERR("pid %d odp_ring_mp_enqueue_bulk fail, ipc_slave %d, ret %d\n", - getpid(), - (PKTIO_TYPE_IPC_SLAVE == pktio_entry->s.ipc.type), - ret); + getpid(), (PKTIO_TYPE_IPC_SLAVE == pkt_ipc->type), ret); ODP_ERR("odp_ring_full: %d, odp_ring_count %d, _ring_free_count %d\n", _ring_full(r), _ring_count(r), _ring_free_count(r)); diff --cc platform/linux-generic/pktio/loopback.c index ff08364a,0cf45acb..3d66af16 --- a/platform/linux-generic/pktio/loopback.c +++ b/platform/linux-generic/pktio/loopback.c @@@ -19,10 -19,13 +20,15 @@@ #include <protocols/eth.h> #include <protocols/ip.h>
++#include <string.h> #include <errno.h> #include <inttypes.h> #include <limits.h> +#include <linux/if_ether.h> + #include <stdlib.h> + + #define MAX_LOOP 16 + #define LOOP_MTU (64 * 1024)
/* MAC address for the "loop" interface */ static const char pktio_loop_mac[] = {0x02, 0xe9, 0x34, 0x80, 0x73, 0x01}; @@@ -32,30 -35,29 +38,41 @@@ static int loopback_stats_reset(pktio_e static int loopback_open(odp_pktio_t id, pktio_entry_t *pktio_entry, const char *devname, odp_pool_t pool ODP_UNUSED) { + long idx; + char loopq_name[ODP_QUEUE_NAME_LEN]; + pktio_ops_loopback_data_t *pkt_lbk = NULL;
- if (strcmp(devname, "loop")) + if (!strcmp(devname, "loop")) { + idx = 0; + } else if (!strncmp(devname, "loop", 4)) { + char *end; + + idx = strtol(devname + 4, &end, 10); + if (idx <= 0 || idx >= MAX_LOOP || *end) + return -1; + } else { return -1; + } + + snprintf(loopq_name, sizeof(loopq_name), "%" PRIu64 "-pktio_loopq", + odp_pktio_to_u64(id)); - pktio_entry->s.pkt_loop.loopq = - odp_queue_create(loopq_name, NULL); - pktio_entry->s.pkt_loop.idx = idx;
- if (pktio_entry->s.pkt_loop.loopq == ODP_QUEUE_INVALID) + pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*pkt_lbk)); + if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { + ODP_ERR("Failed to allocate pktio_ops_loopback_data_t struct"); return -1; + } + + pkt_lbk = pktio_entry->s.ops_data; + memset(pkt_lbk, 0, sizeof(*pkt_lbk)); + - char loopq_name[ODP_QUEUE_NAME_LEN]; - - snprintf(loopq_name, sizeof(loopq_name), "%" PRIu64 "-pktio_loopq", - odp_pktio_to_u64(id)); + pkt_lbk->loopq = odp_queue_create(loopq_name, NULL); ++ pkt_lbk->idx = idx; + + if (pkt_lbk->loopq == ODP_QUEUE_INVALID) { + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); + return -1; + }
loopback_stats_reset(pktio_entry);
@@@ -88,15 -81,14 +105,15 @@@ static int loopback_recv(pktio_entry_t odp_time_t *ts = NULL; int num_rx = 0; int failed = 0; + pktio_ops_loopback_data_t *pkt_lbk = pktio_entry->s.ops_data;
- if (odp_unlikely(len > QUEUE_MULTI_MAX)) - len = QUEUE_MULTI_MAX; + if (odp_unlikely(num > QUEUE_MULTI_MAX)) + num = QUEUE_MULTI_MAX;
odp_ticketlock_lock(&pktio_entry->s.rxl);
- queue = queue_fn->from_ext(pktio_entry->s.pkt_loop.loopq); + queue = queue_fn->from_ext(pkt_lbk->loopq); - nbr = queue_fn->deq_multi(queue, hdr_tbl, len); + nbr = queue_fn->deq_multi(queue, hdr_tbl, num);
if (pktio_entry->s.config.pktin.bit.ts_all || pktio_entry->s.config.pktin.bit.ts_ptp) { @@@ -184,25 -177,38 +202,39 @@@ static int loopback_send(pktio_entry_t queue_t queue; int i; int ret; + int nb_tx = 0; uint32_t bytes = 0; + pktio_ops_loopback_data_t *pkt_lbk = pktio_entry->s.ops_data; + uint32_t out_octets_tbl[num]; + + if (odp_unlikely(num > QUEUE_MULTI_MAX)) + num = QUEUE_MULTI_MAX;
- if (odp_unlikely(len > QUEUE_MULTI_MAX)) - len = QUEUE_MULTI_MAX; + for (i = 0; i < num; ++i) { + uint32_t pkt_len = odp_packet_len(pkt_tbl[i]);
- for (i = 0; i < len; ++i) { + if (pkt_len > LOOP_MTU) { + if (nb_tx == 0) { + __odp_errno = EMSGSIZE; + return -1; + } + break; + } hdr_tbl[i] = packet_to_buf_hdr(pkt_tbl[i]); - bytes += odp_packet_len(pkt_tbl[i]); + bytes += pkt_len; + /* Store cumulative byte counts to update 'stats.out_octets' + * correctly in case enq_multi() fails to enqueue all packets. + */ + out_octets_tbl[i] = bytes; + nb_tx++; }
- if (pktio_entry->s.config.outbound_ipsec) - for (i = 0; i < len; ++i) { - odp_buffer_t buf = buf_from_buf_hdr(hdr_tbl[i]); - odp_ipsec_packet_result_t result; + for (i = 0; i < nb_tx; ++i) { + odp_ipsec_packet_result_t result;
- if (_odp_buffer_event_subtype(buf) != - ODP_EVENT_PACKET_IPSEC) - continue; + if (packet_subtype(pkt_tbl[i]) == + ODP_EVENT_PACKET_IPSEC && + pktio_entry->s.config.outbound_ipsec) {
/* Possibly postprocessing packet */ odp_ipsec_result(&result, pkt_tbl[i]); @@@ -213,8 -218,8 +244,8 @@@
odp_ticketlock_lock(&pktio_entry->s.txl);
- queue = queue_fn->from_ext(pktio_entry->s.pkt_loop.loopq); + queue = queue_fn->from_ext(pkt_lbk->loopq); - ret = queue_fn->enq_multi(queue, hdr_tbl, len); + ret = queue_fn->enq_multi(queue, hdr_tbl, nb_tx);
if (ret > 0) { pktio_entry->s.stats.out_ucast_pkts += ret; @@@ -238,7 -242,8 +268,10 @@@ static uint32_t loopback_mtu_get(pktio_ static int loopback_mac_addr_get(pktio_entry_t *pktio_entry ODP_UNUSED, void *mac_addr) { ++ pktio_ops_loopback_data_t *pkt_lbk = pktio_entry->s.ops_data; ++ memcpy(mac_addr, pktio_loop_mac, ETH_ALEN); - ((uint8_t *)mac_addr)[ETH_ALEN - 1] += pktio_entry->s.pkt_loop.idx; ++ ((uint8_t *)mac_addr)[ETH_ALEN - 1] += pkt_lbk->idx; return ETH_ALEN; }
diff --cc platform/linux-generic/pktio/netmap.c index fc17da07,66fe247d..867ce2cd --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@@ -10,10 -10,12 +10,10 @@@
#include <odp_posix_extensions.h>
- #include <odp/api/plat/packet_inlines.h> #include <odp/api/packet.h> + #include <odp/api/plat/packet_inlines.h>
#include <odp_packet_io_internal.h> -#include <odp_packet_netmap.h> -#include <odp_packet_socket.h> #include <odp_debug_internal.h> #include <protocols/eth.h>
@@@ -277,10 -266,10 +277,10 @@@ static inline int netmap_wait_for_link( */ static void netmap_init_capability(pktio_entry_t *pktio_entry) { - pkt_netmap_t *pkt_nm = &pktio_entry->s.pkt_nm; + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; - odp_pktio_capability_t *capa = &pkt_nm->capa; + odp_pktio_capability_t *capa = &pktio_entry->s.capa;
- memset(&pkt_nm->capa, 0, sizeof(odp_pktio_capability_t)); + memset(capa, 0, sizeof(odp_pktio_capability_t));
capa->max_input_queues = PKTIO_MAX_QUEUES; if (pkt_nm->num_rx_rings < PKTIO_MAX_QUEUES) @@@ -435,9 -414,9 +432,9 @@@ static int netmap_open(odp_pktio_t id O } pkt_nm->sockfd = sockfd;
- /* Use either interface MTU (+ ethernet header length) or netmap buffer - * size as MTU, whichever is smaller. */ + /* Use either interface MTU or netmap buffer size as MTU, whichever is + * smaller. */ - mtu = mtu_get_fd(pktio_entry->s.pkt_nm.sockfd, pkt_nm->if_name); + mtu = mtu_get_fd(pkt_nm->sockfd, pkt_nm->if_name); if (mtu == 0) { ODP_ERR("Unable to read interface MTU\n"); goto error; @@@ -706,12 -677,13 +696,14 @@@ static inline int netmap_recv_desc(pkti struct nm_desc *desc, odp_packet_t pkt_table[], int num) { ++ pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; struct netmap_ring *ring; odp_time_t ts_val; odp_time_t *ts = NULL; netmap_slot_t slot_tbl[num]; char *buf; uint32_t slot_id; - uint32_t mtu = pktio_entry->s.pkt_nm.mtu; ++ uint32_t mtu = pkt_nm->mtu; int i; int ring_id = desc->cur_rx_ring; int num_rx = 0; @@@ -751,6 -725,44 +745,44 @@@ return 0; }
+ static int netmap_fd_set(pktio_entry_t *pktio_entry, int index, fd_set *readfds) + { + struct nm_desc *desc; - pkt_netmap_t *pkt_nm = &pktio_entry->s.pkt_nm; ++ pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; + unsigned first_desc_id = pkt_nm->rx_desc_ring[index].s.first; + unsigned last_desc_id = pkt_nm->rx_desc_ring[index].s.last; + unsigned desc_id; + int num_desc = pkt_nm->rx_desc_ring[index].s.num; + int i; + int max_fd = 0; + + if (odp_unlikely(pktio_entry->s.state != PKTIO_STATE_STARTED)) + return 0; + + if (!pkt_nm->lockless_rx) + odp_ticketlock_lock(&pkt_nm->rx_desc_ring[index].s.lock); + + desc_id = pkt_nm->rx_desc_ring[index].s.cur; + + for (i = 0; i < num_desc; i++) { + if (desc_id > last_desc_id) + desc_id = first_desc_id; + + desc = pkt_nm->rx_desc_ring[index].s.desc[desc_id]; + + FD_SET(desc->fd, readfds); + if (desc->fd > max_fd) + max_fd = desc->fd; + desc_id++; + } + pkt_nm->rx_desc_ring[index].s.cur = desc_id; + + if (!pkt_nm->lockless_rx) + odp_ticketlock_unlock(&pkt_nm->rx_desc_ring[index].s.lock); + + return max_fd; + } + static int netmap_recv(pktio_entry_t *pktio_entry, int index, odp_packet_t pkt_table[], int num) { @@@ -991,12 -1063,9 +1093,15 @@@ static pktio_ops_module_t netmap_pktio_ .close = netmap_close, .start = netmap_start, .stop = netmap_stop, - .link_status = netmap_link_status, .stats = netmap_stats, .stats_reset = netmap_stats_reset, + .pktin_ts_res = NULL, + .pktin_ts_from_ns = NULL, + .recv = netmap_recv, ++ .recv_tmo = netmap_recv_tmo, ++ .recv_mq_tmo = netmap_recv_mq_tmo, + .send = netmap_send, ++ .fd_set = netmap_fd_set, .mtu_get = netmap_mtu_get, .promisc_mode_set = netmap_promisc_mode_set, .promisc_mode_get = netmap_promisc_mode_get, diff --cc platform/linux-generic/pktio/null.c index 00000000,5a11076c..afee4326 mode 000000,100644..100644 --- a/platform/linux-generic/pktio/null.c +++ b/platform/linux-generic/pktio/null.c @@@ -1,0 -1,175 +1,215 @@@ + /* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + + #include "config.h" + + #include <odp_api.h> + #include <odp_packet_io_internal.h> -#include <odp_packet_null.h> ++#include <odp_pktio_ops_null.h> + -static int null_close(pktio_entry_t *pktio_entry ODP_UNUSED) ++#include <string.h> ++#include <linux/if_ether.h> ++ ++static int null_close(pktio_entry_t *pktio_entry) + { ++ if (ODP_OPS_DATA_FREE(pktio_entry->s.ops_data)) ++ return -1; ++ + return 0; + } + + static int null_open(odp_pktio_t id ODP_UNUSED, + pktio_entry_t *pktio_entry, + const char *devname, odp_pool_t pool ODP_UNUSED) + { ++ pktio_ops_null_data_t *_data = NULL; ++ + if (strncmp(devname, "null:", 5) != 0) + return -1; - pktio_entry->s.pkt_null.promisc = 0; ++ ++ pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*_data)); ++ if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { ++ ODP_ERR("Failed to allocate pktio_ops_null_data_t struct"); ++ return -1; ++ } ++ ++ _data = pktio_entry->s.ops_data; ++ memset(_data, 0, sizeof(*_data)); + return 0; + } + + static int null_recv(pktio_entry_t *pktio_entry ODP_UNUSED, + int index ODP_UNUSED, odp_packet_t pkt_table[] ODP_UNUSED, + int len ODP_UNUSED) + { + return 0; + } + + static int null_fd_set(pktio_entry_t *pktio_entry ODP_UNUSED, + int index ODP_UNUSED, fd_set *readfds ODP_UNUSED) + { + return 0; + } + + static int null_recv_tmo(pktio_entry_t *pktio_entry ODP_UNUSED, + int index ODP_UNUSED, + odp_packet_t pkt_table[] ODP_UNUSED, + int num ODP_UNUSED, uint64_t usecs) + { + struct timeval timeout; + int maxfd = -1; + fd_set readfds; + + timeout.tv_sec = usecs / (1000 * 1000); + timeout.tv_usec = usecs - timeout.tv_sec * (1000ULL * 1000ULL); + FD_ZERO(&readfds); + + select(maxfd + 1, &readfds, NULL, NULL, + usecs == ODP_PKTIN_WAIT ? NULL : &timeout); + + return 0; + } + + static int null_recv_mq_tmo(pktio_entry_t *pktio_entry[] ODP_UNUSED, + int index[] ODP_UNUSED, int num_q ODP_UNUSED, + odp_packet_t pkt_table[] ODP_UNUSED, + int num ODP_UNUSED, unsigned *from ODP_UNUSED, + uint64_t usecs) + { + struct timeval timeout; + int maxfd = -1; + fd_set readfds; + + timeout.tv_sec = usecs / (1000 * 1000); + timeout.tv_usec = usecs - timeout.tv_sec * (1000ULL * 1000ULL); + + FD_ZERO(&readfds); + + select(maxfd + 1, &readfds, NULL, NULL, + usecs == ODP_PKTIN_WAIT ? NULL : &timeout); + + return 0; + } + + static int null_send(pktio_entry_t *pktio_entry ODP_UNUSED, + int index ODP_UNUSED, const odp_packet_t pkt_table[], + int num) + { + odp_packet_free_multi(pkt_table, num); + + return num; + } + + #define PKTIO_NULL_MTU (64 * 1024) + + static uint32_t null_mtu_get(pktio_entry_t *pktio_entry ODP_UNUSED) + { + return PKTIO_NULL_MTU; + } + + static const char null_mac[] = {0x02, 0xe9, 0x34, 0x80, 0x73, 0x05}; + + static int null_mac_addr_get(pktio_entry_t *pktio_entry ODP_UNUSED, + void *mac_addr) + { + memcpy(mac_addr, null_mac, ETH_ALEN); + return ETH_ALEN; + } + + static int null_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable) + { - pktio_entry->s.pkt_null.promisc = !!enable; ++ pktio_ops_null_data_t *_data = pktio_entry->s.ops_data; ++ ++ _data->promisc = !!enable; + return 0; + } + + static int null_promisc_mode_get(pktio_entry_t *pktio_entry) + { - return pktio_entry->s.pkt_null.promisc; ++ pktio_ops_null_data_t *_data = pktio_entry->s.ops_data; ++ ++ return _data->promisc; + } + + static int null_capability(pktio_entry_t *pktio_entry ODP_UNUSED, + odp_pktio_capability_t *capa) + { + memset(capa, 0, sizeof(odp_pktio_capability_t)); + + capa->max_input_queues = PKTIO_MAX_QUEUES; + capa->max_output_queues = PKTIO_MAX_QUEUES; + capa->set_op.op.promisc_mode = 1; + + odp_pktio_config_init(&capa->config); + capa->config.pktin.bit.ts_all = 1; + capa->config.pktin.bit.ts_ptp = 1; + return 0; + } + + static int null_inqueues_config(pktio_entry_t *pktio_entry ODP_UNUSED, + const odp_pktin_queue_param_t *p ODP_UNUSED) + { + return 0; + } + + static int null_outqueues_config(pktio_entry_t *pktio_entry ODP_UNUSED, + const odp_pktout_queue_param_t *p ODP_UNUSED) + { + return 0; + } + + static int null_init_global(void) + { + ODP_PRINT("PKTIO: initialized null interface.\n"); + return 0; + } + -const pktio_if_ops_t null_pktio_ops = { - .name = "null", - .print = NULL, - .init_global = null_init_global, - .init_local = NULL, - .term = NULL, ++static pktio_ops_module_t null_pktio_ops = { ++ .base = { ++ .name = "null", ++ .init_local = NULL, ++ .term_local = NULL, ++ .init_global = null_init_global, ++ .term_global = NULL, ++ }, + .open = null_open, + .close = null_close, + .start = NULL, + .stop = NULL, ++ .stats = NULL, ++ .stats_reset = NULL, + .recv = null_recv, + .recv_tmo = null_recv_tmo, + .recv_mq_tmo = null_recv_mq_tmo, + .fd_set = null_fd_set, + .send = null_send, + .mtu_get = null_mtu_get, + .promisc_mode_set = null_promisc_mode_set, + .promisc_mode_get = null_promisc_mode_get, + .mac_get = null_mac_addr_get, ++ .mac_set = NULL, + .capability = null_capability, + .pktin_ts_res = NULL, + .pktin_ts_from_ns = NULL, + .config = NULL, + .input_queues_config = null_inqueues_config, + .output_queues_config = null_outqueues_config, ++ .link_status = NULL, ++ .config = NULL, ++ .print = NULL, + }; ++ ++ODP_MODULE_CONSTRUCTOR(null_pktio_ops) ++{ ++ odp_module_constructor(&null_pktio_ops); ++ ++ odp_subsystem_register_module(pktio_ops, &null_pktio_ops); ++} ++ ++/* Temporary variable to enable link this module, ++ * will remove in Makefile scheme changes. ++ */ ++int enable_link_null_pktio_ops = 0; diff --cc platform/linux-generic/pktio/pcap.c index f3f00057,889903dd..e1cb4e6f --- a/platform/linux-generic/pktio/pcap.c +++ b/platform/linux-generic/pktio/pcap.c @@@ -39,9 -39,9 +39,10 @@@ #include <odp_posix_extensions.h>
#include <odp_api.h> + #include <odp/api/plat/packet_inlines.h> #include <odp_packet_internal.h> #include <odp_packet_io_internal.h> +#include <odp_pktio_ops_pcap.h>
#include <protocols/eth.h>
@@@ -305,9 -294,9 +306,9 @@@ static int _pcapif_dump_pkt(pktio_ops_p }
static int pcapif_send_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - const odp_packet_t pkts[], int len) + const odp_packet_t pkts[], int num) { - pkt_pcap_t *pcap = &pktio_entry->s.pkt_pcap; + pktio_ops_pcap_data_t *pcap = pktio_entry->s.ops_data; int i;
odp_ticketlock_lock(&pktio_entry->s.txl); diff --cc platform/linux-generic/pktio/socket.c index 6c98bc60,749377c0..c720954f --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@@ -268,9 -601,9 +268,9 @@@ static uint32_t _rx_pkt_to_iovec(odp_pa * ODP_PACKET_SOCKET_MMSG: */ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - odp_packet_t pkt_table[], int len) + odp_packet_t pkt_table[], int num) { - pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock; + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; odp_pool_t pool = pkt_sock->pool; odp_time_t ts_val; odp_time_t *ts = NULL; @@@ -360,6 -698,89 +365,89 @@@ return nb_rx; }
+ static int sock_fd_set(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + fd_set *readfds) + { - pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock; ++ pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; + const int sockfd = pkt_sock->sockfd; + + FD_SET(sockfd, readfds); + return sockfd; + } + + static int sock_recv_tmo(pktio_entry_t *pktio_entry, int index, + odp_packet_t pkt_table[], int num, uint64_t usecs) + { + struct timeval timeout; + int ret; + int maxfd; + fd_set readfds; + + ret = sock_mmsg_recv(pktio_entry, index, pkt_table, num); + if (ret != 0) + return ret; + + timeout.tv_sec = usecs / (1000 * 1000); + timeout.tv_usec = usecs - timeout.tv_sec * (1000ULL * 1000ULL); + + FD_ZERO(&readfds); + maxfd = sock_fd_set(pktio_entry, index, &readfds); + + if (select(maxfd + 1, &readfds, NULL, NULL, + usecs == ODP_PKTIN_WAIT ? NULL : &timeout) == 0) + return 0; + + return sock_mmsg_recv(pktio_entry, index, pkt_table, num); + } + + static int sock_recv_mq_tmo(pktio_entry_t *pktio_entry[], int index[], + int num_q, odp_packet_t pkt_table[], int num, + unsigned *from, uint64_t usecs) + { + struct timeval timeout; + int i; + int ret; + int maxfd = -1, maxfd2; + fd_set readfds; + + for (i = 0; i < num_q; i++) { + ret = sock_mmsg_recv(pktio_entry[i], index[i], pkt_table, num); + + if (ret > 0 && from) + *from = i; + + if (ret != 0) + return ret; + } + + timeout.tv_sec = usecs / (1000 * 1000); + timeout.tv_usec = usecs - timeout.tv_sec * (1000ULL * 1000ULL); + + FD_ZERO(&readfds); + + for (i = 0; i < num_q; i++) { + maxfd2 = sock_fd_set(pktio_entry[i], index[i], &readfds); + if (maxfd2 > maxfd) + maxfd = maxfd2; + } + + if (select(maxfd + 1, &readfds, NULL, NULL, + usecs == ODP_PKTIN_WAIT ? NULL : &timeout) == 0) + return 0; + + for (i = 0; i < num_q; i++) { + ret = sock_mmsg_recv(pktio_entry[i], index[i], pkt_table, num); + + if (ret > 0 && from) + *from = i; + + if (ret != 0) + return ret; + } + + return 0; + } + static uint32_t _tx_pkt_to_iovec(odp_packet_t pkt, struct iovec iovecs[MAX_SEGS]) { @@@ -383,11 -804,11 +471,11 @@@ * ODP_PACKET_SOCKET_MMSG: */ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - const odp_packet_t pkt_table[], int len) + const odp_packet_t pkt_table[], int num) { - pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock; + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; - struct mmsghdr msgvec[len]; - struct iovec iovecs[len][MAX_SEGS]; + struct mmsghdr msgvec[num]; + struct iovec iovecs[num][MAX_SEGS]; int ret; int sockfd; int n, i; @@@ -547,9 -955,10 +635,12 @@@ static pktio_ops_module_t socket_pktio_ .stop = NULL, .stats = sock_stats, .stats_reset = sock_stats_reset, + .pktin_ts_res = NULL, + .pktin_ts_from_ns = NULL, .recv = sock_mmsg_recv, + .recv_tmo = sock_recv_tmo, + .recv_mq_tmo = sock_recv_mq_tmo, + .fd_set = sock_fd_set, .send = sock_mmsg_send, .mtu_get = sock_mtu_get, .promisc_mode_set = sock_promisc_mode_set, diff --cc platform/linux-generic/pktio/socket_mmap.c index 1e49d5b2,852bc766..19223db6 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@@ -25,8 -23,11 +25,10 @@@ #include <poll.h> #include <sys/ioctl.h> #include <errno.h> + #include <time.h>
#include <odp_api.h> + #include <odp/api/plat/packet_inlines.h> -#include <odp_packet_socket.h> #include <odp_packet_internal.h> #include <odp_packet_io_internal.h> #include <odp_debug_internal.h> @@@ -42,10 -39,19 +44,19 @@@ #include <protocols/eth.h> #include <protocols/ip.h>
+ /* Maximum number of retries per sock_mmap_send() call */ + #define TX_RETRIES 10 + + /* Number of nanoseconds to wait between TX retries */ + #define TX_RETRY_NSEC 1000 + + /* Maximum number of packets to store in each RX/TX block */ + #define MAX_PKTS_PER_BLOCK 512 + static int disable_pktio; /** !0 this pktio disabled, 0 enabled */
-static int set_pkt_sock_fanout_mmap(pkt_sock_mmap_t *const pkt_sock, - int sock_group_idx) +static int set_pkt_sock_fanout_mmap( + pktio_ops_socket_mmap_data_t *const pkt_sock, int sock_group_idx) { int sockfd = pkt_sock->sockfd; int val; @@@ -150,9 -157,14 +162,14 @@@ static uint8_t *pkt_mmap_vlan_insert(ui return l2_hdr_ptr; }
+ static inline unsigned next_frame(unsigned cur_frame, unsigned frame_count) + { + return odp_unlikely(cur_frame + 1 >= frame_count) ? 0 : cur_frame + 1; + } + static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, - pkt_sock_mmap_t *pkt_sock, + pktio_ops_socket_mmap_data_t *pkt_sock, - odp_packet_t pkt_table[], unsigned len, + odp_packet_t pkt_table[], unsigned num, unsigned char if_mac[]) { union frame_map ppd; @@@ -616,10 -647,24 +663,24 @@@ error return -1; }
+ static int sock_mmap_fd_set(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + fd_set *readfds) + { - pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap; ++ pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; + int fd; + + odp_ticketlock_lock(&pktio_entry->s.rxl); + fd = pkt_sock->sockfd; + FD_SET(fd, readfds); + odp_ticketlock_unlock(&pktio_entry->s.rxl); + + return fd; + } + static int sock_mmap_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - odp_packet_t pkt_table[], int len) + odp_packet_t pkt_table[], int num) { - pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap; + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; int ret;
odp_ticketlock_lock(&pktio_entry->s.rxl); @@@ -630,11 -675,84 +691,84 @@@ return ret; }
+ static int sock_mmap_recv_tmo(pktio_entry_t *pktio_entry, int index, + odp_packet_t pkt_table[], int num, uint64_t usecs) + { + struct timeval timeout; + int ret; + int maxfd; + fd_set readfds; + + ret = sock_mmap_recv(pktio_entry, index, pkt_table, num); + if (ret != 0) + return ret; + + timeout.tv_sec = usecs / (1000 * 1000); + timeout.tv_usec = usecs - timeout.tv_sec * (1000ULL * 1000ULL); + + FD_ZERO(&readfds); + maxfd = sock_mmap_fd_set(pktio_entry, index, &readfds); + + if (select(maxfd + 1, &readfds, NULL, NULL, + usecs == ODP_PKTIN_WAIT ? NULL : &timeout) == 0) + return 0; + + return sock_mmap_recv(pktio_entry, index, pkt_table, num); + } + + static int sock_mmap_recv_mq_tmo(pktio_entry_t *pktio_entry[], int index[], + int num_q, odp_packet_t pkt_table[], int num, + unsigned *from, uint64_t usecs) + { + struct timeval timeout; + int i; + int ret; + int maxfd = -1, maxfd2; + fd_set readfds; + + for (i = 0; i < num_q; i++) { + ret = sock_mmap_recv(pktio_entry[i], index[i], pkt_table, num); + + if (ret > 0 && from) + *from = i; + + if (ret != 0) + return ret; + } + + FD_ZERO(&readfds); + + for (i = 0; i < num_q; i++) { + maxfd2 = sock_mmap_fd_set(pktio_entry[i], index[i], &readfds); + if (maxfd2 > maxfd) + maxfd = maxfd2; + } + + timeout.tv_sec = usecs / (1000 * 1000); + timeout.tv_usec = usecs - timeout.tv_sec * (1000ULL * 1000ULL); + + if (select(maxfd + 1, &readfds, NULL, NULL, + usecs == ODP_PKTIN_WAIT ? NULL : &timeout) == 0) + return 0; + + for (i = 0; i < num_q; i++) { + ret = sock_mmap_recv(pktio_entry[i], index[i], pkt_table, num); + + if (ret > 0 && from) + *from = i; + + if (ret != 0) + return ret; + } + + return 0; + } + static int sock_mmap_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - const odp_packet_t pkt_table[], int len) + const odp_packet_t pkt_table[], int num) { int ret; - pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap; + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data;
odp_ticketlock_lock(&pktio_entry->s.txl); ret = pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring, @@@ -752,10 -858,11 +886,13 @@@ static pktio_ops_module_t socket_mmap_p .stop = NULL, .stats = sock_mmap_stats, .stats_reset = sock_mmap_stats_reset, + .pktin_ts_res = NULL, + .pktin_ts_from_ns = NULL, .recv = sock_mmap_recv, + .recv_tmo = sock_mmap_recv_tmo, + .recv_mq_tmo = sock_mmap_recv_mq_tmo, .send = sock_mmap_send, + .fd_set = sock_mmap_fd_set, .mtu_get = sock_mmap_mtu_get, .promisc_mode_set = sock_mmap_promisc_mode_set, .promisc_mode_get = sock_mmap_promisc_mode_get, diff --cc platform/linux-generic/pktio/subsystem.c index e49ccd3e,00000000..03f9078a mode 100644,000000..100644 --- a/platform/linux-generic/pktio/subsystem.c +++ b/platform/linux-generic/pktio/subsystem.c @@@ -1,86 -1,0 +1,88 @@@ +/* Copyright (c) 2017, ARM Limited. All rights reserved. + * + * Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <config.h> + +#include <odp_debug_internal.h> +#include <odp_packet_io_internal.h> + +#define SUBSYSTEM_VERSION 0x00010000UL +ODP_SUBSYSTEM_DEFINE(pktio_ops, "packet IO operations", SUBSYSTEM_VERSION); + +/* Instantiate init and term functions */ +ODP_SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, init_global, ODP_ERR) +ODP_SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, init_local, ODP_ERR) +ODP_SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, term_global, ODP_ABORT) + +/* Temporary variable to enable link modules, + * will remove in Makefile scheme changes. + */ +#if defined(ODP_PKTIO_DPDK) && ODP_PKTIO_DPDK == 1 +extern int enable_link_dpdk_pktio_ops; +#endif +#if defined(ODP_PKTIO_IPC) && ODP_PKTIO_IPC == 1 +extern int enable_link_ipc_pktio_ops; +#endif ++extern int enable_link_null_pktio_ops; +extern int enable_link_loopback_pktio_ops; +#if defined(ODP_NETMAP) && ODP_NETMAP == 1 +extern int enable_link_netmap_pktio_ops; +#endif +#if defined(HAVE_PCAP) && HAVE_PCAP == 1 +extern int enable_link_pcap_pktio_ops; +#endif +#if defined(ODP_PKTIO_SOCKET) && ODP_PKTIO_SOCKET == 1 +extern int enable_link_socket_pktio_ops; +#endif +#if defined(ODP_PKTIO_SOCKET_MMAP) && ODP_PKTIO_SOCKET_MMAP == 1 +extern int enable_link_socket_mmap_pktio_ops; +#endif +#if defined(ODP_PKTIO_TAP) && ODP_PKTIO_TAP == 1 +extern int enable_link_tap_pktio_ops; +#endif +#if defined(_ODP_MDEV) && _ODP_MDEV == 1 +extern int enable_link_cxgb4_pktio_ops; +extern int enable_link_e1000e_pktio_ops; +extern int enable_link_i40e_pktio_ops; +#endif + +ODP_SUBSYSTEM_CONSTRUCTOR(pktio_ops) +{ + odp_subsystem_constructor(pktio_ops); + + /* Further initialization per subsystem */ + +#if defined(ODP_PKTIO_DPDK) && ODP_PKTIO_DPDK == 1 + enable_link_dpdk_pktio_ops = 1; +#endif +#if defined(ODP_PKTIO_IPC) && ODP_PKTIO_IPC == 1 + enable_link_ipc_pktio_ops = 1; +#endif ++ enable_link_null_pktio_ops = 1; + enable_link_loopback_pktio_ops = 1; +#if defined(ODP_NETMAP) && ODP_NETMAP == 1 + enable_link_netmap_pktio_ops = 1; +#endif +#if defined(HAVE_PCAP) && HAVE_PCAP == 1 + enable_link_pcap_pktio_ops = 1; +#endif +#if defined(ODP_PKTIO_SOCKET) && ODP_PKTIO_SOCKET == 1 + enable_link_socket_pktio_ops = 1; +#endif +#if defined(ODP_PKTIO_SOCKET_MMAP) && ODP_PKTIO_SOCKET_MMAP == 1 + enable_link_socket_mmap_pktio_ops = 1; +#endif +#if defined(ODP_PKTIO_TAP) && ODP_PKTIO_TAP == 1 + enable_link_tap_pktio_ops = 1; +#endif +#if defined(_ODP_MDEV) && _ODP_MDEV == 1 + enable_link_cxgb4_pktio_ops = 1; + enable_link_e1000e_pktio_ops = 1; + enable_link_i40e_pktio_ops = 1; +#endif +} diff --cc platform/linux-generic/pktio/tap.c index 81eaffef,56f90b31..b8a836be --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@@ -44,6 -42,8 +44,7 @@@ #include <linux/if_tun.h>
#include <odp_api.h> + #include <odp/api/plat/packet_inlines.h> -#include <odp_packet_socket.h> #include <odp_packet_internal.h> #include <odp_packet_io_internal.h> #include <odp_classification_internal.h> @@@ -356,9 -340,9 +357,9 @@@ static int tap_pktio_send_lockless(pkti int i, n; uint32_t pkt_len; uint8_t buf[BUF_SIZE]; - pkt_tap_t *tap = &pktio_entry->s.pkt_tap; + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data;
- for (i = 0; i < len; i++) { + for (i = 0; i < num; i++) { pkt_len = odp_packet_len(pkts[i]);
if (pkt_len > tap->mtu) { diff --cc platform/linux-generic/pool/generic.c index 4d5f5946,e5ba8982..e02a5b08 --- a/platform/linux-generic/pool/generic.c +++ b/platform/linux-generic/pool/generic.c @@@ -47,10 -49,52 +48,25 @@@ ODP_STATIC_ASSERT(CONFIG_PACKET_SEG_LEN ODP_STATIC_ASSERT(CONFIG_PACKET_SEG_SIZE < 0xffff, "Segment size must be less than 64k (16 bit offsets)");
-/* Thread local variables */ -typedef struct pool_local_t { - pool_cache_t *cache[ODP_CONFIG_POOLS]; - int thr_id; -} pool_local_t; - pool_table_t *pool_tbl; - __thread pool_local_t local; -static __thread pool_local_t local; ++__thread pool_local_t _pool_local_data; + + #include <odp/visibility_begin.h> + + /* Fill in pool header field offsets for inline functions */ + const _odp_pool_inline_offset_t ODP_ALIGNED_CACHE _odp_pool_inline = { + .pool_hdl = offsetof(pool_t, pool_hdl), + .uarea_size = offsetof(pool_t, params.pkt.uarea_size) + }; + + #include <odp/visibility_end.h> + + static inline odp_pool_t pool_index_to_handle(uint32_t pool_idx) + { + return _odp_cast_scalar(odp_pool_t, pool_idx); + }
-static inline pool_t *pool_from_buf(odp_buffer_t buf) -{ - odp_buffer_hdr_t *buf_hdr = buf_hdl_to_hdr(buf); - - return buf_hdr->pool_ptr; -} - -static inline odp_buffer_hdr_t *buf_hdr_from_index(pool_t *pool, - uint32_t buffer_idx) -{ - uint32_t block_offset; - odp_buffer_hdr_t *buf_hdr; - - block_offset = buffer_idx * pool->block_size; - - /* clang requires cast to uintptr_t */ - buf_hdr = (odp_buffer_hdr_t *)(uintptr_t)&pool->base_addr[block_offset]; - - return buf_hdr; -} - -int odp_pool_init_global(void) +static int generic_pool_init_global(void) { uint32_t i; odp_shm_t shm; @@@ -115,15 -159,15 +131,15 @@@ static int generic_pool_init_local(void int i; int thr_id = odp_thread_id();
-- memset(&local, 0, sizeof(pool_local_t)); ++ memset(&_pool_local_data, 0, sizeof(pool_local_t));
for (i = 0; i < ODP_CONFIG_POOLS; i++) { pool = pool_entry(i); -- local.cache[i] = &pool->local_cache[thr_id]; -- local.cache[i]->num = 0; ++ _pool_local_data.cache[i] = &pool->local_cache[thr_id]; ++ _pool_local_data.cache[i]->num = 0; }
-- local.thr_id = thr_id; ++ _pool_local_data.thr_id = thr_id; return 0; }
@@@ -150,7 -194,7 +166,7 @@@ static int generic_pool_term_local(void for (i = 0; i < ODP_CONFIG_POOLS; i++) { pool_t *pool = pool_entry(i);
-- flush_cache(local.cache[i], pool); ++ flush_cache(_pool_local_data.cache[i], pool); }
return 0; @@@ -256,17 -295,12 +271,11 @@@ static void init_buffers(pool_t *pool
memset(buf_hdr, 0, (uintptr_t)data - (uintptr_t)buf_hdr);
- seg_size = pool->headroom + pool->seg_len + pool->tailroom; - /* Initialize buffer metadata */ - buf_hdr->size = seg_size; - buf_hdr->index = i; buf_hdr->type = type; buf_hdr->event_type = type; - buf_hdr->event_subtype = ODP_EVENT_NO_SUBTYPE; - buf_hdr->pool_hdl = pool->pool_hdl; buf_hdr->pool_ptr = pool; buf_hdr->uarea_addr = uarea; - /* Show user requested size through API */ buf_hdr->segcount = 1; buf_hdr->num_seg = 1; buf_hdr->next_seg = NULL; @@@ -684,36 -934,43 +701,36 @@@ static void generic_pool_print(odp_pool
pool = pool_entry_from_hdl(pool_hdl);
- printf("\nPool info\n"); - printf("---------\n"); - printf(" pool %" PRIu64 "\n", - odp_pool_to_u64(pool->pool_hdl)); - printf(" name %s\n", pool->name); - printf(" pool type %s\n", - pool->params.type == ODP_POOL_BUFFER ? "buffer" : - (pool->params.type == ODP_POOL_PACKET ? "packet" : - (pool->params.type == ODP_POOL_TIMEOUT ? "timeout" : - "unknown"))); - printf(" pool shm %" PRIu64 "\n", - odp_shm_to_u64(pool->shm)); - printf(" user area shm %" PRIu64 "\n", - odp_shm_to_u64(pool->uarea_shm)); - printf(" num %u\n", pool->num); - printf(" align %u\n", pool->align); - printf(" headroom %u\n", pool->headroom); - printf(" seg len %u\n", pool->seg_len); - printf(" max data len %u\n", pool->max_len); - printf(" tailroom %u\n", pool->tailroom); - printf(" block size %u\n", pool->block_size); - printf(" uarea size %u\n", pool->uarea_size); - printf(" shm size %u\n", pool->shm_size); - printf(" base addr %p\n", pool->base_addr); - printf(" uarea shm size %u\n", pool->uarea_shm_size); - printf(" uarea base addr %p\n", pool->uarea_base_addr); - printf("\n"); + ODP_PRINT("\nPool info\n"); + ODP_PRINT("---------\n"); + ODP_PRINT(" pool %" PRIu64 "\n", + odp_pool_to_u64(pool->pool_hdl)); + ODP_PRINT(" name %s\n", pool->name); + ODP_PRINT(" pool type %s\n", + pool->params.type == ODP_POOL_BUFFER ? "buffer" : + (pool->params.type == ODP_POOL_PACKET ? "packet" : + (pool->params.type == ODP_POOL_TIMEOUT ? "timeout" : + "unknown"))); + ODP_PRINT(" pool shm %" PRIu64 "\n", + odp_shm_to_u64(pool->shm)); + ODP_PRINT(" user area shm %" PRIu64 "\n", + odp_shm_to_u64(pool->uarea_shm)); + ODP_PRINT(" num %u\n", pool->num); + ODP_PRINT(" align %u\n", pool->align); + ODP_PRINT(" headroom %u\n", pool->headroom); + ODP_PRINT(" seg len %u\n", pool->seg_len); + ODP_PRINT(" max data len %u\n", pool->max_len); + ODP_PRINT(" tailroom %u\n", pool->tailroom); + ODP_PRINT(" block size %u\n", pool->block_size); + ODP_PRINT(" uarea size %u\n", pool->uarea_size); + ODP_PRINT(" shm size %u\n", pool->shm_size); + ODP_PRINT(" base addr %p\n", pool->base_addr); + ODP_PRINT(" uarea shm size %u\n", pool->uarea_shm_size); + ODP_PRINT(" uarea base addr %p\n", pool->uarea_base_addr); + ODP_PRINT("\n"); }
-odp_pool_t odp_buffer_pool(odp_buffer_t buf) -{ - pool_t *pool = pool_from_buf(buf); - - return pool->pool_hdl; -} - -void odp_pool_param_init(odp_pool_param_t *params) +static void generic_pool_param_init(odp_pool_param_t *params) { memset(params, 0, sizeof(odp_pool_param_t)); params->pkt.headroom = CONFIG_PACKET_HEADROOM; diff --cc platform/linux-generic/queue/generic.c index 37c02380,58103930..4375d9d1 --- a/platform/linux-generic/queue/generic.c +++ b/platform/linux-generic/queue/generic.c @@@ -251,10 -251,9 +252,9 @@@ void queue_destroy_finalize(uint32_t qu UNLOCK(&queue->s.lock); }
-static int queue_destroy(odp_queue_t handle) +static int generic_queue_destroy(odp_queue_t handle) { queue_entry_t *queue; - queue = handle_to_qentry(handle);
if (handle == ODP_QUEUE_INVALID) diff --cc platform/linux-generic/queue/scalable.c index 566d75bd,00000000..83553ce2 mode 100644,000000..100644 --- a/platform/linux-generic/queue/scalable.c +++ b/platform/linux-generic/queue/scalable.c @@@ -1,1012 -1,0 +1,1016 @@@ +/* Copyright (c) 2017, ARM Limited. All rights reserved. + * + * Copyright (c) 2017, Linaro Limited + * All rights reserved. + * - * SPDX-License-Identifier: BSD-3-Clause ++ * SPDX-License-Identifier: BSD-3-Clause + */ +#include <config.h> + +#include <odp/api/hints.h> ++#include <odp/api/ticketlock.h> +#include <odp/api/plat/ticketlock_inlines.h> +#include <odp/api/queue.h> +#include <odp/api/schedule.h> +#include <odp/api/shared_memory.h> +#include <odp/api/sync.h> +#include <odp/api/traffic_mngr.h> + +#include <odp_internal.h> +#include <odp_config_internal.h> +#include <odp_debug_internal.h> + +#include <odp_buffer_inlines.h> +#include <odp_packet_io_internal.h> +#include <odp_pool_internal.h> +#include <odp_queue_scalable_internal.h> +#include <subsystem/spec/queue_subsystem.h> +#include <odp_schedule_if.h> +#include <_ishm_internal.h> +#include <_ishmpool_internal.h> + +#include <string.h> +#include <inttypes.h> + +#define NUM_INTERNAL_QUEUES 64 + +#define LOCK(a) _odp_ticketlock_lock(a) +#define UNLOCK(a) _odp_ticketlock_unlock(a) +#define LOCK_INIT(a) odp_ticketlock_init(a) + +extern __thread sched_scalable_thread_state_t *sched_ts; + +typedef struct queue_table_t { + queue_entry_t queue[ODP_CONFIG_QUEUES]; +} queue_table_t; + +static queue_table_t *queue_tbl; +static _odp_ishm_pool_t *queue_shm_pool; + +static inline odp_queue_t queue_from_id(uint32_t queue_id) +{ + return _odp_cast_scalar(odp_queue_t, queue_id + 1); +} + +static queue_t queue_from_ext(odp_queue_t handle); +static int _queue_enq(queue_t handle, odp_buffer_hdr_t *buf_hdr); +static odp_buffer_hdr_t *_queue_deq(queue_t handle); +static int _queue_enq_multi(queue_t handle, odp_buffer_hdr_t *buf_hdr[], + int num); +static int _queue_deq_multi(queue_t handle, odp_buffer_hdr_t *buf_hdr[], + int num); + +static queue_entry_t *get_qentry(uint32_t queue_id) +{ + return &queue_tbl->queue[queue_id]; +} + +queue_entry_t *qentry_from_ext(odp_queue_t handle) +{ + return get_qentry(queue_to_id(handle)); +} + +static int _odp_queue_disable_enq(sched_elem_t *q) +{ + ringidx_t old_read, old_write, new_write; + uint32_t size; + + old_write = q->prod_write; + size = q->prod_mask + 1; + do { + /* Need __atomic_load to avoid compiler reordering */ + old_read = __atomic_load_n(&q->prod_read, __ATOMIC_ACQUIRE); + if (old_write != old_read) { + /* Queue is not empty, cannot claim all elements + * Cannot disable enqueue. + */ + return -1; + } + /* Claim all elements in ring */ + new_write = old_write + size; + } while (!__atomic_compare_exchange_n(&q->prod_write, + &old_write, /* Updated on failure */ + new_write, + true, + __ATOMIC_RELAXED, + __ATOMIC_RELAXED)); + /* All remaining elements claimed, no one else can enqueue */ + return 0; +} + +static int queue_init(queue_entry_t *queue, const char *name, + const odp_queue_param_t *param) +{ + ringidx_t ring_idx; + sched_elem_t *sched_elem; + uint32_t ring_size; + odp_buffer_hdr_t **ring; + uint32_t size; + + sched_elem = &queue->s.sched_elem; + ring_size = param->size > 0 ? + ROUNDUP_POWER2_U32(param->size) : CONFIG_QUEUE_SIZE; + strncpy(queue->s.name, name ? name : "", ODP_QUEUE_NAME_LEN - 1); + queue->s.name[ODP_QUEUE_NAME_LEN - 1] = 0; + memcpy(&queue->s.param, param, sizeof(odp_queue_param_t)); + + size = ring_size * sizeof(odp_buffer_hdr_t *); + ring = (odp_buffer_hdr_t **)shm_pool_alloc_align(queue_shm_pool, size); + if (NULL == ring) + return -1; + + for (ring_idx = 0; ring_idx < ring_size; ring_idx++) + ring[ring_idx] = NULL; + + queue->s.type = queue->s.param.type; + queue->s.enqueue = _queue_enq; + queue->s.dequeue = _queue_deq; + queue->s.enqueue_multi = _queue_enq_multi; + queue->s.dequeue_multi = _queue_deq_multi; + queue->s.pktin = PKTIN_INVALID; + + sched_elem->node.next = NULL; +#ifdef CONFIG_QSCHST_LOCK + LOCK_INIT(&sched_elem->qschlock); +#endif + sched_elem->qschst.numevts = 0; + sched_elem->qschst.wrr_budget = CONFIG_WRR_WEIGHT; + sched_elem->qschst.cur_ticket = 0; + sched_elem->qschst.nxt_ticket = 0; + sched_elem->pop_deficit = 0; + if (queue->s.type == ODP_QUEUE_TYPE_SCHED) + sched_elem->qschst_type = queue->s.param.sched.sync; + else + sched_elem->qschst_type = ODP_NO_SCHED_QUEUE; + /* 2nd cache line - enqueue */ + sched_elem->prod_read = 0; + sched_elem->prod_write = 0; + sched_elem->prod_ring = ring; + sched_elem->prod_mask = ring_size - 1; + /* 3rd cache line - dequeue */ + sched_elem->cons_read = 0; + sched_elem->cons_write = 0; + sched_elem->rwin = NULL; + sched_elem->schedq = NULL; + sched_elem->user_ctx = queue->s.param.context; +#ifdef CONFIG_SPLIT_PRODCONS + sched_elem->cons_ring = ring; + sched_elem->cons_mask = ring_size - 1; + sched_elem->cons_type = sched_elem->qschst_type; +#endif + + /* Queue initialized successfully, add it to the sched group */ + if (queue->s.type == ODP_QUEUE_TYPE_SCHED) { + if (queue->s.param.sched.sync == ODP_SCHED_SYNC_ORDERED) { + sched_elem->rwin = + rwin_alloc(queue_shm_pool, + queue->s.param.sched.lock_count); + if (sched_elem->rwin == NULL) { + ODP_ERR("Reorder window not created\n"); + goto rwin_create_failed; + } + } + sched_elem->sched_grp = param->sched.group; + sched_elem->sched_prio = param->sched.prio; + sched_elem->schedq = + sched_queue_add(param->sched.group, param->sched.prio); + ODP_ASSERT(sched_elem->schedq != NULL); + + } + + return 0; + +rwin_create_failed: + _odp_ishm_pool_free(queue_shm_pool, ring); + + return -1; +} + +static int scalable_queue_init_global(void) +{ + uint32_t i; + uint64_t pool_size; + uint64_t min_alloc; + uint64_t max_alloc; + + ODP_DBG("Queue init ... "); + + /* Attach to the pool if it exists */ + queue_shm_pool = _odp_ishm_pool_lookup("queue_shm_pool"); + if (queue_shm_pool == NULL) { + /* Create shared memory pool to allocate shared memory for the + * queues. Use the default queue size. + */ + /* Add size of the array holding the queues */ + pool_size = sizeof(queue_table_t); + /* Add storage required for queues */ + pool_size += (CONFIG_QUEUE_SIZE * sizeof(odp_buffer_hdr_t *)) * + ODP_CONFIG_QUEUES; + /* Add the reorder window size */ + pool_size += sizeof(reorder_window_t) * ODP_CONFIG_QUEUES; + /* Choose min_alloc and max_alloc such that buddy allocator is + * is selected. + */ + min_alloc = 0; + max_alloc = CONFIG_QUEUE_SIZE * sizeof(odp_buffer_hdr_t *); + queue_shm_pool = _odp_ishm_pool_create("queue_shm_pool", + pool_size, + min_alloc, max_alloc, + _ODP_ISHM_SINGLE_VA); + if (queue_shm_pool == NULL) { + ODP_ERR("Failed to allocate shared memory pool for" + " queues\n"); + goto queue_shm_pool_create_failed; + } + } + + queue_tbl = (queue_table_t *) + shm_pool_alloc_align(queue_shm_pool, + sizeof(queue_table_t)); + if (queue_tbl == NULL) { + ODP_ERR("Failed to reserve shared memory for queue table\n"); + goto queue_tbl_ishm_alloc_failed; + } + + memset(queue_tbl, 0, sizeof(queue_table_t)); + + for (i = 0; i < ODP_CONFIG_QUEUES; i++) { + /* init locks */ + queue_entry_t *queue; + + queue = get_qentry(i); + LOCK_INIT(&queue->s.lock); + queue->s.index = i; + queue->s.handle = queue_from_id(i); + } + + ODP_DBG("done\n"); + ODP_DBG("Queue init global\n"); + ODP_DBG(" struct queue_entry_s size %zu\n", + sizeof(struct queue_entry_s)); + ODP_DBG(" queue_entry_t size %zu\n", + sizeof(queue_entry_t)); + ODP_DBG("\n"); + + return 0; + +queue_shm_pool_create_failed: + +queue_tbl_ishm_alloc_failed: + _odp_ishm_pool_destroy(queue_shm_pool); + + return -1; +} + +static int scalable_queue_term_global(void) +{ + int ret = 0; + int rc = 0; + queue_entry_t *queue; + int i; + + for (i = 0; i < ODP_CONFIG_QUEUES; i++) { + queue = &queue_tbl->queue[i]; + if (__atomic_load_n(&queue->s.status, + __ATOMIC_RELAXED) != QUEUE_STATUS_FREE) { + ODP_ERR("Not destroyed queue: %s\n", queue->s.name); + rc = -1; + } + } + + _odp_ishm_pool_free(queue_shm_pool, queue_tbl); + + ret = _odp_ishm_pool_destroy(queue_shm_pool); + if (ret < 0) { + ODP_ERR("Failed to destroy shared memory pool for queues\n"); + rc = -1; + } + + return rc; +} + +static int scalable_queue_init_local(void) +{ + return 0; +} + +static int scalable_queue_term_local(void) +{ + return 0; +} + +static int scalable_queue_capability(odp_queue_capability_t *capa) +{ + memset(capa, 0, sizeof(odp_queue_capability_t)); + + /* Reserve some queues for internal use */ + capa->max_queues = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; + capa->max_ordered_locks = sched_fn->max_ordered_locks(); + capa->max_sched_groups = sched_fn->num_grps(); + capa->sched_prios = odp_schedule_num_prio(); + capa->plain.max_num = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; + capa->plain.max_size = 0; ++ capa->plain.nonblocking = ODP_BLOCKING; + capa->sched.max_num = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; + capa->sched.max_size = 0; ++ capa->sched.nonblocking = ODP_BLOCKING; + + return 0; +} + +static odp_queue_type_t scalable_queue_type(odp_queue_t handle) +{ + return qentry_from_int(queue_from_ext(handle))->s.type; +} + +static odp_schedule_sync_t scalable_queue_sched_type(odp_queue_t handle) +{ + return qentry_from_int(queue_from_ext(handle))->s.param.sched.sync; +} + +static odp_schedule_prio_t scalable_queue_sched_prio(odp_queue_t handle) +{ + return qentry_from_int(queue_from_ext(handle))->s.param.sched.prio; +} + +static odp_schedule_group_t scalable_queue_sched_group(odp_queue_t handle) +{ + return qentry_from_int(queue_from_ext(handle))->s.param.sched.group; +} + +static uint32_t scalable_queue_lock_count(odp_queue_t handle) +{ + queue_entry_t *queue = qentry_from_int(queue_from_ext(handle)); + + return queue->s.param.sched.sync == ODP_SCHED_SYNC_ORDERED ? + queue->s.param.sched.lock_count : 0; +} + +static odp_queue_t scalable_queue_create(const char *name, + const odp_queue_param_t *param) +{ + int queue_idx; + odp_queue_t handle = ODP_QUEUE_INVALID; + queue_entry_t *queue; + odp_queue_param_t default_param; + + if (param == NULL) { + odp_queue_param_init(&default_param); + param = &default_param; + } + + for (queue_idx = 0; queue_idx < ODP_CONFIG_QUEUES; queue_idx++) { + queue = &queue_tbl->queue[queue_idx]; + + if (queue->s.status != QUEUE_STATUS_FREE) + continue; + + LOCK(&queue->s.lock); + if (queue->s.status == QUEUE_STATUS_FREE) { + if (queue_init(queue, name, param)) { + UNLOCK(&queue->s.lock); + return handle; + } + queue->s.status = QUEUE_STATUS_READY; + handle = queue->s.handle; + UNLOCK(&queue->s.lock); + break; + } + UNLOCK(&queue->s.lock); + } + return handle; +} + +static int scalable_queue_destroy(odp_queue_t handle) +{ + queue_entry_t *queue; + sched_elem_t *q; + + if (handle == ODP_QUEUE_INVALID) + return -1; + + queue = qentry_from_int(queue_from_ext(handle)); + LOCK(&queue->s.lock); + if (queue->s.status != QUEUE_STATUS_READY) { + UNLOCK(&queue->s.lock); + return -1; + } + q = &queue->s.sched_elem; + +#ifdef CONFIG_QSCHST_LOCK + LOCK(&q->qschlock); +#endif + if (_odp_queue_disable_enq(q)) { + /* Producer side not empty */ +#ifdef CONFIG_QSCHST_LOCK + UNLOCK(&q->qschlock); +#endif + UNLOCK(&queue->s.lock); + return -1; + } + /* Enqueue is now disabled */ + if (q->cons_read != q->cons_write) { + /* Consumer side is not empty + * Roll back previous change, enable enqueue again. + */ + uint32_t size; + + size = q->prod_mask + 1; + __atomic_fetch_sub(&q->prod_write, size, __ATOMIC_RELAXED); +#ifdef CONFIG_QSCHST_LOCK + UNLOCK(&q->qschlock); +#endif + UNLOCK(&queue->s.lock); + return -1; + } +#ifdef CONFIG_QSCHST_LOCK + UNLOCK(&q->qschlock); +#endif + /* Producer and consumer sides empty, enqueue disabled + * Now wait until schedq state is empty and no outstanding tickets + */ + while (__atomic_load_n(&q->qschst.numevts, __ATOMIC_RELAXED) != 0 || + __atomic_load_n(&q->qschst.cur_ticket, __ATOMIC_RELAXED) != + __atomic_load_n(&q->qschst.nxt_ticket, __ATOMIC_RELAXED)) { + sevl(); + while (wfe() && monitor32((uint32_t *)&q->qschst.numevts, + __ATOMIC_RELAXED) != 0) + doze(); + } + + if (q->schedq != NULL) { + sched_queue_rem(q->sched_grp, q->sched_prio); + q->schedq = NULL; + } + + _odp_ishm_pool_free(queue_shm_pool, q->prod_ring); + + if (q->rwin != NULL) { + if (rwin_free(queue_shm_pool, q->rwin) < 0) { + ODP_ERR("Failed to free reorder window\n"); + UNLOCK(&queue->s.lock); + return -1; + } + q->rwin = NULL; + } + queue->s.status = QUEUE_STATUS_FREE; + UNLOCK(&queue->s.lock); + return 0; +} + +static int scalable_queue_context_set(odp_queue_t handle, void *context, + uint32_t len ODP_UNUSED) +{ + odp_mb_full(); + qentry_from_int(queue_from_ext(handle))->s.param.context = context; + odp_mb_full(); + return 0; +} + +static void *scalable_queue_context(odp_queue_t handle) +{ + return qentry_from_int(queue_from_ext(handle))->s.param.context; +} + +static odp_queue_t scalable_queue_lookup(const char *name) +{ + uint32_t i; + + for (i = 0; i < ODP_CONFIG_QUEUES; i++) { + queue_entry_t *queue = &queue_tbl->queue[i]; + + if (queue->s.status == QUEUE_STATUS_FREE || + queue->s.status == QUEUE_STATUS_DESTROYED) + continue; + + LOCK(&queue->s.lock); + if (strcmp(name, queue->s.name) == 0) { + /* found it */ + UNLOCK(&queue->s.lock); + return queue->s.handle; + } + UNLOCK(&queue->s.lock); + } + + return ODP_QUEUE_INVALID; +} + +#ifndef CONFIG_QSCHST_LOCK +static inline int _odp_queue_enq(sched_elem_t *q, + odp_buffer_hdr_t *buf_hdr[], + int num) +{ + ringidx_t old_read; + ringidx_t old_write; + ringidx_t new_write; + int actual; + uint32_t mask; + odp_buffer_hdr_t **ring; + + mask = q->prod_mask; + ring = q->prod_ring; + + /* Load producer ring state (read & write index) */ + old_write = __atomic_load_n(&q->prod_write, __ATOMIC_RELAXED); + do { + /* Consumer does store-release prod_read, we need + * load-acquire. + */ + old_read = __atomic_load_n(&q->prod_read, __ATOMIC_ACQUIRE); + + actual = MIN(num, (int)((mask + 1) - (old_write - old_read))); + if (odp_unlikely(actual <= 0)) + return 0; + + new_write = old_write + actual; + } while (!__atomic_compare_exchange_n(&q->prod_write, + &old_write, /* Updated on failure */ + new_write, + true, + __ATOMIC_RELAXED, + __ATOMIC_RELAXED)); + +#ifdef CONFIG_SPLIT_PRODCONS + __builtin_prefetch(&q->cons_write, 0, 0); +#endif + /* Store our event(s) in the ring */ + do { + ring[old_write & mask] = *buf_hdr++; + } while (++old_write != new_write); + old_write -= actual; + +#ifdef CONFIG_SPLIT_PRODCONS + __builtin_prefetch(&q->node, 1, 0); +#endif + /* Wait for our turn to signal consumers */ + if (odp_unlikely(__atomic_load_n(&q->cons_write, + __ATOMIC_RELAXED) != old_write)) { + sevl(); + while (wfe() && monitor32(&q->cons_write, + __ATOMIC_RELAXED) != old_write) + doze(); + } + + /* Signal consumers that events are available (release events) + * Enable other producers to continue + */ + /* Wait for writes (to ring slots) to complete */ + atomic_store_release(&q->cons_write, new_write, /*readonly=*/false); + + return actual; +} + +#endif + +int _odp_queue_enq_sp(sched_elem_t *q, + odp_buffer_hdr_t *buf_hdr[], + int num) +{ + ringidx_t old_read; + ringidx_t old_write; + ringidx_t new_write; + int actual; + uint32_t mask; + odp_buffer_hdr_t **ring; + + mask = q->prod_mask; + ring = q->prod_ring; + + /* Load producer ring state (read & write index) */ + old_write = q->prod_write; + /* Consumer does store-release prod_read, we need load-acquire */ + old_read = __atomic_load_n(&q->prod_read, __ATOMIC_ACQUIRE); + actual = MIN(num, (int)((mask + 1) - (old_write - old_read))); + if (odp_unlikely(actual <= 0)) + return 0; + + new_write = old_write + actual; + q->prod_write = new_write; + + /* Store our event(s) in the ring */ + do { + ring[old_write & mask] = *buf_hdr++; + } while (++old_write != new_write); + old_write -= actual; + +#ifdef CONFIG_SPLIT_PRODCONS + __builtin_prefetch(&q->node, 1, 0); +#endif + + /* Signal consumers that events are available (release events) + * Enable other producers to continue + */ +#ifdef CONFIG_QSCHST_LOCK + q->cons_write = new_write; +#else + atomic_store_release(&q->cons_write, new_write, /*readonly=*/false); +#endif + + return actual; +} + +static int _queue_enq_multi(queue_t handle, odp_buffer_hdr_t *buf_hdr[], + int num) +{ + int actual; + queue_entry_t *queue; + sched_scalable_thread_state_t *ts; + + queue = qentry_from_int(handle); + ts = sched_ts; + if (ts && odp_unlikely(ts->out_of_order)) { + actual = rctx_save(queue, buf_hdr, num); + return actual; + } + +#ifdef CONFIG_QSCHST_LOCK + LOCK(&queue->s.sched_elem.qschlock); + actual = _odp_queue_enq_sp(&queue->s.sched_elem, buf_hdr, num); +#else + actual = _odp_queue_enq(&queue->s.sched_elem, buf_hdr, num); +#endif + + if (odp_likely(queue->s.sched_elem.schedq != NULL && actual != 0)) { + /* Perform scheduler related updates. */ +#ifdef CONFIG_QSCHST_LOCK + sched_update_enq_sp(&queue->s.sched_elem, actual); +#else + sched_update_enq(&queue->s.sched_elem, actual); +#endif + } + +#ifdef CONFIG_QSCHST_LOCK + UNLOCK(&queue->s.sched_elem.qschlock); +#endif + return actual; +} + +static int _queue_enq(queue_t handle, odp_buffer_hdr_t *buf_hdr) +{ + return odp_likely( + _queue_enq_multi(handle, &buf_hdr, 1) == 1) ? 0 : -1; +} + +static int scalable_queue_enq_multi(odp_queue_t handle, + const odp_event_t ev[], int num) +{ + odp_buffer_hdr_t *buf_hdr[QUEUE_MULTI_MAX]; + queue_entry_t *queue; + int i; + + if (num > QUEUE_MULTI_MAX) + num = QUEUE_MULTI_MAX; + + queue = qentry_from_int(queue_from_ext(handle)); + + for (i = 0; i < num; i++) + buf_hdr[i] = buf_hdl_to_hdr(odp_buffer_from_event(ev[i])); + + return queue->s.enqueue_multi(qentry_to_int(queue), buf_hdr, num); +} + +static int scalable_queue_enq(odp_queue_t handle, odp_event_t ev) +{ + odp_buffer_hdr_t *buf_hdr; + queue_entry_t *queue; + + queue = qentry_from_int(queue_from_ext(handle)); + buf_hdr = buf_hdl_to_hdr(odp_buffer_from_event(ev)); + + return queue->s.enqueue(qentry_to_int(queue), buf_hdr); +} + +/* Single-consumer dequeue. */ +int _odp_queue_deq_sc(sched_elem_t *q, odp_event_t *evp, int num) +{ + int actual; + ringidx_t old_read; + ringidx_t old_write; + ringidx_t new_read; + uint32_t mask; + odp_buffer_hdr_t **ring; + + /* Load consumer ring state (read & write index). */ + old_read = q->cons_read; + /* Producer does store-release cons_write, we need load-acquire */ + old_write = __atomic_load_n(&q->cons_write, __ATOMIC_ACQUIRE); + actual = MIN(num, (int)(old_write - old_read)); + + if (odp_unlikely(actual <= 0)) + return 0; + +#ifdef CONFIG_SPLIT_PRODCONS + __builtin_prefetch(&q->node, 1, 0); +#endif + new_read = old_read + actual; + q->cons_read = new_read; + + mask = q->cons_mask; + ring = q->cons_ring; + do { + *evp++ = odp_buffer_to_event( + buf_from_buf_hdr(ring[old_read & mask])); + } while (++old_read != new_read); + + /* Signal producers that empty slots are available + * (release ring slots). Enable other consumers to continue. + */ +#ifdef CONFIG_QSCHST_LOCK + q->prod_read = new_read; +#else + /* Wait for loads (from ring slots) to complete. */ + atomic_store_release(&q->prod_read, new_read, /*readonly=*/true); +#endif + return actual; +} + +inline int _odp_queue_deq(sched_elem_t *q, odp_buffer_hdr_t *buf_hdr[], int num) +{ + int actual; + ringidx_t old_read; + ringidx_t old_write; + ringidx_t new_read; + uint32_t mask; + odp_buffer_hdr_t **ring; + odp_buffer_hdr_t **p_buf_hdr; + + mask = q->cons_mask; + ring = q->cons_ring; + + /* Load consumer ring state (read & write index) */ + old_read = __atomic_load_n(&q->cons_read, __ATOMIC_RELAXED); + do { + /* Need __atomic_load to avoid compiler reordering + * Producer does store-release cons_write, we need + * load-acquire. + */ + old_write = __atomic_load_n(&q->cons_write, __ATOMIC_ACQUIRE); + /* Prefetch ring buffer array */ + __builtin_prefetch(&q->cons_ring[old_read & mask], 0, 0); + + actual = MIN(num, (int)(old_write - old_read)); + if (odp_unlikely(actual <= 0)) + return 0; + + /* Attempt to free ring slot(s) */ + new_read = old_read + actual; + } while (!__atomic_compare_exchange_n(&q->cons_read, + &old_read, /* Updated on failure */ + new_read, + true, + __ATOMIC_RELAXED, + __ATOMIC_RELAXED)); +#ifdef CONFIG_SPLIT_PRODCONS + __builtin_prefetch(&q->prod_read, 0, 0); +#endif + p_buf_hdr = buf_hdr; + do { + *p_buf_hdr++ = ring[old_read & mask]; + } while (++old_read != new_read); + old_read -= actual; + +#ifdef CONFIG_SPLIT_PRODCONS + __builtin_prefetch(&q->node, 1, 0); +#endif + /* Wait for our turn to signal producers */ + if (odp_unlikely(__atomic_load_n(&q->prod_read, __ATOMIC_RELAXED) != + old_read)) { + sevl(); + while (wfe() && monitor32(&q->prod_read, + __ATOMIC_RELAXED) != old_read) + doze(); + } + + /* Signal producers that empty slots are available + * (release ring slots) + * Enable other consumers to continue + */ + /* Wait for loads (from ring slots) to complete */ + atomic_store_release(&q->prod_read, new_read, /*readonly=*/true); + + return actual; +} + +inline int _odp_queue_deq_mc(sched_elem_t *q, odp_event_t *evp, int num) +{ + int ret, evt_idx; + odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX]; + + if (num > QUEUE_MULTI_MAX) + num = QUEUE_MULTI_MAX; + + ret = _odp_queue_deq(q, hdr_tbl, num); + if (odp_likely(ret != 0)) { + for (evt_idx = 0; evt_idx < num; evt_idx++) + evp[evt_idx] = odp_buffer_to_event( + buf_from_buf_hdr(hdr_tbl[evt_idx])); + } + + return ret; +} + +static int _queue_deq_multi(queue_t handle, odp_buffer_hdr_t *buf_hdr[], + int num) +{ + sched_elem_t *q; + queue_entry_t *queue; + + queue = qentry_from_int(handle); + q = &queue->s.sched_elem; + return _odp_queue_deq(q, buf_hdr, num); +} + +static odp_buffer_hdr_t *_queue_deq(queue_t handle) +{ + sched_elem_t *q; + odp_buffer_hdr_t *buf_hdr; + queue_entry_t *queue; + + queue = qentry_from_int(handle); + q = &queue->s.sched_elem; + if (_odp_queue_deq(q, &buf_hdr, 1) == 1) + return buf_hdr; + else + return NULL; +} + +static int scalable_queue_deq_multi(odp_queue_t handle, odp_event_t ev[], + int num) +{ + queue_entry_t *queue; + + if (num > QUEUE_MULTI_MAX) + num = QUEUE_MULTI_MAX; + + queue = qentry_from_int(queue_from_ext(handle)); + return queue->s.dequeue_multi(qentry_to_int(queue), + (odp_buffer_hdr_t **)ev, num); +} + +static odp_event_t scalable_queue_deq(odp_queue_t handle) +{ + queue_entry_t *queue; + + queue = qentry_from_int(queue_from_ext(handle)); + return (odp_event_t)queue->s.dequeue(qentry_to_int(queue)); +} + +static void scalable_queue_param_init(odp_queue_param_t *params) +{ + memset(params, 0, sizeof(odp_queue_param_t)); + params->type = ODP_QUEUE_TYPE_PLAIN; + params->enq_mode = ODP_QUEUE_OP_MT; + params->deq_mode = ODP_QUEUE_OP_MT; ++ params->nonblocking = ODP_BLOCKING; + params->sched.prio = ODP_SCHED_PRIO_DEFAULT; + params->sched.sync = ODP_SCHED_SYNC_PARALLEL; + params->sched.group = ODP_SCHED_GROUP_ALL; +} + +static int scalable_queue_info(odp_queue_t handle, odp_queue_info_t *info) +{ + uint32_t queue_id; + queue_entry_t *queue; + int status; + + if (odp_unlikely(info == NULL)) { + ODP_ERR("Unable to store info, NULL ptr given\n"); + return -1; + } + + queue_id = queue_to_id(handle); + + if (odp_unlikely(queue_id >= ODP_CONFIG_QUEUES)) { + ODP_ERR("Invalid queue handle:%" PRIu64 "\n", + odp_queue_to_u64(handle)); + return -1; + } + + queue = get_qentry(queue_id); + + LOCK(&queue->s.lock); + status = queue->s.status; + + if (odp_unlikely(status == QUEUE_STATUS_FREE || + status == QUEUE_STATUS_DESTROYED)) { + UNLOCK(&queue->s.lock); + ODP_ERR("Invalid queue status:%d\n", status); + return -1; + } + + info->name = queue->s.name; + info->param = queue->s.param; + + UNLOCK(&queue->s.lock); + + return 0; +} + +static uint64_t scalable_queue_to_u64(odp_queue_t hdl) +{ + return _odp_pri(hdl); +} + +static odp_pktout_queue_t queue_get_pktout(queue_t handle) +{ + return qentry_from_int(handle)->s.pktout; +} + +static void queue_set_pktout(queue_t handle, odp_pktio_t pktio, int index) +{ + qentry_from_int(handle)->s.pktout.pktio = pktio; + qentry_from_int(handle)->s.pktout.index = index; +} + +static odp_pktin_queue_t queue_get_pktin(queue_t handle) +{ + return qentry_from_int(handle)->s.pktin; +} + +static void queue_set_pktin(queue_t handle, odp_pktio_t pktio, int index) +{ + qentry_from_int(handle)->s.pktin.pktio = pktio; + qentry_from_int(handle)->s.pktin.index = index; +} + +static void queue_set_enq_deq_func(queue_t handle, + queue_enq_fn_t enq, + queue_enq_multi_fn_t enq_multi, + queue_deq_fn_t deq, + queue_deq_multi_fn_t deq_multi) +{ + if (enq) + qentry_from_int(handle)->s.enqueue = enq; + + if (enq_multi) + qentry_from_int(handle)->s.enqueue_multi = enq_multi; + + if (deq) + qentry_from_int(handle)->s.dequeue = deq; + + if (deq_multi) + qentry_from_int(handle)->s.dequeue_multi = deq_multi; +} + +static queue_t queue_from_ext(odp_queue_t handle) +{ + uint32_t queue_id; + + queue_id = queue_to_id(handle); + return qentry_to_int(get_qentry(queue_id)); +} + +static odp_queue_t queue_to_ext(queue_t handle) +{ + return qentry_from_int(handle)->s.handle; +} + +/* API functions */ +odp_queue_module_t scalable_queue = { + .base = { + .name = "scalable_queue", + .init_global = scalable_queue_init_global, + .term_global = scalable_queue_term_global, + .init_local = scalable_queue_init_local, + .term_local = scalable_queue_term_local, + }, + .create = scalable_queue_create, + .destroy = scalable_queue_destroy, + .lookup = scalable_queue_lookup, + .capability = scalable_queue_capability, + .context_set = scalable_queue_context_set, + .context = scalable_queue_context, + .enq = scalable_queue_enq, + .enq_multi = scalable_queue_enq_multi, + .deq = scalable_queue_deq, + .deq_multi = scalable_queue_deq_multi, + .type = scalable_queue_type, + .sched_type = scalable_queue_sched_type, + .sched_prio = scalable_queue_sched_prio, + .sched_group = scalable_queue_sched_group, + .lock_count = scalable_queue_lock_count, + .to_u64 = scalable_queue_to_u64, + .param_init = scalable_queue_param_init, + .info = scalable_queue_info, +}; + +ODP_MODULE_CONSTRUCTOR(scalable_queue) +{ + odp_module_constructor(&scalable_queue); + odp_subsystem_register_module(queue, &scalable_queue); +} + +/* Functions towards internal components */ +queue_fn_t queue_scalable_fn = { + .from_ext = queue_from_ext, + .to_ext = queue_to_ext, + .enq = _queue_enq, + .enq_multi = _queue_enq_multi, + .deq = _queue_deq, + .deq_multi = _queue_deq_multi, + .get_pktout = queue_get_pktout, + .set_pktout = queue_set_pktout, + .get_pktin = queue_get_pktin, + .set_pktin = queue_set_pktin, - .set_enq_deq_fn = queue_set_enq_deq_func, ++ .set_enq_deq_fn = queue_set_enq_deq_func +}; diff --cc test/validation/api/ipsec/ipsec.c index 824ac6ef,ea3cff05..6066650c --- a/test/validation/api/ipsec/ipsec.c +++ b/test/validation/api/ipsec/ipsec.c @@@ -279,9 -298,21 +298,21 @@@ int ipsec_check_esp_aes_gcm_128(void int ipsec_check_esp_aes_gcm_256(void) { return ipsec_check_esp(ODP_CIPHER_ALG_AES_GCM, 256, - ODP_AUTH_ALG_AES_GCM, 0); + ODP_AUTH_ALG_AES_GCM, 256); }
+ int ipsec_check_ah_aes_gmac_128(void) + { + return ipsec_check_esp(ODP_CIPHER_ALG_NULL, 0, + ODP_AUTH_ALG_AES_GMAC, 128); + } + + int ipsec_check_esp_null_aes_gmac_128(void) + { + return ipsec_check_esp(ODP_CIPHER_ALG_NULL, 0, + ODP_AUTH_ALG_AES_GMAC, 128); + } + void ipsec_sa_param_fill(odp_ipsec_sa_param_t *param, odp_bool_t in, odp_bool_t ah, diff --cc test/validation/drv/Makefile.inc index 5f8fbbb6,00000000..514943b3 mode 100644,000000..100644 --- a/test/validation/drv/Makefile.inc +++ b/test/validation/drv/Makefile.inc @@@ -1,1 -1,0 +1,3 @@@ - include $(top_srcdir)/test/validation/Makefile.inc ++include $(top_srcdir)/test/Makefile.inc ++ ++AM_CPPFLAGS += -I$(top_srcdir)/platform/@with_platform@/include
-----------------------------------------------------------------------
Summary of changes: .gitignore | 4 + .shippable.yml | 10 +- .travis.yml | 306 ++-- CHANGELOG | 601 ++++++++ DEPENDENCIES | 14 +- Makefile.am | 8 +- Makefile.inc | 20 + README | 11 +- README.DPDK | 1 - configure.ac | 170 ++- doc/.gitignore | 1 + doc/application-api-guide/Makefile.am | 1 + doc/application-api-guide/odp.dox | 4 +- doc/helper-guide/odp.dox | 4 +- doc/images/.gitignore | 1 + doc/images/ipsec-inline.svg | 31 + doc/images/ipsec-lookaside.svg | 29 + doc/images/ipsec_sa_states.msc | 76 + doc/implementers-guide/Makefile.am | 6 +- doc/implementers-guide/implementers-guide.adoc | 74 +- doc/platform-api-guide/Makefile.am | 3 +- doc/process-guide/release-guide.adoc | 2 +- doc/users-guide/Makefile.am | 11 + doc/users-guide/users-guide-ipsec.adoc | 467 ++++++ doc/users-guide/users-guide.adoc | 2 + example/Makefile.am | 6 +- example/Makefile.inc | 24 +- example/ddf_app/Makefile.am | 2 + example/ddf_ifs/Makefile.am | 8 +- example/generator/Makefile.am | 5 + example/generator/generator_run.sh | 17 + example/generator/odp_generator.c | 643 +++++--- example/ipfragreass/Makefile.am | 2 + example/ipfragreass/odp_ipfragreass.c | 4 +- example/ipsec/Makefile.am | 3 +- example/ipsec/README | 3 +- example/ipsec/odp_ipsec.c | 89 +- example/ipsec/odp_ipsec_cache.c | 4 + example/ipsec/odp_ipsec_fwd_db.c | 4 +- example/ipsec/odp_ipsec_fwd_db.h | 5 +- example/ipsec/odp_ipsec_loop_db.c | 56 - example/ipsec/odp_ipsec_loop_db.h | 128 -- example/ipsec/odp_ipsec_stream.c | 57 +- example/ipsec/odp_ipsec_stream.h | 6 +- example/ipsec_api/.gitignore | 1 + example/ipsec_api/Makefile.am | 33 + example/ipsec_api/odp_ipsec.c | 1248 ++++++++++++++++ example/ipsec_api/odp_ipsec_api_run_ah_in.sh | 12 + example/ipsec_api/odp_ipsec_api_run_ah_out.sh | 12 + example/ipsec_api/odp_ipsec_api_run_ah_tun_in.sh | 13 + example/ipsec_api/odp_ipsec_api_run_ah_tun_out.sh | 13 + example/ipsec_api/odp_ipsec_api_run_esp_in.sh | 13 + example/ipsec_api/odp_ipsec_api_run_esp_out.sh | 13 + example/ipsec_api/odp_ipsec_api_run_esp_tun_in.sh | 14 + example/ipsec_api/odp_ipsec_api_run_esp_tun_out.sh | 13 + example/ipsec_api/odp_ipsec_api_run_live.sh | 17 + example/ipsec_api/odp_ipsec_api_run_router.sh | 9 + example/ipsec_api/odp_ipsec_api_run_simple.sh | 10 + example/ipsec_api/odp_ipsec_cache.c | 180 +++ example/ipsec_api/odp_ipsec_cache.h | 112 ++ example/ipsec_api/odp_ipsec_fwd_db.c | 1 + example/ipsec_api/odp_ipsec_fwd_db.h | 1 + example/ipsec_api/odp_ipsec_misc.h | 1 + example/ipsec_api/odp_ipsec_sa_db.c | 1 + example/ipsec_api/odp_ipsec_sa_db.h | 1 + example/ipsec_api/odp_ipsec_sp_db.c | 1 + example/ipsec_api/odp_ipsec_sp_db.h | 1 + example/ipsec_api/odp_ipsec_stream.c | 1 + example/ipsec_api/odp_ipsec_stream.h | 1 + example/ipsec_offload/.gitignore | 1 + example/ipsec_offload/Makefile.am | 18 + example/ipsec_offload/odp_ipsec_offload.c | 854 +++++++++++ example/ipsec_offload/odp_ipsec_offload_cache.c | 146 ++ example/ipsec_offload/odp_ipsec_offload_cache.h | 78 + example/ipsec_offload/odp_ipsec_offload_fwd_db.c | 223 +++ example/ipsec_offload/odp_ipsec_offload_fwd_db.h | 197 +++ example/ipsec_offload/odp_ipsec_offload_misc.h | 366 +++++ example/ipsec_offload/odp_ipsec_offload_sa_db.c | 359 +++++ example/ipsec_offload/odp_ipsec_offload_sa_db.h | 126 ++ example/ipsec_offload/odp_ipsec_offload_sp_db.c | 165 +++ example/ipsec_offload/odp_ipsec_offload_sp_db.h | 72 + example/ipsec_offload/run_left.sh | 14 + example/ipsec_offload/run_right.sh | 14 + example/l2fwd/README | 3 +- example/l2fwd_simple/l2fwd_simple_run.sh | 13 + example/l2fwd_simple/odp_l2fwd_simple.c | 24 +- example/l3fwd/odp_l3fwd.c | 4 +- example/l3fwd/odp_l3fwd_db.h | 4 +- example/m4/configure.m4 | 4 +- example/switch/odp_switch.c | 6 +- example/traffic_mgmt/.gitignore | 4 +- example/traffic_mgmt/odp_traffic_mgmt.c | 1 + helper/Makefile.am | 15 +- helper/cuckootable.c | 10 +- helper/hashtable.c | 2 +- helper/include/odp/helper/chksum.h | 27 - helper/include/odp/helper/ip.h | 6 +- helper/iplookuptable.c | 6 +- helper/lineartable.c | 2 +- helper/m4/configure.m4 | 11 +- helper/test/Makefile.am | 24 +- helper/test/linux/process.c | 2 + helper/test/linux/pthread.c | 2 + helper/threads.c | 3 +- include/Makefile.am | 292 +++- include/README | 79 + include/odp/api/abi-default/align.h | 56 + include/odp/api/abi-default/atomic.h | 72 + include/odp/api/abi-default/barrier.h | 38 + include/odp/api/abi-default/buffer.h | 33 + include/odp/api/abi-default/byteorder.h | 73 + .../api/abi => api/abi-default}/classification.h | 0 include/odp/api/abi-default/cpu.h | 28 + include/odp/api/abi-default/cpumask.h | 53 + .../default/api/abi => api/abi-default}/crypto.h | 0 include/odp/api/abi-default/debug.h | 35 + include/odp/api/abi-default/event.h | 50 + include/odp/api/abi-default/init.h | 35 + include/odp/api/abi-default/ipsec.h | 41 + include/odp/api/abi-default/packet.h | 50 + include/odp/api/abi-default/packet_flags.h | 24 + include/odp/api/abi-default/packet_io.h | 59 + .../default/api/abi => api/abi-default}/pool.h | 0 .../default/api/abi => api/abi-default}/queue.h | 0 include/odp/api/abi-default/rwlock.h | 36 + include/odp/api/abi-default/rwlock_recursive.h | 36 + include/odp/api/abi-default/schedule.h | 39 + include/odp/api/abi-default/schedule_types.h | 56 + .../api/abi => api/abi-default}/shared_memory.h | 0 include/odp/api/abi-default/spinlock.h | 29 + include/odp/api/abi-default/spinlock_recursive.h | 34 + include/odp/api/abi-default/std_clib.h | 24 + include/odp/api/abi-default/std_types.h | 43 + include/odp/api/abi-default/sync.h | 24 + include/odp/api/abi-default/thread.h | 34 + include/odp/api/abi-default/thrmask.h | 48 + include/odp/api/abi-default/ticketlock.h | 32 + include/odp/api/abi-default/time.h | 53 + include/odp/api/abi-default/timer.h | 54 + include/odp/api/abi-default/traffic_mngr.h | 178 +++ include/odp/api/abi-default/version.h | 30 + include/odp/api/align.h | 28 + include/odp/api/atomic.h | 28 + include/odp/api/barrier.h | 31 + include/odp/api/buffer.h | 31 + include/odp/api/byteorder.h | 28 + include/odp/api/chksum.h | 26 + include/odp/api/classification.h | 33 + include/odp/api/cpu.h | 30 + include/odp/api/cpumask.h | 28 + include/odp/api/crypto.h | 41 + include/odp/api/debug.h | 28 + include/odp/api/deprecated.h | 26 + include/odp/api/errno.h | 26 + include/odp/api/event.h | 28 + include/odp/api/feature.h | 26 + include/odp/api/hash.h | 26 + include/odp/api/hints.h | 26 + include/odp/api/init.h | 28 + include/odp/api/ipsec.h | 28 + include/odp/api/packet.h | 33 + include/odp/api/packet_flags.h | 28 + include/odp/api/packet_io.h | 41 + include/odp/api/packet_io_stats.h | 26 + include/odp/api/pool.h | 30 + include/odp/api/queue.h | 32 + include/odp/api/random.h | 26 + include/odp/api/rwlock.h | 28 + include/odp/api/rwlock_recursive.h | 28 + include/odp/api/schedule.h | 29 + include/odp/api/schedule_types.h | 28 + include/odp/api/shared_memory.h | 28 + include/odp/api/spec/align.h | 4 +- include/odp/api/spec/atomic.h | 4 +- include/odp/api/spec/barrier.h | 4 +- include/odp/api/spec/buffer.h | 4 +- include/odp/api/spec/byteorder.h | 4 +- include/odp/api/spec/chksum.h | 4 +- include/odp/api/spec/classification.h | 255 ++-- include/odp/api/spec/compiler.h | 53 - include/odp/api/spec/cpu.h | 7 +- include/odp/api/spec/cpumask.h | 4 +- include/odp/api/spec/crypto.h | 65 +- include/odp/api/spec/debug.h | 4 +- include/odp/api/spec/deprecated.h.in | 4 +- include/odp/api/spec/errno.h | 4 +- include/odp/api/spec/event.h | 66 +- include/odp/api/spec/feature.h | 4 +- include/odp/api/spec/hash.h | 4 +- include/odp/api/spec/hints.h | 4 +- include/odp/api/spec/init.h | 4 +- include/odp/api/spec/ipsec.h | 120 +- include/odp/api/spec/packet.h | 277 +++- include/odp/api/spec/packet_flags.h | 240 +-- include/odp/api/spec/packet_io.h | 202 ++- include/odp/api/spec/packet_io_stats.h | 4 +- include/odp/api/spec/pool.h | 240 ++- include/odp/api/spec/queue.h | 74 +- include/odp/api/spec/random.h | 4 +- include/odp/api/spec/rwlock.h | 4 +- include/odp/api/spec/rwlock_recursive.h | 4 +- include/odp/api/spec/schedule.h | 24 +- include/odp/api/spec/schedule_types.h | 14 +- include/odp/api/spec/shared_memory.h | 13 +- include/odp/api/spec/spinlock.h | 4 +- include/odp/api/spec/spinlock_recursive.h | 4 +- include/odp/api/spec/std_clib.h | 4 +- include/odp/api/spec/std_types.h | 14 +- include/odp/api/spec/support.h | 4 +- include/odp/api/spec/sync.h | 4 +- include/odp/api/spec/system_info.h | 4 +- include/odp/api/spec/thread.h | 32 +- include/odp/api/spec/thread_types.h | 59 + include/odp/api/spec/threshold.h | 106 ++ include/odp/api/spec/thrmask.h | 4 +- include/odp/api/spec/ticketlock.h | 4 +- include/odp/api/spec/time.h | 14 +- include/odp/api/spec/timer.h | 4 +- include/odp/api/spec/traffic_mngr.h | 643 ++++---- include/odp/api/spec/version.h.in | 4 +- include/odp/api/spinlock.h | 28 + include/odp/api/spinlock_recursive.h | 28 + include/odp/api/std_clib.h | 23 + include/odp/api/std_types.h | 29 + include/odp/api/support.h | 26 + include/odp/api/sync.h | 28 + include/odp/api/system_info.h | 28 + include/odp/api/thread.h | 30 + include/odp/api/threshold.h | 26 + include/odp/api/thrmask.h | 28 + include/odp/api/ticketlock.h | 28 + include/odp/api/time.h | 29 + include/odp/api/timer.h | 32 + include/odp/api/traffic_mngr.h | 28 + include/odp/api/version.h | 28 + include/odp/arch/arm32-linux/odp/api/abi/align.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/atomic.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/barrier.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/buffer.h | 2 +- .../odp/arch/arm32-linux/odp/api/abi/byteorder.h | 7 + .../arch/arm32-linux/odp/api/abi/classification.h | 2 +- include/odp/arch/arm32-linux/odp/api/abi/cpu.h | 30 + include/odp/arch/arm32-linux/odp/api/abi/cpumask.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/crypto.h | 2 +- include/odp/arch/arm32-linux/odp/api/abi/debug.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/event.h | 2 +- include/odp/arch/arm32-linux/odp/api/abi/init.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/ipsec.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/packet.h | 2 +- .../arch/arm32-linux/odp/api/abi/packet_flags.h | 7 + .../odp/arch/arm32-linux/odp/api/abi/packet_io.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/pool.h | 2 +- include/odp/arch/arm32-linux/odp/api/abi/queue.h | 2 +- include/odp/arch/arm32-linux/odp/api/abi/rwlock.h | 7 + .../arm32-linux/odp/api/abi/rwlock_recursive.h | 7 + .../odp/arch/arm32-linux/odp/api/abi/schedule.h | 7 + .../arch/arm32-linux/odp/api/abi/schedule_types.h | 7 + .../arch/arm32-linux/odp/api/abi/shared_memory.h | 2 +- .../odp/arch/arm32-linux/odp/api/abi/spinlock.h | 7 + .../arm32-linux/odp/api/abi/spinlock_recursive.h | 7 + .../odp/arch/arm32-linux/odp/api/abi/std_clib.h | 7 + .../odp/arch/arm32-linux/odp/api/abi/std_types.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/sync.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/thread.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/thrmask.h | 7 + .../odp/arch/arm32-linux/odp/api/abi/ticketlock.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/time.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/timer.h | 7 + .../arch/arm32-linux/odp/api/abi/traffic_mngr.h | 7 + include/odp/arch/arm32-linux/odp/api/abi/version.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/align.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/atomic.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/barrier.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/buffer.h | 2 +- .../odp/arch/arm64-linux/odp/api/abi/byteorder.h | 7 + .../arch/arm64-linux/odp/api/abi/classification.h | 2 +- include/odp/arch/arm64-linux/odp/api/abi/cpu.h | 30 + include/odp/arch/arm64-linux/odp/api/abi/cpumask.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/crypto.h | 2 +- include/odp/arch/arm64-linux/odp/api/abi/debug.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/event.h | 2 +- include/odp/arch/arm64-linux/odp/api/abi/init.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/ipsec.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/packet.h | 2 +- .../arch/arm64-linux/odp/api/abi/packet_flags.h | 7 + .../odp/arch/arm64-linux/odp/api/abi/packet_io.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/pool.h | 2 +- include/odp/arch/arm64-linux/odp/api/abi/queue.h | 2 +- include/odp/arch/arm64-linux/odp/api/abi/rwlock.h | 7 + .../arm64-linux/odp/api/abi/rwlock_recursive.h | 7 + .../odp/arch/arm64-linux/odp/api/abi/schedule.h | 7 + .../arch/arm64-linux/odp/api/abi/schedule_types.h | 7 + .../arch/arm64-linux/odp/api/abi/shared_memory.h | 2 +- .../odp/arch/arm64-linux/odp/api/abi/spinlock.h | 7 + .../arm64-linux/odp/api/abi/spinlock_recursive.h | 7 + .../odp/arch/arm64-linux/odp/api/abi/std_clib.h | 7 + .../odp/arch/arm64-linux/odp/api/abi/std_types.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/sync.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/thread.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/thrmask.h | 7 + .../odp/arch/arm64-linux/odp/api/abi/ticketlock.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/time.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/timer.h | 7 + .../arch/arm64-linux/odp/api/abi/traffic_mngr.h | 7 + include/odp/arch/arm64-linux/odp/api/abi/version.h | 7 + include/odp/arch/default/api/abi/buffer.h | 33 - include/odp/arch/default/api/abi/event.h | 50 - include/odp/arch/default/api/abi/packet.h | 50 - include/odp/arch/mips64-linux/odp/api/abi/align.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/atomic.h | 7 + .../odp/arch/mips64-linux/odp/api/abi/barrier.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/buffer.h | 2 +- .../odp/arch/mips64-linux/odp/api/abi/byteorder.h | 7 + .../arch/mips64-linux/odp/api/abi/classification.h | 2 +- include/odp/arch/mips64-linux/odp/api/abi/cpu.h | 32 + .../odp/arch/mips64-linux/odp/api/abi/cpumask.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/crypto.h | 2 +- include/odp/arch/mips64-linux/odp/api/abi/debug.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/event.h | 2 +- include/odp/arch/mips64-linux/odp/api/abi/init.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/ipsec.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/packet.h | 2 +- .../arch/mips64-linux/odp/api/abi/packet_flags.h | 7 + .../odp/arch/mips64-linux/odp/api/abi/packet_io.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/pool.h | 2 +- include/odp/arch/mips64-linux/odp/api/abi/queue.h | 2 +- include/odp/arch/mips64-linux/odp/api/abi/rwlock.h | 7 + .../mips64-linux/odp/api/abi/rwlock_recursive.h | 7 + .../odp/arch/mips64-linux/odp/api/abi/schedule.h | 7 + .../arch/mips64-linux/odp/api/abi/schedule_types.h | 7 + .../arch/mips64-linux/odp/api/abi/shared_memory.h | 2 +- .../odp/arch/mips64-linux/odp/api/abi/spinlock.h | 7 + .../mips64-linux/odp/api/abi/spinlock_recursive.h | 7 + .../odp/arch/mips64-linux/odp/api/abi/std_clib.h | 7 + .../odp/arch/mips64-linux/odp/api/abi/std_types.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/sync.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/thread.h | 7 + .../odp/arch/mips64-linux/odp/api/abi/thrmask.h | 7 + .../odp/arch/mips64-linux/odp/api/abi/ticketlock.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/time.h | 7 + include/odp/arch/mips64-linux/odp/api/abi/timer.h | 7 + .../arch/mips64-linux/odp/api/abi/traffic_mngr.h | 7 + .../odp/arch/mips64-linux/odp/api/abi/version.h | 7 + include/odp/arch/power64-linux/odp/api/abi/align.h | 7 + .../odp/arch/power64-linux/odp/api/abi/atomic.h | 7 + .../odp/arch/power64-linux/odp/api/abi/barrier.h | 7 + .../odp/arch/power64-linux/odp/api/abi/buffer.h | 2 +- .../odp/arch/power64-linux/odp/api/abi/byteorder.h | 7 + .../power64-linux/odp/api/abi/classification.h | 2 +- include/odp/arch/power64-linux/odp/api/abi/cpu.h | 8 + .../odp/arch/power64-linux/odp/api/abi/cpumask.h | 7 + .../odp/arch/power64-linux/odp/api/abi/crypto.h | 2 +- include/odp/arch/power64-linux/odp/api/abi/debug.h | 7 + include/odp/arch/power64-linux/odp/api/abi/event.h | 2 +- include/odp/arch/power64-linux/odp/api/abi/init.h | 7 + include/odp/arch/power64-linux/odp/api/abi/ipsec.h | 7 + .../odp/arch/power64-linux/odp/api/abi/packet.h | 2 +- .../arch/power64-linux/odp/api/abi/packet_flags.h | 7 + .../odp/arch/power64-linux/odp/api/abi/packet_io.h | 7 + include/odp/arch/power64-linux/odp/api/abi/pool.h | 2 +- include/odp/arch/power64-linux/odp/api/abi/queue.h | 2 +- .../odp/arch/power64-linux/odp/api/abi/rwlock.h | 7 + .../power64-linux/odp/api/abi/rwlock_recursive.h | 7 + .../odp/arch/power64-linux/odp/api/abi/schedule.h | 7 + .../power64-linux/odp/api/abi/schedule_types.h | 7 + .../arch/power64-linux/odp/api/abi/shared_memory.h | 2 +- .../odp/arch/power64-linux/odp/api/abi/spinlock.h | 7 + .../power64-linux/odp/api/abi/spinlock_recursive.h | 7 + .../odp/arch/power64-linux/odp/api/abi/std_clib.h | 7 + .../odp/arch/power64-linux/odp/api/abi/std_types.h | 7 + include/odp/arch/power64-linux/odp/api/abi/sync.h | 7 + .../odp/arch/power64-linux/odp/api/abi/thread.h | 7 + .../odp/arch/power64-linux/odp/api/abi/thrmask.h | 7 + .../arch/power64-linux/odp/api/abi/ticketlock.h | 7 + include/odp/arch/power64-linux/odp/api/abi/time.h | 7 + include/odp/arch/power64-linux/odp/api/abi/timer.h | 7 + .../arch/power64-linux/odp/api/abi/traffic_mngr.h | 7 + .../odp/arch/power64-linux/odp/api/abi/version.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/align.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/atomic.h | 7 + .../odp/arch/x86_32-linux/odp/api/abi/barrier.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/buffer.h | 2 +- .../odp/arch/x86_32-linux/odp/api/abi/byteorder.h | 7 + .../arch/x86_32-linux/odp/api/abi/classification.h | 2 +- include/odp/arch/x86_32-linux/odp/api/abi/cpu.h | 29 + .../odp/arch/x86_32-linux/odp/api/abi/cpumask.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/crypto.h | 2 +- include/odp/arch/x86_32-linux/odp/api/abi/debug.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/event.h | 2 +- include/odp/arch/x86_32-linux/odp/api/abi/init.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/ipsec.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/packet.h | 2 +- .../arch/x86_32-linux/odp/api/abi/packet_flags.h | 7 + .../odp/arch/x86_32-linux/odp/api/abi/packet_io.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/pool.h | 2 +- include/odp/arch/x86_32-linux/odp/api/abi/queue.h | 2 +- include/odp/arch/x86_32-linux/odp/api/abi/rwlock.h | 7 + .../x86_32-linux/odp/api/abi/rwlock_recursive.h | 7 + .../odp/arch/x86_32-linux/odp/api/abi/schedule.h | 7 + .../arch/x86_32-linux/odp/api/abi/schedule_types.h | 7 + .../arch/x86_32-linux/odp/api/abi/shared_memory.h | 2 +- .../odp/arch/x86_32-linux/odp/api/abi/spinlock.h | 7 + .../x86_32-linux/odp/api/abi/spinlock_recursive.h | 7 + .../odp/arch/x86_32-linux/odp/api/abi/std_clib.h | 7 + .../odp/arch/x86_32-linux/odp/api/abi/std_types.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/sync.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/thread.h | 7 + .../odp/arch/x86_32-linux/odp/api/abi/thrmask.h | 7 + .../odp/arch/x86_32-linux/odp/api/abi/ticketlock.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/time.h | 7 + include/odp/arch/x86_32-linux/odp/api/abi/timer.h | 7 + .../arch/x86_32-linux/odp/api/abi/traffic_mngr.h | 7 + .../odp/arch/x86_32-linux/odp/api/abi/version.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/align.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/atomic.h | 7 + .../odp/arch/x86_64-linux/odp/api/abi/barrier.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/buffer.h | 2 +- .../odp/arch/x86_64-linux/odp/api/abi/byteorder.h | 7 + .../arch/x86_64-linux/odp/api/abi/classification.h | 2 +- include/odp/arch/x86_64-linux/odp/api/abi/cpu.h | 25 + .../odp/arch/x86_64-linux/odp/api/abi/cpumask.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/crypto.h | 2 +- include/odp/arch/x86_64-linux/odp/api/abi/debug.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/event.h | 2 +- include/odp/arch/x86_64-linux/odp/api/abi/init.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/ipsec.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/packet.h | 2 +- .../arch/x86_64-linux/odp/api/abi/packet_flags.h | 7 + .../odp/arch/x86_64-linux/odp/api/abi/packet_io.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/pool.h | 2 +- include/odp/arch/x86_64-linux/odp/api/abi/queue.h | 2 +- include/odp/arch/x86_64-linux/odp/api/abi/rwlock.h | 7 + .../x86_64-linux/odp/api/abi/rwlock_recursive.h | 7 + .../odp/arch/x86_64-linux/odp/api/abi/schedule.h | 7 + .../arch/x86_64-linux/odp/api/abi/schedule_types.h | 7 + .../arch/x86_64-linux/odp/api/abi/shared_memory.h | 2 +- .../odp/arch/x86_64-linux/odp/api/abi/spinlock.h | 7 + .../x86_64-linux/odp/api/abi/spinlock_recursive.h | 7 + .../odp/arch/x86_64-linux/odp/api/abi/std_clib.h | 7 + .../odp/arch/x86_64-linux/odp/api/abi/std_types.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/sync.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/thread.h | 7 + .../odp/arch/x86_64-linux/odp/api/abi/thrmask.h | 7 + .../odp/arch/x86_64-linux/odp/api/abi/ticketlock.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/time.h | 7 + include/odp/arch/x86_64-linux/odp/api/abi/timer.h | 7 + .../arch/x86_64-linux/odp/api/abi/traffic_mngr.h | 7 + .../odp/arch/x86_64-linux/odp/api/abi/version.h | 7 + .../include => include}/odp/visibility_begin.h | 0 .../include => include}/odp/visibility_end.h | 0 include/odp_api.h | 1 - m4/odp_check_flag.m4 | 26 + m4/odp_dpdk.m4 | 137 ++ m4/odp_pthread.m4 | 7 + platform/Makefile.inc | 11 +- platform/linux-dpdk/Makefile.am | 2 - platform/linux-dpdk/include/odp/api/align.h | 2 +- platform/linux-dpdk/include/odp/api/atomic.h | 2 +- platform/linux-dpdk/include/odp/api/barrier.h | 2 +- platform/linux-dpdk/include/odp/api/buffer.h | 2 +- platform/linux-dpdk/include/odp/api/byteorder.h | 2 +- platform/linux-dpdk/include/odp/api/chksum.h | 1 - .../linux-dpdk/include/odp/api/classification.h | 2 +- platform/linux-dpdk/include/odp/api/compiler.h | 1 - platform/linux-dpdk/include/odp/api/cpu.h | 1 - platform/linux-dpdk/include/odp/api/cpumask.h | 2 +- platform/linux-dpdk/include/odp/api/crypto.h | 2 +- platform/linux-dpdk/include/odp/api/debug.h | 2 +- platform/linux-dpdk/include/odp/api/deprecated.h | 1 - platform/linux-dpdk/include/odp/api/errno.h | 1 - platform/linux-dpdk/include/odp/api/event.h | 2 +- platform/linux-dpdk/include/odp/api/feature.h | 1 - platform/linux-dpdk/include/odp/api/hash.h | 1 - platform/linux-dpdk/include/odp/api/hints.h | 1 - platform/linux-dpdk/include/odp/api/init.h | 2 +- platform/linux-dpdk/include/odp/api/ipsec.h | 2 +- platform/linux-dpdk/include/odp/api/packet_io.h | 2 +- .../linux-dpdk/include/odp/api/packet_io_stats.h | 1 - .../linux-dpdk/include/odp/api/plat/atomic_types.h | 1 - .../include/odp/api/plat/barrier_types.h | 1 - .../include/odp/api/plat/byteorder_types.h | 1 - .../include/odp/api/plat/classification_types.h | 1 - .../include/odp/api/plat/cpumask_types.h | 1 - .../linux-dpdk/include/odp/api/plat/crypto_types.h | 1 - .../linux-dpdk/include/odp/api/plat/init_types.h | 1 - .../linux-dpdk/include/odp/api/plat/ipsec_types.h | 1 - .../include/odp/api/plat/packet_io_types.h | 1 - .../linux-dpdk/include/odp/api/plat/pool_types.h | 1 - .../linux-dpdk/include/odp/api/plat/queue_types.h | 1 - .../include/odp/api/plat/rwlock_recursive_types.h | 1 - .../linux-dpdk/include/odp/api/plat/rwlock_types.h | 1 - .../include/odp/api/plat/schedule_types.h | 1 - .../include/odp/api/plat/shared_memory_types.h | 1 - .../odp/api/plat/spinlock_recursive_types.h | 1 - .../include/odp/api/plat/spinlock_types.h | 1 - .../linux-dpdk/include/odp/api/plat/thread_types.h | 1 - .../include/odp/api/plat/thrmask_types.h | 1 - .../include/odp/api/plat/ticketlock_types.h | 1 - .../linux-dpdk/include/odp/api/plat/time_types.h | 1 - .../include/odp/api/plat/traffic_mngr_types.h | 1 - .../include/odp/api/plat/version_types.h | 1 - platform/linux-dpdk/include/odp/api/pool.h | 2 +- platform/linux-dpdk/include/odp/api/queue.h | 2 +- platform/linux-dpdk/include/odp/api/random.h | 1 - platform/linux-dpdk/include/odp/api/rwlock.h | 2 +- .../linux-dpdk/include/odp/api/rwlock_recursive.h | 2 +- platform/linux-dpdk/include/odp/api/schedule.h | 2 +- .../linux-dpdk/include/odp/api/schedule_types.h | 2 +- .../linux-dpdk/include/odp/api/shared_memory.h | 2 +- platform/linux-dpdk/include/odp/api/spinlock.h | 2 +- .../include/odp/api/spinlock_recursive.h | 2 +- platform/linux-dpdk/include/odp/api/std_types.h | 2 +- platform/linux-dpdk/include/odp/api/support.h | 1 - platform/linux-dpdk/include/odp/api/sync.h | 2 +- platform/linux-dpdk/include/odp/api/system_info.h | 1 - platform/linux-dpdk/include/odp/api/thread.h | 2 +- platform/linux-dpdk/include/odp/api/thrmask.h | 2 +- platform/linux-dpdk/include/odp/api/ticketlock.h | 2 +- platform/linux-dpdk/include/odp/api/time.h | 2 +- platform/linux-dpdk/include/odp/api/timer.h | 2 +- platform/linux-dpdk/include/odp/api/traffic_mngr.h | 2 +- platform/linux-dpdk/include/odp/api/version.h | 2 +- platform/linux-dpdk/include/odp/visibility_begin.h | 1 - platform/linux-dpdk/include/odp/visibility_end.h | 1 - platform/linux-dpdk/include/odp_buffer_inlines.h | 10 - platform/linux-dpdk/m4/configure.m4 | 2 +- platform/linux-dpdk/m4/odp_pthread.m4 | 1 - platform/linux-dpdk/odp_crypto.c | 6 +- platform/linux-generic/.gitignore | 1 - platform/linux-generic/Makefile.am | 216 ++- platform/linux-generic/_ishm.c | 22 +- .../linux-generic/arch/aarch64/odp/api/abi/cpu.h | 30 + .../linux-generic/arch/aarch64/odp/api/cpu_arch.h | 30 - platform/linux-generic/arch/aarch64/odp_cpu.h | 2 +- .../linux-generic/arch/aarch64/odp_global_time.c | 2 +- platform/linux-generic/arch/arm/odp/api/abi/cpu.h | 30 + platform/linux-generic/arch/arm/odp/api/cpu_arch.h | 30 - platform/linux-generic/arch/arm/odp_cpu.h | 2 +- platform/linux-generic/arch/arm/odp_llsc.h | 10 +- .../linux-generic/arch/default/odp/api/cpu_arch.h | 24 - platform/linux-generic/arch/default/odp_cpu_arch.c | 38 - .../linux-generic/arch/default/odp_cpu_cycles.c | 29 + .../linux-generic/arch/default/odp_global_time.c | 13 +- .../linux-generic/arch/mips64/odp/api/abi/cpu.h | 32 + .../linux-generic/arch/mips64/odp/api/cpu_arch.h | 32 - platform/linux-generic/arch/mips64/odp_cpu_arch.c | 24 - .../linux-generic/arch/mips64/odp_cpu_cycles.c | 33 + .../linux-generic/arch/odp_arch_time_internal.h | 24 + .../linux-generic/arch/powerpc/odp/api/abi/cpu.h | 8 + .../linux-generic/arch/powerpc/odp/api/cpu_arch.h | 24 - platform/linux-generic/arch/powerpc/odp_cpu_arch.c | 41 - .../linux-generic/arch/powerpc/odp_global_time.c | 15 - platform/linux-generic/arch/x86/cpu_flags.c | 4 +- platform/linux-generic/arch/x86/odp/api/abi/cpu.h | 29 + platform/linux-generic/arch/x86/odp/api/cpu_arch.h | 29 - platform/linux-generic/arch/x86/odp_cpu_arch.c | 31 - platform/linux-generic/arch/x86/odp_cpu_cycles.c | 34 + platform/linux-generic/arch/x86/odp_global_time.c | 2 +- .../linux-generic/arch/x86/odp_sysinfo_parse.c | 2 +- platform/linux-generic/buffer/generic.c | 33 +- .../linux-generic/include-abi/odp/api/abi/align.h | 7 + .../linux-generic/include-abi/odp/api/abi/atomic.h | 78 + .../include-abi/odp/api/abi/barrier.h | 38 + .../linux-generic/include-abi/odp/api/abi/buffer.h | 39 + .../include-abi/odp/api/abi/byteorder.h | 90 ++ .../include-abi/odp/api/abi/classification.h | 42 + .../include-abi/odp/api/abi/cpumask.h | 7 + .../linux-generic/include-abi/odp/api/abi/crypto.h | 38 + .../linux-generic/include-abi/odp/api/abi/debug.h | 68 + .../linux-generic/include-abi/odp/api/abi/event.h | 54 + .../linux-generic/include-abi/odp/api/abi/init.h | 7 + .../linux-generic/include-abi/odp/api/abi/ipsec.h | 39 + .../linux-generic/include-abi/odp/api/abi/packet.h | 71 + .../include-abi/odp/api/abi/packet_flags.h | 27 + .../include-abi/odp/api/abi/packet_io.h | 62 + .../linux-generic/include-abi/odp/api/abi/pool.h | 48 + .../linux-generic/include-abi/odp/api/abi/queue.h | 41 + .../linux-generic/include-abi/odp/api/abi/rwlock.h | 7 + .../include-abi/odp/api/abi/rwlock_recursive.h | 7 + .../include-abi/odp/api/abi/schedule.h | 7 + .../include-abi/odp/api/abi/schedule_types.h | 7 + .../include-abi/odp/api/abi/shared_memory.h | 43 + .../include-abi/odp/api/abi/spinlock.h | 7 + .../include-abi/odp/api/abi/spinlock_recursive.h | 7 + .../include-abi/odp/api/abi/std_clib.h | 27 + .../include-abi/odp/api/abi/std_types.h | 7 + .../linux-generic/include-abi/odp/api/abi/sync.h | 35 + .../linux-generic/include-abi/odp/api/abi/thread.h | 11 + .../include-abi/odp/api/abi/thrmask.h | 7 + .../include-abi/odp/api/abi/ticketlock.h | 45 + .../linux-generic/include-abi/odp/api/abi/time.h | 7 + .../linux-generic/include-abi/odp/api/abi/timer.h | 51 + .../include-abi/odp/api/abi/traffic_mngr.h | 7 + .../include-abi/odp/api/abi/version.h | 7 + platform/linux-generic/include/odp/api/align.h | 58 - platform/linux-generic/include/odp/api/atomic.h | 42 - platform/linux-generic/include/odp/api/barrier.h | 31 - platform/linux-generic/include/odp/api/buffer.h | 39 - platform/linux-generic/include/odp/api/byteorder.h | 43 - platform/linux-generic/include/odp/api/chksum.h | 34 - .../linux-generic/include/odp/api/classification.h | 46 - platform/linux-generic/include/odp/api/compiler.h | 34 - platform/linux-generic/include/odp/api/cpu.h | 28 - platform/linux-generic/include/odp/api/cpumask.h | 28 - platform/linux-generic/include/odp/api/crypto.h | 41 - platform/linux-generic/include/odp/api/debug.h | 77 - .../linux-generic/include/odp/api/deprecated.h | 26 - platform/linux-generic/include/odp/api/errno.h | 27 - platform/linux-generic/include/odp/api/event.h | 36 - platform/linux-generic/include/odp/api/feature.h | 34 - platform/linux-generic/include/odp/api/hash.h | 34 - platform/linux-generic/include/odp/api/hints.h | 34 - platform/linux-generic/include/odp/api/init.h | 36 - platform/linux-generic/include/odp/api/ipsec.h | 36 - platform/linux-generic/include/odp/api/packet.h | 38 - .../linux-generic/include/odp/api/packet_flags.h | 31 - platform/linux-generic/include/odp/api/packet_io.h | 41 - .../include/odp/api/packet_io_stats.h | 26 - .../include/odp/api/plat/atomic_inlines.h | 315 ++-- .../include/odp/api/plat/atomic_types.h | 90 -- .../include/odp/api/plat/barrier_types.h | 38 - .../include/odp/api/plat/buffer_types.h | 46 - .../include/odp/api/plat/byteorder_inlines.h | 46 +- .../include/odp/api/plat/byteorder_inlines_api.h | 88 ++ .../include/odp/api/plat/byteorder_types.h | 84 -- .../include/odp/api/plat/classification_types.h | 49 - .../include/odp/api/plat/cpumask_types.h | 54 - .../include/odp/api/plat/crypto_types.h | 45 - .../include/odp/api/plat/event_types.h | 62 - .../include/odp/api/plat/init_types.h | 35 - .../include/odp/api/plat/ipsec_types.h | 39 - .../include/odp/api/plat/packet_flag_inlines.h | 19 +- .../include/odp/api/plat/packet_inline_types.h | 122 ++ .../include/odp/api/plat/packet_inlines.h | 209 ++- .../include/odp/api/plat/packet_inlines_api.h | 73 + .../include/odp/api/plat/packet_io_types.h | 64 - .../include/odp/api/plat/packet_types.h | 159 -- .../include/odp/api/plat/pktio_inlines.h | 27 + .../include/odp/api/plat/pktio_inlines_api.h | 31 + .../include/odp/api/plat/pool_inline_types.h | 37 + .../include/odp/api/plat/pool_types.h | 55 - .../include/odp/api/plat/queue_types.h | 48 - .../include/odp/api/plat/rwlock_recursive_types.h | 38 - .../include/odp/api/plat/rwlock_types.h | 39 - .../include/odp/api/plat/schedule_types.h | 64 - .../include/odp/api/plat/shared_memory_types.h | 50 - .../odp/api/plat/spinlock_recursive_types.h | 36 - .../include/odp/api/plat/spinlock_types.h | 34 - .../include/odp/api/plat/static_inline.h.in | 43 - .../include/odp/api/plat/std_clib_inlines.h | 1 - .../include/odp/api/plat/strong_types.h | 2 + .../include/odp/api/plat/thread_inlines.h | 46 + .../include/odp/api/plat/thread_inlines_api.h | 41 + .../include/odp/api/plat/thread_types.h | 34 - .../include/odp/api/plat/thrmask_types.h | 48 - .../include/odp/api/plat/ticketlock_inlines.h | 20 - .../include/odp/api/plat/ticketlock_inlines_api.h | 6 + .../include/odp/api/plat/ticketlock_types.h | 35 - .../include/odp/api/plat/time_types.h | 53 - .../include/odp/api/plat/timer_types.h | 51 - .../include/odp/api/plat/traffic_mngr_types.h | 185 --- .../include/odp/api/plat/version_types.h | 30 - platform/linux-generic/include/odp/api/pool.h | 37 - platform/linux-generic/include/odp/api/queue.h | 44 - platform/linux-generic/include/odp/api/random.h | 34 - platform/linux-generic/include/odp/api/rwlock.h | 28 - .../include/odp/api/rwlock_recursive.h | 28 - platform/linux-generic/include/odp/api/schedule.h | 36 - .../linux-generic/include/odp/api/schedule_types.h | 28 - .../linux-generic/include/odp/api/shared_memory.h | 36 - platform/linux-generic/include/odp/api/spinlock.h | 28 - .../include/odp/api/spinlock_recursive.h | 28 - platform/linux-generic/include/odp/api/std_clib.h | 28 - platform/linux-generic/include/odp/api/std_types.h | 42 - platform/linux-generic/include/odp/api/support.h | 34 - platform/linux-generic/include/odp/api/sync.h | 39 - .../linux-generic/include/odp/api/system_info.h | 29 - platform/linux-generic/include/odp/api/thread.h | 28 - platform/linux-generic/include/odp/api/thrmask.h | 36 - .../linux-generic/include/odp/api/ticketlock.h | 32 - platform/linux-generic/include/odp/api/time.h | 31 - platform/linux-generic/include/odp/api/timer.h | 40 - .../linux-generic/include/odp/api/traffic_mngr.h | 35 - platform/linux-generic/include/odp/api/version.h | 27 - platform/linux-generic/include/odp/drv/align.h | 2 +- .../linux-generic/include/odp_atomic_internal.h | 217 ++- .../linux-generic/include/odp_buffer_inlines.h | 2 - .../linux-generic/include/odp_buffer_internal.h | 14 +- .../include/odp_classification_inlines.h | 31 +- .../linux-generic/include/odp_config_internal.h | 16 +- .../linux-generic/include/odp_crypto_internal.h | 71 - platform/linux-generic/include/odp_internal.h | 2 + .../linux-generic/include/odp_ipsec_internal.h | 108 +- .../linux-generic/include/odp_packet_internal.h | 48 +- .../linux-generic/include/odp_packet_io_internal.h | 39 +- .../include/odp_packet_io_ring_internal.h | 10 +- .../linux-generic/include/odp_pktio_ops_loopback.h | 1 + .../linux-generic/include/odp_pktio_ops_netmap.h | 6 +- .../linux-generic/include/odp_pktio_ops_null.h | 18 + .../linux-generic/include/odp_pktio_ops_socket.h | 19 +- .../include/odp_pktio_ops_subsystem.h | 11 + platform/linux-generic/include/odp_pool_internal.h | 63 +- .../linux-generic/include/odp_queue_internal.h | 5 +- .../include/odp_queue_scalable_internal.h | 5 +- platform/linux-generic/include/odp_ring_internal.h | 4 +- platform/linux-generic/include/odp_schedule_if.h | 16 +- .../linux-generic/include/odp_schedule_scalable.h | 24 +- .../include/odp_schedule_scalable_ordered.h | 8 +- platform/linux-generic/include/odp_time_internal.h | 24 - platform/linux-generic/include/protocols/ip.h | 6 +- platform/linux-generic/include/protocols/thash.h | 8 +- platform/linux-generic/include/protocols/udp.h | 2 + platform/linux-generic/libodp-linux.pc.in | 4 +- platform/linux-generic/m4/configure.m4 | 3 +- platform/linux-generic/m4/odp_dpdk.m4 | 45 +- platform/linux-generic/m4/odp_pthread.m4 | 8 - platform/linux-generic/odp_atomic.c | 3 - platform/linux-generic/odp_atomic_api.c | 13 + platform/linux-generic/odp_byteorder.c | 6 +- platform/linux-generic/odp_classification.c | 68 +- platform/linux-generic/odp_crypto.c | 573 +++++-- platform/linux-generic/odp_event.c | 43 +- platform/linux-generic/odp_init.c | 13 + platform/linux-generic/odp_ipsec.c | 1564 +++++++++++++------- platform/linux-generic/odp_ipsec_sad.c | 333 ++++- platform/linux-generic/odp_name_table.c | 8 +- platform/linux-generic/odp_packet.c | 450 +++--- platform/linux-generic/odp_packet_api.c | 28 + platform/linux-generic/odp_packet_flags.c | 27 +- platform/linux-generic/odp_packet_flags_api.c | 15 + platform/linux-generic/odp_packet_io.c | 121 +- platform/linux-generic/odp_pkt_queue.c | 9 +- platform/linux-generic/odp_pktio_api.c | 14 + platform/linux-generic/odp_queue_if.c | 2 +- platform/linux-generic/odp_queue_scalable.c | 1010 +++++++++++++ platform/linux-generic/odp_rwlock_recursive.c | 11 +- platform/linux-generic/odp_spinlock_recursive.c | 7 +- platform/linux-generic/odp_std_clib.c | 5 +- platform/linux-generic/odp_sync.c | 5 +- platform/linux-generic/odp_thread.c | 36 +- platform/linux-generic/odp_thread_api.c | 15 + platform/linux-generic/odp_ticketlock.c | 12 +- platform/linux-generic/odp_time.c | 11 +- platform/linux-generic/odp_timer.c | 15 +- platform/linux-generic/odp_traffic_mngr.c | 48 +- platform/linux-generic/pktio/common.c | 173 ++- platform/linux-generic/pktio/common.h | 21 +- platform/linux-generic/pktio/dpdk.c | 272 +++- platform/linux-generic/pktio/dpdk.h | 25 +- platform/linux-generic/pktio/ethtool.c | 1 + platform/linux-generic/pktio/ipc.c | 39 +- platform/linux-generic/pktio/loopback.c | 91 +- platform/linux-generic/pktio/netmap.c | 161 +- platform/linux-generic/pktio/null.c | 214 +++ platform/linux-generic/pktio/pcap.c | 15 +- platform/linux-generic/pktio/socket.c | 113 +- platform/linux-generic/pktio/socket_mmap.c | 255 +++- platform/linux-generic/pktio/subsystem.c | 2 + platform/linux-generic/pktio/tap.c | 19 +- platform/linux-generic/pool/generic.c | 137 +- platform/linux-generic/queue/generic.c | 9 +- platform/linux-generic/queue/scalable.c | 8 +- platform/linux-generic/schedule/generic.c | 19 +- platform/linux-generic/schedule/iquery.c | 14 +- platform/linux-generic/schedule/scalable.c | 2 +- platform/linux-generic/schedule/sp.c | 12 +- platform/linux-generic/test/.gitignore | 3 +- platform/linux-generic/test/Makefile.am | 3 +- platform/linux-generic/test/Makefile.inc | 22 - .../linux-generic/test/mmap_vlan_ins/pktio_env | 3 - platform/linux-generic/test/ring/Makefile.am | 33 +- .../linux-generic/test/validation/Makefile.inc | 1 - .../linux-generic/test/validation/api/Makefile.inc | 2 +- .../test/validation/api/shmem/Makefile.am | 9 +- .../test/validation/api/shmem/shmem_odp1.c | 10 +- platform/linux-generic/test/wrapper-script.sh | 3 - scripts/Dockerfile | 3 +- scripts/builddeb | 37 - scripts/checkpatch.pl | 1 + scripts/devbuild.sh | 77 - scripts/git-transplant.py | 94 -- test/Makefile.am | 2 +- test/Makefile.inc | 44 +- test/common/Makefile.am | 2 +- test/common/odp_cunit_common.c | 27 +- test/common/odp_cunit_common.h | 3 +- test/common/test_packet_parser.h | 175 +++ test/m4/configure.m4 | 1 + test/m4/miscellaneous.m4 | 18 +- test/performance/Makefile.am | 5 +- test/performance/odp_crypto.c | 73 +- test/performance/odp_l2fwd.c | 172 ++- test/performance/odp_l2fwd_run.sh | 6 +- test/performance/odp_pktio_ordered.c | 6 +- test/performance/odp_pktio_perf.c | 2 +- test/performance/odp_sched_latency.c | 4 +- test/performance/odp_scheduling.c | 4 +- test/validation/Makefile.am | 8 +- test/validation/Makefile.inc | 16 - test/validation/api/Makefile.am | 4 +- test/validation/api/Makefile.inc | 7 +- test/validation/api/atomic/Makefile.am | 1 - test/validation/api/barrier/Makefile.am | 1 - test/validation/api/buffer/Makefile.am | 1 - test/validation/api/chksum/Makefile.am | 3 +- test/validation/api/chksum/chksum.c | 6 +- test/validation/api/classification/Makefile.am | 1 - test/validation/api/cpumask/Makefile.am | 2 +- test/validation/api/crypto/Makefile.am | 1 - test/validation/api/crypto/crypto.h | 6 + test/validation/api/crypto/odp_crypto_test_inp.c | 840 ++++++----- test/validation/api/crypto/test_vectors.h | 365 ++++- test/validation/api/crypto/test_vectors_len.h | 18 +- test/validation/api/errno/Makefile.am | 1 - test/validation/api/event/.gitignore | 1 + test/validation/api/event/Makefile.am | 4 + test/validation/api/event/event.c | 417 ++++++ test/validation/api/event/event.h | 12 + test/validation/api/event/event_main.c | 13 + test/validation/api/hash/Makefile.am | 1 - test/validation/api/init/Makefile.am | 3 - test/validation/api/ipsec/Makefile.am | 13 +- test/validation/api/ipsec/ipsec.c | 85 +- test/validation/api/ipsec/ipsec.h | 6 + test/validation/api/ipsec/ipsec_sync_in.c | 27 - test/validation/api/ipsec/ipsec_test_in.c | 1115 +++++++++++--- test/validation/api/ipsec/ipsec_test_out.c | 770 +++++++++- test/validation/api/ipsec/test_vectors.h | 1094 ++++++++++++-- test/validation/api/lock/Makefile.am | 1 - test/validation/api/packet/Makefile.am | 1 - test/validation/api/packet/packet.c | 303 +++- test/validation/api/packet/packet.h | 2 + test/validation/api/pktio/Makefile.am | 1 - test/validation/api/pktio/parser.c | 3 +- test/validation/api/pktio/parser.h | 149 -- test/validation/api/pktio/pktio.c | 85 +- test/validation/api/pool/Makefile.am | 1 - test/validation/api/pool/pool.c | 213 ++- test/validation/api/pool/pool.h | 4 +- test/validation/api/queue/Makefile.am | 1 - test/validation/api/queue/queue.c | 3 + test/validation/api/random/Makefile.am | 1 - test/validation/api/scheduler/Makefile.am | 1 - test/validation/api/shmem/Makefile.am | 1 - test/validation/api/shmem/shmem.c | 39 +- test/validation/api/std_clib/Makefile.am | 1 - test/validation/api/system/Makefile.am | 1 - test/validation/api/thread/Makefile.am | 2 +- test/validation/api/time/Makefile.am | 11 - test/validation/api/time/time.c | 38 +- test/validation/api/time/time.sh | 42 - test/validation/api/timer/Makefile.am | 1 - test/validation/api/traffic_mngr/Makefile.am | 2 +- test/validation/drv/Makefile.inc | 4 +- 854 files changed, 25290 insertions(+), 9403 deletions(-) create mode 100644 Makefile.inc delete mode 120000 README.DPDK create mode 100644 doc/.gitignore create mode 100644 doc/images/ipsec-inline.svg create mode 100644 doc/images/ipsec-lookaside.svg create mode 100644 doc/images/ipsec_sa_states.msc create mode 100644 doc/users-guide/users-guide-ipsec.adoc create mode 100755 example/generator/generator_run.sh delete mode 100644 example/ipsec/odp_ipsec_loop_db.c delete mode 100644 example/ipsec/odp_ipsec_loop_db.h create mode 100644 example/ipsec_api/.gitignore create mode 100644 example/ipsec_api/Makefile.am create mode 100644 example/ipsec_api/odp_ipsec.c create mode 100755 example/ipsec_api/odp_ipsec_api_run_ah_in.sh create mode 100755 example/ipsec_api/odp_ipsec_api_run_ah_out.sh create mode 100755 example/ipsec_api/odp_ipsec_api_run_ah_tun_in.sh create mode 100755 example/ipsec_api/odp_ipsec_api_run_ah_tun_out.sh create mode 100755 example/ipsec_api/odp_ipsec_api_run_esp_in.sh create mode 100755 example/ipsec_api/odp_ipsec_api_run_esp_out.sh create mode 100755 example/ipsec_api/odp_ipsec_api_run_esp_tun_in.sh create mode 100755 example/ipsec_api/odp_ipsec_api_run_esp_tun_out.sh create mode 100755 example/ipsec_api/odp_ipsec_api_run_live.sh create mode 100755 example/ipsec_api/odp_ipsec_api_run_router.sh create mode 100755 example/ipsec_api/odp_ipsec_api_run_simple.sh create mode 100644 example/ipsec_api/odp_ipsec_cache.c create mode 100644 example/ipsec_api/odp_ipsec_cache.h create mode 120000 example/ipsec_api/odp_ipsec_fwd_db.c create mode 120000 example/ipsec_api/odp_ipsec_fwd_db.h create mode 120000 example/ipsec_api/odp_ipsec_misc.h create mode 120000 example/ipsec_api/odp_ipsec_sa_db.c create mode 120000 example/ipsec_api/odp_ipsec_sa_db.h create mode 120000 example/ipsec_api/odp_ipsec_sp_db.c create mode 120000 example/ipsec_api/odp_ipsec_sp_db.h create mode 120000 example/ipsec_api/odp_ipsec_stream.c create mode 120000 example/ipsec_api/odp_ipsec_stream.h create mode 100644 example/ipsec_offload/.gitignore create mode 100644 example/ipsec_offload/Makefile.am create mode 100644 example/ipsec_offload/odp_ipsec_offload.c create mode 100644 example/ipsec_offload/odp_ipsec_offload_cache.c create mode 100644 example/ipsec_offload/odp_ipsec_offload_cache.h create mode 100644 example/ipsec_offload/odp_ipsec_offload_fwd_db.c create mode 100644 example/ipsec_offload/odp_ipsec_offload_fwd_db.h create mode 100644 example/ipsec_offload/odp_ipsec_offload_misc.h create mode 100644 example/ipsec_offload/odp_ipsec_offload_sa_db.c create mode 100644 example/ipsec_offload/odp_ipsec_offload_sa_db.h create mode 100644 example/ipsec_offload/odp_ipsec_offload_sp_db.c create mode 100644 example/ipsec_offload/odp_ipsec_offload_sp_db.h create mode 100755 example/ipsec_offload/run_left.sh create mode 100755 example/ipsec_offload/run_right.sh create mode 100644 include/README create mode 100644 include/odp/api/abi-default/align.h create mode 100644 include/odp/api/abi-default/atomic.h create mode 100644 include/odp/api/abi-default/barrier.h create mode 100644 include/odp/api/abi-default/buffer.h create mode 100644 include/odp/api/abi-default/byteorder.h rename include/odp/{arch/default/api/abi => api/abi-default}/classification.h (100%) create mode 100644 include/odp/api/abi-default/cpu.h create mode 100644 include/odp/api/abi-default/cpumask.h rename include/odp/{arch/default/api/abi => api/abi-default}/crypto.h (100%) create mode 100644 include/odp/api/abi-default/debug.h create mode 100644 include/odp/api/abi-default/event.h create mode 100644 include/odp/api/abi-default/init.h create mode 100644 include/odp/api/abi-default/ipsec.h create mode 100644 include/odp/api/abi-default/packet.h create mode 100644 include/odp/api/abi-default/packet_flags.h create mode 100644 include/odp/api/abi-default/packet_io.h rename include/odp/{arch/default/api/abi => api/abi-default}/pool.h (100%) rename include/odp/{arch/default/api/abi => api/abi-default}/queue.h (100%) create mode 100644 include/odp/api/abi-default/rwlock.h create mode 100644 include/odp/api/abi-default/rwlock_recursive.h create mode 100644 include/odp/api/abi-default/schedule.h create mode 100644 include/odp/api/abi-default/schedule_types.h rename include/odp/{arch/default/api/abi => api/abi-default}/shared_memory.h (100%) create mode 100644 include/odp/api/abi-default/spinlock.h create mode 100644 include/odp/api/abi-default/spinlock_recursive.h create mode 100644 include/odp/api/abi-default/std_clib.h create mode 100644 include/odp/api/abi-default/std_types.h create mode 100644 include/odp/api/abi-default/sync.h create mode 100644 include/odp/api/abi-default/thread.h create mode 100644 include/odp/api/abi-default/thrmask.h create mode 100644 include/odp/api/abi-default/ticketlock.h create mode 100644 include/odp/api/abi-default/time.h create mode 100644 include/odp/api/abi-default/timer.h create mode 100644 include/odp/api/abi-default/traffic_mngr.h create mode 100644 include/odp/api/abi-default/version.h create mode 100644 include/odp/api/align.h create mode 100644 include/odp/api/atomic.h create mode 100644 include/odp/api/barrier.h create mode 100644 include/odp/api/buffer.h create mode 100644 include/odp/api/byteorder.h create mode 100644 include/odp/api/chksum.h create mode 100644 include/odp/api/classification.h create mode 100644 include/odp/api/cpu.h create mode 100644 include/odp/api/cpumask.h create mode 100644 include/odp/api/crypto.h create mode 100644 include/odp/api/debug.h create mode 100644 include/odp/api/deprecated.h create mode 100644 include/odp/api/errno.h create mode 100644 include/odp/api/event.h create mode 100644 include/odp/api/feature.h create mode 100644 include/odp/api/hash.h create mode 100644 include/odp/api/hints.h create mode 100644 include/odp/api/init.h create mode 100644 include/odp/api/ipsec.h create mode 100644 include/odp/api/packet.h create mode 100644 include/odp/api/packet_flags.h create mode 100644 include/odp/api/packet_io.h create mode 100644 include/odp/api/packet_io_stats.h create mode 100644 include/odp/api/pool.h create mode 100644 include/odp/api/queue.h create mode 100644 include/odp/api/random.h create mode 100644 include/odp/api/rwlock.h create mode 100644 include/odp/api/rwlock_recursive.h create mode 100644 include/odp/api/schedule.h create mode 100644 include/odp/api/schedule_types.h create mode 100644 include/odp/api/shared_memory.h delete mode 100644 include/odp/api/spec/compiler.h create mode 100644 include/odp/api/spec/thread_types.h create mode 100644 include/odp/api/spec/threshold.h create mode 100644 include/odp/api/spinlock.h create mode 100644 include/odp/api/spinlock_recursive.h create mode 100644 include/odp/api/std_clib.h create mode 100644 include/odp/api/std_types.h create mode 100644 include/odp/api/support.h create mode 100644 include/odp/api/sync.h create mode 100644 include/odp/api/system_info.h create mode 100644 include/odp/api/thread.h create mode 100644 include/odp/api/threshold.h create mode 100644 include/odp/api/thrmask.h create mode 100644 include/odp/api/ticketlock.h create mode 100644 include/odp/api/time.h create mode 100644 include/odp/api/timer.h create mode 100644 include/odp/api/traffic_mngr.h create mode 100644 include/odp/api/version.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/align.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/atomic.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/barrier.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/byteorder.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/cpu.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/cpumask.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/debug.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/init.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/ipsec.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/packet_flags.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/packet_io.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/rwlock.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/rwlock_recursive.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/schedule.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/schedule_types.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/spinlock.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/spinlock_recursive.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/std_clib.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/std_types.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/sync.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/thread.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/thrmask.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/ticketlock.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/time.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/timer.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/traffic_mngr.h create mode 100644 include/odp/arch/arm32-linux/odp/api/abi/version.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/align.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/atomic.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/barrier.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/byteorder.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/cpu.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/cpumask.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/debug.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/init.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/ipsec.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/packet_flags.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/packet_io.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/rwlock.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/rwlock_recursive.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/schedule.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/schedule_types.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/spinlock.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/spinlock_recursive.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/std_clib.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/std_types.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/sync.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/thread.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/thrmask.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/ticketlock.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/time.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/timer.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/traffic_mngr.h create mode 100644 include/odp/arch/arm64-linux/odp/api/abi/version.h delete mode 100644 include/odp/arch/default/api/abi/buffer.h delete mode 100644 include/odp/arch/default/api/abi/event.h delete mode 100644 include/odp/arch/default/api/abi/packet.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/align.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/atomic.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/barrier.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/byteorder.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/cpu.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/cpumask.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/debug.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/init.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/ipsec.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/packet_flags.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/packet_io.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/rwlock.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/rwlock_recursive.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/schedule.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/schedule_types.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/spinlock.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/spinlock_recursive.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/std_clib.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/std_types.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/sync.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/thread.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/thrmask.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/ticketlock.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/time.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/timer.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/traffic_mngr.h create mode 100644 include/odp/arch/mips64-linux/odp/api/abi/version.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/align.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/atomic.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/barrier.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/byteorder.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/cpu.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/cpumask.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/debug.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/init.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/ipsec.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/packet_flags.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/packet_io.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/rwlock.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/rwlock_recursive.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/schedule.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/schedule_types.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/spinlock.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/spinlock_recursive.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/std_clib.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/std_types.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/sync.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/thread.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/thrmask.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/ticketlock.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/time.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/timer.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/traffic_mngr.h create mode 100644 include/odp/arch/power64-linux/odp/api/abi/version.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/align.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/atomic.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/barrier.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/byteorder.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/cpu.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/cpumask.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/debug.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/init.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/ipsec.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/packet_flags.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/packet_io.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/rwlock.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/rwlock_recursive.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/schedule.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/schedule_types.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/spinlock.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/spinlock_recursive.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/std_clib.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/std_types.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/sync.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/thread.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/thrmask.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/ticketlock.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/time.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/timer.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/traffic_mngr.h create mode 100644 include/odp/arch/x86_32-linux/odp/api/abi/version.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/align.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/atomic.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/barrier.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/byteorder.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/cpu.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/cpumask.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/debug.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/init.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/ipsec.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/packet_flags.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/packet_io.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/rwlock.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/rwlock_recursive.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/schedule.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/schedule_types.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/spinlock.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/spinlock_recursive.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/std_clib.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/std_types.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/sync.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/thread.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/thrmask.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/ticketlock.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/time.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/timer.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/traffic_mngr.h create mode 100644 include/odp/arch/x86_64-linux/odp/api/abi/version.h rename {platform/linux-generic/include => include}/odp/visibility_begin.h (100%) rename {platform/linux-generic/include => include}/odp/visibility_end.h (100%) create mode 100644 m4/odp_check_flag.m4 create mode 100644 m4/odp_dpdk.m4 create mode 100644 m4/odp_pthread.m4 delete mode 120000 platform/linux-dpdk/include/odp/api/chksum.h delete mode 120000 platform/linux-dpdk/include/odp/api/compiler.h delete mode 120000 platform/linux-dpdk/include/odp/api/cpu.h delete mode 120000 platform/linux-dpdk/include/odp/api/deprecated.h delete mode 120000 platform/linux-dpdk/include/odp/api/errno.h delete mode 120000 platform/linux-dpdk/include/odp/api/feature.h delete mode 120000 platform/linux-dpdk/include/odp/api/hash.h delete mode 120000 platform/linux-dpdk/include/odp/api/hints.h delete mode 120000 platform/linux-dpdk/include/odp/api/packet_io_stats.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/atomic_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/barrier_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/byteorder_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/classification_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/cpumask_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/crypto_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/init_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/ipsec_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/packet_io_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/pool_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/queue_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/rwlock_recursive_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/rwlock_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/schedule_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/shared_memory_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/spinlock_recursive_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/spinlock_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/thread_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/thrmask_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/ticketlock_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/time_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/traffic_mngr_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/plat/version_types.h delete mode 120000 platform/linux-dpdk/include/odp/api/random.h delete mode 120000 platform/linux-dpdk/include/odp/api/support.h delete mode 120000 platform/linux-dpdk/include/odp/api/system_info.h delete mode 120000 platform/linux-dpdk/include/odp/visibility_begin.h delete mode 120000 platform/linux-dpdk/include/odp/visibility_end.h delete mode 120000 platform/linux-dpdk/m4/odp_pthread.m4 create mode 100644 platform/linux-generic/arch/aarch64/odp/api/abi/cpu.h delete mode 100644 platform/linux-generic/arch/aarch64/odp/api/cpu_arch.h create mode 100644 platform/linux-generic/arch/arm/odp/api/abi/cpu.h delete mode 100644 platform/linux-generic/arch/arm/odp/api/cpu_arch.h delete mode 100644 platform/linux-generic/arch/default/odp/api/cpu_arch.h delete mode 100644 platform/linux-generic/arch/default/odp_cpu_arch.c create mode 100644 platform/linux-generic/arch/mips64/odp/api/abi/cpu.h delete mode 100644 platform/linux-generic/arch/mips64/odp/api/cpu_arch.h delete mode 100644 platform/linux-generic/arch/mips64/odp_cpu_arch.c create mode 100644 platform/linux-generic/arch/mips64/odp_cpu_cycles.c create mode 100644 platform/linux-generic/arch/odp_arch_time_internal.h create mode 100644 platform/linux-generic/arch/powerpc/odp/api/abi/cpu.h delete mode 100644 platform/linux-generic/arch/powerpc/odp/api/cpu_arch.h delete mode 100644 platform/linux-generic/arch/powerpc/odp_cpu_arch.c delete mode 100644 platform/linux-generic/arch/powerpc/odp_global_time.c create mode 100644 platform/linux-generic/arch/x86/odp/api/abi/cpu.h delete mode 100644 platform/linux-generic/arch/x86/odp/api/cpu_arch.h delete mode 100644 platform/linux-generic/arch/x86/odp_cpu_arch.c create mode 100644 platform/linux-generic/arch/x86/odp_cpu_cycles.c create mode 100644 platform/linux-generic/include-abi/odp/api/abi/align.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/atomic.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/barrier.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/buffer.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/byteorder.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/classification.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/cpumask.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/crypto.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/debug.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/event.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/init.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/ipsec.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/packet.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/packet_flags.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/packet_io.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/pool.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/queue.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/rwlock.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/rwlock_recursive.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/schedule.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/schedule_types.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/shared_memory.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/spinlock.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/spinlock_recursive.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/std_clib.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/std_types.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/sync.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/thread.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/thrmask.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/ticketlock.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/time.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/timer.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/traffic_mngr.h create mode 100644 platform/linux-generic/include-abi/odp/api/abi/version.h delete mode 100644 platform/linux-generic/include/odp/api/align.h delete mode 100644 platform/linux-generic/include/odp/api/atomic.h delete mode 100644 platform/linux-generic/include/odp/api/barrier.h delete mode 100644 platform/linux-generic/include/odp/api/buffer.h delete mode 100644 platform/linux-generic/include/odp/api/byteorder.h delete mode 100644 platform/linux-generic/include/odp/api/chksum.h delete mode 100644 platform/linux-generic/include/odp/api/classification.h delete mode 100644 platform/linux-generic/include/odp/api/compiler.h delete mode 100644 platform/linux-generic/include/odp/api/cpu.h delete mode 100644 platform/linux-generic/include/odp/api/cpumask.h delete mode 100644 platform/linux-generic/include/odp/api/crypto.h delete mode 100644 platform/linux-generic/include/odp/api/debug.h delete mode 100644 platform/linux-generic/include/odp/api/deprecated.h delete mode 100644 platform/linux-generic/include/odp/api/errno.h delete mode 100644 platform/linux-generic/include/odp/api/event.h delete mode 100644 platform/linux-generic/include/odp/api/feature.h delete mode 100644 platform/linux-generic/include/odp/api/hash.h delete mode 100644 platform/linux-generic/include/odp/api/hints.h delete mode 100644 platform/linux-generic/include/odp/api/init.h delete mode 100644 platform/linux-generic/include/odp/api/ipsec.h delete mode 100644 platform/linux-generic/include/odp/api/packet.h delete mode 100644 platform/linux-generic/include/odp/api/packet_flags.h delete mode 100644 platform/linux-generic/include/odp/api/packet_io.h delete mode 100644 platform/linux-generic/include/odp/api/packet_io_stats.h delete mode 100644 platform/linux-generic/include/odp/api/plat/atomic_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/barrier_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/buffer_types.h create mode 100644 platform/linux-generic/include/odp/api/plat/byteorder_inlines_api.h delete mode 100644 platform/linux-generic/include/odp/api/plat/byteorder_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/classification_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/cpumask_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/crypto_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/event_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/init_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/ipsec_types.h create mode 100644 platform/linux-generic/include/odp/api/plat/packet_inline_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/packet_io_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/packet_types.h create mode 100644 platform/linux-generic/include/odp/api/plat/pktio_inlines.h create mode 100644 platform/linux-generic/include/odp/api/plat/pktio_inlines_api.h create mode 100644 platform/linux-generic/include/odp/api/plat/pool_inline_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/pool_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/queue_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/rwlock_recursive_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/rwlock_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/schedule_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/shared_memory_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/spinlock_recursive_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/spinlock_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/static_inline.h.in create mode 100644 platform/linux-generic/include/odp/api/plat/thread_inlines.h create mode 100644 platform/linux-generic/include/odp/api/plat/thread_inlines_api.h delete mode 100644 platform/linux-generic/include/odp/api/plat/thread_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/thrmask_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/ticketlock_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/time_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/timer_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/traffic_mngr_types.h delete mode 100644 platform/linux-generic/include/odp/api/plat/version_types.h delete mode 100644 platform/linux-generic/include/odp/api/pool.h delete mode 100644 platform/linux-generic/include/odp/api/queue.h delete mode 100644 platform/linux-generic/include/odp/api/random.h delete mode 100644 platform/linux-generic/include/odp/api/rwlock.h delete mode 100644 platform/linux-generic/include/odp/api/rwlock_recursive.h delete mode 100644 platform/linux-generic/include/odp/api/schedule.h delete mode 100644 platform/linux-generic/include/odp/api/schedule_types.h delete mode 100644 platform/linux-generic/include/odp/api/shared_memory.h delete mode 100644 platform/linux-generic/include/odp/api/spinlock.h delete mode 100644 platform/linux-generic/include/odp/api/spinlock_recursive.h delete mode 100644 platform/linux-generic/include/odp/api/std_clib.h delete mode 100644 platform/linux-generic/include/odp/api/std_types.h delete mode 100644 platform/linux-generic/include/odp/api/support.h delete mode 100644 platform/linux-generic/include/odp/api/sync.h delete mode 100644 platform/linux-generic/include/odp/api/system_info.h delete mode 100644 platform/linux-generic/include/odp/api/thread.h delete mode 100644 platform/linux-generic/include/odp/api/thrmask.h delete mode 100644 platform/linux-generic/include/odp/api/ticketlock.h delete mode 100644 platform/linux-generic/include/odp/api/time.h delete mode 100644 platform/linux-generic/include/odp/api/timer.h delete mode 100644 platform/linux-generic/include/odp/api/traffic_mngr.h delete mode 100644 platform/linux-generic/include/odp/api/version.h delete mode 100644 platform/linux-generic/include/odp_crypto_internal.h create mode 100644 platform/linux-generic/include/odp_pktio_ops_null.h delete mode 100644 platform/linux-generic/include/odp_time_internal.h delete mode 100644 platform/linux-generic/m4/odp_pthread.m4 create mode 100644 platform/linux-generic/odp_atomic_api.c create mode 100644 platform/linux-generic/odp_packet_api.c create mode 100644 platform/linux-generic/odp_packet_flags_api.c create mode 100644 platform/linux-generic/odp_pktio_api.c create mode 100644 platform/linux-generic/odp_queue_scalable.c create mode 100644 platform/linux-generic/odp_thread_api.c create mode 100644 platform/linux-generic/pktio/null.c delete mode 100644 platform/linux-generic/test/Makefile.inc delete mode 100644 platform/linux-generic/test/validation/Makefile.inc delete mode 100755 platform/linux-generic/test/wrapper-script.sh delete mode 100755 scripts/builddeb delete mode 100755 scripts/devbuild.sh delete mode 100755 scripts/git-transplant.py create mode 100644 test/common/test_packet_parser.h delete mode 100644 test/validation/Makefile.inc create mode 100644 test/validation/api/event/.gitignore create mode 100644 test/validation/api/event/Makefile.am create mode 100644 test/validation/api/event/event.c create mode 100644 test/validation/api/event/event.h create mode 100644 test/validation/api/event/event_main.c delete mode 100644 test/validation/api/ipsec/ipsec_sync_in.c delete mode 100755 test/validation/api/time/time.sh
hooks/post-receive