FrameSequence_1.test 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. %description:
  2. Test 802.11 frame sequences
  3. %includes:
  4. #include <stdio.h>
  5. #include "inet/linklayer/common/MACAddress.h"
  6. #include "inet/linklayer/ieee80211/mac/contract/IFrameSequence.h"
  7. #include "inet/linklayer/ieee80211/mac/framesequence/FrameSequenceContext.h"
  8. #include "inet/linklayer/ieee80211/mac/framesequence/FrameSequenceStep.h"
  9. #include "inet/linklayer/ieee80211/mac/framesequence/GenericFrameSequences.h"
  10. %inifile: omnetpp.ini
  11. #debug-on-errors = true
  12. #debugger-attach-on-error = true
  13. %global:
  14. using namespace inet;
  15. using namespace inet::ieee80211;
  16. enum Role
  17. {
  18. ORIGINATOR,
  19. RECIPIENT,
  20. };
  21. FrameSequenceContext *originatorContext = new FrameSequenceContext(MACAddress(), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
  22. FrameSequenceContext *recipientContext = new FrameSequenceContext(MACAddress(), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
  23. class DataFs : public IFrameSequence
  24. {
  25. protected:
  26. int firstStep = -1;
  27. int step = -1;
  28. public:
  29. virtual void startSequence(FrameSequenceContext *context, int firstStep) override {
  30. this->firstStep = firstStep;
  31. step = 0;
  32. }
  33. virtual IFrameSequenceStep *prepareStep(FrameSequenceContext *context) override {
  34. if (context == originatorContext) {
  35. switch (step) {
  36. case 0: {
  37. Ieee80211Frame *frame = new Ieee80211Frame("DATA");
  38. frame->setType(ST_DATA);
  39. return new TransmitStep(frame, 0);
  40. }
  41. case 1:
  42. return nullptr;
  43. default:
  44. throw cRuntimeError("Unknown step");
  45. }
  46. }
  47. else {
  48. switch (step) {
  49. case 0:
  50. return new ReceiveStep();
  51. case 1:
  52. return nullptr;
  53. default:
  54. throw cRuntimeError("Unknown step");
  55. }
  56. }
  57. }
  58. virtual bool completeStep(FrameSequenceContext *context) override {
  59. if (context == originatorContext) {
  60. switch (step) {
  61. case 0:
  62. step++;
  63. return true;
  64. default:
  65. throw cRuntimeError("Unknown step");
  66. }
  67. }
  68. else {
  69. switch (step) {
  70. case 0: {
  71. IReceiveStep *receiveStep = check_and_cast<IReceiveStep *>(context->getStep(firstStep + step));
  72. step++;
  73. return receiveStep->getReceivedFrame()->getType() == ST_DATA;
  74. }
  75. default:
  76. throw cRuntimeError("Unknown step");
  77. }
  78. }
  79. }
  80. virtual std::string getHistory() override { return ""; }
  81. };
  82. class INET_API AckFs : public IFrameSequence {
  83. protected:
  84. int firstStep = -1;
  85. int step = -1;
  86. public:
  87. virtual void startSequence(FrameSequenceContext *context, int firstStep) override {
  88. this->firstStep = firstStep;
  89. step = 0;
  90. }
  91. virtual IFrameSequenceStep *prepareStep(FrameSequenceContext *context) override {
  92. if (context == originatorContext) {
  93. switch (step) {
  94. case 0:
  95. return new ReceiveStep();
  96. case 1:
  97. return nullptr;
  98. default:
  99. throw cRuntimeError("Unknown step");
  100. }
  101. }
  102. else {
  103. switch (step) {
  104. case 0: {
  105. Ieee80211Frame *frame = new Ieee80211Frame("ACK");
  106. frame->setType(ST_ACK);
  107. return new TransmitStep(frame, 0);
  108. }
  109. case 1:
  110. return nullptr;
  111. default:
  112. throw cRuntimeError("Unknown step");
  113. }
  114. }
  115. }
  116. virtual bool completeStep(FrameSequenceContext *context) override {
  117. if (context == originatorContext) {
  118. switch (step) {
  119. case 0: {
  120. IReceiveStep *receiveStep = check_and_cast<IReceiveStep *>(context->getStep(firstStep + step));
  121. step++;
  122. return receiveStep->getReceivedFrame()->getType() == ST_ACK;
  123. }
  124. default:
  125. throw cRuntimeError("Unknown step");
  126. }
  127. }
  128. else {
  129. switch (step) {
  130. case 0:
  131. step++;
  132. return true;
  133. default:
  134. throw cRuntimeError("Unknown step");
  135. }
  136. }
  137. }
  138. virtual std::string getHistory() override { return ""; }
  139. };
  140. class RtsCtsFs : public IFrameSequence {
  141. protected:
  142. int firstStep = -1;
  143. int step = -1;
  144. public:
  145. RtsCtsFs() { }
  146. virtual void startSequence(FrameSequenceContext *context, int firstStep) override {
  147. step = 0;
  148. this->firstStep = firstStep;
  149. }
  150. IFrameSequenceStep *prepareStep(FrameSequenceContext *context) override {
  151. if (context == originatorContext) {
  152. switch (step) {
  153. case 0: {
  154. Ieee80211Frame *frame = new Ieee80211Frame("RTS");
  155. frame->setType(ST_RTS);
  156. return new TransmitStep(frame, 0);
  157. }
  158. case 1:
  159. return new ReceiveStep();
  160. case 2:
  161. return nullptr;
  162. default:
  163. throw cRuntimeError("Unknown step");
  164. }
  165. }
  166. else {
  167. switch (step) {
  168. case 0:
  169. return new ReceiveStep();
  170. case 1: {
  171. Ieee80211Frame *frame = new Ieee80211Frame("CTS");
  172. frame->setType(ST_CTS);
  173. return new TransmitStep(frame, 0);
  174. }
  175. case 2:
  176. return nullptr;
  177. default:
  178. throw cRuntimeError("Unknown step");
  179. }
  180. }
  181. }
  182. bool completeStep(FrameSequenceContext *context) override {
  183. if (context == originatorContext) {
  184. switch (step) {
  185. case 0:
  186. step++;
  187. return true;
  188. case 1: {
  189. IReceiveStep *receiveStep = check_and_cast<IReceiveStep *>(context->getStep(firstStep + step));
  190. step++;
  191. return receiveStep->getReceivedFrame()->getType() == ST_CTS;
  192. }
  193. default:
  194. throw cRuntimeError("Unknown step");
  195. }
  196. }
  197. else {
  198. switch (step) {
  199. case 0: {
  200. IReceiveStep *receiveStep = check_and_cast<IReceiveStep *>(context->getStep(firstStep + step));
  201. step++;
  202. return receiveStep->getReceivedFrame()->getType() == ST_RTS;
  203. }
  204. case 1:
  205. step++;
  206. return true;
  207. default:
  208. throw cRuntimeError("Unknown step");
  209. }
  210. }
  211. }
  212. virtual std::string getHistory() override { return ""; }
  213. };
  214. static void runFrameSequence(IFrameSequence *originatorFrameSequence, IFrameSequence *recipientFrameSequence)
  215. {
  216. // prepare originator
  217. bool isOriginatorRunning = true;
  218. IFrameSequenceStep *originatorStep = nullptr;
  219. Ieee80211Frame *originatorFrame = nullptr;
  220. originatorContext = new FrameSequenceContext(MACAddress(ORIGINATOR), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
  221. originatorFrameSequence->startSequence(originatorContext, 0);
  222. // prepare recipient
  223. bool isRecipientRunning = true;
  224. IFrameSequenceStep *recipientStep = nullptr;
  225. Ieee80211Frame *recipientFrame = nullptr;
  226. recipientContext = new FrameSequenceContext(MACAddress(RECIPIENT), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
  227. recipientFrameSequence->startSequence(recipientContext, 0);
  228. // run frame sequence
  229. while (isOriginatorRunning || isRecipientRunning) {
  230. if (isOriginatorRunning) {
  231. // advance originator
  232. originatorStep = originatorFrameSequence->prepareStep(originatorContext);
  233. if (originatorStep == nullptr) {
  234. EV_INFO << "originator complete\n";
  235. isOriginatorRunning = false;
  236. }
  237. else
  238. originatorContext->addStep(originatorStep);
  239. }
  240. if (isRecipientRunning) {
  241. // advance recipient
  242. recipientStep = recipientFrameSequence->prepareStep(recipientContext);
  243. if (recipientStep == nullptr) {
  244. EV_INFO << "recipient complete\n";
  245. isRecipientRunning = false;
  246. }
  247. else
  248. recipientContext->addStep(recipientStep);
  249. }
  250. // handle originator transmit
  251. if (isOriginatorRunning) {
  252. if (originatorStep->getType() == IFrameSequenceStep::Type::TRANSMIT) {
  253. ITransmitStep *transmitStep = check_and_cast<ITransmitStep *>(originatorStep);
  254. originatorFrame = transmitStep->getFrameToTransmit();
  255. EV_INFO << "originator transmit: " << originatorFrame->getName() << "\n";
  256. }
  257. }
  258. // handle recipient transmit
  259. if (isRecipientRunning) {
  260. if (recipientStep->getType() == IFrameSequenceStep::Type::TRANSMIT) {
  261. ITransmitStep *transmitStep = check_and_cast<ITransmitStep *>(recipientStep);
  262. recipientFrame = transmitStep->getFrameToTransmit();
  263. EV_INFO << "recipient transmit: " << recipientFrame->getName() << "\n";
  264. }
  265. }
  266. // handle originator receive
  267. if (isOriginatorRunning) {
  268. if (originatorStep->getType() == IFrameSequenceStep::Type::RECEIVE) {
  269. IReceiveStep *receiveStep = check_and_cast<IReceiveStep *>(originatorStep);
  270. ASSERT(recipientFrame);
  271. receiveStep->setFrameToReceive(recipientFrame);
  272. EV_INFO << "originator receive: " << recipientFrame->getName() << "\n";
  273. }
  274. }
  275. // handle recipient receive
  276. if (isRecipientRunning) {
  277. if (recipientStep->getType() == IFrameSequenceStep::Type::RECEIVE) {
  278. IReceiveStep *receiveStep = check_and_cast<IReceiveStep *>(recipientStep);
  279. ASSERT(originatorFrame);
  280. receiveStep->setFrameToReceive(originatorFrame);
  281. EV_INFO << "recipient receive: " << originatorFrame->getName() << "\n";
  282. }
  283. }
  284. // complete originator
  285. if (isOriginatorRunning) {
  286. bool originatorStepCompletion = originatorFrameSequence->completeStep(originatorContext);
  287. if (!originatorStepCompletion) {
  288. EV_INFO << "originator abort\n";
  289. isOriginatorRunning = false;
  290. }
  291. }
  292. // complete recipient
  293. if (isRecipientRunning) {
  294. bool recipientStepCompletion = recipientFrameSequence->completeStep(recipientContext);
  295. if (!recipientStepCompletion) {
  296. EV_INFO << "recipient abort\n";
  297. isRecipientRunning = false;
  298. }
  299. }
  300. delete originatorFrame;
  301. delete recipientFrame;
  302. originatorFrame = nullptr;
  303. recipientFrame = nullptr;
  304. }
  305. delete originatorFrameSequence;
  306. delete recipientFrameSequence;
  307. }
  308. bool applyOptional(OptionalFs *frameSequence, FrameSequenceContext *context) {
  309. return true;
  310. }
  311. bool skipOptional(OptionalFs *frameSequence, FrameSequenceContext *context) {
  312. return false;
  313. }
  314. bool skipRepeated(RepeatingFs *frameSequence, FrameSequenceContext *context) {
  315. return false;
  316. }
  317. bool applyRepeatedOneTime(RepeatingFs *frameSequence, FrameSequenceContext *context) {
  318. return frameSequence->getCount() <= 0;
  319. }
  320. bool applyRepeatedTwoTimes(RepeatingFs *frameSequence, FrameSequenceContext *context) {
  321. return frameSequence->getCount() <= 1;
  322. }
  323. int selectFirstAlternative(AlternativesFs *frameSequence, FrameSequenceContext *context) {
  324. return 0;
  325. }
  326. int selectSecondAlternative(AlternativesFs *frameSequences, FrameSequenceContext *context) {
  327. return 1;
  328. }
  329. int selectSubsequentAlternativeCounter = 0;
  330. int selectSubsequentAlternative(AlternativesFs *frameSequences, FrameSequenceContext *context) {
  331. if (context == originatorContext)
  332. return selectSubsequentAlternativeCounter++ / 2;
  333. else {
  334. selectSubsequentAlternativeCounter++;
  335. if (selectSubsequentAlternativeCounter < 2)
  336. return -1;
  337. else
  338. return selectSubsequentAlternativeCounter / 2;
  339. }
  340. }
  341. %activity:
  342. EV_INFO << "\nTesting DATA frame sequence\n";
  343. runFrameSequence(new DataFs(), new DataFs());
  344. EV_INFO << "\nTesting sequential frame sequence\n";
  345. runFrameSequence(new SequentialFs({new DataFs(), new DataFs()}), new SequentialFs({new DataFs(), new DataFs()}));
  346. EV_INFO << "\nTesting applied optional frame sequence\n";
  347. runFrameSequence(new OptionalFs(new DataFs(), applyOptional), new OptionalFs(new DataFs(), applyOptional));
  348. EV_INFO << "\nTesting skipped optional frame sequence\n";
  349. runFrameSequence(new OptionalFs(new DataFs(), skipOptional), new OptionalFs(new DataFs(), skipOptional));
  350. EV_INFO << "\nTesting skipped repeated frame sequence\n";
  351. runFrameSequence(new RepeatingFs(new DataFs(), skipRepeated), new RepeatingFs(new DataFs(), skipRepeated));
  352. EV_INFO << "\nTesting one time applied repeated frame sequence\n";
  353. runFrameSequence(new RepeatingFs(new DataFs(), applyRepeatedOneTime), new RepeatingFs(new DataFs(), applyRepeatedOneTime));
  354. EV_INFO << "\nTesting alternative frame sequence\n";
  355. runFrameSequence(new AlternativesFs({new DataFs()}, selectFirstAlternative), new AlternativesFs({new DataFs()}, selectFirstAlternative));
  356. EV_INFO << "\nTesting DATA ACK frame sequence\n";
  357. runFrameSequence(new SequentialFs({new DataFs(), new AckFs()}), new SequentialFs({new DataFs(), new AckFs()}));
  358. EV_INFO << "\nTesting skipped [RTS CTS] DATA ACK frame sequence\n";
  359. runFrameSequence(new SequentialFs({new OptionalFs(new RtsCtsFs(), skipOptional), new DataFs(), new AckFs()}), new SequentialFs({new OptionalFs(new RtsCtsFs(), skipOptional), new DataFs(), new AckFs()}));
  360. EV_INFO << "\nTesting applied [RTS CTS] DATA ACK frame sequence\n";
  361. runFrameSequence(new SequentialFs({new OptionalFs(new RtsCtsFs(), applyOptional), new DataFs(), new AckFs()}), new SequentialFs({new OptionalFs(new RtsCtsFs(), applyOptional), new DataFs(), new AckFs()}));
  362. %contains: stdout
  363. Testing DATA frame sequence
  364. originator transmit: DATA
  365. recipient receive: DATA
  366. originator complete
  367. recipient complete
  368. Testing sequential frame sequence
  369. originator transmit: DATA
  370. recipient receive: DATA
  371. originator transmit: DATA
  372. recipient receive: DATA
  373. originator complete
  374. recipient complete
  375. Testing applied optional frame sequence
  376. originator transmit: DATA
  377. recipient receive: DATA
  378. originator complete
  379. recipient complete
  380. Testing skipped optional frame sequence
  381. originator complete
  382. recipient complete
  383. Testing skipped repeated frame sequence
  384. originator complete
  385. recipient complete
  386. Testing one time applied repeated frame sequence
  387. originator transmit: DATA
  388. recipient receive: DATA
  389. originator complete
  390. recipient complete
  391. Testing alternative frame sequence
  392. originator transmit: DATA
  393. recipient receive: DATA
  394. originator complete
  395. recipient complete
  396. Testing DATA ACK frame sequence
  397. originator transmit: DATA
  398. recipient receive: DATA
  399. recipient transmit: ACK
  400. originator receive: ACK
  401. originator complete
  402. recipient complete
  403. Testing skipped [RTS CTS] DATA ACK frame sequence
  404. originator transmit: DATA
  405. recipient receive: DATA
  406. recipient transmit: ACK
  407. originator receive: ACK
  408. originator complete
  409. recipient complete
  410. Testing applied [RTS CTS] DATA ACK frame sequence
  411. originator transmit: RTS
  412. recipient receive: RTS
  413. recipient transmit: CTS
  414. originator receive: CTS
  415. originator transmit: DATA
  416. recipient receive: DATA
  417. recipient transmit: ACK
  418. originator receive: ACK
  419. originator complete
  420. recipient complete