dg_send_recv.lc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /* include dgsendrecv1 */
  2. #include "unprtt.h"## 1 ##src/rtt/dg_send_recv.c##
  3. #include <setjmp.h>## 2 ##src/rtt/dg_send_recv.c##
  4. #define RTT_DEBUG## 3 ##src/rtt/dg_send_recv.c##
  5. static struct rtt_info rttinfo;## 4 ##src/rtt/dg_send_recv.c##
  6. static int rttinit = 0;## 5 ##src/rtt/dg_send_recv.c##
  7. static struct msghdr msgsend, msgrecv; /* assumed init to 0 */## 6 ##src/rtt/dg_send_recv.c##
  8. static struct hdr {## 7 ##src/rtt/dg_send_recv.c##
  9. uint32_t seq; /* sequence # */## 8 ##src/rtt/dg_send_recv.c##
  10. uint32_t ts; /* timestamp when sent */## 9 ##src/rtt/dg_send_recv.c##
  11. } sendhdr, recvhdr;## 10 ##src/rtt/dg_send_recv.c##
  12. static void sig_alrm(int signo);## 11 ##src/rtt/dg_send_recv.c##
  13. static sigjmp_buf jmpbuf;## 12 ##src/rtt/dg_send_recv.c##
  14. ssize_t## 13 ##src/rtt/dg_send_recv.c##
  15. dg_send_recv(int fd, const void *outbuff, size_t outbytes,## 14 ##src/rtt/dg_send_recv.c##
  16. void *inbuff, size_t inbytes,## 15 ##src/rtt/dg_send_recv.c##
  17. const SA *destaddr, socklen_t destlen)## 16 ##src/rtt/dg_send_recv.c##
  18. {## 17 ##src/rtt/dg_send_recv.c##
  19. ssize_t n;## 18 ##src/rtt/dg_send_recv.c##
  20. struct iovec iovsend[2], iovrecv[2];## 19 ##src/rtt/dg_send_recv.c##
  21. if (rttinit == 0) {## 20 ##src/rtt/dg_send_recv.c##
  22. rtt_init(&rttinfo); /* first time we're called */## 21 ##src/rtt/dg_send_recv.c##
  23. rttinit = 1;## 22 ##src/rtt/dg_send_recv.c##
  24. rtt_d_flag = 1;## 23 ##src/rtt/dg_send_recv.c##
  25. }## 24 ##src/rtt/dg_send_recv.c##
  26. sendhdr.seq++;## 25 ##src/rtt/dg_send_recv.c##
  27. msgsend.msg_name = destaddr;## 26 ##src/rtt/dg_send_recv.c##
  28. msgsend.msg_namelen = destlen;## 27 ##src/rtt/dg_send_recv.c##
  29. msgsend.msg_iov = iovsend;## 28 ##src/rtt/dg_send_recv.c##
  30. msgsend.msg_iovlen = 2;## 29 ##src/rtt/dg_send_recv.c##
  31. iovsend[0].iov_base = &sendhdr;## 30 ##src/rtt/dg_send_recv.c##
  32. iovsend[0].iov_len = sizeof(struct hdr);## 31 ##src/rtt/dg_send_recv.c##
  33. iovsend[1].iov_base = outbuff;## 32 ##src/rtt/dg_send_recv.c##
  34. iovsend[1].iov_len = outbytes;## 33 ##src/rtt/dg_send_recv.c##
  35. msgrecv.msg_name = NULL;## 34 ##src/rtt/dg_send_recv.c##
  36. msgrecv.msg_namelen = 0;## 35 ##src/rtt/dg_send_recv.c##
  37. msgrecv.msg_iov = iovrecv;## 36 ##src/rtt/dg_send_recv.c##
  38. msgrecv.msg_iovlen = 2;## 37 ##src/rtt/dg_send_recv.c##
  39. iovrecv[0].iov_base = &recvhdr;## 38 ##src/rtt/dg_send_recv.c##
  40. iovrecv[0].iov_len = sizeof(struct hdr);## 39 ##src/rtt/dg_send_recv.c##
  41. iovrecv[1].iov_base = inbuff;## 40 ##src/rtt/dg_send_recv.c##
  42. iovrecv[1].iov_len = inbytes;## 41 ##src/rtt/dg_send_recv.c##
  43. /* end dgsendrecv1 */
  44. /* include dgsendrecv2 */
  45. Signal(SIGALRM, sig_alrm);## 42 ##src/rtt/dg_send_recv.c##
  46. rtt_newpack(&rttinfo); /* initialize for this packet */## 43 ##src/rtt/dg_send_recv.c##
  47. sendagain:## 44 ##src/rtt/dg_send_recv.c##
  48. sendhdr.ts = rtt_ts(&rttinfo);## 45 ##src/rtt/dg_send_recv.c##
  49. Sendmsg(fd, &msgsend, 0);## 46 ##src/rtt/dg_send_recv.c##
  50. alarm(rtt_start(&rttinfo)); /* calc timeout value & start timer */## 47 ##src/rtt/dg_send_recv.c##
  51. if (sigsetjmp(jmpbuf, 1) != 0) {## 48 ##src/rtt/dg_send_recv.c##
  52. if (rtt_timeout(&rttinfo) < 0) {## 49 ##src/rtt/dg_send_recv.c##
  53. err_msg("dg_send_recv: no response from server, giving up");## 50 ##src/rtt/dg_send_recv.c##
  54. rttinit = 0; /* reinit in case we're called again */## 51 ##src/rtt/dg_send_recv.c##
  55. errno = ETIMEDOUT;## 52 ##src/rtt/dg_send_recv.c##
  56. return (-1);## 53 ##src/rtt/dg_send_recv.c##
  57. }## 54 ##src/rtt/dg_send_recv.c##
  58. goto sendagain;## 55 ##src/rtt/dg_send_recv.c##
  59. }## 56 ##src/rtt/dg_send_recv.c##
  60. do {## 57 ##src/rtt/dg_send_recv.c##
  61. n = Recvmsg(fd, &msgrecv, 0);## 58 ##src/rtt/dg_send_recv.c##
  62. } while (n < sizeof(struct hdr) || recvhdr.seq != sendhdr.seq);## 59 ##src/rtt/dg_send_recv.c##
  63. alarm(0); /* stop SIGALRM timer */## 60 ##src/rtt/dg_send_recv.c##
  64. /* 4calculate & store new RTT estimator values */## 61 ##src/rtt/dg_send_recv.c##
  65. rtt_stop(&rttinfo, rtt_ts(&rttinfo) - recvhdr.ts);## 62 ##src/rtt/dg_send_recv.c##
  66. return (n - sizeof(struct hdr)); /* return size of received datagram */## 63 ##src/rtt/dg_send_recv.c##
  67. }## 64 ##src/rtt/dg_send_recv.c##
  68. static void## 65 ##src/rtt/dg_send_recv.c##
  69. sig_alrm(int signo)## 66 ##src/rtt/dg_send_recv.c##
  70. {## 67 ##src/rtt/dg_send_recv.c##
  71. siglongjmp(jmpbuf, 1);## 68 ##src/rtt/dg_send_recv.c##
  72. }## 69 ##src/rtt/dg_send_recv.c##
  73. /* end dgsendrecv2 */
  74. ssize_t## 70 ##src/rtt/dg_send_recv.c##
  75. Dg_send_recv(int fd, const void *outbuff, size_t outbytes,## 71 ##src/rtt/dg_send_recv.c##
  76. void *inbuff, size_t inbytes,## 72 ##src/rtt/dg_send_recv.c##
  77. const SA *destaddr, socklen_t destlen)## 73 ##src/rtt/dg_send_recv.c##
  78. {## 74 ##src/rtt/dg_send_recv.c##
  79. ssize_t n;## 75 ##src/rtt/dg_send_recv.c##
  80. n = dg_send_recv(fd, outbuff, outbytes, inbuff, inbytes,## 76 ##src/rtt/dg_send_recv.c##
  81. destaddr, destlen);## 77 ##src/rtt/dg_send_recv.c##
  82. if (n < 0)## 78 ##src/rtt/dg_send_recv.c##
  83. err_quit("dg_send_recv error");## 79 ##src/rtt/dg_send_recv.c##
  84. return (n);## 80 ##src/rtt/dg_send_recv.c##
  85. }## 81 ##src/rtt/dg_send_recv.c##