AccessLevel.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*====================================================================*
  2. *
  3. * Copyright (c) 2013 Qualcomm Atheros, Inc.
  4. *
  5. * All rights reserved.
  6. *
  7. *====================================================================*/
  8. /*====================================================================*
  9. *
  10. * signed AccessLevel (struct plc * plc, unsigned level, unsigned key_type, void * key, unsigned key_len);
  11. *
  12. * plc.h
  13. *
  14. * Gain PTS level access on a QCA7420 device using a
  15. * VS_ACCESS_CONTROL_LEVEL Request Message;
  16. *
  17. * Contributor(s):
  18. * Nathaniel Houghton <nhoughto@qca.qualcomm.com>
  19. *
  20. *--------------------------------------------------------------------*/
  21. #ifndef ACCESSLEVEL_SOURCE
  22. #define ACCESSLEVEL_SOURCE
  23. #include <stdint.h>
  24. #include <memory.h>
  25. #include "../plc/plc.h"
  26. #include "../tools/error.h"
  27. #define ACCESS_CONTROL_MAX_KEY_LENGTH 1024
  28. signed AccessLevel (struct plc * plc, unsigned level, unsigned key_type, void * key, unsigned key_len)
  29. {
  30. struct channel * channel = (struct channel *) (plc->channel);
  31. struct message * message = (struct message *) (plc->message);
  32. #ifndef __GNUC__
  33. #pragma pack (push,1)
  34. #endif
  35. struct __packed vs_access_level_request
  36. {
  37. struct ethernet_hdr ethernet;
  38. struct qualcomm_hdr qualcomm;
  39. uint32_t RSVD1;
  40. uint8_t ACCESS_LEVEL;
  41. uint16_t RSVD2;
  42. uint8_t ACCESS_TYPE;
  43. uint16_t RSVD3;
  44. uint16_t KEY_LENGTH;
  45. uint8_t KEY [1024];
  46. }
  47. * request = (struct vs_access_level_request *) (message);
  48. struct __packed vs_access_level_confirm
  49. {
  50. struct ethernet_hdr ethernet;
  51. struct qualcomm_hdr qualcomm;
  52. uint16_t RSVD1;
  53. uint16_t MRESPONSE;
  54. }
  55. * confirm = (struct vs_access_level_confirm *) (message);
  56. #ifndef __GNUC__
  57. #pragma pack (pop)
  58. #endif
  59. Request (plc, "Request Access Level %d", level);
  60. memset (message, 0, sizeof (* message));
  61. if (key_len > sizeof (request->KEY))
  62. {
  63. error (1, 0, "access control key is too long.");
  64. }
  65. EthernetHeader (& request->ethernet, channel->peer, channel->host, channel->type);
  66. QualcommHeader (& request->qualcomm, 0, (VS_ACCESS_LEVEL_CONTROL | MMTYPE_REQ));
  67. plc->packetsize = sizeof (* request) - sizeof (request->KEY) + key_len;
  68. if (plc->packetsize < ETHER_MIN_LEN - ETHER_CRC_LEN)
  69. {
  70. plc->packetsize = (ETHER_MIN_LEN - ETHER_CRC_LEN);
  71. }
  72. memcpy (request->KEY, key, key_len);
  73. request->ACCESS_LEVEL = level;
  74. request->KEY_LENGTH = key_len;
  75. request->ACCESS_TYPE = key_type;
  76. if (SendMME (plc) <= 0)
  77. {
  78. error (PLC_EXIT (plc), errno, CHANNEL_CANTSEND);
  79. return (-1);
  80. }
  81. if (ReadMME (plc, 0, (VS_ACCESS_LEVEL_CONTROL | MMTYPE_CNF)) <= 0)
  82. {
  83. error (PLC_EXIT (plc), ECANCELED, CHANNEL_CANTREAD);
  84. return (-1);
  85. }
  86. if (confirm->MRESPONSE)
  87. {
  88. Failure (plc, PLC_WONTDOIT);
  89. return (-1);
  90. }
  91. return (0);
  92. }
  93. #endif