protoname.cc
上传用户:juan65231
上传日期:2014-02-17
资源大小:194k
文件大小:8k
源码类别:

网络

开发平台:

Unix_Linux

  1. #include "protoname.h"
  2. #include "protoname_pkt.h"
  3. #include <random.h>
  4. #include <cmu-trace.h>
  5. #include <iostream>
  6. int hdr_protoname_pkt::offset_;
  7. static class ProtonameHeaderClass : public PacketHeaderClass {
  8. public:
  9. ProtonameHeaderClass() : PacketHeaderClass("PacketHeader/Protoname", sizeof(hdr_protoname_pkt)) {
  10. bind_offset(&hdr_protoname_pkt::offset_);
  11. }
  12. } class_rtProtoProtoname_hdr;
  13. static class ProtonameClass : public TclClass {
  14. public:
  15. ProtonameClass() : TclClass("Agent/Protoname") {}
  16. TclObject* create(int argc, const char*const* argv) {
  17. assert(argc == 5);
  18. return (new Protoname((nsaddr_t) Address::instance().str2addr(argv[4])));
  19. }
  20. } class_rtProtoProtoname;
  21. //void
  22. //Protoname_PktTimer::expire(Event* e) {
  23. //   agent_->send_protoname_pkt();
  24. //   agent_->reset_protoname_pkt_timer();
  25. //}
  26. Protoname::Protoname(nsaddr_t id) : Agent(PT_PROTONAME)/*, pkt_timer_(this) */{
  27.   //bind_bool("accesible_var_", &accesible_var_);
  28.   ra_addr_ = id;
  29.    node_ = (MobileNode*)Node::get_node_by_address(id);
  30. }
  31. int
  32. Protoname::command(int argc, const char*const* argv) {        
  33.   if (argc == 2) {
  34.   if (strcasecmp(argv[1], "start") == 0) {
  35.   //pkt_timer_.resched(0.0);
  36.   return TCL_OK;
  37.   }               // to generate the pairwise keys , nodes only broadcast the packet       else if (strcasecmp(argv[1], "gen-pair-keys") == 0) {
  38.   send_protoname_pairkey();
  39.   return TCL_OK;
  40.   }                else if (strcasecmp(argv[1], "initilize") == 0) {
  41.   init();
  42.   return TCL_OK;
  43.   }               
  44. /* else if (strcasecmp(argv[1], "print_rtable") == 0) {
  45.   if (logtarget_ != 0) {
  46.   sprintf(logtarget_->pt_->buffer(), "P %f _%d_ Routing Table", CURRENT_TIME, ra_addr());
  47.   logtarget_->pt_->dump();
  48.   rtable_.print(logtarget_);
  49.   }
  50.   else {
  51.   fprintf(stdout, "%f _%d_ If you want to print this routing table "
  52.   "you must create a trace file in your tcl script", CURRENT_TIME, ra_addr());
  53.   }
  54.   return TCL_OK;
  55.   }*/
  56.   }
  57.   else if (argc == 3) {
  58.   // Obtains corresponding dmux to carry packets to upper layers
  59.   if (strcmp(argv[1], "port-dmux") == 0) {
  60.   dmux_ = (PortClassifier*)TclObject::lookup(argv[2]);
  61.   if (dmux_ == 0) {
  62.   fprintf(stderr, "%s: %s lookup of %s failedn", __FILE__, argv[1], argv[2]);
  63.  return TCL_ERROR;
  64.   }
  65.   return TCL_OK;
  66.   }
  67.   // Obtains corresponding tracer
  68.   else if (strcmp(argv[1], "log-target") == 0 || strcmp(argv[1], "tracetarget") == 0) {
  69.   logtarget_ = (Trace*)TclObject::lookup(argv[2]);
  70.   if (logtarget_ == 0)
  71.   return TCL_ERROR;
  72. return TCL_OK;
  73.   }
  74. else if (strcmp(argv[1], "send-pkt-to") == 0) {
  75. send_protoname_pkt(nsaddr_t(atoi(argv[2])));
  76. return TCL_OK;                }       else if (strcmp(argv[1], "send-to") == 0) {         
  77. send_protoname_pkt(nsaddr_t(atoi(argv[2])));
  78. return TCL_OK;                }                  } // Pass the command to the base class
  79.   return Agent::command(argc, argv);
  80. } void Protoname::recv(Packet* p, Handler* h) {
  81. struct hdr_cmn* ch = HDR_CMN(p);
  82.   struct hdr_ip* ih = HDR_IP(p);
  83.   if (ih->saddr() == ra_addr()) {
  84.   // If there exists a loop, must drop the packet
  85.   if (ch->num_forwards() > 0) {
  86.   drop(p, DROP_RTR_ROUTE_LOOP);
  87.   return;
  88.   }
  89.   // else if this is a packet I am originating, must add IP header
  90.   else if (ch->num_forwards() == 0)
  91.   ch->size() += IP_HDR_LEN;
  92.   }
  93.   // If it is a protoname packet, must process it
  94.   if (ch->ptype() == PT_PROTONAME)
  95.   recv_protoname_pkt(p);
  96.   // Otherwise, must forward the packet (unless TTL has reached zero)
  97.   else {
  98.   ih->ttl_--;
  99.   if (ih->ttl_ == 0) {
  100.   drop(p, DROP_RTR_TTL);
  101.   return;
  102.   }
  103.   forward_data(p);
  104.   }
  105. } int a(int m,int e) {       int c=1;       //c是结果
  106. int arr[20];  //存放指数转换为二进制的中间值
  107. int i=0;
  108. int temp; 
  109. while(e!=0)
  110. {
  111. temp=e%2;
  112. arr[i++]=temp;
  113. e=e/2;
  114. }
  115. i=i-1;
  116. while(i>=0)
  117. {
  118. c=(c*c)%71;
  119. if(arr[i--]==1)
  120. c=(c*(m%71))%71;
  121. }        return c; }
  122. void
  123. Protoname::recv_protoname_pkt(Packet* p) {
  124. struct hdr_ip* ih = HDR_IP(p);
  125. struct hdr_protoname_pkt* ph = HDR_PROTONAME_PKT(p);
  126.   // All routing messages are sent from and to port RT_PORT,
  127.   // so we check it.
  128.   assert(ih->sport() == RT_PORT);
  129.   assert(ih->dport() == RT_PORT);       //ph->pkt_len() = 1;
  130.   /* ... processing of protoname packet ... */
  131. //forward_data(p);        if(ph->pkt_app() == 0) {        // to add sth here        int ka,kb;        ka = key_element;        kb = ph->pkt_ran();        pkt_pairkeys_[index] = a(kb,ka);        pkt_neighbours_[index] = ph->pkt_src();        printf("host is %d his neighbour is %d their pairwise key is %dn",ra_addr(),pkt_neighbours_[index],pkt_pairkeys_[index]);        index++;                           }  
  132.   // Release resources
  133. //   Packet::free(p);
  134. }
  135. void
  136. Protoname::send_protoname_pkt(nsaddr_t dest) {
  137. Packet* p = allocpkt();
  138.   struct hdr_cmn* ch = HDR_CMN(p);
  139.   struct hdr_ip* ih = HDR_IP(p);
  140.   struct hdr_protoname_pkt* ph = HDR_PROTONAME_PKT(p);
  141.   ph->pkt_src() = ra_addr();
  142. ph->pkt_dst() = dest;
  143.   ph->pkt_len() = 32;
  144.   ph->pkt_seq_num() = seq_num_++;            ph->pkt_app() = 1;          u_int16_t t1;    //srand(time(0));         t1 = rand()%71;     t1 = a(7,t1);
  145.     ph->pkt_ran() = t1;
  146.   ch->ptype() = PT_PROTONAME;
  147.   ch->direction() = hdr_cmn::DOWN;
  148.   ch->size() = IP_HDR_LEN + ph->pkt_len();
  149.   ch->error() = 0;
  150.   ch->next_hop() = IP_BROADCAST;
  151.   ch->addr_type() = NS_AF_INET;
  152.   ih->saddr() = ra_addr();
  153. ih->daddr() = IP_BROADCAST;
  154.   ih->sport() = RT_PORT;
  155.   ih->dport() = RT_PORT;
  156.   ih->ttl() = IP_DEF_TTL;
  157.      
  158.   Scheduler::instance().schedule(target_, p, JITTER);
  159. }
  160. void
  161. Protoname::send_protoname_pairkey() {
  162. Packet* p = allocpkt();
  163.   struct hdr_cmn* ch = HDR_CMN(p);
  164.   struct hdr_ip* ih = HDR_IP(p);
  165.   struct hdr_protoname_pkt* ph = HDR_PROTONAME_PKT(p);
  166.   ph->pkt_src() = ra_addr();
  167. //ph->pkt_dst() = dest;
  168.   ph->pkt_len() = 32;
  169.   ph->pkt_seq_num() = seq_num_++;            ph->pkt_app() = 0;      // 0 stand for the application of generating the pairwise keys /*    u_int16_t t1;    //srand(time(0));         t1 = rand()%71;     //key_element = t1;     //ph->pkt_len() = key_element;     t1 = a(7,t1);
  170.     ph->pkt_ran() = t1;     key_element = t1;    // the key_element store the local element  */     ph->pkt_ran() = a(7,key_element);     ph->pkt_temp() = key_element;
  171.   ch->ptype() = PT_PROTONAME;
  172.   ch->direction() = hdr_cmn::DOWN;
  173.   ch->size() = IP_HDR_LEN + ph->pkt_len();
  174.   ch->error() = 0;
  175.   ch->next_hop() = IP_BROADCAST;
  176.   ch->addr_type() = NS_AF_INET;
  177.   ih->saddr() = ra_addr();
  178. ih->daddr() = IP_BROADCAST;
  179.   ih->sport() = RT_PORT;
  180.   ih->dport() = RT_PORT;
  181.   ih->ttl() = IP_DEF_TTL;
  182.      
  183.   Scheduler::instance().schedule(target_, p, JITTER);
  184. }
  185. void
  186. Protoname::init() {        index = 0;        for (int i = 0;i<10;i++)                    {             pkt_pairkeys_[i] = 0;             pkt_neighbours_[i] = NULL;                     }                     //printf("afeirgoo");       u_int16_t t1;       //srand(time(0));           t1 = rand()%71;             //t1 = a(7,t1);
  187.       //ph->pkt_ran() = t1;       key_element = t1;    // the key_element store the local element  }
  188. //void
  189. //Protoname::reset_protoname_pkt_timer() {
  190. // pkt_timer_.resched((double)5.0);
  191. //}
  192. void
  193. Protoname::forward_data(Packet* p) {
  194.       struct hdr_cmn* ch = HDR_CMN(p);
  195.       struct hdr_ip* ih = HDR_IP(p);
  196.   struct hdr_protoname_pkt* ph = HDR_PROTONAME_PKT(p);
  197.   
  198.       if (ch->direction() == hdr_cmn::UP &&
  199.           ((u_int32_t)ih->daddr() == IP_BROADCAST && ph->pkt_dst() == ra_addr())) {
  200.           // dmux_->recv(p, 0); //Packet::free(p);
  201.   drop(p, DROP_RTR_ROUTE_LOOP);
  202.           return;
  203.      }
  204.      else {
  205.          ch->direction() = hdr_cmn::DOWN;
  206.          ch->addr_type() = NS_AF_INET;
  207.          ch->next_hop() = IP_BROADCAST;
  208.  
  209.          Scheduler::instance().schedule(target_, p, 0.0);
  210.      }
  211. }