classmask.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ip.h>
  4. static uchar classmask[4][16] = {
  5. 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0x00,0x00,0x00,
  6. 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0x00,0x00,0x00,
  7. 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0x00,0x00,
  8. 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x00,
  9. };
  10. static uchar v6loopback[IPaddrlen] = {
  11. 0, 0, 0, 0,
  12. 0, 0, 0, 0,
  13. 0, 0, 0, 0,
  14. 0, 0, 0, 0x01
  15. };
  16. static uchar v6linklocal[IPaddrlen] = {
  17. 0xfe, 0x80, 0, 0,
  18. 0, 0, 0, 0,
  19. 0, 0, 0, 0,
  20. 0, 0, 0, 0
  21. };
  22. static uchar v6linklocalmask[IPaddrlen] = {
  23. 0xff, 0xff, 0xff, 0xff,
  24. 0xff, 0xff, 0xff, 0xff,
  25. 0, 0, 0, 0,
  26. 0, 0, 0, 0
  27. };
  28. static int v6llpreflen = 8; /* link-local prefix length in bytes */
  29. static uchar v6multicast[IPaddrlen] = {
  30. 0xff, 0, 0, 0,
  31. 0, 0, 0, 0,
  32. 0, 0, 0, 0,
  33. 0, 0, 0, 0
  34. };
  35. static uchar v6multicastmask[IPaddrlen] = {
  36. 0xff, 0, 0, 0,
  37. 0, 0, 0, 0,
  38. 0, 0, 0, 0,
  39. 0, 0, 0, 0
  40. };
  41. static int v6mcpreflen = 1; /* multicast prefix length */
  42. static uchar v6solicitednode[IPaddrlen] = {
  43. 0xff, 0x02, 0, 0,
  44. 0, 0, 0, 0,
  45. 0, 0, 0, 0x01,
  46. 0xff, 0, 0, 0
  47. };
  48. static uchar v6solicitednodemask[IPaddrlen] = {
  49. 0xff, 0xff, 0xff, 0xff,
  50. 0xff, 0xff, 0xff, 0xff,
  51. 0xff, 0xff, 0xff, 0xff,
  52. 0xff, 0x0, 0x0, 0x0
  53. };
  54. static int v6snpreflen = 13;
  55. uchar*
  56. defmask(uchar *ip)
  57. {
  58. if(isv4(ip))
  59. return classmask[ip[IPv4off]>>6];
  60. else {
  61. if(ipcmp(ip, v6loopback) == 0)
  62. return IPallbits;
  63. else if(memcmp(ip, v6linklocal, v6llpreflen) == 0)
  64. return v6linklocalmask;
  65. else if(memcmp(ip, v6solicitednode, v6snpreflen) == 0)
  66. return v6solicitednodemask;
  67. else if(memcmp(ip, v6multicast, v6mcpreflen) == 0)
  68. return v6multicastmask;
  69. return IPallbits;
  70. }
  71. }
  72. void
  73. maskip(uchar *from, uchar *mask, uchar *to)
  74. {
  75. int i;
  76. for(i = 0; i < IPaddrlen; i++)
  77. to[i] = from[i] & mask[i];
  78. }