stats.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /*
  2. ** Id: stats.c#1
  3. */
  4. /*! \file stats.c
  5. \brief This file includes statistics support.
  6. */
  7. /*
  8. ** Log: stats.c
  9. *
  10. * 07 17 2014 samp.lin
  11. * NULL
  12. * Initial version.
  13. */
  14. /*******************************************************************************
  15. * C O M P I L E R F L A G S
  16. ********************************************************************************
  17. */
  18. /*******************************************************************************
  19. * E X T E R N A L R E F E R E N C E S
  20. ********************************************************************************
  21. */
  22. #include "precomp.h"
  23. #if (CFG_SUPPORT_STATISTICS == 1)
  24. enum EVENT_TYPE {
  25. EVENT_RX,
  26. EVENT_TX,
  27. };
  28. /*******************************************************************************
  29. * C O N S T A N T S
  30. ********************************************************************************
  31. */
  32. /*******************************************************************************
  33. * F U N C T I O N D E C L A R A T I O N S
  34. ********************************************************************************
  35. */
  36. /*******************************************************************************
  37. * P U B L I C D A T A
  38. ********************************************************************************
  39. */
  40. /*******************************************************************************
  41. * P R I V A T E F U N C T I O N S
  42. ********************************************************************************
  43. */
  44. static VOID statsParsePktInfo(PUINT_8 pucPkt, UINT_8 status, UINT_8 eventType)
  45. {
  46. /* get ethernet protocol */
  47. UINT_16 u2EtherType = (pucPkt[ETH_TYPE_LEN_OFFSET] << 8) | (pucPkt[ETH_TYPE_LEN_OFFSET + 1]);
  48. PUINT_8 pucEthBody = &pucPkt[ETH_HLEN];
  49. switch (u2EtherType) {
  50. case ETH_P_IPV4:
  51. {
  52. UINT_8 ucIpProto = pucEthBody[9]; /* IP header without options */
  53. UINT_8 ucIpVersion = (pucEthBody[0] & IPVH_VERSION_MASK) >> IPVH_VERSION_OFFSET;
  54. UINT_16 u2IpId = *(UINT_16 *) &pucEthBody[4];
  55. if (ucIpVersion != IPVERSION)
  56. break;
  57. switch (ucIpProto) {
  58. case IP_PRO_ICMP:
  59. {
  60. /* the number of ICMP packets is seldom so we print log here */
  61. UINT_8 ucIcmpType;
  62. UINT_16 u2IcmpId, u2IcmpSeq;
  63. PUINT_8 pucIcmp = &pucEthBody[20];
  64. ucIcmpType = pucIcmp[0];
  65. if (ucIcmpType == 3) /* don't log network unreachable packet */
  66. break;
  67. u2IcmpId = *(UINT_16 *) &pucIcmp[4];
  68. u2IcmpSeq = *(UINT_16 *) &pucIcmp[6];
  69. switch (eventType) {
  70. case EVENT_RX:
  71. DBGLOG(SW4, INFO, "<RX> ICMP: Type %d, Id BE 0x%04x, Seq BE 0x%04x\n",
  72. ucIcmpType, u2IcmpId, u2IcmpSeq);
  73. break;
  74. case EVENT_TX:
  75. DBGLOG(SW4, INFO, "<TX> ICMP: Type %d, Id 0x04%x, Seq BE 0x%04x\n",
  76. ucIcmpType, u2IcmpId, u2IcmpSeq);
  77. break;
  78. }
  79. break;
  80. }
  81. case IP_PRO_UDP:
  82. {
  83. /* the number of DHCP packets is seldom so we print log here */
  84. PUINT_8 pucUdp = &pucEthBody[20];
  85. PUINT_8 pucBootp = &pucUdp[8];
  86. UINT_8 ucUdpDstPort;
  87. UINT_32 u4TransID;
  88. if (pucUdp[2] != 0x00)
  89. break;
  90. ucUdpDstPort = pucUdp[3];
  91. if ((ucUdpDstPort != UDP_PORT_DHCPS) && (ucUdpDstPort != UDP_PORT_DHCPC))
  92. break;
  93. u4TransID = pucBootp[4]<<24 | pucBootp[5]<<16 | pucBootp[6]<<8 | pucBootp[7];
  94. switch (eventType) {
  95. case EVENT_RX:
  96. DBGLOG(SW4, INFO, "<RX> DHCP: IPID 0x%02x, MsgType 0x%x, TransID 0x%04x\n",
  97. u2IpId, pucBootp[0], u4TransID);
  98. break;
  99. case EVENT_TX:
  100. DBGLOG(SW4, INFO, "<TX> DHCP: IPID 0x%02x, MsgType 0x%x, TransID 0x%04x\n",
  101. u2IpId, pucBootp[0], u4TransID);
  102. break;
  103. }
  104. break;
  105. }
  106. }
  107. break;
  108. }
  109. case ETH_P_1X:
  110. {
  111. PUINT_8 pucEapol = pucEthBody;
  112. UINT_8 ucEapolType = pucEapol[1];
  113. switch (ucEapolType) {
  114. case 0: /* eap packet */
  115. switch (eventType) {
  116. case EVENT_RX:
  117. DBGLOG(SW4, INFO, "<RX> EAP Packet: code %d, id %d, type %d\n",
  118. pucEapol[4], pucEapol[5], pucEapol[7]);
  119. break;
  120. case EVENT_TX:
  121. DBGLOG(SW4, INFO, "<TX> EAP Packet: code %d, id %d, type %d\n",
  122. pucEapol[4], pucEapol[5], pucEapol[7]);
  123. break;
  124. }
  125. break;
  126. case 1: /* eapol start */
  127. switch (eventType) {
  128. case EVENT_RX:
  129. DBGLOG(SW4, INFO, "<RX> EAPOL: start\n");
  130. break;
  131. case EVENT_TX:
  132. DBGLOG(SW4, INFO, "<RX> EAPOL: start\n");
  133. break;
  134. }
  135. break;
  136. case 3: /* key */
  137. switch (eventType) {
  138. case EVENT_RX:
  139. DBGLOG(SW4, INFO, "<RX> EAPOL: key, KeyInfo 0x%04x\n",
  140. *((PUINT_16)(&pucEapol[5])));
  141. break;
  142. case EVENT_TX:
  143. DBGLOG(SW4, INFO, "<TX> EAPOL: key, KeyInfo 0x%04x\n",
  144. *((PUINT_16)(&pucEapol[5])));
  145. break;
  146. }
  147. break;
  148. }
  149. break;
  150. }
  151. case ETH_WPI_1X:
  152. {
  153. UINT_8 ucSubType = pucEthBody[3]; /* sub type filed*/
  154. UINT_16 u2Length = *(PUINT_16)&pucEthBody[6];
  155. UINT_16 u2Seq = *(PUINT_16)&pucEthBody[8];
  156. switch (eventType) {
  157. case EVENT_RX:
  158. DBGLOG(SW4, INFO, "<RX> WAPI: subType %d, Len %d, Seq %d\n",
  159. ucSubType, u2Length, u2Seq);
  160. break;
  161. case EVENT_TX:
  162. DBGLOG(SW4, INFO, "<TX> WAPI: subType %d, Len %d, Seq %d\n",
  163. ucSubType, u2Length, u2Seq);
  164. break;
  165. }
  166. break;
  167. }
  168. }
  169. }
  170. /*----------------------------------------------------------------------------*/
  171. /*! \brief This routine is called to display rx packet information.
  172. *
  173. * \param[in] pPkt Pointer to the packet
  174. * \param[out] None
  175. *
  176. * \retval None
  177. */
  178. /*----------------------------------------------------------------------------*/
  179. VOID StatsRxPktInfoDisplay(UINT_8 *pPkt)
  180. {
  181. statsParsePktInfo(pPkt, 0, EVENT_RX);
  182. #if 0 /* carefully! too many ARP */
  183. if (pucIpHdr[0] == 0x00) { /* ARP */
  184. UINT_8 *pucDstIp = (UINT_8 *) pucIpHdr;
  185. if (pucDstIp[7] == ARP_PRO_REQ) {
  186. DBGLOG(RX, TRACE, "<rx> OS rx a arp req from %d.%d.%d.%d\n",
  187. pucDstIp[14], pucDstIp[15], pucDstIp[16], pucDstIp[17]);
  188. } else if (pucDstIp[7] == ARP_PRO_RSP) {
  189. DBGLOG(RX, TRACE, "<rx> OS rx a arp rsp from %d.%d.%d.%d\n",
  190. pucDstIp[24], pucDstIp[25], pucDstIp[26], pucDstIp[27]);
  191. }
  192. }
  193. #endif
  194. }
  195. /*----------------------------------------------------------------------------*/
  196. /*! \brief This routine is called to display tx packet information.
  197. *
  198. * \param[in] pPkt Pointer to the packet
  199. * \param[out] None
  200. *
  201. * \retval None
  202. */
  203. /*----------------------------------------------------------------------------*/
  204. VOID StatsTxPktInfoDisplay(UINT_8 *pPkt)
  205. {
  206. UINT_16 u2EtherTypeLen;
  207. u2EtherTypeLen = (pPkt[ETH_TYPE_LEN_OFFSET] << 8) | (pPkt[ETH_TYPE_LEN_OFFSET + 1]);
  208. statsParsePktInfo(pPkt, 0, EVENT_TX);
  209. #if 0
  210. if (u2EtherTypeLen == ETH_P_ARP) {
  211. UINT_8 *pucDstIp = &aucLookAheadBuf[ETH_HLEN];
  212. if (pucDstIp[7] == ARP_PRO_REQ) {
  213. DBGLOG(RX, TRACE, "<tx> OS tx a arp req to %d.%d.%d.%d\n",
  214. pucDstIp[24], pucDstIp[25], pucDstIp[26], pucDstIp[27]);
  215. } else if (pucDstIp[7] == ARP_PRO_RSP) {
  216. DBGLOG(RX, TRACE, "<tx> OS tx a arp rsp to %d.%d.%d.%d\n",
  217. pucDstIp[14], pucDstIp[15], pucDstIp[16], pucDstIp[17]);
  218. }
  219. }
  220. #endif
  221. }
  222. #endif /* CFG_SUPPORT_STATISTICS */
  223. /* End of stats.c */