mod_delay.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * mod_delay.c
  3. *
  4. * Copyright (c) 2001 Dug Song <dugsong@monkey.org>
  5. *
  6. * $Id$
  7. */
  8. #include "config.h"
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include "pkt.h"
  13. #include "mod.h"
  14. #define DELAY_FIRST 1
  15. #define DELAY_LAST 2
  16. #define DELAY_RANDOM 3
  17. struct delay_data {
  18. rand_t *rnd;
  19. int which;
  20. struct timeval tv;
  21. };
  22. void *
  23. delay_close(void *d)
  24. {
  25. struct delay_data *data = (struct delay_data *)d;
  26. if (data != NULL) {
  27. rand_close(data->rnd);
  28. free(data);
  29. }
  30. return (NULL);
  31. }
  32. void *
  33. delay_open(int argc, char *argv[])
  34. {
  35. struct delay_data *data;
  36. uint64_t usec;
  37. if (argc != 3)
  38. return (NULL);
  39. if ((data = malloc(sizeof(*data))) == NULL)
  40. return (NULL);
  41. data->rnd = rand_open();
  42. if (strcasecmp(argv[1], "first") == 0)
  43. data->which = DELAY_FIRST;
  44. else if (strcasecmp(argv[1], "last") == 0)
  45. data->which = DELAY_LAST;
  46. else if (strcasecmp(argv[1], "random") == 0)
  47. data->which = DELAY_RANDOM;
  48. else
  49. return (delay_close(data));
  50. if ((usec = atoi(argv[2])) == 0)
  51. return (delay_close(data));
  52. usec *= 1000;
  53. data->tv.tv_sec = usec / 1000000;
  54. data->tv.tv_usec = usec % 1000000;
  55. return (data);
  56. }
  57. int
  58. delay_apply(void *d, struct pktq *pktq)
  59. {
  60. struct delay_data *data = (struct delay_data *)d;
  61. struct pkt *pkt;
  62. if (data->which == DELAY_FIRST)
  63. pkt = TAILQ_FIRST(pktq);
  64. else if (data->which == DELAY_LAST)
  65. pkt = TAILQ_LAST(pktq, pktq);
  66. else
  67. pkt = pktq_random(data->rnd, pktq);
  68. memcpy(&pkt->pkt_ts, &data->tv, sizeof(pkt->pkt_ts));
  69. return (0);
  70. }
  71. struct mod mod_delay = {
  72. "delay", /* name */
  73. "delay first|last|random <ms>", /* usage */
  74. delay_open, /* open */
  75. delay_apply, /* apply */
  76. delay_close /* close */
  77. };