testppp.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ctype.h>
  4. int debug;
  5. long errrate;
  6. long droprate;
  7. int framing;
  8. int nocompress;
  9. int noipcompress;
  10. char *ppp = "8.out";
  11. char *mtu;
  12. void
  13. pppopen(int fd, char *net, char *local, char *remote)
  14. {
  15. char *argv[16];
  16. int argc;
  17. switch(fork()){
  18. case -1:
  19. fprint(2, "testppp: can't fork: %r\n");
  20. exits(0);
  21. case 0:
  22. return;
  23. default:
  24. break;
  25. }
  26. dup(fd, 0);
  27. dup(fd, 1);
  28. argc = 0;
  29. argv[argc++] = ppp;
  30. if(debug)
  31. argv[argc++] = "-d";
  32. if(framing)
  33. argv[argc++] = "-f";
  34. if(nocompress)
  35. argv[argc++] = "-c";
  36. if(noipcompress)
  37. argv[argc++] = "-C";
  38. if(mtu){
  39. argv[argc++] = "-m";
  40. argv[argc++] = mtu;
  41. }
  42. argv[argc++] = "-x";
  43. argv[argc++] = net;
  44. if(local){
  45. argv[argc++] = local;
  46. if(remote)
  47. argv[argc++] = remote;
  48. }
  49. argv[argc] = 0;
  50. exec(ppp, argv);
  51. }
  52. void
  53. printbuf(uchar *p, int n)
  54. {
  55. int i;
  56. uchar *e;
  57. char buf[32*5];
  58. if(n > 32)
  59. n = 32;
  60. i = 0;
  61. for(e = p + n; p < e; p++){
  62. if(isprint(*p))
  63. i += sprint(buf+i, "%c ", *p);
  64. else
  65. i += sprint(buf+i, "%2.2ux ", *p);
  66. }
  67. fprint(2, "%s\n", buf);
  68. }
  69. void
  70. xfer(int from, int to)
  71. {
  72. uchar buf[4096];
  73. int i, n, modified, ok, total, errs, dropped;
  74. if(fork() == 0)
  75. return;
  76. total = ok = errs = dropped = 0;
  77. for(;;){
  78. n = read(from, buf, sizeof(buf));
  79. if(n <= 0){
  80. fprint(2, "%d -> %d EOF\n", from, to);
  81. exits(0);
  82. }
  83. modified = 0;
  84. if(errrate){
  85. for(i = 0; i < n; i++){
  86. if(lnrand(errrate) == 0){
  87. buf[i] ^= 0xff;
  88. modified = 1;
  89. }
  90. }
  91. }
  92. if(droprate && lnrand(droprate) == 0){
  93. fprint(2, "!!!!!!!!!!!!!!%d -> %d dropped %d (%d/%d)\n", from, to, ok, dropped, total);
  94. ok = 0;
  95. dropped++;
  96. total++;
  97. continue;
  98. }
  99. if(modified){
  100. fprint(2, "!!!!!!!!!!!!!!%d -> %d %d (%d/%d)\n", from, to, ok, errs, total);
  101. ok = 0;
  102. errs++;
  103. } else
  104. ok++;
  105. total++;
  106. if(debug > 1){
  107. fprint(2, "%d -> %d (%d)", from, to, n);
  108. printbuf(buf, n);
  109. }
  110. n = write(to, buf, n);
  111. if(n < 0){
  112. fprint(2, "%d -> %d write err\n", from, to);
  113. exits(0);
  114. }
  115. }
  116. }
  117. void
  118. usage(void)
  119. {
  120. fprint(2, "usage: testppp [-cCDf] [-e errrate] [-d droprate] [-m mtu] [-p ppp]\n");
  121. exits("usage");
  122. }
  123. void
  124. main(int argc, char **argv)
  125. {
  126. char *s;
  127. int pfd1[2];
  128. int pfd2[2];
  129. errrate = 0;
  130. droprate = 0;
  131. ARGBEGIN{
  132. case 'c':
  133. nocompress = 1;
  134. break;
  135. case 'C':
  136. noipcompress = 1;
  137. break;
  138. case 'd':
  139. s = ARGF();
  140. if(s)
  141. droprate = strtol(s, nil, 0);
  142. break;
  143. case 'D':
  144. debug++;
  145. break;
  146. case 'e':
  147. s = ARGF();
  148. if(s)
  149. errrate = strtol(s, nil, 0);
  150. break;
  151. case 'f':
  152. framing = 1;
  153. break;
  154. case 'm':
  155. mtu = ARGF();
  156. break;
  157. case 'p':
  158. ppp = ARGF();
  159. if(ppp == nil)
  160. usage();
  161. break;
  162. default:
  163. usage();
  164. break;
  165. }ARGEND
  166. if(argc)
  167. usage();
  168. pipe(pfd1);
  169. pipe(pfd2);
  170. bind("#I2", "/net.alt2", MCREATE);
  171. bind("#I1", "/net.alt", MCREATE);
  172. pppopen(pfd1[0], "/net.alt2", "135.104.99.1", "135.104.99.2");
  173. pppopen(pfd2[0], "/net.alt", 0, 0);
  174. close(pfd1[0]);
  175. close(pfd2[0]);
  176. xfer(pfd1[1], pfd2[1]);
  177. xfer(pfd2[1], pfd1[1]);
  178. exits(0);
  179. }