sim.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:2k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Simulate a network path by introducing delay (propagation and queuing),
  2.  * bandwidth (delay as a function of packet size), duplication and loss.
  3.  * Intended for use with the loopback interface
  4.  */
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "timer.h"
  8. #include "iface.h"
  9. #include "ip.h"
  10. static void simfunc(void *p);
  11. struct pkt {
  12. struct timer timer;
  13. struct mbuf *bp;
  14. };
  15. struct {
  16. int32 fixed; /* Fixed prop delay, ms */
  17. int32 xmit; /* Xmit time, ms/byte */
  18. int32 maxq; /* Max queueing delay, ms */
  19. int pdup; /* Probability of duplication, *0.1% */
  20. int ploss; /* Probability of loss, *0.1% */
  21. } Simctl = {
  22. 0,0,1000,0,0 };
  23. int
  24. dosim(argc,argv,p)
  25. int argc;
  26. char *argv;
  27. void *p;
  28. {
  29. return 0;
  30. }
  31. void
  32. net_sim(bp)
  33. struct mbuf *bp;
  34. {
  35. struct pkt *pkt;
  36. int32 delay;
  37. if(urandom(1000) < Simctl.ploss){
  38. if(Loopback.trfp)
  39. fprintf(Loopback.trfp,"packet lostn");
  40. free_p(&bp); /* Packet is lost */
  41. return;
  42. }
  43. if(urandom(1000) < Simctl.pdup){
  44. struct mbuf *dbp;
  45. if(Loopback.trfp)
  46. fprintf(Loopback.trfp,"packet dupedn");
  47. dup_p(&dbp,bp,0,len_p(bp));
  48. net_sim(dbp); /* Packet is duplicated */
  49. }
  50. /* The simulated network delay for this packet is the sum
  51.  * of three factors: a fixed propagation delay, a transmission
  52.  * delay proportional to the packet size, and an evenly
  53.  * distributed random queuing delay up to some maximum
  54.  */
  55. delay = Simctl.fixed + len_p(bp)*Simctl.xmit + urandom(Simctl.maxq);
  56. if(Loopback.trfp)
  57. fprintf(Loopback.trfp,"packet delayed %ld msn",delay);
  58. if(delay == 0){
  59. /* No delay, return immediately */
  60. net_route(&Loopback,&bp);
  61. return;
  62. }
  63. pkt = (struct pkt *)mallocw(sizeof(struct pkt));
  64. pkt->bp = bp;
  65. set_timer(&pkt->timer,delay);
  66. pkt->timer.func = simfunc;
  67. pkt->timer.arg = pkt;
  68. start_timer(&pkt->timer);
  69. }
  70. /* Put packet on hopper after delay */
  71. static void
  72. simfunc(p)
  73. void *p;
  74. {
  75. struct pkt *pkt = (struct pkt *)p;
  76. struct mbuf *bp = pkt->bp;
  77. stop_timer(&pkt->timer); /* shouldn't be necessary */
  78. net_route(&Loopback,&bp);
  79. free(pkt);
  80. }