00001 #include "headers.h"
00002
00012
00018 SAR::SAR(PacketWriter* packetWriter, int serviceNumber)
00019 {
00020 m_serviceNumber = serviceNumber;
00021 m_packetWriter = packetWriter;
00022 m_receive = new ReceiveWindow(WINDOW_SIZE, this);
00023 MEMCHECK(m_receive);
00024 m_send = new SendWindow(WINDOW_SIZE, this);
00025 MEMCHECK(m_send);
00026 m_buffer = NULL;
00027 }
00028
00029
00033 SAR::~SAR()
00034 {
00035
00036 connectionClosed();
00037 delete m_receive;
00038 m_receive = NULL;
00039 delete m_send;
00040 m_send = NULL;
00041 }
00042
00043
00049 int
00050 SAR::reliableSend(u_char* data, int dataLength)
00051 {
00052
00053 int bytesSent = m_send->reliableSend(data, dataLength);
00054
00055 return bytesSent;
00056 }
00057
00058
00070 int
00071 SAR::receive(u_char* buffer, int bufferLength) {
00072 return m_receive->receive(buffer, bufferLength);
00073 }
00074
00075
00081 void
00082 SAR::receivePacket(TpPacket* packet)
00083 {
00084 if (packet->isAck())
00085 {
00086
00087 debug(DEBUG_SAR, "receivePacket: Got ACK %d", packet->getAckNum());
00088 m_send->onAckRecvd(packet->getAckNum(), packet->getCredits(), packet->isRetrans());
00089 delete packet;
00090 }
00091 else
00092 {
00093
00094 debug(DEBUG_SAR, "receivePacket: Got data");
00095 m_receive->addReceive(packet);
00096 }
00097 }
00098
00099
00104 int
00105 SAR::sendDataPacket(TpPacket* packet)
00106 {
00107 return m_packetWriter->sendDataPacket(m_serviceNumber, packet);
00108 }
00109
00110
00114 TimeValue
00115 SAR::getAverageRtt() {
00116 return m_send->getRtt();
00117 }
00118
00119
00123 void
00124 SAR::connectionClosed() {
00125 m_send->end();
00126 m_receive->close();
00127 }
00128
00129
00130 void
00131 SAR::toStream(std::ostream& s) {
00132 s << "SAR\n";
00133 s << "---\n";
00134 s << "Receive Window:\n";
00135 s << *m_receive;
00136 s << "Send Window:\n";
00137 s << *m_send;
00138 }