udpwrite.lc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "udpcksum.h"## 1 ##src/udpcksum/udpwrite.c##
  2. /* include open_output_raw */
  3. int rawfd; /* raw socket to write on */## 2 ##src/udpcksum/udpwrite.c##
  4. void## 3 ##src/udpcksum/udpwrite.c##
  5. open_output(void)## 4 ##src/udpcksum/udpwrite.c##
  6. {## 5 ##src/udpcksum/udpwrite.c##
  7. int on = 1;## 6 ##src/udpcksum/udpwrite.c##
  8. /* ## 7 ##src/udpcksum/udpwrite.c##
  9. * Need a raw socket to write our own IP datagrams to.## 8 ##src/udpcksum/udpwrite.c##
  10. * Process must have superuser privileges to create this socket.## 9 ##src/udpcksum/udpwrite.c##
  11. * Also must set IP_HDRINCL so we can write our own IP headers.## 10 ##src/udpcksum/udpwrite.c##
  12. */## 11 ##src/udpcksum/udpwrite.c##
  13. rawfd = Socket(dest->sa_family, SOCK_RAW, 0);## 12 ##src/udpcksum/udpwrite.c##
  14. Setsockopt(rawfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));## 13 ##src/udpcksum/udpwrite.c##
  15. }## 14 ##src/udpcksum/udpwrite.c##
  16. /* end open_output_raw */
  17. /*## 15 ##src/udpcksum/udpwrite.c##
  18. * "buf" points to an empty IP/UDP header,## 16 ##src/udpcksum/udpwrite.c##
  19. * followed by "ulen" bytes of user data.## 17 ##src/udpcksum/udpwrite.c##
  20. */## 18 ##src/udpcksum/udpwrite.c##
  21. /* include udp_write */
  22. void## 19 ##src/udpcksum/udpwrite.c##
  23. udp_write(char *buf, int userlen)## 20 ##src/udpcksum/udpwrite.c##
  24. {## 21 ##src/udpcksum/udpwrite.c##
  25. struct udpiphdr *ui;## 22 ##src/udpcksum/udpwrite.c##
  26. struct ip *ip;## 23 ##src/udpcksum/udpwrite.c##
  27. /* 4Fill in and checksum UDP header */## 24 ##src/udpcksum/udpwrite.c##
  28. ip = (struct ip *) buf;## 25 ##src/udpcksum/udpwrite.c##
  29. ui = (struct udpiphdr *) buf;## 26 ##src/udpcksum/udpwrite.c##
  30. bzero(ui, sizeof(*ui));## 27 ##src/udpcksum/udpwrite.c##
  31. /* 8add 8 to userlen for pseudo-header length */## 28 ##src/udpcksum/udpwrite.c##
  32. ui->ui_len = htons((uint16_t) (sizeof(struct udphdr) + userlen));## 29 ##src/udpcksum/udpwrite.c##
  33. /* 8then add 28 for IP datagram length */## 30 ##src/udpcksum/udpwrite.c##
  34. userlen += sizeof(struct udpiphdr);## 31 ##src/udpcksum/udpwrite.c##
  35. ui->ui_pr = IPPROTO_UDP;## 32 ##src/udpcksum/udpwrite.c##
  36. ui->ui_src.s_addr = ((struct sockaddr_in *) local)->sin_addr.s_addr;## 33 ##src/udpcksum/udpwrite.c##
  37. ui->ui_dst.s_addr = ((struct sockaddr_in *) dest)->sin_addr.s_addr;## 34 ##src/udpcksum/udpwrite.c##
  38. ui->ui_sport = ((struct sockaddr_in *) local)->sin_port;## 35 ##src/udpcksum/udpwrite.c##
  39. ui->ui_dport = ((struct sockaddr_in *) dest)->sin_port;## 36 ##src/udpcksum/udpwrite.c##
  40. ui->ui_ulen = ui->ui_len;## 37 ##src/udpcksum/udpwrite.c##
  41. if (zerosum == 0) {## 38 ##src/udpcksum/udpwrite.c##
  42. #if 1 /* change to if 0 for Solaris 2.x, x < 6 */## 39 ##src/udpcksum/udpwrite.c##
  43. if ((ui->ui_sum = in_cksum((u_int16_t *) ui, userlen)) == 0)## 40 ##src/udpcksum/udpwrite.c##
  44. ui->ui_sum = 0xffff;## 41 ##src/udpcksum/udpwrite.c##
  45. #else## 42 ##src/udpcksum/udpwrite.c##
  46. ui->ui_sum = ui->ui_len;## 43 ##src/udpcksum/udpwrite.c##
  47. #endif## 44 ##src/udpcksum/udpwrite.c##
  48. }## 45 ##src/udpcksum/udpwrite.c##
  49. /* 4Fill in rest of IP header; */## 46 ##src/udpcksum/udpwrite.c##
  50. /* 4ip_output() calcuates & stores IP header checksum */## 47 ##src/udpcksum/udpwrite.c##
  51. ip->ip_v = IPVERSION;## 48 ##src/udpcksum/udpwrite.c##
  52. ip->ip_hl = sizeof(struct ip) >> 2;## 49 ##src/udpcksum/udpwrite.c##
  53. ip->ip_tos = 0;## 50 ##src/udpcksum/udpwrite.c##
  54. #if defined(linux) || defined(__OpenBSD__)## 51 ##src/udpcksum/udpwrite.c##
  55. ip->ip_len = htons(userlen); /* network byte order */## 52 ##src/udpcksum/udpwrite.c##
  56. #else## 53 ##src/udpcksum/udpwrite.c##
  57. ip->ip_len = userlen; /* host byte order */## 54 ##src/udpcksum/udpwrite.c##
  58. #endif## 55 ##src/udpcksum/udpwrite.c##
  59. ip->ip_id = 0; /* let IP set this */## 56 ##src/udpcksum/udpwrite.c##
  60. ip->ip_off = 0; /* frag offset, MF and DF flags */## 57 ##src/udpcksum/udpwrite.c##
  61. ip->ip_ttl = TTL_OUT;## 58 ##src/udpcksum/udpwrite.c##
  62. Sendto(rawfd, buf, userlen, 0, dest, destlen);## 59 ##src/udpcksum/udpwrite.c##
  63. }## 60 ##src/udpcksum/udpwrite.c##
  64. /* end udp_write */