netw.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include <linux/if.h>
  2. #include <linux/if_tun.h>
  3. #include <fcntl.h>
  4. #include <sys/ioctl.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #define MTU 1500
  10. typedef struct ipv4 {
  11. u_int16_t tun_flags; //tun specific 16 bits
  12. u_int16_t tun_proto; //tun specific 16 bits
  13. u_int8_t version; // 4 bits
  14. u_int8_t header_length; // 4 bits
  15. u_int8_t type_of_service; // 8 bits
  16. u_int16_t total_length; //16 bits
  17. u_int16_t identification; // 16 bits
  18. u_int8_t flags; // 3 bits
  19. } ipv4_t;
  20. int create_tun(char *dev_name, int flags){
  21. struct ifreq ifr;
  22. int fd, err;
  23. char *clonedev = "/dev/net/tun";
  24. if ((fd = open(clonedev, O_RDWR)) < 0)
  25. {
  26. return fd;
  27. }
  28. memset(&ifr, 0, sizeof(ifr));
  29. ifr.ifr_ifru.ifru_flags = flags;
  30. if(*dev_name) {
  31. strncpy(ifr.ifr_ifrn.ifrn_name, dev_name, IFNAMSIZ);
  32. }
  33. if((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0)
  34. {
  35. close(fd);
  36. return err;
  37. }
  38. strcpy(dev_name, ifr.ifr_ifrn.ifrn_name);
  39. return fd;
  40. }
  41. void print_packet(u_int8_t* buf, int buf_size) {
  42. int i;
  43. printf("received %d bytes: ", buf_size);
  44. for (i = 0; i < buf_size; i++)
  45. {
  46. if (i > 0) printf(":");
  47. printf("%02X", buf[i]);
  48. }
  49. printf("\n");
  50. }
  51. // 0100 0110 46
  52. // 1111 0000
  53. // 0100 0000 40
  54. // 46 - 40 = 6
  55. // 0100 0110 46
  56. // 0000 1111
  57. // 0000 0110 6
  58. // 46 - 6 = 40
  59. ipv4_t parse_packet(u_int8_t *buf, int buf_size) {
  60. ipv4_t p;
  61. p.tun_flags = buf[1]<<8 | buf[0];
  62. p.tun_proto = buf[2]<<8 | buf[3];
  63. p.version = buf[4] - (buf[4] & 00001111);
  64. p.header_length = buf[4] - (buf[4] & 11110000);
  65. p.type_of_service = buf[5];
  66. p.total_length = buf[6]<<8 | buf[7];
  67. p.identification = buf[8]<<8 | buf[9];
  68. p.flags = buf[10] - (buf[10] & 00011111);
  69. return p;
  70. }
  71. int main (int argc, char** argv) {
  72. char tun_name[IFNAMSIZ];
  73. u_int8_t buf[MTU];
  74. int ret;
  75. ipv4_t curr_packet;
  76. sprintf(tun_name, "tun01");
  77. int tunfd = create_tun(tun_name, (IFF_TUN));
  78. if (tunfd < 0) {
  79. fprintf(stderr, "could not allocate device tun.\n");
  80. return(EXIT_FAILURE);
  81. }
  82. for (;;) {
  83. ret = read(tunfd, buf, MTU);
  84. curr_packet = parse_packet(buf, ret);
  85. if (curr_packet.tun_proto == 0x800) {
  86. printf("proto: %02X\n", curr_packet.tun_proto);
  87. printf("version: %02X\n", curr_packet.version);
  88. printf("header length %02X\n", curr_packet.header_length);
  89. print_packet(buf, ret);
  90. }
  91. }
  92. return (0);
  93. }