2013-03-31 4 views
0

м работает над NS2 ... сделал некоторые изменения в aodv.cc и добавлены некоторые функции моегоошибки сегментации в ns2

недействительным nb_traffic_update (INT ид, структура nb_traffic_stat ** nblist, внутр нидь, внутр флаг, int hop_count)

.., чтобы обнаружить атаку воронки. Когда m запускает код с небольшим количеством узлов, я получаю результаты, но когда я увеличиваю количество узлов, я получаю ошибку сегментации. Это мой nb_traffic.h файл

struct nb_traffic_stat 
    { 
     int id; 
     int recvrequest; 
     int routereply; 
     int no_of_hops; 
     //int no_of_updation; 
     struct nb_traffic_stat *next; 
    }; 
    struct traffic_stat 
    { 
     int id; 
     struct nb_traffic_stat **list; 
     struct traffic_stat *next; 
    }; 
    struct ftraffic_stat 
    { 
     int sendrequest; 
     int routereply; 
    }; 

модификация aodv.cc

struct traffic_stat *tlist=NULL,*ttail=NULL; 
    void 
    AODV::recvReply(Packet *p) { 
    ... 
    if (ih->daddr() == index) { // If I am the original source 
    ..... 

    nb_traffic_update(index,&nblist,ih->saddr(),1,rp->rp_hop_count);//1 is for receiving the route reply 

    } 
    } 

    void 
    AODV::recvRequest(Packet *p) { 
    .... 
    /*after ensuring this is the new routerequest*/ 

    struct hdr_cmn *ch = HDR_CMN(p); 
    if(ch->num_forwards()==1) 
    { 
     nb_traffic_update(index,&nblist,rq->rq_src,0,0);//0 is for receiving the request 
    } 
    } 

моя функция обновления сосед трафика

void nb_traffic_update(int id,struct nb_traffic_stat **nblist,int nid,int flag,int hop_count) 
    { 
     int n; 
     //printf("inside nb_traffic_update:%d\n",id); 
     if(*nblist==NULL) 
     { 
      struct nb_traffic_stat *ptr; 
      ptr=(struct nb_traffic_stat*)malloc(sizeof(struct nb_traffic_stat)); 
      ptr->id=nid; 
      ptr->next=NULL; 
      if(flag==0) 
      { 
     ptr->recvrequest=1; 
      ptr->routereply=0; 
      ptr->no_of_hops=0; 
      //ptr->no_of_updation=0; 
      } 
      else 
      { 
      ptr->recvrequest=0; 
      ptr->routereply=1; 
      ptr->no_of_hops=hop_count; 
      //ptr->no_of_updation=1; 
      } 
      *nblist=ptr; 
      struct traffic_stat *sptr; 
      sptr=tlist; 
      while(sptr!=NULL&&sptr->id!=id) 
      { 
       sptr=sptr->next; 
      } 
      assert(sptr!=NULL); 
      sptr->list=nblist; 
     } 
    else 
    { 
     int found=0; 
     struct nb_traffic_stat *tptr,*prevtptr; 
     tptr=*nblist; 
     while(tptr!=NULL&&tptr->id<=nid) 
     { 
      if(tptr->id==nid) 
      { 
       found=1; 
       break; 
      } 
      prevtptr=tptr; 
      tptr=tptr->next; 
     } 
     if(found) 
     { 
      if(flag==0) 
      { 
      tptr->recvrequest++; 
      } 
      else 
      { 
       tptr->routereply++; 
       tptr->no_of_hops=hop_count; 
       //tptr->no_of_updation++; 
      } 

     } 
     else 
     { 
      struct nb_traffic_stat *ptr; 
      ptr=(struct nb_traffic_stat*)malloc(sizeof(struct nb_traffic_stat)); 
      ptr->id=nid; 
      if(flag==0) 
      { 
      ptr->recvrequest=1; 
       ptr->routereply=0; 
       ptr->no_of_hops=0; 
       //ptr->no_of_updation=0; 
      } 
      else 
      { 
       ptr->recvrequest=0; 
       ptr->routereply=1; 
       ptr->no_of_hops=hop_count; 
       //ptr->no_of_updation=1; 
      } 
      ptr->next=prevtptr->next; 
      prevtptr->next=ptr; 
     } 

     } 
     } 
+1

Вы можете разместить изменения, внесенные вами в код AODV? Упомяните об этом в комментариях. – doptimusprime

+0

Можете ли вы просто показать точные линии, которые бросают segfault? – Shoe

+0

@dbasic В классе AODV i hve добавлена ​​структура nb_traffic_stat * nblist; .. n других изменений, которые я сделал ... уже упоминалось ... моя основная проблема - когда я запускаю симуляцию для 4-5 узлов, я получаю правильные результаты и нет ошибки, но когда я увеличиваю значение без ответа 9, я получаю ошибку сегментации. То же самое происходит, когда я увеличиваю симуляцию tym. Это что-то, что происходит из-за проблемы с памятью? –

ответ

1

Вы не проверяла nblist быть внутри NULL nb_traffic_update(int, nb_traffic_stat**, int, int, int), что приводит к segfault.

Также в условном заявлении if (*nblist==NULL) Вы делаете: *nblist=ptr;. Это означает, что *NULL = ptr; может вызвать segfault.

+0

@dbasic yes Я инициализировал nblist как null в конструкторе AODV .. при выполнении вызова nb_traffic_update я отправляю адрес nblist (m пытается создать связанный список соседей, которые отправляют данные на этот узел). –

+0

@Jueccy Я поместил чек для nblist == NULL .. но все еще получаю ошибку !! –

+0

@GarimaGoyal, см. Редактирование. – Shoe

1

Запустите Tcl с помощью GDB он будет показывать функцию, которая вызывает ошибку сегмента ...

для бывших, GDB -args нс путь/к/TCL/script.tcl

+0

Спасибо ... вы только что сэкономили много времени –

Смежные вопросы