connection_Setup.cc 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * connection_Setup.cc
  3. *
  4. * Created on: Feb 7, 2018
  5. * Author: anay
  6. */
  7. /*
  8. * connection_Setup.cpp
  9. *
  10. * Created on: Nov 27, 2017
  11. * Author: anay
  12. */
  13. #include <omnetpp.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include "connection_Setup.h"
  17. using namespace inet;
  18. void connection_Setup::initialize(int stage) {
  19. int port = 1024;
  20. socket = create_UDPSocket(L3Address(), port);
  21. }
  22. void connection_Setup::handleMessage(cMessage *msg) {
  23. if (PN == 1 && msg->isSelfMessage()) {
  24. sendClientInitial(0x00000002, "FirstMessage");
  25. }
  26. if (PN == 1 && msg->arrivedOn("udpOut")
  27. && pkt == dynamic_cast<Long_Header*>(msg)) {
  28. if (pkt->getVersion() == 0x0000001 || pkt->getVersion() == 0x0000002) {
  29. version = pkt->getVersion();
  30. if (pkt->getType() == 0x81) {
  31. receiveVersionNegotiation(pkt);
  32. }
  33. if (pkt->getType() == 0x82) {
  34. receiveClientInitial(pkt);
  35. }
  36. if (pkt->getType() == 0x83) {
  37. receiveServerStatelessRetry(pkt);
  38. }
  39. if (pkt->getType() == 0x84) {
  40. receiveServerCleartext(pkt);
  41. }
  42. if (pkt->getType() == 0x85) {
  43. receiveClientCleartext(pkt);
  44. }
  45. if (pkt->getType() == 0x86) {
  46. receiveRTTProtected(pkt);
  47. }
  48. } else {
  49. sendVersionNegotiation();
  50. }
  51. }
  52. }
  53. void connection_Setup::sendVersionNegotiation() {
  54. Version_Negotiation *msg = new Version_Negotiation;
  55. Long_Header *pkt = new Long_Header();
  56. msg->setVersions("0x0000001, 0x00000002");
  57. pkt->setType(0x81);
  58. pkt->setCID(0x0101010101010101);
  59. pkt->setPN(PN);
  60. pkt->setVersion(0x00000002);
  61. pkt->encapsulate(msg);
  62. send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket);
  63. }
  64. void connection_Setup::receiveVersionNegotiation(Long_Header *pkt) {
  65. Version_Negotiation *vn =
  66. dynamic_cast<Version_Negotiation*>(pkt->decapsulate());
  67. std::cout << vn->getVersions() << endl;
  68. }
  69. void connection_Setup::sendClientInitial(uint32_t version, const char* stream) {
  70. Client_Initial *msg = new Client_Initial();
  71. Long_Header *pkt = new Long_Header();
  72. Stream *str = new Stream();
  73. str->setType(0xcb);
  74. str->setStream_Id(0x00000000);
  75. str->setStream_Data("FirstCount");
  76. msg->setStream_0(str);
  77. pkt->setType(0x82);
  78. pkt->setCID(0x0101010101010101);
  79. pkt->setPN(PN);
  80. pkt->setVersion(0x00000002);
  81. pkt->encapsulate(msg);
  82. send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket);
  83. }
  84. void connection_Setup::receiveClientInitial(Long_Header *pkt) {
  85. CID = pkt->getCID();
  86. Client_Initial *ci = dynamic_cast<Client_Initial*>(pkt->decapsulate());
  87. Stream *str = new Stream();
  88. str = ci->getStream_0();
  89. std::cout << str->getStream_Id() << "\t" << str->getStream_Data() << endl;
  90. sendServerCleartext(version, str->getStream_Data());
  91. }
  92. void connection_Setup::receiveClientCleartext(Long_Header *pkt) {
  93. Client_Cleartext *cc = dynamic_cast<Client_Cleartext*>(pkt->decapsulate());
  94. Ack* ack = cc->getAck_0();
  95. Stream* stream = cc->getStream_0();
  96. Padding* pad = cc->getPadding_0();
  97. lastAckPn = ack->getLargest_Acknowledged();
  98. std::cout << stream->getStream_Id() << "\t" << stream->getStream_Data()
  99. << endl;
  100. std::cout << strlen(pad->getPad()) << endl;
  101. sendRTTProtected(pkt->getVersion(), "SendingData");
  102. }
  103. void connection_Setup::receiveServerCleartext(Long_Header *pkt) {
  104. Server_Cleartext *sc = dynamic_cast<Server_Cleartext*>(pkt->decapsulate());
  105. Ack* ack = sc->getAck_0();
  106. Stream* stream = sc->getStream_0();
  107. Padding* pad = sc->getPadding_0();
  108. lastAckPn = ack->getLargest_Acknowledged();
  109. std::cout << stream->getStream_Id() << "\t" << stream->getStream_Data()
  110. << endl;
  111. std::cout << strlen(pad->getPad()) << endl;
  112. sendClientCleartext(pkt->getVersion(), stream->getStream_Data());
  113. }
  114. void connection_Setup::receiveServerStatelessRetry(Long_Header *pkt) {
  115. Server_Stateless_Retry *ssr =
  116. dynamic_cast<Server_Stateless_Retry*>(pkt->decapsulate());
  117. Stream* stream = ssr->getStream_0();
  118. std::cout << stream->getStream_Id() << "\t" << stream->getStream_Data()
  119. << endl;
  120. }
  121. void connection_Setup::receiveRTTProtected(Long_Header *pkt) {
  122. _0_RTT_Protected *rp = dynamic_cast<_0_RTT_Protected*>(pkt->decapsulate());
  123. Stream* stream = rp->getStream_0();
  124. std::cout << stream->getStream_Id() << "\t" << stream->getStream_Data()
  125. << endl;
  126. sendRTTProtected(pkt->getVersion(), "SendingData2");
  127. }
  128. void connection_Setup::sendClientCleartext(uint32_t version,
  129. const char* stream) {
  130. Client_Cleartext *cc = new Client_Cleartext();
  131. Long_Header *pkt = new Long_Header();
  132. Stream *str = new Stream();
  133. Ack *ack = new Ack();
  134. Padding *pad = new Padding();
  135. str->setType(0xcb);
  136. str->setStream_Id(0x00000000);
  137. str->setStream_Data("ClientCleartext");
  138. ack->setType(0xa8);
  139. ack->setLargest_Acknowledged(PN);
  140. ack->setAck_Block_Section(stream);
  141. pad->setPad("000000000");
  142. cc->setAck_0(ack);
  143. cc->setStream_0(str);
  144. cc->setPadding_0(pad);
  145. pkt->setType(0x85);
  146. pkt->setCID(CID);
  147. pkt->setPN(++PN);
  148. pkt->setVersion(version);
  149. pkt->encapsulate(cc);
  150. send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket);
  151. }
  152. void connection_Setup::sendServerCleartext(uint32_t version,
  153. const char* string) {
  154. Server_Cleartext *sc = new Server_Cleartext();
  155. Long_Header *pkt = new Long_Header();
  156. Stream *str = new Stream();
  157. Ack *ack = new Ack();
  158. Padding *pad = new Padding();
  159. str->setType(0xcb);
  160. str->setStream_Id(0x00000000);
  161. str->setStream_Data("ServerCleartext");
  162. ack->setType(0xa8);
  163. ack->setLargest_Acknowledged(PN);
  164. ack->setAck_Block_Section(string);
  165. pad->setPad("000000000");
  166. sc->setAck_0(ack);
  167. sc->setStream_0(str);
  168. sc->setPadding_0(pad);
  169. pkt->setType(0x84);
  170. pkt->setCID(CID);
  171. pkt->setPN(++PN);
  172. pkt->setVersion(version);
  173. pkt->encapsulate(sc);
  174. send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket);
  175. }
  176. void connection_Setup::sendServerStatelessRetry(uint32_t version,
  177. const char* string) {
  178. Server_Stateless_Retry *ssr = new Server_Stateless_Retry();
  179. Long_Header *pkt = new Long_Header();
  180. Stream *str = new Stream();
  181. str->setType(0xcb);
  182. str->setStream_Id(0x00000000);
  183. str->setStream_Data("ServerStatelessRetry");
  184. ssr->setStream_0(str);
  185. pkt->setType(0x84);
  186. pkt->setCID(CID);
  187. pkt->setPN(++PN);
  188. pkt->setVersion(version);
  189. pkt->encapsulate(ssr);
  190. send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket);
  191. }
  192. void connection_Setup::sendRTTProtected(uint32_t version, const char* string) {
  193. _0_RTT_Protected *rp = new _0_RTT_Protected();
  194. Long_Header *pkt = new Long_Header();
  195. Stream *str = new Stream();
  196. str->setType(0xcb);
  197. str->setStream_Id(0x00000000);
  198. str->setStream_Data("RTTProtected");
  199. rp->setStream_0(str);
  200. pkt->setType(0x86);
  201. pkt->setCID(CID);
  202. pkt->setPN(++PN);
  203. pkt->setVersion(version);
  204. pkt->encapsulate(rp);
  205. send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket);
  206. }