/* * connection_Setup.cc * * Created on: Feb 7, 2018 * Author: anay */ /* * connection_Setup.cpp * * Created on: Nov 27, 2017 * Author: anay */ #include #include #include #include "connection_Setup.h" using namespace inet; void connection_Setup::initialize(int stage) { int port = 1024; socket = create_UDPSocket(L3Address(), port); } void connection_Setup::handleMessage(cMessage *msg) { if (PN == 1 && msg->isSelfMessage()) { sendClientInitial(0x00000002, "FirstMessage"); } if (PN == 1 && msg->arrivedOn("udpOut") && pkt == dynamic_cast(msg)) { if (pkt->getVersion() == 0x0000001 || pkt->getVersion() == 0x0000002) { version = pkt->getVersion(); if (pkt->getType() == 0x81) { receiveVersionNegotiation(pkt); } if (pkt->getType() == 0x82) { receiveClientInitial(pkt); } if (pkt->getType() == 0x83) { receiveServerStatelessRetry(pkt); } if (pkt->getType() == 0x84) { receiveServerCleartext(pkt); } if (pkt->getType() == 0x85) { receiveClientCleartext(pkt); } if (pkt->getType() == 0x86) { receiveRTTProtected(pkt); } } else { sendVersionNegotiation(); } } } void connection_Setup::sendVersionNegotiation() { Version_Negotiation *msg = new Version_Negotiation; Long_Header *pkt = new Long_Header(); msg->setVersions("0x0000001, 0x00000002"); pkt->setType(0x81); pkt->setCID(0x0101010101010101); pkt->setPN(PN); pkt->setVersion(0x00000002); pkt->encapsulate(msg); send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket); } void connection_Setup::receiveVersionNegotiation(Long_Header *pkt) { Version_Negotiation *vn = dynamic_cast(pkt->decapsulate()); std::cout << vn->getVersions() << endl; } void connection_Setup::sendClientInitial(uint32_t version, const char* stream) { Client_Initial *msg = new Client_Initial(); Long_Header *pkt = new Long_Header(); Stream *str = new Stream(); str->setType(0xcb); str->setStream_Id(0x00000000); str->setStream_Data("FirstCount"); msg->setStream_0(str); pkt->setType(0x82); pkt->setCID(0x0101010101010101); pkt->setPN(PN); pkt->setVersion(0x00000002); pkt->encapsulate(msg); send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket); } void connection_Setup::receiveClientInitial(Long_Header *pkt) { CID = pkt->getCID(); Client_Initial *ci = dynamic_cast(pkt->decapsulate()); Stream *str = new Stream(); str = ci->getStream_0(); std::cout << str->getStream_Id() << "\t" << str->getStream_Data() << endl; sendServerCleartext(version, str->getStream_Data()); } void connection_Setup::receiveClientCleartext(Long_Header *pkt) { Client_Cleartext *cc = dynamic_cast(pkt->decapsulate()); Ack* ack = cc->getAck_0(); Stream* stream = cc->getStream_0(); Padding* pad = cc->getPadding_0(); lastAckPn = ack->getLargest_Acknowledged(); std::cout << stream->getStream_Id() << "\t" << stream->getStream_Data() << endl; std::cout << strlen(pad->getPad()) << endl; sendRTTProtected(pkt->getVersion(), "SendingData"); } void connection_Setup::receiveServerCleartext(Long_Header *pkt) { Server_Cleartext *sc = dynamic_cast(pkt->decapsulate()); Ack* ack = sc->getAck_0(); Stream* stream = sc->getStream_0(); Padding* pad = sc->getPadding_0(); lastAckPn = ack->getLargest_Acknowledged(); std::cout << stream->getStream_Id() << "\t" << stream->getStream_Data() << endl; std::cout << strlen(pad->getPad()) << endl; sendClientCleartext(pkt->getVersion(), stream->getStream_Data()); } void connection_Setup::receiveServerStatelessRetry(Long_Header *pkt) { Server_Stateless_Retry *ssr = dynamic_cast(pkt->decapsulate()); Stream* stream = ssr->getStream_0(); std::cout << stream->getStream_Id() << "\t" << stream->getStream_Data() << endl; } void connection_Setup::receiveRTTProtected(Long_Header *pkt) { _0_RTT_Protected *rp = dynamic_cast<_0_RTT_Protected*>(pkt->decapsulate()); Stream* stream = rp->getStream_0(); std::cout << stream->getStream_Id() << "\t" << stream->getStream_Data() << endl; sendRTTProtected(pkt->getVersion(), "SendingData2"); } void connection_Setup::sendClientCleartext(uint32_t version, const char* stream) { Client_Cleartext *cc = new Client_Cleartext(); Long_Header *pkt = new Long_Header(); Stream *str = new Stream(); Ack *ack = new Ack(); Padding *pad = new Padding(); str->setType(0xcb); str->setStream_Id(0x00000000); str->setStream_Data("ClientCleartext"); ack->setType(0xa8); ack->setLargest_Acknowledged(PN); ack->setAck_Block_Section(stream); pad->setPad("000000000"); cc->setAck_0(ack); cc->setStream_0(str); cc->setPadding_0(pad); pkt->setType(0x85); pkt->setCID(CID); pkt->setPN(++PN); pkt->setVersion(version); pkt->encapsulate(cc); send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket); } void connection_Setup::sendServerCleartext(uint32_t version, const char* string) { Server_Cleartext *sc = new Server_Cleartext(); Long_Header *pkt = new Long_Header(); Stream *str = new Stream(); Ack *ack = new Ack(); Padding *pad = new Padding(); str->setType(0xcb); str->setStream_Id(0x00000000); str->setStream_Data("ServerCleartext"); ack->setType(0xa8); ack->setLargest_Acknowledged(PN); ack->setAck_Block_Section(string); pad->setPad("000000000"); sc->setAck_0(ack); sc->setStream_0(str); sc->setPadding_0(pad); pkt->setType(0x84); pkt->setCID(CID); pkt->setPN(++PN); pkt->setVersion(version); pkt->encapsulate(sc); send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket); } void connection_Setup::sendServerStatelessRetry(uint32_t version, const char* string) { Server_Stateless_Retry *ssr = new Server_Stateless_Retry(); Long_Header *pkt = new Long_Header(); Stream *str = new Stream(); str->setType(0xcb); str->setStream_Id(0x00000000); str->setStream_Data("ServerStatelessRetry"); ssr->setStream_0(str); pkt->setType(0x84); pkt->setCID(CID); pkt->setPN(++PN); pkt->setVersion(version); pkt->encapsulate(ssr); send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket); } void connection_Setup::sendRTTProtected(uint32_t version, const char* string) { _0_RTT_Protected *rp = new _0_RTT_Protected(); Long_Header *pkt = new Long_Header(); Stream *str = new Stream(); str->setType(0xcb); str->setStream_Id(0x00000000); str->setStream_Data("RTTProtected"); rp->setStream_0(str); pkt->setType(0x86); pkt->setCID(CID); pkt->setPN(++PN); pkt->setVersion(version); pkt->encapsulate(rp); send_packet(pkt, L3AddressResolver().resolve("node2"), 1023, socket); }