2013-03-31 4 views
0

travaille sur NS2 ... a fait quelques changements dans aodv.cc et a ajouté quelques fonctions de mon propreerreur de segmentation dans NS2

nb_traffic_update void (int id, struct nb_traffic_stat ** nblist, int JNV, drapeau int, int hop_count)

..pour détecter une attaque de gouffre .. lors de l'exécution du code avec un petit nombre de nœuds, j'obtiens des résultats mais quand j'augmente le nombre de nœuds, j'obtiens un défaut de segmentation. Ceci est mon fichier 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; 
    }; 

modification 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 
    } 
    } 

ma fonction de mise à jour du trafic voisin

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

Pouvez-vous poster les changements que vous avez faits dans le code AODV? Mentionnez-le dans les commentaires. – doptimusprime

+0

Pouvez-vous juste montrer les lignes exactes qui lancent segfault? – Shoe

+0

@dbasic En classe AODV j'ai ajouté struct nb_traffic_stat * nblist; .. n autres changements que j'ai faits ... ont déjà mentionné ... mon problème principal est quand je lance la simulation pour 4-5 nœuds j'obtiens des résultats corrects et pas d'erreur mais quand j'augmente le non dire 9, je reçois la faute de segmentation .. la même chose arrive quand j'augmente la simulation tym..est-ce quelque chose qui se passe en raison de problème de mémoire ?? –

Répondre

1

Vous n'êtes pas la vérification de nblist à NULL dans la nb_traffic_update(int, nb_traffic_stat**, int, int, int) fonction, ce qui conduit à la segfault.

Également dans l'instruction conditionnelle if (*nblist==NULL) vous faites: *nblist=ptr;. Ce qui signifie *NULL = ptr; qui peut provoquer le segfault.

+0

@dbasic oui j'ai initialisé nblist comme null dans le constructeur AODV..quand faire un appel à nb_traffic_update j'envoie l'adresse de nblist (m essayant de créer une liste chaînée de voisins qui envoient des données à ce noeud) .. –

+0

@Jueccy J'ai mis un chèque pour nblist == NULL..mais encore obtenir l'erreur !! –

+0

@GarimaGoyal, voir la modification. – Shoe

1

Lancez votre tcl avec gdb il affichera la fonction qui provoque la faute du segment ...

Ex, gdb -args ns path/to/tcl/script.tcl

+0

Merci ... vous venez d'économiser beaucoup de mon temps –