6 Ekim 2008 Pazartesi

QueueDizdar.cc




#include "queueDizdar.h"

static class QueueDizdarClass : public TclClass {
public:
QueueDizdarClass() : TclClass("Queue/QueueDizdar") {}
TclObject* create(int, const char*const*) {
return (new QueueDizdar);
}
} class_queue_dizdar;

void QueueDizdar::enque(Packet* p) {
if(dusurmeTipi == 0) { //önden düşürme = front drop
if((kuyruk->length()) >= qlim_){//is queue full
//add the received packet to the end of the queue
kuyruk->enque(p);
//will be the first packet in the list
Packet* listedeIlkPaket;
//find the first packet
listedeIlkPaket = kuyruk->head();
//deque the first packet in the queue
//so the head will automaticaly jumps to
//next one on the queue
kuyruk->deque();
//drop that first packet that was just released
drop(listedeIlkPaket);
}else{//if not full add received packet
kuyruk->enque(p);
}

}else{
if(dusurmeTipi == 1) { //sondan düşürme = end drop
if(kuyruk->length() >= qlim_){//is queue full??
drop(p);
}else{
kuyruk->enque(p);
}

}else{ //rastgele düşürme = random drop
if(kuyruk->length() >= qlim_){//is queue full??
kuyruk->enque(p);
Packet* dusurulecekPaket;//this is the one which will be dropped
//find the packet by random number
//this is done by the lookup function
//func. returns the n th. packet
dusurulecekPaket = kuyruk->lookup(Random::integer(kuyruk->length()));
kuyruk->remove(dusurulecekPaket);//remove the selected packet
//from the queue
drop(dusurulecekPaket);
}else{
kuyruk->enque(p);
}
}
}
}

Packet* QueueDizdar::deque() {
kuyruk->deque();
}


QueueDizdar.h



/*
önden, sondan yada rastgele paket düşürmeli
kuyruk boyu ayarlanabilir
kuyruk deneyi 1

front, end or random drop style
queue length can be set
(queue experiment no:1)

Ferhat Umut DİZDAR fumutdizdar@gmail.com
ferhat.umut@gmail.com
*/
#include "queue.h"
#include <math.h>
#include <sys/types.h>
#include "random.h"


class QueueDizdar : public Queue {
public :
QueueDizdar () {
//real queue derived from PacketQueue
kuyruk = new PacketQueue;
dusurmeTipi = 1;
//dusurmeTipi Tcl connection
//so dusurmeTipi can be reached through TCL
bind("dusurmeTipi", &dusurmeTipi);
}
~QueueDizdar() {}
protected :
void enque(Packet* p);
Packet* deque();
PacketQueue* kuyruk;
int dusurmeTipi;
//0=önden düşürmeli=frontdrop
//1=sondan düşürmeli=enddrop
//2=rastgele=randomdrop
};



5 Ekim 2008 Pazar

NS ve ( error: two or more data types in declaration of ) hatası..

Bu hatanın nedeni noktalı virgül. Evet, bu kadar basit. Bana tam olarak 2 saate mal oldu. Yeni bir kuyruk tipini denemek için hazırladığım bir adet .cc ve bir adet .h uzantılı kodu derlemeye çalışırken karşılaştım. Hatayı .cc sayfasında göstemesine rağmen aslında hata header dosyasındaki class tanımlamasından sonra ";" ü unutmuş olmamdan kaynaklanıyormuş..

Agent ve send..

Bir agent için, send komutu verildiğinde, agent, bunu;
send(Packet* p, Handler* h) { target_->recv(p, h); } şeklinde yorumlar.

Agent connector sınıfından türemiştir ve connector de target;
inline NsObject* target() { return target_; } şeklinde tanımlanmıştır.
Yani bir NsObject nesnesinin yerini gösteren bir pointerdır aslında target.

Böylece aslında send komutu bir diğer nesnenin recv fonksiyonuna paketin ulaşmasını sağlar.

Gönderim - Alım zamanı gibi birimler double olarak tanımlanır. Bu değişkenlere o anın zaman etiketi yazılmak istenirse;
hdrCevap->gonderimZamani = Scheduler::instance().clock(); denmelidir.

4 Ekim 2008 Cumartesi

Class Queue ve Class PacketQueue

Aslında Queue sınıfının yaptığı pek bir şey yok. Zaten paket Queue ya ulaşınca recv fonksiyonu çağrılıyor ve önce enque ve sonrada deque çağrılıyor. Bu iki fonksiyon Queue sınıfında virtual tanımlı ve boş.
Queue diğer kuyruk sınıflarına temel olması için tasarlanmış. Ama genel olarak enque ve deque fonksiyonlarını sağlayan PacketQueue kullanılıyor.
PacketQueue sınıfında tanımlı enque fonksiyonu gelen paketi, eğer listede başka paket yoksa en başa kaydediyor. Listede paket varsa, bir önceki paketin "sıradaki paket" yani next alanını yeni gelen paketi gösterecek şekilde ayarlayıp yeni paketi de listeye ekliyor, liste boyutunu arttırıyor ve kuyruk sonu işaretçisini son gelen paketi gösterecek hale getiriyor.
Deque fonksiyonu ise, FIFO mantığı ile, head ile işaret edilen yani listedeki ilk paketi listeden kaldırmak için tasarlanmış. Bu fonksiyon head işaretçisini, listede yer alan sıradaki pakete yönlendiriyor ve kuyruk boyunu bir azaltıyor..

1 Ekim 2008 Çarşamba

ECN ve Çakışma..

ECN ve Çakışma Engelleme..
IP headerında ECN için iki bit ayrılmıştır. Acrıca TCP, TCP headerında yer alan iki adet bayrağı(ECN-Echo ve CWR - Congestion Window Reduced) da kullanır. ECN nin amacı paket düşürmeden, çakışmayı engelleyebilmektir.

TCP de ECN nin kullanımı seçimliktir. Eğer kullanılacak ise iki tarafında bu hususta anlaşmış olmaları gerekir.

Eğer anlaşma gerçekleşirse, gönderici gönderdiği bütün paketleri ECN-capable codepoint ile işaretler. Yaklaşan bir çakışmayı fark eden router paketleri düşürmek yerine Congestion Experienced Codepoint ile işaretler.

Alıcı bu işaretli segmenti alınca, göndericiye, ECN-echo bayrağı set edilmiş bir ACK yollar. Gönderici, congestion window boyutunu düşürür ve bunu Congestion Window Reduced codepoint ile işaretlenmiş bir paket göndererek bildirir..

Tcl dosyalarına komut yollama..

    sprintf(out, "%s recv %d %3.1f", name(),
hdrip->src_.addr_ >> Address::instance().NodeShift_[1],
(Scheduler::instance().clock()-hdr->send_time) * 1000);
Tcl& tcl = Tcl::instance();
tcl.eval(out);

Yukarıdaki kodun bir agent' ın C kodlarında yazıldığını varsayarsak bu durum da bu satıra gelindiğinde, nsin çalışmasına neden olan Tcl dosyası içerisinde yani simülasyonun yapıldığı tcl dosyası içerisinde, recv isimli bir prosedür aranacaktır.
Yani bu yolla C içerisinden Tcl içerisindeki bir fonksiyon çağrılabilir. Eğer Tcl içerisine yazılmış olan fonksiyondan bir değer geridöndürmemiz gerekse idi bunu da tcl.result(void) fonksiyonunu bir değişkene atayarak yapabilirdik.

Bu arada Packet* pkt = allocpkt(); komut verildiğinde yeni bir paket oluşturulur. Ancak bu komutu içinden çağırdığımız agent, muhtemelen başka agentlardan türemiştir ve her agent kendi sınıfına ait olan header kısmını doldurup yollar. Örneğin TCP agent kendi başlığını doldurmadan önce zaten başlığın common header ve IP header kısımları doldurulmuştur.