dosreduce.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:11k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<errno.h>
  4. #define INFINITY -1;
  5. #define INC 0
  6. int debug=0;
  7. typedef struct node {
  8.   int c;   /* color  0:white 1:grey 2:black */
  9.   int d;   /* Distance */
  10.   int p;   /* parent */
  11.   int id;   
  12. } node;
  13. typedef struct QueueItem{
  14.   struct node *u;
  15.   struct QueueItem *next;
  16. } QueueItem;
  17. typedef struct ATlinks{
  18.   int n1;
  19.   int n2;
  20.   struct ATlinks *next;
  21. } ATlinks;
  22. typedef struct CTinfo{
  23.   int src;          
  24.   int dst; 
  25.   int *path;    
  26.   int flag;   /* whether it should be used or not */
  27. } CTinfo;
  28. QueueItem *head, *tail;
  29. ATlinks *AThead, *ATtail;
  30. void enqueue(struct node *vertex );
  31. struct node* dequeue(void);
  32. void cleanq(void);
  33. int main(int argc, char **argv)
  34. {
  35.   int i,j,k, maxd,id1,id2,noattackers,wt;
  36.   int node_count,edges,victim;
  37.   FILE *fp;
  38.   struct node **V, *u;
  39.   struct ATlinks *newlink;
  40.   struct ATlinks *p;
  41.   struct CTinfo **CrossTraffic;
  42.   int **matrix;
  43.   char temp[30];
  44.   int pn1,pn2,*attackers;
  45.   int found,activeconn,pathlen;
  46.   int tempi;
  47.   int *FT,lc,nc;
  48.   if (argc < 3 ){
  49.     printf("Usage: %s inet_topology #attackers #activeconnectionsn",argv[0]);
  50.     exit(0);
  51.   }
  52.   noattackers = atoi(argv[2]);
  53.   activeconn = atoi(argv[3]);
  54.   
  55.   /* Read the node_count and edges for topo file */ 
  56.   if ( (fp = fopen(argv[1],"r")) == NULL ){
  57.     printf(" Error openning the adjanceny filen");
  58.     exit(1);
  59.   }
  60.   fscanf(fp,"%d %d",&node_count,&edges);
  61.   /* Ignore location infomation */
  62.   for(i=0;i<=node_count;i++){
  63.     fgets(temp,30,fp);
  64.   }
  65.   /* Randomly choose victim node */
  66.   victim = (int)((float)node_count*rand()/(RAND_MAX+1.0));
  67.   if(debug){
  68.     printf("node_count= %d edges %d victim=%dn",node_count,edges,victim);
  69.   }
  70.   /* Initialise all remaining vertices 
  71.    */
  72.   V = (struct node **)malloc(node_count*sizeof(node));
  73.   for(i=0;i<node_count;i++){
  74.     V[i] = (struct node *) malloc (sizeof(node));
  75.     V[i]->id=i;
  76.     V[i]->c=0;
  77.     V[i]->d=INFINITY;
  78.     V[i]->p=INFINITY;
  79.   }
  80.   
  81.   /* Initialise queue */
  82.   head = tail = NULL;
  83.   
  84.   /* Initialise the root of bfs tree 
  85.    * rootid can be the id of any node. like node 0 or leaf */
  86.   V[victim]->c = 1;
  87.   V[victim]->d = 0;
  88.   V[victim]->p = INFINITY;
  89.   enqueue(V[victim]);
  90.   
  91.   /* open file with adjaceny information */
  92.   matrix = (int**)malloc(node_count*sizeof(int*));
  93.   for(i=0;i<node_count;i++){
  94.     matrix[i] = (int*)malloc(node_count*sizeof(int));
  95.     for(j=0;j<node_count;j++){
  96.       matrix[i][j]=0;
  97.     }
  98.   }
  99.   for(i=0;i<edges;i++){
  100.     fscanf(fp,"%d %d %d",&id1,&id2,&wt);
  101.     matrix[id1][id2]=1;
  102.     matrix[id2][id1]=1;
  103.   }
  104.   close(fp);
  105.   
  106.   while(head){
  107.     u = (struct node *) malloc (sizeof(node));
  108.     if(u== NULL){
  109.       printf("Error allocationg un");
  110.       exit(1);
  111.     }
  112.     u=dequeue();
  113.     id1= u->id;
  114.     for(i=0;i<node_count;i++){
  115.       /* refer to adj matrix */
  116.       if(matrix[id1][i] == 1 ){
  117. if (V[i]->c == 0){
  118.   V[i]->c =1;
  119.   V[i]->d = u->d + 1;
  120.   V[i]->p = u->id;
  121.   enqueue(V[i]);
  122.       }
  123.     }
  124.       V[id1]->c = 2;
  125.       V[id1]->p = u->p;
  126.       V[id1]->d = u->d;
  127.   }
  128.   maxd =0;
  129.   /* print out all the information */
  130.   for (i=0;i<node_count;i++){
  131.     /* printf("id: %d c=%d d=%d p=%dn",V[i]->id,V[i]->c,V[i]->d,V[i]->p);  */
  132.      if(maxd < V[i]->d)
  133.        maxd = V[i]->d;
  134.   }    
  135.   if (debug) printf(" Max depth %dn",maxd);
  136.   
  137.   /* Choose the attackers randomly in the topology  */
  138.   attackers = (int*)malloc(noattackers*sizeof(int));
  139.   for(i=0;i<noattackers;i++){
  140.     attackers[i] = victim;
  141.     /* Ensure the victim and attackers are distinct */
  142.     while(attackers[i] == victim){
  143.       attackers[i]= (int)((float)node_count*rand()/(RAND_MAX+1.0));
  144.     }
  145.     if(debug)
  146.       printf("attacker[%d] = %dn",i,attackers[i]);
  147.   }
  148.   /* Record the attack tree links */
  149.   AThead = ATtail = NULL;
  150.   for(i=0;i<noattackers;i++){
  151.     pn1 = V[attackers[i]]->id;
  152.     pn2 = V[attackers[i]]->p;
  153.     while(pn2 != victim) {
  154.       if(AThead == NULL){
  155. if ( (newlink = (struct ATlinks *)malloc(sizeof(ATlinks))) == NULL){
  156.   printf("Error allocationg space for new ATlinkn");
  157.   exit(1);
  158. }
  159. newlink->n1=pn1;
  160. newlink->n2=pn2;
  161. AThead = newlink;
  162. ATtail = newlink;
  163. newlink->next = NULL;
  164.       } else {
  165. /* insert only if not already present */
  166. ATlinks *p = AThead;
  167. while (p){
  168.   if( (p->n1 != pn1) || (p->n2 != pn2) )
  169.     p = p->next; 
  170.   else 
  171.     break;
  172. }
  173. /* link not found */ 
  174. if(p==NULL){
  175.    if ( (newlink = (struct ATlinks *)malloc(sizeof(ATlinks))) == NULL){
  176.   printf("Error allocationg space for new ATlinkn");
  177.   exit(1);
  178. }
  179. newlink->n1=pn1;
  180. newlink->n2=pn2;
  181. newlink->next = NULL;
  182. ATtail->next = newlink;
  183. ATtail = newlink;
  184. } else {
  185.   /* reached common attack tree. Break from while */
  186.   break; 
  187. }
  188.       }
  189.       pn1 = pn2;
  190.       pn2 = V[pn1]->p;
  191.     }
  192.     /* Insert the last link before victim */ 
  193.     if(pn2 == victim){
  194.        if(AThead == NULL){
  195. if ( (newlink = (struct ATlinks *)malloc(sizeof(ATlinks))) == NULL){
  196.   printf("Error allocationg space for new ATlinkn");
  197.   exit(1);
  198. }
  199. newlink->n1=pn1;
  200. newlink->n2=pn2;
  201. AThead = newlink;
  202. ATtail = newlink;
  203. newlink->next = NULL;
  204.       } else {
  205.       /* insert only if not already present */
  206. ATlinks *p = AThead;
  207. while (p){
  208.   if( (p->n1 != pn1) || (p->n2 != pn2) )
  209.     p = p->next;
  210.   else 
  211.     break;
  212. }
  213.        /* link not found */ 
  214. if(p==NULL){
  215.    if((newlink = (struct ATlinks *)malloc(sizeof(ATlinks))) == NULL){
  216.   printf("Error allocationg space for new ATlinkn");
  217.   exit(1);
  218. }
  219. newlink->n1=pn1;
  220. newlink->n2=pn2;
  221. newlink->next = NULL;
  222. ATtail->next = newlink;
  223. ATtail = newlink;
  224. }
  225.       } /* end else */
  226.     }
  227.     
  228.   }
  229.   
  230.   /* print the attack tree  and encode into matrix */
  231.   i=0;
  232.   p = AThead;
  233.   while(p){
  234.      if(debug) printf("%d n1= %d n2= %dn",i++,p->n1,p->n2);
  235.       matrix[p->n1][p->n2] = 2;
  236.       p = p->next;
  237.   }
  238.   /* Now randomly choose the cross traffic source and sinks */
  239.   CrossTraffic = (struct CTinfo **)malloc(activeconn*sizeof(CTinfo));
  240.   for(k=0;k<activeconn;k++){
  241.     if ((CrossTraffic[k] = (struct CTinfo *)malloc(sizeof(CTinfo))) == NULL){
  242.       printf("%d:Error allocation Crosstraffic structuren",errno);
  243.       exit(1);
  244.     }
  245.     CrossTraffic[k]->src =(int)((float)node_count*rand()/(RAND_MAX+ 1.0));
  246.     CrossTraffic[k]->dst =(int)((float)node_count*rand()/(RAND_MAX+ 1.0));
  247.     if(CrossTraffic[k]->src == CrossTraffic[k]->dst){
  248.       while(CrossTraffic[k]->dst == CrossTraffic[k]->src)
  249. CrossTraffic[k]->dst =(int)((float)node_count*rand()/(RAND_MAX+ 1.0));
  250.     }
  251.     CrossTraffic[k]->flag = 0; /* Usable */
  252.     /* printf("src %d dst %dn",CrossTraffic[k]->src, CrossTraffic[k]->dst);
  253.        fflush(NULL); */
  254.     
  255.     /* fill path after bfs */
  256.     /* Initialise the V matrix */
  257.     for(i=0;i<node_count;i++){
  258.       V[i]->id=i;
  259.       V[i]->c=0;
  260.       V[i]->d=INFINITY;
  261.       V[i]->p=INFINITY;
  262.     }
  263.   
  264.     /* Initialise queue */
  265.     head = tail = NULL;
  266.     tempi = CrossTraffic[k]->src;
  267.     /* Initialise the root of bfs tree 
  268.      * rootid can be the id of any node. like node 0 or leaf */
  269.     V[tempi]->c = 1;
  270.     V[tempi]->d = 0;
  271.     V[tempi]->p = INFINITY;
  272.     enqueue(V[tempi]);
  273.     found=0;
  274.     while(head){
  275.       if((u = (struct node *)malloc(sizeof(node))) == NULL){
  276. printf("out of memory for u %dn",errno);
  277. exit(1);
  278.       }
  279.       u=dequeue();
  280.       id1= u->id;
  281.       for(i=0;i<node_count;i++){
  282. /* refer to adj matrix */
  283. if(matrix[id1][i] != 0 ){
  284.   if (V[i]->c == 0){
  285.     V[i]->c =1;
  286.     V[i]->d = u->d + 1;
  287.     V[i]->p = u->id;
  288.     if (V[i]->id == CrossTraffic[k]->dst){
  289.       found = 1;
  290.       pathlen = V[i]->d;
  291.       break; 
  292.     }
  293.     enqueue(V[i]);
  294.   } 
  295. }
  296.       }
  297.       if(found == 1){ 
  298. cleanq();
  299. break;
  300.       }
  301.       V[id1]->c = 2;
  302.       V[id1]->p = u->p;
  303.       V[id1]->d = u->d;
  304.     }
  305.     /* print the information */
  306.     if(debug)
  307.       printf("%d Src %d Dst %d Path ",k,CrossTraffic[k]->src,CrossTraffic[k]->dst);
  308.     /* Find the path from src to dst */
  309.     /* Stored dst, dst-1...src */ 
  310.     CrossTraffic[k]->path = (int*)malloc(sizeof(pathlen));
  311.     for(j=pathlen;j>=0;j--){
  312.       if(j==pathlen)
  313. CrossTraffic[k]->path[j] = CrossTraffic[k]->dst;
  314.       else {
  315. tempi = CrossTraffic[k]->path[j+1];
  316. CrossTraffic[k]->path[j] = V[tempi]->p;
  317.       }
  318.       if(debug)
  319. printf("%d ",CrossTraffic[k]->path[j]);
  320.     }
  321.   
  322.     /* Matrix encoding 
  323.      * 0 = no link 
  324.      * 1 = link ( no traffic )
  325.      * 2 = attack link only 
  326.      * 3 = attack + cross traffic link 
  327.      * 4 = cross traffic link only but path on AT  
  328.      * 5 = only one flow of cross traffic 
  329.      * 6 = more than one flow of cross traffic on link 
  330.      *
  331.      * Flag encoding 
  332.      * 0 : discard 
  333.      * 1 : shared attack tree 
  334.      * 2 : shared cross traffic links 
  335.      **** */ 
  336.     /* Check is flag should change */ 
  337.     for(j=0;j<pathlen;j++){
  338.       if((matrix[CrossTraffic[k]->path[j]][CrossTraffic[k]->path[j+1]] == 2) 
  339.       || (matrix[CrossTraffic[k]->path[j]][CrossTraffic[k]->path[j+1]] == 3)){
  340. CrossTraffic[k]->flag = 1;
  341.       }
  342.     }
  343.     for(j=0;j<pathlen;j++){
  344.       switch(matrix[CrossTraffic[k]->path[j]][CrossTraffic[k]->path[j+1]]){
  345.       case 1:
  346. if(CrossTraffic[k]->flag == 1)
  347.   tempi=4;
  348. else 
  349.   tempi=5;
  350. break;
  351.       case 2:
  352. if(CrossTraffic[k]->flag == 0){
  353.   printf("Flag has to be 1 or 2 for %dn",k);
  354.   printf("info: link %d %d, matrix = %dn",
  355.  CrossTraffic[k]->path[j],CrossTraffic[k]->path[j+1], matrix[CrossTraffic[k]->path[j]][CrossTraffic[k]->path[j+1]]); 
  356.   exit(1);
  357. }
  358. tempi=3;
  359. break;
  360.       case 3:
  361. if(CrossTraffic[k]->flag == 0){
  362.   printf("Flag has to be 1 or 2 for %dn",k);
  363.      printf("info: link %d %d, matrix = %dn",
  364.  CrossTraffic[k]->path[j],CrossTraffic[k]->path[j+1], matrix[CrossTraffic[k]->path[j]][CrossTraffic[k]->path[j+1]]); 
  365.   exit(1);
  366. }
  367. tempi=3;
  368. break;
  369. /*
  370.        //case 4:
  371. //if(CrossTraffic[k]->flag == 1)
  372.  // tempi=4;
  373. //else {
  374. //  tempi=6;
  375. //  CrossTraffic[k]->flag = 2;
  376. //}
  377. //break;
  378.       //case 5:
  379. // if (CrossTraffic[k]->flag == 0)
  380. //   tempi = 5;
  381. // else {
  382. //   CrossTraffic[k]->flag =2;
  383. //   tempi = 6;
  384. // }
  385. // break; 
  386. */
  387. }
  388.       matrix[CrossTraffic[k]->path[j]][CrossTraffic[k]->path[j+1]] = tempi;
  389.     } /* for the switch */ 
  390.     if(debug) printf("Flag %dn",CrossTraffic[k]->flag);
  391.   } /* Close for number of active connections  */
  392.   /* Get number of nodes and links in reducted topology */ 
  393.   FT = (int *)malloc(node_count*sizeof(int));
  394.   if ( FT == NULL){
  395.     printf("out of memoryn");
  396.     exit(0);
  397.   }
  398.   for(i=0;i<node_count;i++)
  399.     FT[i] =0;
  400.   lc=0;
  401.   nc=0;
  402.   for(i=0;i<node_count;i++){
  403.     for(j=0;j<node_count;j++){
  404.       // printf("[%d][%d]= %dn",i,j,matrix[i][j]);
  405.       if((matrix[i][j] == 2) || (matrix[i][j] == 3) || (matrix[i][j] == 4) || (matrix[i][j] == 6)){
  406. if(FT[i]==0){
  407.   FT[i] = 1;
  408.   printf("node %dn",i);
  409.   nc++;
  410. }
  411. if(FT[j] == 0){
  412.   FT[j]=1;
  413.      printf("node %dn",j);
  414.   nc++;
  415. }
  416. printf("link %d %dn",i,j);
  417. lc++;
  418.       } 
  419.     }
  420.   }
  421.   printf("nSummaryn");
  422.   printf("Total: Nodes %d Links %dn",nc,lc);
  423.   printf("Victim: %dn",victim);
  424.   printf("Attackers:");
  425.   for(i=0;i<noattackers;i++) printf(" %d",attackers[i]);
  426.   printf("n");
  427.   
  428.   return 0; 
  429. }
  430.   
  431.   
  432. void cleanq(void)
  433. {
  434.   struct node *p;
  435.   while(head)
  436.     p = dequeue();
  437. }
  438. void enqueue(struct node *vertex)
  439. {
  440.   QueueItem *p = (struct QueueItem *) malloc (sizeof(QueueItem));
  441.   if ( p == NULL){
  442.     printf("Error here");
  443.     exit(0);
  444.   }
  445.   p->u = vertex;
  446.   p->next = NULL;
  447.   if(head==NULL){
  448.     head = p;
  449.     tail = p;
  450.   }
  451.   else {
  452.     tail->next= p;
  453.     tail = p;
  454.   }
  455. }
  456. struct node* dequeue(void)
  457. {
  458.   struct node *retvertex;
  459.   QueueItem *p = (struct QueueItem *) malloc (sizeof(QueueItem));
  460.   if (head == tail) {
  461.     retvertex = head->u;
  462.     head = tail = NULL;
  463.   } else {
  464.     p = head;
  465.     retvertex=head->u;
  466.     head = head->next;
  467.     free(p);
  468.   }
  469.   return retvertex;
  470. }