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

通讯编程

开发平台:

Visual C++

  1. /*-*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 by the University of Southern California
  4.  * All rights reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software and its
  7.  * documentation in source and binary forms for non-commercial purposes
  8.  * and without fee is hereby granted, provided that the above copyright
  9.  * notice appear in all copies and that both the copyright notice and
  10.  * this permission notice appear in supporting documentation. and that
  11.  * any documentation, advertising materials, and other materials related
  12.  * to such distribution and use acknowledge that the software was
  13.  * developed by the University of Southern California, Information
  14.  * Sciences Institute.  The name of the University may not be used to
  15.  * endorse or promote products derived from this software without
  16.  * specific prior written permission.
  17.  *
  18.  * THE UNIVERSITY OF SOUTHERN CALIFORNIA makes no representations about
  19.  * the suitability of this software for any purpose.  THIS SOFTWARE IS
  20.  * PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
  21.  * INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  22.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  23.  *
  24.  * Other copyrights might apply to parts of this software and are so
  25.  * noted when applicable.
  26.  *
  27.  *  sgb2hierns.c -- converter from sgb format to ns format with hierarchical addressing. 
  28.  *
  29.  *  usage :  sgb2hierns <sgbgraph.file> {optional <topo.file -used for scenario
  30.  *  generation>}
  31.  *
  32.  *  Based on sgb2ns converter
  33.  *  Maintainer: Padma Haldar (haldar@isi.edu)
  34.  */
  35. #include <stdio.h>
  36. #include <strings.h>
  37. #include "gb_graph.h"
  38. #include "gb_save.h"
  39. #include "geog.h"
  40. #define TRUE   1
  41. #define FALSE  0
  42. #define MED    256
  43. #define LARGE  4096
  44. #define HUGE   655536
  45. main(argc,argv)
  46.     int argc;
  47.     char *argv[];
  48. {
  49.     int i, 
  50. j, 
  51. nlink, 
  52. k, 
  53. jj, 
  54. domain = 0,
  55. cluster = 0,
  56. p=0,
  57. /* q=0, */
  58. q_b=0,
  59. r=0,
  60. n=0,
  61.     l=0;
  62.     Vertex *v;  
  63.     Arc *a;
  64.     Graph *g;
  65.     FILE    *fopen(), 
  66.     *fout;
  67.     char m[420],
  68.     tempstr[10],
  69.     node_per_cluster[HUGE],
  70.     name[40];
  71.     char *temp,
  72.     *index;
  73.     char *address[HUGE];
  74.     int q[HUGE];
  75.     FILE    *output = NULL;
  76.     int     stubsize[LARGE],
  77.     stubnode[LARGE];
  78.     char    transits[LARGE]; 
  79.     
  80.     
  81.     if (argc < 3) {
  82.     /* for the purpose of scenario generator, need to return a list of transits
  83.        & stubs and num of nodes in each - hence the optional third arg topofile */
  84.     printf("sgb2hierns <sgfile> <outfile> ?<topofile>?nn");
  85.     return;
  86.     }
  87.   
  88.     fout = fopen(argv[2],"w");
  89.     if (argc > 3) {
  90.     printf("More than 3 arguments: generate topoinfo %sn", argv[3]);
  91.     output = fopen(argv[3], "w"); 
  92.     }
  93.     
  94.     g = restore_graph(argv[1]);
  95.     if (g == NULL) {
  96.     printf("%s does not contain a correct SGB graphn",argv[1]);
  97.     return;
  98.     }
  99.     fprintf(fout,"# Generated by sgb2hier-ns,sgb2hier-ns generated from sgb2nsn");
  100.     fprintf(fout,"# sgb2ns adapted from sgb2alt by Polly Huangn");
  101.     fprintf(fout,"# GRAPH (#nodes #edges id uu vv ww xx yy zz):n");
  102.     fprintf(fout,"# %d %d %s ",g->n, g->m, g->id);
  103.     if (g->util_types[8] == 'I') fprintf(fout,"%ld ",g->uu.I);
  104.     if (g->util_types[9] == 'I') fprintf(fout,"%ld ",g->vv.I);
  105.     if (g->util_types[10] == 'I') fprintf(fout,"%ld ",g->ww.I);
  106.     if (g->util_types[11] == 'I') fprintf(fout,"%ld ",g->xx.I);
  107.     if (g->util_types[12] == 'I') fprintf(fout,"%ld ",g->yy.I);
  108.     if (g->util_types[13] == 'I') fprintf(fout,"%ld ",g->zz.I);
  109.     fprintf(fout,"nn");
  110.   
  111.     fprintf(fout, "#Creating hierarchical topology from transit-stub graph:nn");
  112.     
  113.     q[p] = 0;
  114.     /* generating hierarchical topology from transit-stub*/
  115.     for (v = g->vertices,i=0; i < g->n; i++,v++) {
  116. strcpy(name, v->name);
  117. temp = name;
  118. temp += 2;
  119. index = strstr(temp, ".");
  120. temp[index - temp] = '';
  121. if ( p == atoi(temp)) { /* in same domain as before */
  122.   
  123.     if (name[0] == 'T') { /* for transits -> single node domains */
  124. r = 0;
  125. address[i] = (char *)malloc(strlen(v->name));
  126. sprintf(address[i],"%d.%d.%d",p,q[p],r);
  127. strcat(node_per_cluster, "1 ");
  128. sprintf(tempstr, "%d ", i); 
  129.   strcat(transits, tempstr); 
  130. q[p] = q[p] + 1;
  131.     }
  132.     else if (name[0] == 'S') { /* for stubs */
  133. strcpy(name, v->name);
  134. temp = name;
  135. while(temp){
  136.     index = strstr(temp, ".");
  137.     if (index != NULL)
  138.     temp = index + 1;
  139.     else{
  140.     if (atoi(temp) == 0) {
  141.     /* counting stub nodes for scenario gen */
  142.     stubnode[l] = i;
  143.     l++;
  144.     
  145.     if ( q_b != 0) {
  146.     sprintf(tempstr, "%d ", r + 1);
  147.     strcat(node_per_cluster, tempstr);
  148.     
  149.     stubsize[n] = r + 1;
  150.     n++;
  151.     } 
  152.     r = 0;
  153.     address[i] = (char *)malloc(strlen(v->name));
  154.     sprintf(address[i],"%d.%d.%d", p, q[p], r);
  155.     q_b = q[p];
  156.     q[p] = q[p] + 1;
  157.     }
  158.     else {
  159.     r++;
  160.     address[i] = (char *)malloc(strlen(v->name));
  161.     sprintf(address[i],"%d.%d.%d", p, q_b, r);
  162.     
  163.     }
  164.     break;
  165.     }
  166. }
  167.     }
  168. }
  169. else {
  170.     sprintf(tempstr, "%d ", r + 1);
  171.     strcat(node_per_cluster, tempstr);
  172.     stubsize[n] = r + 1;
  173.     n++; 
  174.     p = atoi(temp);
  175.     q[p] = 0;
  176.     q_b = 0;
  177.     r = 0;
  178.     address[i] = (char *)malloc(strlen(v->name));
  179.     sprintf(address[i],"%d.%d.%d",p,q[p],r);
  180.     strcat(node_per_cluster, "1 ");
  181.     sprintf(tempstr, "%d ", i); 
  182.       strcat(transits, tempstr); 
  183.     
  184.     q[p] = q[p] + 1;
  185. }
  186.     }
  187.     domain = p + 1;
  188.     /* cluster = q;  */  /* assuming all domains have equal # of clusters */
  189.     /* for domains having diff no of clusters , use q[domain num]*/
  190.     
  191.     sprintf(tempstr, "%d ", r + 1);
  192.     strcat(node_per_cluster, tempstr);
  193.     stubsize[n] = r + 1;
  194.     /* writing topology (transit/stub) details into topo outfile for scenario gen.:*/
  195.     if (output != NULL) {
  196.     fprintf(output, "domains %dn", domain);
  197.     fprintf(output, "transits %sn", transits);
  198.     fprintf(output, "total-stubs %dn", n+1);
  199.     fprintf(output, "stubs ");
  200.     for(i = 0; i < l; i++) 
  201.     fprintf(output, "%d ", stubnode[i]);
  202.     fprintf(output, "nnodes/stub ");
  203.     for(i = 0; i <= n; i++) 
  204.     fprintf(output, "%d ", stubsize[i]);
  205.     fprintf(output, "nnEnd of topology file. n");
  206.     fclose(output);
  207.     } 
  208.     
  209.     fprintf(fout, "proc create-hier-topology {nsns node linkBW} {n");
  210.     fprintf(fout, "tupvar $node nn"); 
  211.     fprintf(fout, "tupvar $nsns nsnn"); 
  212. /*     fprintf(fout, "tglobal ns nnn"); */
  213.   
  214.     fprintf(fout,"tset verbose 1nn");
  215.     /* nodes */
  216.     fprintf(fout, "tif {$verbose} { n");
  217.     fprintf(fout, "ttputs "Creating hierarchical nodes.." nn");
  218.     fprintf(fout, "t}n");
  219.     fprintf(fout, "tset i 0 n");
  220.     fprintf(fout, "tforeach a { nn");
  221.     
  222.     for (i = 0; i < g->n; i++) {
  223.     fprintf(fout, "tt%sn",address[i]);
  224.     /* fprintf(fout, "set n(%d) [$ns node %s]n", i, address[i]); */
  225. /*      if ((i % 100) == 0) { */
  226. /*      fprintf(fout,  */
  227. /*      "tif {$verbose} { puts -nonewline "%d..."; flush stdout }n",i);  */
  228. /*  } */
  229.     }
  230.     fprintf(fout,"t} { n");
  231.     fprintf(fout,"ttset n($i) [$ns node $a]n");
  232.     fprintf(fout,"ttincr i n");
  233.     fprintf(fout,"ttif {[expr $i %% 100] == 0} {n");
  234.     fprintf(fout,"tttputs "creating node $i..." n tt} nt}");
  235.     
  236.     
  237.     fprintf(fout,"nn");
  238.     fprintf(fout,"# Topology information :n");
  239.     fprintf(fout, "tlappend domain %dn", domain);
  240.     fprintf(fout, "tAddrParams set domain_num_ $domainn");
  241.     fprintf(fout, "tlappend cluster ");
  242.     for (i = 0; i < domain; i++) {
  243. /* printf("q[%d] = %dn",i,q[i]); */
  244. fprintf(fout, "%d ",q[i]);
  245.     }
  246.     fprintf(fout, "n");
  247.     fprintf(fout, "tAddrParams set cluster_num_ $clustern");
  248.     fprintf(fout, "tlappend eilastlevel %sn",node_per_cluster);
  249.     fprintf(fout, "tAddrParams set nodes_num_ $eilastleveln");
  250.     fprintf(fout,"nn");
  251.     /* edges */
  252.     fprintf(fout, "t# EDGES (from-node to-node length a b):n");
  253.     nlink = 0;
  254.     fprintf(fout, "tif {$verbose} { n");
  255.     fprintf(fout, "ttputs "Creating links 0..."n");
  256.     fprintf(fout, "ttflush stdout n");
  257.     fprintf(fout, "t}n");
  258.     fprintf(fout, "tset i 0 n");
  259.     fprintf(fout, "tforeach t { n");
  260.     
  261.     for (v = g->vertices,i=0; i < g->n; i++,v++) 
  262. for (a = v->arcs; a != NULL; a = a->next) {
  263.     j = a->tip - g->vertices;
  264.     if (j > i) {
  265.     fprintf(fout, "tt{%d %d %dms} n",i, j, 10 * a->len);
  266.     
  267.     /*   fprintf(fout,  */
  268. /*      "t$ns duplex-link-of-interfaces $n(%d) $n(%d) $linkBW %dms DropTailn", i, j, 10 * a->len); */
  269.     nlink++;
  270.     /* if ((nlink % 10) == 0) { */
  271. /*      fprintf(fout, */
  272. /*      "tif {$verbose} { puts -nonewline "%d..."; flush stdout }n",  */
  273. /*      nlink); */
  274. /*      } */
  275.     }
  276.     
  277. }
  278.     fprintf(fout, "t} { n");
  279.     fprintf(fout, "t$ns duplex-link-of-interfaces $n([lindex $t 0]) $n([lindex $t 1]) $linkBW [lindex $t 2] DropTail n");
  280.     fprintf(fout, "tincr i n");
  281.     fprintf(fout, "tif {[expr $i %% 100] == 0} { n");
  282.     fprintf(fout, "ttputs "creating link $i..." n");
  283.     fprintf(fout, "t} n } n");
  284. /*     fprintf(fout, "ntif {$verbose} { n"); */
  285. /*     fprintf(fout, "ttputs -nonewline "%d..."n", nlink); */
  286. /*     fprintf(fout, "ttflush stdoutn"); */
  287. /*     fprintf(fout, "ttputs "starting"n"); */
  288. /*     fprintf(fout, "t}n"); */
  289.     /* srm members. join-group will be performed by Agent/SRM::start */
  290.     /* return the number of nodes in this topology */
  291.     fprintf(fout, "treturn %dn", g->n);
  292.     fprintf(fout, "}n");
  293.     for (i=0; i < g->n; i++)
  294. if (address[i] != NULL)
  295.     free(address[i]);
  296.     fprintf(fout,"# end of hier topology generationn");
  297.     fclose(fout);
  298.     
  299. }   
  300.