Beispiel #1
0
void
TcpSrcPeriodic::doNextEvent() {
    if (_idle_time==0||_active_time==0) {
        _is_active = true;
        startflow();
        return;
    }

    if (_is_active) {
        if (eventlist().now()>=_end_active && _idle_time!=0 && _active_time!=0 ) {
            _is_active = false;

            //this clears RTOs too
            reset();
            eventlist().sourceIsPendingRel(*this,(simtime_picosec)(2*drand()*_idle_time));
        }
        else if (_rtx_timeout_pending) {
            TcpSrc::doNextEvent();
        }
        else {
            cout << "Wrong place to be in: doNextDEvent 1" << eventlist().now() << " end active " << _end_active << "timeout " << _rtx_timeout_pending << endl;
            //maybe i got a timeout here. How?
            exit(1);
        }
    }
    else {
        _is_active = true;
        ((TcpSinkPeriodic*)_sink)->reset();
        _start_active = eventlist().now();
        _end_active = _start_active + (simtime_picosec)(2*drand()*_active_time);
        eventlist().sourceIsPending(*this,_end_active);
        startflow();
    }
}
Beispiel #2
0
void
TcpRtxTimerScanner::doNextEvent()
{
    simtime_picosec now = eventlist().now();
    tcps_t::iterator i;
    for (i = _tcps.begin(); i!=_tcps.end(); i++) {
        (*i)->rtx_timer_hook(now);
    }
    eventlist().sourceIsPendingRel(*this, _scanPeriod);
}
Beispiel #3
0
void SinkLoggerSampling::doNextEvent(){
	eventlist().sourceIsPendingRel(*this,_period);  
	simtime_picosec now = eventlist().now();
	simtime_picosec delta = now - _last_time;
	_last_time = now;

	for (uint64_t i=0;i<_sinks.size();i++){
	  TcpAck::seq_t deltaB = _sinks[i]->_cumulative_ack - _last_seq[i];
	  double rate = deltaB * 1000000000000.0 / delta;//Bps

	  _last_seq[i] = _sinks[i]->_cumulative_ack;

	  _logfile->writeRecord(TcpLogger::TCP_SINK,_sinks[i]->id,TcpLogger::RATE,rate,0.0,0.0);
	}
}
Beispiel #4
0
void
TcpSrc::retransmit_packet() {
    TcpPacket* p = TcpPacket::newpkt(_flow, *_route, _last_acked+1, _mss);
    p->flow().logTraffic(*p,*this,TrafficLogger::PKT_CREATESEND);
    _last_sent_time = eventlist().now();
    p->sendOn();
}
Beispiel #5
0
void
TcpSrc::connect(route_t& routeout, route_t& routeback, TcpSink& sink, simtime_picosec starttime)
{
    _route = &routeout;
    _sink = &sink;
    _flow.id = id; // identify the packet flow with the TCP source that generated it
    _sink->connect(*this, routeback);
    eventlist().sourceIsPending(*this,starttime);
}
Beispiel #6
0
void
AggregateTcpLogger::doNextEvent() {
	eventlist().sourceIsPending(*this,max(eventlist().now()+_period,_logfile->_starttime));
	double totunacked=0;
	double toteffcwnd=0;
	double totcwnd=0;
	int numflows=0;
	for (tcplist_t::iterator i = _monitoredTcps.begin(); i!=_monitoredTcps.end(); i++) {
		TcpSrc* tcp = *i;
		uint32_t cwnd = tcp->_cwnd;
		uint32_t unacked = tcp->_unacked;
		uint32_t effcwnd = tcp->_effcwnd;
		totcwnd += cwnd;
		toteffcwnd += effcwnd;
		totunacked += unacked;
		numflows++;
		}
	_logfile->writeRecord(TcpLogger::TCP_RECORD,id,TcpLogger::AVE_CWND,totcwnd/numflows,totunacked/numflows,toteffcwnd/numflows);
	}
Beispiel #7
0
void
TcpSrc::send_packets() {
    while ( _last_acked + _cwnd >= _highest_sent + _mss) {
        TcpPacket* p = TcpPacket::newpkt(_flow, *_route, _highest_sent+1, _mss);
        p->flow().logTraffic(*p,*this,TrafficLogger::PKT_CREATESEND);
        _highest_sent += _mss;  //XX beware wrapping
        _last_sent_time = eventlist().now();
        p->sendOn();
    }
}
Beispiel #8
0
void
QueueLoggerSampling::doNextEvent() 
	{
	eventlist().sourceIsPendingRel(*this,_period);
	if (_queue==NULL) return;
	mem_b queuebuff = _queue->_maxsize;
	if (!_seenQueueInD) { // queue size hasn't changed in the past D time units
		_logfile->writeRecord(QUEUE_APPROX,_queue->id,QUEUE_RANGE,(double)_lastq,(double)_lastq,(double)_lastq);
		_logfile->writeRecord(QUEUE_APPROX,_queue->id,QUEUE_OVERFLOW,0,0,(double)queuebuff);
		}
	else { // queue size has changed
		_logfile->writeRecord(QUEUE_APPROX,_queue->id,QUEUE_RANGE,(double)_lastq,(double)_minQueueInD,(double)_maxQueueInD);
		_logfile->writeRecord(QUEUE_APPROX,_queue->id,QUEUE_OVERFLOW,-(double)_lastIdledInD,(double)_lastDroppedInD,(double)queuebuff);
		}
	_seenQueueInD=false;
	simtime_picosec now = eventlist().now();
	simtime_picosec dt_ps = now-_lastlook;
	_lastlook = now;
	if ((_queue!=NULL) & (_queue->_queuesize==0)) _cumidle += timeAsSec(dt_ps); // if the queue is empty, we've just been idling
	_logfile->writeRecord(QUEUE_RECORD,_queue->id,CUM_TRAFFIC,_cumarr,_cumidle,_cumdrop);
	}
Beispiel #9
0
void
QueueLoggerSampling::logQueue(Queue& queue, QueueEvent ev, Packet &pkt) {
	if (_queue==NULL) _queue=&queue;
	assert(&queue==_queue);
	_lastq = queue._queuesize;
	if (!_seenQueueInD) {
		_seenQueueInD=true;
		_minQueueInD=queue._queuesize;
		_maxQueueInD=_minQueueInD;
		_lastDroppedInD=0;
		_lastIdledInD=0;
		_numIdledInD=0;
		_numDropsInD=0;
		}
	else {
		_minQueueInD=min(_minQueueInD,queue._queuesize);
		_maxQueueInD=max(_maxQueueInD,queue._queuesize);
		}
	simtime_picosec now = eventlist().now();
	simtime_picosec dt_ps = now-_lastlook;
	double dt = timeAsSec(dt_ps);
	_lastlook = now;
	switch(ev) {
		case PKT_SERVICE: // we've just been working
			break;
		case PKT_ENQUEUE:
			_cumarr += timeAsSec(queue.drainTime(&pkt));
			if (queue._queuesize>pkt.size()) // we've just been working
				{}
			else { // we've just been idling 
				mem_b idledwork = queue.serviceCapacity(dt_ps);
				_cumidle += dt; 
				_lastIdledInD = idledwork;
				_numIdledInD++;
				}
			break;
		case PKT_DROP: // assume we've just been working
			assert(queue._queuesize>=pkt.size()); // it is possible to drop when queue is idling, but this logger can't make sense of it
			double localdroptime = timeAsSec(queue.drainTime(&pkt));
			_cumarr += localdroptime;
			_cumdrop += localdroptime;
			_lastDroppedInD = pkt.size();
			_numDropsInD++;
			break;
		}
	}