현재 flow를 확인하고 배열상으로 저장한다. 벡터를 사용할려다 실패했다..
ㅡㅡㅋ 거참 프로그래밍 실력 하고는
하긴 필요 없다 생각하고 100개의 구조체 배열을 만들었다.
그리고 모두 0으로 초기화 하고 패킷이 들어오면 식별 번호를 부여했다.
그러면 만사 오케이~ ㅋㅋ
flow 식별 및 첫 기준 데이타 입력
############################################################################
if(addr()==0)
{
if (strcmp(check_name,"ack")==0){
if ( ETHER_ADDR(dh->dh_ta)== 0){
if(flow_num == 0)
{
d_an[0].old_ack_num=seq;
d_an[0].ip_addr=dst1;
d_an[0].port_num=dport;
// printf("\nseq %d dst1 %d dport %d \n",d_an[0].old_ack_num,d_an[0].ip_addr,d_an[0].port_num);
flow_num++;
}
else
{
for(i=0; i<flow_num;i++)
{
if(d_an[i].ip_addr == dst1&&d_an[i].port_num == dport)
{
break;
}
}
// printf("\ni %d flow_num %d\n",i,flow_num);
if(i==flow_num)
{
d_an[flow_num].old_ack_num=seq;
d_an[flow_num].ip_addr=dst1;
d_an[flow_num].port_num=dport;
// printf("\nseq %d dst1 %d dport %d \n",d_an[flow_num].old_ack_num,d_an[flow_num].ip_addr,d_an[flow_num].port_num);
// printf("\ni %d flow_num %d\n",i,flow_num);
flow_num++;
}
}
}
}
}
##########################################################################
해당 flow의 식별 번호가 있을 경우 데이터는 저장 된다.만약을 위해 ip주소와 목적지 주소를 비교하고 포트 번호를 확인 하였다.
##########################################################################
if(addr()==0)
if (strcmp(check_name,"ack")==0)
if ( ETHER_ADDR(dh->dh_ta)== 0){//printf("\ntest2\n");
for(j=0; j<flow_num;j++)
{
if(d_an[j].ip_addr == dst1&&d_an[j].port_num == dport&& flow_num != 0)
{
d_an[j].last_ack_num=seq;
}
}
}
#########################################################################
recvDATA(packet *p) 함수안에 위와 같은 메커니즘을 구현하도록 한다.
#########################################################################
//======================================================================
//fix this
// if(addr()==0) printf("\ntest111111 ch->langth_of_q %d\t",ch->langth_of_q);
int i,j,t;
double up_sum,down_sum;
struct hdr_tcp *dh2 = HDR_TCP(p);
struct hdr_ip *iph =HDR_IP(p);
int src1 = Address::instance().get_nodeaddr(iph->saddr());
int dst1 = Address::instance().get_nodeaddr(iph->daddr());
int sport = Address::instance().get_nodeaddr(iph->sport());
int dport = Address::instance().get_nodeaddr(iph->dport());
int seq=dh2->seqno();
char *check_name = (char *)packet_info.name(ch->ptype());
double now = Scheduler::instance().clock();
if(now<=time_monitor)
if(addr()==0)
if (strcmp(check_name,"ack")==0){
if ( ETHER_ADDR(dh->dh_ra)== 0){
if(flow_num1 == 0)
{
u_an[0].old_ack_num=seq;
u_an[0].ip_addr=dst1;
u_an[0].port_num=dport;
//printf("\nseq %d dst %d dport %d \n",u_an[0].old_ack_num,u_an[0].ip_addr,u_an[0].port_num);
flow_num1++;
}
else
{
for(i=0; i<flow_num1;i++)
{
if(u_an[i].ip_addr == dst1&&u_an[i].port_num == dport)
{
break;
}
}
// printf("\ni %d flow_num1 %d\n",i,flow_num1);
if(i==flow_num1)
{
u_an[flow_num1].old_ack_num=seq;
u_an[flow_num1].ip_addr=dst1;
u_an[flow_num1].port_num=dport;
// printf("\nseq %d dst %d dport %d \n",u_an[flow_num1].old_ack_num,u_an[flow_num1].ip_addr,u_an[flow_num1].port_num);
flow_num1++;
}
}
}
}
//================================================================================================
if(addr()==0)
if (strcmp(check_name,"ack")==0)
if ( ETHER_ADDR(dh->dh_ra)== 0){//printf("\ntest2\n");
for(j=0; j<flow_num;j++)
{
if(u_an[j].ip_addr == dst1&&u_an[j].port_num == dport&& flow_num1 != 0)
{
u_an[j].last_ack_num=seq;
}
}
}
//================================================================================================
##########################################################################
마지막이다. 모니터링 시간이 넘고 체크가 한번도 되지 않았으며 flow 개수가 0이 아닐경우
모니터링의 마지막 동작이 움직인다.
##########################################################################
//======================================================================
if(time_monitor<=now&&R_chek==false&&flow_num !=0)
{
//printf("\nif(time_monitor<=now&&R_chek==false&&flow_num !=0)\n");
// printf("\n\nflow_num %d check_last_ack_time %d\n\n",(flow_num*2),check_last_ack_time);
//double up_d,down_d,f_d;
time_monitor =now;
time_monitor+=200;
check_last_ack_time=0;
up_d=0.0;
down_d=0.0;
f_d=0.0;
for(k=0; k<flow_num;k++)
{
up_d+=(u_an[k].last_ack_num - u_an[k].old_ack_num);
down_d+=(d_an[k].last_ack_num - d_an[k].old_ack_num);
printf("\nuplast %d upold %d dlast %d dold %d \n",u_an[k].last_ack_num,u_an[k].old_ack_num,d_an[k].last_ack_num,d_an[k].old_ack_num);
}
R=down_d/up_d;
time=now;
printf("\n\ntest3 %lf time %lf\n\n",R,time);
// if(check_over<=R) printf("\ntest %lf %lf \n",R,check_over);
// if(R<=check_under) printf("\ntest1 %lf %lf \n",R,check_under);
//R_chek=true;
for(t=0; t<flow_num;t++)
{
d_an[t].old_ack_num=d_an[t].last_ack_num;
u_an[t].old_ack_num=u_an[t].last_ack_num;
}
}
//======================================================================
이 모니터링의 큰 유의 사항은 시뮬레이션 시간과 비교해서 너무 큰 모니터링 시간이 걸리면 안된다는 것인데.. 노드 수가 많을 수록 모든 flow의 수에 대한 데이터를 채우기 어렵다. 원래는 초기화 한수 무한 반복이었는데..
후엔 이전 마지막 값을 초기값으로 다시 저장.. 혹 데이터가 갱신되지 않더라도 오류는 없게 만들었다.
또한 노드가 많고 트래픽이 많을 수록 모니터링의 적응 기간이 길어진다.
동작을 크게 해야할 필요가 있으며..
실험상 1500초를 넘어가면 세그먼트 에러가 뜨는것 같다.
ㅡㅡㅋ
거참...
현재 새로 NS2를 우분투를 새로 설치하여 실행하였으나..
모니터링 실험은 이전 몇번 뿐이었으니...
지금은... 잘 모르겠다.
진실인지..
곧 모니터링을 다시 만들어야 할 것 같으니.. 정확한 실험은 이내 다시 해 봐야 겠다.
'Network > Simulation' 카테고리의 다른 글
NS2의 802_11에 대한 의문점.. (0) | 2009.02.03 |
---|---|
재전송 수를 구간별로 적용시키기 위해 NS2 WLAN (0) | 2009.02.03 |
필요하면 어디서든 선언해 놓아야 한다... ns2 WLAN (0) | 2009.02.03 |
DIFS제어 방법 ns2 (0) | 2009.02.03 |
NS2에서 802_11의 재전송 수 포기에 따른 카운터를 세고 싶을 때 (0) | 2009.02.03 |