test_cmrpc.cpp 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. /*********************************************************************
  2. * _ _ _
  3. * _ __ | |_ _ | | __ _ | |__ ___
  4. * | '__|| __|(_)| | / _` || '_ \ / __|
  5. * | | | |_ _ | || (_| || |_) |\__ \
  6. * |_| \__|(_)|_| \__,_||_.__/ |___/
  7. *
  8. * www.rt-labs.com
  9. * Copyright 2018 rt-labs AB, Sweden.
  10. *
  11. * This software is dual-licensed under GPLv3 and a commercial
  12. * license. See the file LICENSE.md distributed with this software for
  13. * full license information.
  14. ********************************************************************/
  15. /**
  16. * @file
  17. * @brief Integration testing of CMRPC.
  18. *
  19. * For example
  20. * Connect
  21. * Read IM0
  22. * Release connection
  23. * Timeout in CPM
  24. * Fragmented connect
  25. * ConnectReleaseIOSAR_DA ?
  26. */
  27. #include "utils_for_testing.h"
  28. #include "mocks.h"
  29. #include "pf_includes.h"
  30. #include <gtest/gtest.h>
  31. class CmrpcUnitTest : public PnetUnitTest
  32. {
  33. };
  34. class CmrpcTest : public PnetIntegrationTest
  35. {
  36. };
  37. // clang-format off
  38. /**
  39. * Connect request data
  40. * This is UDP payload, so the first 42 bytes (in dec) have been removed from
  41. * the Wireshark output.
  42. */
  43. static uint8_t connect_req[] =
  44. {
  45. 0x04, 0x00, 0x28, 0x00, 0x10, 0x00,
  46. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  47. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  48. 0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  49. 0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  50. 0xff, 0xff, 0xff, 0xff, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x72, 0x01,
  51. 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, 0x01, 0x01,
  52. 0x00, 0x42, 0x01, 0x00, 0x00, 0x01, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  53. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0xc8, 0x5b, 0x76, 0xe6, 0x89, 0xdf, 0xde, 0xa0,
  54. 0x00, 0x00, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x01, 0x40, 0x00,
  55. 0x00, 0x11, 0x02, 0x58, 0x88, 0x92, 0x00, 0x0c, 0x72, 0x74, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2d,
  56. 0x64, 0x65, 0x6d, 0x6f, 0x01, 0x02, 0x00, 0x50, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x88, 0x92,
  57. 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0x80, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
  58. 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  59. 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  60. 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03,
  61. 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x01, 0x02, 0x00, 0x50, 0x01, 0x00, 0x00, 0x02,
  62. 0x00, 0x02, 0x88, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0x80, 0x00, 0x00, 0x20, 0x00, 0x01,
  63. 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00,
  64. 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
  65. 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01,
  66. 0x00, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x01, 0x04, 0x00, 0x3c,
  67. 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  68. 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
  69. 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x80, 0x01,
  70. 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x04, 0x00, 0x26,
  71. 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00,
  72. 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,
  73. 0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x16, 0x01, 0x00, 0x00, 0x01, 0x88, 0x92,
  74. 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0xc8, 0xc0, 0x00, 0xa0, 0x00
  75. };
  76. static uint8_t release_req[] =
  77. {
  78. 0x04, 0x00, 0x28, 0x00, 0x10, 0x00,
  79. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  80. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  81. 0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  82. 0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00,
  83. 0xff, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x20, 0x00,
  84. 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x14,
  85. 0x00, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  86. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00
  87. };
  88. static uint8_t prm_end_req[] =
  89. {
  90. 0x04, 0x00, 0x28, 0x00, 0x10, 0x00,
  91. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  92. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  93. 0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  94. 0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00,
  95. 0xff, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x20, 0x00,
  96. 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x10,
  97. 0x00, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  98. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00
  99. };
  100. static uint8_t appl_rdy_rsp[] =
  101. {
  102. 0x04, 0x02, 0x0a, 0x00, 0x10, 0x00,
  103. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x00, 0xbe, 0xef,
  104. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  105. 0xdf, 0x7d, 0x79, 0x56, 0x34, 0x12, 0x34, 0x12, 0x78, 0x56, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
  106. 0x07, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
  107. 0xff, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
  108. 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x12,
  109. 0x00, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  110. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00
  111. };
  112. static uint8_t write_req[] =
  113. {
  114. 0x04, 0x00, 0x28, 0x00, 0x10, 0x00,
  115. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  116. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  117. 0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  118. 0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00,
  119. 0xff, 0xff, 0xff, 0xff, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x44, 0x00,
  120. 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x08,
  121. 0x00, 0x3c, 0x01, 0x00, 0x00, 0x00, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  122. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
  123. 0x00, 0x7c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  124. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0xa0,
  125. 0xbe, 0xda
  126. };
  127. static uint8_t read_im0_req[] =
  128. {
  129. 0x04, 0x00, 0x28, 0x00, 0x00, 0x00,
  130. 0x00, 0x00, 0xde, 0xa0, 0x00, 0x00, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  131. 0xfe, 0xed, 0xde, 0xa0, 0x00, 0x01, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  132. 0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  133. 0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02,
  134. 0xff, 0xff, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00,
  135. 0x00, 0x40, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x09,
  136. 0x00, 0x3c, 0x01, 0x00, 0x00, 0x02, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  137. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
  138. 0xaf, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  139. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  140. };
  141. /*
  142. * In order to create a fragmented connect using the connect request above:
  143. * 1) Copy the connect request to both fragments.
  144. * 2) Strip away the ETH header, the IP header and the UDP header (0x2a bytes) from both packets (already done!!!)
  145. * 3) In fragment 1 change byte [0x2c] from 0x28 to 0x2c. (means fragment)
  146. * 4) In fragment 2 change byte [0x2c] from 0x28 to 0x2e. (means last fragment)
  147. * 5) Modify fragment length member of both frames:
  148. * a) Fragment 1: bytes [0x74..0x75] from {0x86 0x01} to [0x00 0x01] (means 0x100 bytes).
  149. * b) Fragment 2: bytes [0x74..0x75] from {0x86 0x01} to [0x86 0x00] (means 0x86 bytes).
  150. * 6) Modify fragment number of fragment 2:
  151. * Fragment 2: bytes [0x76..0x77] from {0x00 0x00} to {0x01 0x00} (means fragment 1).
  152. * 7) Modify serial_low member of fragment 2:
  153. * Fragment 2: byte [0x79] from 0x00 to 0x01.
  154. * 7) Cut fragment 1 at 256 bytes of connect request (i.e., at position 0x16a).
  155. * 8) Remove the first 256 bytes of the connect request from fragment 2 (i.e. bytes 0x7a to 0x17a)
  156. */
  157. static uint8_t connect_frag_1_req[] =
  158. {
  159. /* 20 */ /* 2a */0x04, 0x00, 0x2c, 0x00, 0x10, 0x00,
  160. /* 30 */0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  161. /* 40 */0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  162. /* 50 */0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  163. /* 60 */0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  164. /* 70 */0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x72, 0x01,
  165. /* 80 */0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, 0x01, 0x01,
  166. /* 90 */0x00, 0x42, 0x01, 0x00, 0x00, 0x01, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  167. /* a0 */0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0xc8, 0x5b, 0x76, 0xe6, 0x89, 0xdf, 0xde, 0xa0,
  168. /* b0 */0x00, 0x00, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x01, 0x40, 0x00,
  169. /* c0 */0x00, 0x11, 0x02, 0x58, 0x88, 0x92, 0x00, 0x0c, 0x72, 0x74, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2d,
  170. /* d0 */0x64, 0x65, 0x6d, 0x6f, 0x01, 0x02, 0x00, 0x50, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x88, 0x92,
  171. /* e0 */0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0x80, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
  172. /* f0 */0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  173. /* 100 */0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  174. /* 110 */0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03,
  175. /* 120 */0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x01, 0x02, 0x00, 0x50, 0x01, 0x00, 0x00, 0x02,
  176. /* 130 */0x00, 0x02, 0x88, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0x80, 0x00, 0x00, 0x20, 0x00, 0x01,
  177. /* 140 */0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00,
  178. /* 150 */0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
  179. /* 160 */0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01,
  180. /* 170 */0x00, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01
  181. };
  182. static uint8_t connect_frag_2_req[] =
  183. {
  184. /* 20 */ /* 2a */0x04, 0x00, 0x2e, 0x00, 0x10, 0x00,
  185. /* 30 */0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  186. /* 40 */0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  187. /* 50 */0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  188. /* 60 */0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  189. /* 70 */0xff, 0xff, 0xff, 0xff, 0x86, 0x00, 0x01, 0x00, 0x00, 0x01,
  190. /* 80 */
  191. /* 90 */
  192. /* a0 */
  193. /* b0 */
  194. /* c0 */
  195. /* d0 */
  196. /* e0 */
  197. /* f0 */
  198. /* 100 */
  199. /* 110 */
  200. /* 120 */
  201. /* 130 */
  202. /* 140 */
  203. /* 150 */
  204. /* 160 */
  205. /* 170 */ 0x00, 0x03, 0x01, 0x04, 0x00, 0x3c,
  206. /* 180 */0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  207. /* 190 */0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
  208. /* 1a0 */0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x80, 0x01,
  209. /* 1b0 */0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x04, 0x00, 0x26,
  210. /* 1c0 */0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00,
  211. /* 1d0 */0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,
  212. /* 1e0 */0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x16, 0x01, 0x00, 0x00, 0x01, 0x88, 0x92,
  213. /* 1f0 */0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0xc8, 0xc0, 0x00, 0xa0, 0x00
  214. };
  215. static uint8_t connect_req_iosar_da[] =
  216. {
  217. 0x04, 0x00, 0x28, 0x00, 0x10, 0x00,
  218. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  219. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  220. 0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  221. 0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  222. 0xff, 0xff, 0xff, 0xff, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x42, 0x00,
  223. 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x01, 0x01,
  224. 0x00, 0x3e, 0x01, 0x00, 0x00, 0x06, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  225. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0xc8, 0x5b, 0x76, 0xe6, 0x89, 0xdf, 0xde, 0xa0,
  226. 0x00, 0x00, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x01, 0x40, 0x00,
  227. 0x01, 0x11, 0x02, 0x58, 0x88, 0x92, 0x00, 0x08, 0x72, 0x74, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x31
  228. };
  229. static uint8_t release_req_iosar_da[] =
  230. {
  231. 0x04, 0x00, 0x28, 0x00, 0x10, 0x00,
  232. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  233. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  234. 0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  235. 0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
  236. 0xff, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x20, 0x00,
  237. 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x14,
  238. 0x00, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  239. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00
  240. };
  241. static uint8_t connect_req_siemens[] =
  242. {
  243. 0x04, 0x00, 0x20, 0x00, 0x00, 0x00,
  244. 0x00, 0x00, 0xde, 0xa0, 0x00, 0x00, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  245. 0xfe, 0xed, 0xde, 0xa0, 0x00, 0x01, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  246. 0xdf, 0x7d, 0x0a, 0x07, 0x10, 0x32, 0x1b, 0xd0, 0x1f, 0x1f, 0x8a, 0x8c, 0xe0, 0xdc, 0xa0, 0x8a,
  247. 0xba, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  248. 0xff, 0xff, 0xff, 0xff, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
  249. 0x01, 0x70, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x70, 0x01, 0x01,
  250. 0x00, 0x40, 0x01, 0x00, 0x00, 0x01, 0xf1, 0x07, 0x05, 0x4c, 0x1e, 0x41, 0x43, 0x4f, 0x8b, 0xc8,
  251. 0xcc, 0x5f, 0x1c, 0x76, 0x93, 0xf8, 0x00, 0x01, 0xe0, 0xdc, 0xa0, 0x8a, 0xba, 0x33, 0xde, 0xa0,
  252. 0x00, 0x00, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0x64, 0x01, 0x0d, 0x00, 0x2a, 0x40, 0x00,
  253. 0x00, 0x11, 0x00, 0xc8, 0x88, 0x92, 0x00, 0x0a, 0x70, 0x6c, 0x63, 0x78, 0x62, 0x31, 0x64, 0x30,
  254. 0x65, 0x64, 0x01, 0x02, 0x00, 0x50, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x88, 0x92, 0x00, 0x00,
  255. 0x00, 0x02, 0x00, 0x28, 0x80, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff,
  256. 0xff, 0xff, 0x00, 0x03, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  257. 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
  258. 0x00, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01,
  259. 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x01, 0x02, 0x00, 0x50, 0x01, 0x00, 0x00, 0x02, 0x00, 0x02,
  260. 0x88, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0xff, 0xff, 0x00, 0x20, 0x00, 0x02, 0x00, 0x01,
  261. 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
  262. 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04,
  263. 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00,
  264. 0x80, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x01, 0x04, 0x00, 0x3c, 0x01, 0x00,
  265. 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
  266. 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x80, 0x00,
  267. 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x80, 0x01, 0x00, 0x00,
  268. 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x04, 0x00, 0x26, 0x01, 0x00,
  269. 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01,
  270. 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x02,
  271. 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x16, 0x01, 0x00, 0x00, 0x01, 0x88, 0x92, 0x00, 0x00,
  272. 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0xa0, 0x00
  273. };
  274. static uint8_t write_req_siemens[] =
  275. {
  276. 0x04, 0x00, 0x20, 0x00, 0x00, 0x00,
  277. 0x00, 0x00, 0xde, 0xa0, 0x00, 0x00, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  278. 0xfe, 0xed, 0xde, 0xa0, 0x00, 0x01, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  279. 0xdf, 0x7d, 0x0a, 0x07, 0x10, 0x32, 0x1b, 0xd0, 0x1f, 0x1f, 0x8a, 0x8c, 0xe0, 0xdc, 0xa0, 0x8a,
  280. 0xba, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03,
  281. 0xff, 0xff, 0xff, 0xff, 0x01, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00,
  282. 0x01, 0x14, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x08,
  283. 0x00, 0x3c, 0x01, 0x00, 0x00, 0x00, 0xf1, 0x07, 0x05, 0x4c, 0x1e, 0x41, 0x43, 0x4f, 0x8b, 0xc8,
  284. 0xcc, 0x5f, 0x1c, 0x76, 0x93, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  285. 0xe0, 0x40, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  286. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
  287. 0x00, 0x3c, 0x01, 0x00, 0x00, 0x01, 0xf1, 0x07, 0x05, 0x4c, 0x1e, 0x41, 0x43, 0x4f, 0x8b, 0xc8,
  288. 0xcc, 0x5f, 0x1c, 0x76, 0x93, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
  289. 0x80, 0x71, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  290. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x50,
  291. 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x3c, 0x01, 0x00,
  292. 0x00, 0x02, 0xf1, 0x07, 0x05, 0x4c, 0x1e, 0x41, 0x43, 0x4f, 0x8b, 0xc8, 0xcc, 0x5f, 0x1c, 0x76,
  293. 0x93, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00,
  294. 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  295. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
  296. 0x00, 0x3c, 0x01, 0x00, 0x00, 0x03, 0xf1, 0x07, 0x05, 0x4c, 0x1e, 0x41, 0x43, 0x4f, 0x8b, 0xc8,
  297. 0xcc, 0x5f, 0x1c, 0x76, 0x93, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
  298. 0x00, 0x7c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  299. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  300. 0x00, 0x00
  301. };
  302. static uint8_t prm_end_req_siemens[] =
  303. {
  304. 0x04, 0x00, 0x20, 0x00, 0x00, 0x00,
  305. 0x00, 0x00, 0xde, 0xa0, 0x00, 0x00, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  306. 0xfe, 0xed, 0xde, 0xa0, 0x00, 0x01, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  307. 0xdf, 0x7d, 0x0a, 0x07, 0x10, 0x32, 0x1b, 0xd0, 0x1f, 0x1f, 0x8a, 0x8c, 0xe0, 0xdc, 0xa0, 0x8a,
  308. 0xba, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04,
  309. 0xff, 0xff, 0xff, 0xff, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
  310. 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x10,
  311. 0x00, 0x1c, 0x01, 0x00, 0x00, 0x00, 0xf1, 0x07, 0x05, 0x4c, 0x1e, 0x41, 0x43, 0x4f, 0x8b, 0xc8,
  312. 0xcc, 0x5f, 0x1c, 0x76, 0x93, 0xf8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00
  313. };
  314. /* This is a raw Ethernet packet (not UDP payload) */
  315. static uint8_t data_packet[] =
  316. {
  317. 0x1e, 0x30, 0x6c, 0xa2, 0x45, 0x5e, 0xc8, 0x5b, 0x76, 0xe6, 0x89, 0xdf, 0x88, 0x92, 0x80, 0x00,
  318. 0x80, 0x80, 0x80, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  319. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  320. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x35, 0x00
  321. };
  322. // clang-format on
  323. TEST_F (CmrpcTest, CmrpcConnectReleaseTest)
  324. {
  325. int ret;
  326. uint32_t ix;
  327. EXPECT_EQ (mock_os_data.udp_sendto_len, 0);
  328. TEST_TRACE ("\nGenerating mock connection request\n");
  329. mock_set_pnal_udp_recvfrom_buffer (connect_req, sizeof (connect_req));
  330. run_stack (TEST_UDP_DELAY);
  331. EXPECT_EQ (appdata.call_counters.state_calls, 1);
  332. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_STARTUP);
  333. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  334. EXPECT_GT (mock_os_data.eth_send_count, 0);
  335. EXPECT_EQ (mock_os_data.udp_sendto_count, 1);
  336. EXPECT_EQ (mock_os_data.udp_sendto_len, 178);
  337. TEST_TRACE ("\nGenerating mock write request\n");
  338. mock_set_pnal_udp_recvfrom_buffer (write_req, sizeof (write_req));
  339. run_stack (TEST_UDP_DELAY);
  340. EXPECT_EQ (appdata.call_counters.state_calls, 1);
  341. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_STARTUP);
  342. EXPECT_EQ (appdata.call_counters.write_calls, 1);
  343. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  344. EXPECT_EQ (mock_os_data.udp_sendto_count, 2);
  345. EXPECT_EQ (mock_os_data.udp_sendto_len, 164);
  346. TEST_TRACE ("\nGenerating mock parameter end request\n");
  347. mock_set_pnal_udp_recvfrom_buffer (prm_end_req, sizeof (prm_end_req));
  348. run_stack (TEST_UDP_DELAY);
  349. EXPECT_EQ (appdata.call_counters.state_calls, 2);
  350. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_PRMEND);
  351. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  352. EXPECT_EQ (appdata.call_counters.write_calls, 1);
  353. EXPECT_EQ (mock_os_data.udp_sendto_count, 3);
  354. EXPECT_EQ (mock_os_data.udp_sendto_len, 132);
  355. TEST_TRACE ("\nSimulate application calling APPL_RDY\n");
  356. ret = pnet_application_ready (net, appdata.main_arep);
  357. EXPECT_EQ (ret, 0);
  358. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  359. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  360. EXPECT_EQ (mock_os_data.udp_sendto_count, 4);
  361. EXPECT_EQ (mock_os_data.udp_sendto_len, 132);
  362. TEST_TRACE ("\nGenerating mock application ready response\n");
  363. mock_set_pnal_udp_recvfrom_buffer (appl_rdy_rsp, sizeof (appl_rdy_rsp));
  364. run_stack (TEST_UDP_DELAY);
  365. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  366. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  367. EXPECT_EQ (mock_os_data.udp_sendto_count, 4);
  368. TEST_TRACE ("\nGenerating I&M0 request\n");
  369. mock_set_pnal_udp_recvfrom_buffer (read_im0_req, sizeof (read_im0_req));
  370. run_stack (TEST_UDP_DELAY);
  371. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  372. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  373. EXPECT_EQ (mock_os_data.udp_sendto_count, 5);
  374. EXPECT_EQ (mock_os_data.udp_sendto_len, 224);
  375. TEST_TRACE ("\nGenerating cyclic data\n");
  376. for (ix = 0; ix < 100; ix++)
  377. {
  378. send_data (data_packet, sizeof (data_packet));
  379. run_stack (TEST_DATA_DELAY);
  380. }
  381. EXPECT_EQ (appdata.call_counters.state_calls, 4);
  382. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_DATA);
  383. EXPECT_EQ (mock_os_data.udp_sendto_count, 5);
  384. TEST_TRACE ("\nGenerating mock release request\n");
  385. mock_set_pnal_udp_recvfrom_buffer (release_req, sizeof (release_req));
  386. run_stack (TEST_UDP_DELAY);
  387. EXPECT_EQ (appdata.call_counters.release_calls, 1);
  388. EXPECT_EQ (appdata.call_counters.state_calls, 5);
  389. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_ABORT);
  390. EXPECT_EQ (mock_os_data.udp_sendto_count, 6);
  391. EXPECT_EQ (mock_os_data.udp_sendto_len, 132);
  392. }
  393. TEST_F (CmrpcTest, CmrpcConnectionTimeoutTest)
  394. {
  395. int ret;
  396. bool new_flag = false;
  397. uint8_t in_data[10];
  398. uint16_t in_len = sizeof (in_data);
  399. uint8_t out_data[] = {
  400. 0x33, /* Slot 1, subslot 1 Data */
  401. };
  402. uint8_t iops = PNET_IOXS_BAD;
  403. uint32_t ix;
  404. TEST_TRACE ("\nGenerating mock connection request\n");
  405. mock_set_pnal_udp_recvfrom_buffer (connect_req, sizeof (connect_req));
  406. run_stack (TEST_UDP_DELAY);
  407. EXPECT_EQ (appdata.call_counters.state_calls, 1);
  408. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_STARTUP);
  409. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  410. EXPECT_GT (mock_os_data.eth_send_count, 0);
  411. TEST_TRACE ("\nGenerating mock write request\n");
  412. mock_set_pnal_udp_recvfrom_buffer (write_req, sizeof (write_req));
  413. run_stack (TEST_UDP_DELAY);
  414. EXPECT_EQ (appdata.call_counters.state_calls, 1);
  415. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_STARTUP);
  416. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  417. TEST_TRACE ("\nGenerating mock parameter end request\n");
  418. mock_set_pnal_udp_recvfrom_buffer (prm_end_req, sizeof (prm_end_req));
  419. run_stack (TEST_UDP_DELAY);
  420. EXPECT_EQ (appdata.call_counters.state_calls, 2);
  421. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_PRMEND);
  422. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  423. TEST_TRACE ("\nSimulate application calling APPL_RDY\n");
  424. ret = pnet_application_ready (net, appdata.main_arep);
  425. EXPECT_EQ (ret, 0);
  426. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  427. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  428. TEST_TRACE ("\nGenerating mock application ready response\n");
  429. mock_set_pnal_udp_recvfrom_buffer (appl_rdy_rsp, sizeof (appl_rdy_rsp));
  430. run_stack (TEST_UDP_DELAY);
  431. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  432. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  433. TEST_TRACE ("\nGenerate a couple of data packets to move pf_cpm to RUN "
  434. "state\n");
  435. for (ix = 0; ix < 100; ix++)
  436. {
  437. send_data (data_packet, sizeof (data_packet));
  438. run_stack (TEST_DATA_DELAY);
  439. }
  440. EXPECT_EQ (appdata.call_counters.state_calls, 4);
  441. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_DATA);
  442. TEST_TRACE ("\nRead data just to see that it works\n");
  443. in_len = sizeof (in_data);
  444. ret = pnet_output_get_data_and_iops (
  445. net,
  446. TEST_API_IDENT,
  447. 1,
  448. 1,
  449. &new_flag,
  450. in_data,
  451. &in_len,
  452. &iops);
  453. EXPECT_EQ (ret, 0);
  454. EXPECT_EQ (new_flag, true);
  455. EXPECT_EQ (in_len, 1);
  456. EXPECT_EQ (iops, PNET_IOXS_GOOD);
  457. TEST_TRACE ("\nGenerate new data to move PPM to RUN state\n");
  458. ret = pnet_input_set_data_and_iops (
  459. net,
  460. TEST_API_IDENT,
  461. 1,
  462. 1,
  463. out_data,
  464. sizeof (out_data),
  465. PNET_IOXS_GOOD);
  466. EXPECT_EQ (ret, 0);
  467. TEST_TRACE ("\nWait for timeout in CPM\n");
  468. run_stack (TEST_TIMEOUT_DELAY);
  469. EXPECT_EQ (appdata.call_counters.release_calls, 0);
  470. EXPECT_EQ (appdata.call_counters.state_calls, 5);
  471. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_ABORT);
  472. TEST_TRACE ("\nGenerating mock release request\n");
  473. mock_set_pnal_udp_recvfrom_buffer (release_req, sizeof (release_req));
  474. run_stack (TEST_UDP_DELAY);
  475. EXPECT_EQ (appdata.call_counters.release_calls, 0);
  476. EXPECT_EQ (appdata.call_counters.state_calls, 5);
  477. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_ABORT);
  478. }
  479. /**
  480. * Replicate startup with a Siemens S7-1200 controller
  481. */
  482. TEST_F (CmrpcTest, CmrpcSiemensConnectTest)
  483. {
  484. EXPECT_EQ (mock_os_data.udp_sendto_len, 0);
  485. TEST_TRACE ("\nGenerating mock connection request\n");
  486. mock_set_pnal_udp_recvfrom_buffer (
  487. connect_req_siemens,
  488. sizeof (connect_req_siemens));
  489. run_stack (TEST_UDP_DELAY);
  490. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_STARTUP);
  491. EXPECT_EQ (appdata.call_counters.state_calls, 1);
  492. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  493. EXPECT_EQ (appdata.call_counters.write_calls, 0);
  494. EXPECT_EQ (appdata.call_counters.read_calls, 0);
  495. EXPECT_EQ (appdata.call_counters.ccontrol_calls, 0);
  496. EXPECT_EQ (appdata.call_counters.dcontrol_calls, 0);
  497. EXPECT_GT (mock_os_data.eth_send_count, 0);
  498. EXPECT_EQ (mock_os_data.udp_sendto_count, 1);
  499. EXPECT_EQ (mock_os_data.udp_sendto_len, 178); // Actual value. OK in
  500. // Wireshark (232 bytes)
  501. TEST_TRACE ("\nGenerating mock write request\n");
  502. mock_set_pnal_udp_recvfrom_buffer (
  503. write_req_siemens,
  504. sizeof (write_req_siemens));
  505. run_stack (TEST_UDP_DELAY);
  506. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_STARTUP);
  507. EXPECT_EQ (appdata.call_counters.state_calls, 1);
  508. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  509. EXPECT_EQ (appdata.call_counters.write_calls, 2);
  510. EXPECT_EQ (appdata.call_counters.read_calls, 0);
  511. EXPECT_EQ (appdata.call_counters.ccontrol_calls, 0);
  512. EXPECT_EQ (appdata.call_counters.dcontrol_calls, 0);
  513. EXPECT_EQ (mock_os_data.udp_sendto_count, 2);
  514. EXPECT_EQ (mock_os_data.udp_sendto_len, 356); // Actual value. OK in
  515. // Wireshark (398 bytes)
  516. TEST_TRACE ("\nGenerating mock parameter end request\n");
  517. mock_set_pnal_udp_recvfrom_buffer (
  518. prm_end_req_siemens,
  519. sizeof (prm_end_req_siemens));
  520. run_stack (TEST_UDP_DELAY);
  521. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_PRMEND);
  522. EXPECT_EQ (appdata.call_counters.state_calls, 2);
  523. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  524. EXPECT_EQ (appdata.call_counters.write_calls, 2);
  525. EXPECT_EQ (appdata.call_counters.read_calls, 0);
  526. EXPECT_EQ (appdata.call_counters.ccontrol_calls, 0);
  527. EXPECT_EQ (appdata.call_counters.dcontrol_calls, 1);
  528. EXPECT_EQ (mock_os_data.udp_sendto_count, 3);
  529. EXPECT_EQ (mock_os_data.udp_sendto_len, 132); // 20 bytes longer than sent
  530. // from faulty application
  531. }
  532. TEST_F (CmrpcTest, CmrpcConnectFragmentTest)
  533. {
  534. int ret;
  535. uint32_t ix;
  536. TEST_TRACE ("\nGenerating mock connection request, fragment 1\n");
  537. mock_set_pnal_udp_recvfrom_buffer (
  538. connect_frag_1_req,
  539. sizeof (connect_frag_1_req));
  540. run_stack (TEST_UDP_DELAY);
  541. EXPECT_EQ (appdata.call_counters.state_calls, 0);
  542. EXPECT_EQ (appdata.call_counters.connect_calls, 0);
  543. EXPECT_EQ (mock_os_data.eth_send_count, 0);
  544. TEST_TRACE ("\nGenerating mock connection request, fragment 2\n");
  545. mock_set_pnal_udp_recvfrom_buffer (
  546. connect_frag_2_req,
  547. sizeof (connect_frag_2_req));
  548. run_stack (TEST_UDP_DELAY);
  549. EXPECT_EQ (appdata.call_counters.state_calls, 1);
  550. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_STARTUP);
  551. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  552. EXPECT_GT (mock_os_data.eth_send_count, 0);
  553. TEST_TRACE ("\nGenerating mock connection write request\n");
  554. mock_set_pnal_udp_recvfrom_buffer (write_req, sizeof (write_req));
  555. run_stack (TEST_UDP_DELAY);
  556. EXPECT_EQ (appdata.call_counters.state_calls, 1);
  557. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_STARTUP);
  558. EXPECT_EQ (appdata.call_counters.write_calls, 1);
  559. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  560. TEST_TRACE ("\nGenerating mock parameter end request\n");
  561. mock_set_pnal_udp_recvfrom_buffer (prm_end_req, sizeof (prm_end_req));
  562. run_stack (TEST_UDP_DELAY);
  563. EXPECT_EQ (appdata.call_counters.state_calls, 2);
  564. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_PRMEND);
  565. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  566. TEST_TRACE ("\nSimulate application calling APPL_RDY\n");
  567. ret = pnet_application_ready (net, appdata.main_arep);
  568. EXPECT_EQ (ret, 0);
  569. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  570. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  571. TEST_TRACE ("\nGenerating mock application ready response\n");
  572. mock_set_pnal_udp_recvfrom_buffer (appl_rdy_rsp, sizeof (appl_rdy_rsp));
  573. run_stack (TEST_UDP_DELAY);
  574. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  575. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  576. TEST_TRACE ("\nRead I&M0\n");
  577. mock_set_pnal_udp_recvfrom_buffer (read_im0_req, sizeof (read_im0_req));
  578. run_stack (TEST_UDP_DELAY);
  579. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  580. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  581. TEST_TRACE ("\nSending data\n");
  582. for (ix = 0; ix < 100; ix++)
  583. {
  584. send_data (data_packet, sizeof (data_packet));
  585. run_stack (TEST_DATA_DELAY);
  586. }
  587. EXPECT_EQ (appdata.call_counters.state_calls, 4);
  588. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_DATA);
  589. TEST_TRACE ("Sending mock release request\n");
  590. mock_set_pnal_udp_recvfrom_buffer (release_req, sizeof (release_req));
  591. run_stack (TEST_UDP_DELAY);
  592. EXPECT_EQ (appdata.call_counters.release_calls, 1);
  593. EXPECT_EQ (appdata.call_counters.state_calls, 5);
  594. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_ABORT);
  595. }
  596. TEST_F (CmrpcTest, CmrpcConnectReleaseIOSAR_DA)
  597. {
  598. // Device-access AR is not yet supported
  599. TEST_TRACE ("\nGenerating mock connection request IOSAR_DA\n");
  600. mock_set_pnal_udp_recvfrom_buffer (
  601. connect_req_iosar_da,
  602. sizeof (connect_req_iosar_da));
  603. run_stack (TEST_UDP_DELAY);
  604. EXPECT_EQ (appdata.call_counters.state_calls, 0);
  605. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_ABORT);
  606. EXPECT_EQ (appdata.call_counters.connect_calls, 0);
  607. EXPECT_EQ (mock_os_data.eth_send_count, 0);
  608. TEST_TRACE ("\nGenerating mock release request IOSAR_DA\n");
  609. mock_set_pnal_udp_recvfrom_buffer (
  610. release_req_iosar_da,
  611. sizeof (release_req_iosar_da));
  612. run_stack (TEST_UDP_DELAY);
  613. EXPECT_EQ (appdata.call_counters.state_calls, 0);
  614. EXPECT_EQ (appdata.call_counters.release_calls, 0);
  615. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_ABORT);
  616. }
  617. TEST_F (CmrpcUnitTest, CmrpcCheckGenerateUuid)
  618. {
  619. uint32_t timestamp;
  620. uint32_t session_number;
  621. pnet_ethaddr_t mac_address;
  622. pf_uuid_t uuid;
  623. timestamp = 0xC1C2C3C4;
  624. session_number = 0xB1B2B3B4;
  625. mac_address.addr[0] = 0xA1;
  626. mac_address.addr[1] = 0xA2;
  627. mac_address.addr[2] = 0xA3;
  628. mac_address.addr[3] = 0xA4;
  629. mac_address.addr[4] = 0xA5;
  630. mac_address.addr[5] = 0xA6;
  631. pf_generate_uuid (timestamp, session_number, mac_address, &uuid);
  632. EXPECT_EQ (uuid.data1, timestamp);
  633. EXPECT_EQ (uuid.data2, 0xB1B2);
  634. EXPECT_EQ (uuid.data3, 0x10B3);
  635. EXPECT_EQ (uuid.data4[0], 0x80);
  636. EXPECT_EQ (uuid.data4[1], 0xB4);
  637. EXPECT_EQ (uuid.data4[2], 0xA1);
  638. EXPECT_EQ (uuid.data4[3], 0xA2);
  639. EXPECT_EQ (uuid.data4[4], 0xA3);
  640. EXPECT_EQ (uuid.data4[5], 0xA4);
  641. EXPECT_EQ (uuid.data4[6], 0xA5);
  642. EXPECT_EQ (uuid.data4[7], 0xA6);
  643. }