smux.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "smux.h"
  2. #define SMUX_USE_LITTLE_ENDIAN 1
  3. int smux_frame_pack(const smux_frame_t* frame, void* buf, int len) {
  4. if (!frame || !buf || !len) return -1;
  5. const smux_head_t* head = &(frame->head);
  6. unsigned int packlen = smux_package_length(head);
  7. // Check is buffer enough
  8. if (len < packlen) {
  9. return -2;
  10. }
  11. unsigned char* p = (unsigned char*)buf;
  12. *p++ = head->version;
  13. *p++ = head->cmd;
  14. #if SMUX_USE_LITTLE_ENDIAN
  15. *p++ = head->length;
  16. *p++ = (head->length >> 8) & 0xFF;
  17. #else
  18. // hton length
  19. *p++ = (head->length >> 8) & 0xFF;
  20. *p++ = head->length;
  21. #endif
  22. uint32_t sid = head->sid;
  23. #if SMUX_USE_LITTLE_ENDIAN
  24. *p++ = sid & 0xFF;
  25. *p++ = (sid >> 8) & 0xFF;
  26. *p++ = (sid >> 16) & 0xFF;
  27. *p++ = (sid >> 24) & 0xFF;
  28. #else
  29. // hton sid
  30. *p++ = (sid >> 24) & 0xFF;
  31. *p++ = (sid >> 16) & 0xFF;
  32. *p++ = (sid >> 8) & 0xFF;
  33. *p++ = sid & 0xFF;
  34. #endif
  35. // memcpy data
  36. if (frame->data && head->length) {
  37. memcpy(p, frame->data, frame->head.length);
  38. }
  39. return packlen;
  40. }
  41. int smux_frame_unpack(smux_frame_t* frame, const void* buf, int len) {
  42. if (!frame || !buf || !len) return -1;
  43. if (len < SMUX_HEAD_LENGTH) return -2;
  44. smux_head_t* head = &(frame->head);
  45. unsigned char* p = (unsigned char*)buf;
  46. head->version = *p++;
  47. head->cmd = *p++;
  48. #if SMUX_USE_LITTLE_ENDIAN
  49. head->length = *p++;
  50. head->length |= ((uint16_t)*p++) << 8;
  51. #else
  52. // ntoh length
  53. head->length = ((uint16_t)*p++) << 8;
  54. head->length |= *p++;
  55. #endif
  56. #if SMUX_USE_LITTLE_ENDIAN
  57. head->sid = *p++;
  58. head->sid |= ((uint32_t)*p++) << 8;
  59. head->sid |= ((uint32_t)*p++) << 16;
  60. head->sid |= ((uint32_t)*p++) << 24;
  61. #else
  62. // ntoh sid
  63. head->sid = ((uint32_t)*p++) << 24;
  64. head->sid |= ((uint32_t)*p++) << 16;
  65. head->sid |= ((uint32_t)*p++) << 8;
  66. head->sid |= *p++;
  67. #endif
  68. // NOTE: just shadow copy
  69. if (len > SMUX_HEAD_LENGTH) {
  70. frame->data = (const char*)buf + SMUX_HEAD_LENGTH;
  71. }
  72. unsigned int packlen = smux_package_length(head);
  73. return MIN(len, packlen);
  74. }