PrintRule.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*====================================================================*
  2. *
  3. * Copyright (c) 2013 Qualcomm Atheros, Inc.
  4. *
  5. * All rights reserved.
  6. *
  7. *====================================================================*/
  8. /*====================================================================*
  9. *
  10. * signed PrintRule (uint32_t CR_PID, uint32_t CR_OPERAND, uint8_t CR_VALUE []);
  11. *
  12. * rules.h
  13. *
  14. * print one classifier rule on stdout;
  15. *
  16. * some classifier rule structures have an 8-bit PID and OPERAND
  17. * while others have a 32-bit PID and OPERAND; this function is
  18. * the common demominator;
  19. *
  20. * Contributor(s):
  21. * Nathaniel Houghton <nhoughto@qca.qualcomm.com>
  22. * Charles Maier <cmaier@qca.qualcomm.com>
  23. *
  24. *--------------------------------------------------------------------*/
  25. #ifndef PRINTRULE_SOURCE
  26. #define PRINTRULE_SOURCE
  27. #include <string.h>
  28. #include "../plc/rules.h"
  29. #include "../tools/error.h"
  30. signed PrintRule (uint32_t CR_PID, uint32_t CR_OPERAND, uint8_t CR_VALUE [])
  31. {
  32. char buffer [CLASSIFIER_STRING];
  33. uint32_t val32;
  34. uint16_t val16;
  35. uint8_t val8;
  36. const char * p1;
  37. const char * p2;
  38. p1 = reword (CR_PID, fields, SIZEOF (fields));
  39. if (p1 == NULL)
  40. {
  41. error (1, 0, "invalid classifier PID");
  42. }
  43. p2 = reword (CR_OPERAND, operators, SIZEOF (operators));
  44. if (p2 == NULL)
  45. {
  46. error (1, 0, "invalid classifier operand");
  47. }
  48. printf ("%s %s", p1, p2);
  49. switch (CR_PID)
  50. {
  51. case FIELD_ETH_SA:
  52. case FIELD_ETH_DA:
  53. printf (" %s", hexstring (buffer, sizeof (buffer), CR_VALUE, ETHER_ADDR_LEN));
  54. break;
  55. case FIELD_IPV4_SA:
  56. case FIELD_IPV4_DA:
  57. putchar (' ');
  58. memout (CR_VALUE, IPv4_LEN, "%d", 1, '.', 0, stdout);
  59. break;
  60. case FIELD_IPV6_SA:
  61. case FIELD_IPV6_DA:
  62. putchar (' ');
  63. memout (CR_VALUE, IPv6_LEN, "%02x", 2, ':', 0, stdout);
  64. break;
  65. case FIELD_VLAN_UP:
  66. case FIELD_IPV6_TC:
  67. case FIELD_IPV4_TOS:
  68. case FIELD_IPV4_PROT:
  69. memcpy (& val8, CR_VALUE, sizeof (val8));
  70. printf (" 0x%02X", val8);
  71. break;
  72. case FIELD_VLAN_ID:
  73. case FIELD_TCP_SP:
  74. case FIELD_TCP_DP:
  75. case FIELD_UDP_SP:
  76. case FIELD_UDP_DP:
  77. case FIELD_IP_SP:
  78. case FIELD_IP_DP:
  79. memcpy (& val16, CR_VALUE, sizeof (val16));
  80. val16 = ntohs (val16);
  81. printf (" %d", val16);
  82. break;
  83. case FIELD_ETH_TYPE:
  84. memcpy (& val16, CR_VALUE, sizeof (val16));
  85. val16 = ntohs (val16);
  86. printf (" 0x%04X", val16);
  87. break;
  88. case FIELD_IPV6_FL:
  89. memcpy (& val32, & CR_VALUE [0], sizeof (val32));
  90. val32 = ntohl (val32);
  91. printf (" 0x%08X", val32);
  92. break;
  93. case FIELD_HPAV_MME:
  94. memcpy (& val8, & CR_VALUE [0], sizeof (val8));
  95. memcpy (& val16, & CR_VALUE [1], sizeof (val16));
  96. printf (" %02x:%04x", val8, val16);
  97. break;
  98. case FIELD_TCP_ACK:
  99. {
  100. code_t val;
  101. const char * p;
  102. memcpy (& val, CR_VALUE, sizeof (val));
  103. p = reword (val, states, SIZEOF (states));
  104. if (p == NULL)
  105. {
  106. error (1, 0, "invalid TCP ACK flag");
  107. }
  108. printf (" %s", p);
  109. }
  110. break;
  111. case FIELD_VLAN_TAG:
  112. {
  113. code_t val;
  114. const char * p;
  115. memcpy (& val, CR_VALUE, sizeof (val));
  116. p = reword (val, states, SIZEOF (states));
  117. if (p == NULL)
  118. {
  119. error (1, 0, "invalid VLAN tag flag");
  120. }
  121. printf (" %s", p);
  122. }
  123. break;
  124. default:
  125. printf (" *****UNSUPPORTED CODE*****");
  126. break;
  127. }
  128. return (0);
  129. }
  130. #endif