| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- #include "smux.h"
- #define SMUX_USE_LITTLE_ENDIAN 1
- int smux_frame_pack(const smux_frame_t* frame, void* buf, int len) {
- if (!frame || !buf || !len) return -1;
- const smux_head_t* head = &(frame->head);
- unsigned int packlen = smux_package_length(head);
- // Check is buffer enough
- if (len < packlen) {
- return -2;
- }
- unsigned char* p = (unsigned char*)buf;
- *p++ = head->version;
- *p++ = head->cmd;
- #if SMUX_USE_LITTLE_ENDIAN
- *p++ = head->length;
- *p++ = (head->length >> 8) & 0xFF;
- #else
- // hton length
- *p++ = (head->length >> 8) & 0xFF;
- *p++ = head->length;
- #endif
- uint32_t sid = head->sid;
- #if SMUX_USE_LITTLE_ENDIAN
- *p++ = sid & 0xFF;
- *p++ = (sid >> 8) & 0xFF;
- *p++ = (sid >> 16) & 0xFF;
- *p++ = (sid >> 24) & 0xFF;
- #else
- // hton sid
- *p++ = (sid >> 24) & 0xFF;
- *p++ = (sid >> 16) & 0xFF;
- *p++ = (sid >> 8) & 0xFF;
- *p++ = sid & 0xFF;
- #endif
- // memcpy data
- if (frame->data && head->length) {
- memcpy(p, frame->data, frame->head.length);
- }
- return packlen;
- }
- int smux_frame_unpack(smux_frame_t* frame, const void* buf, int len) {
- if (!frame || !buf || !len) return -1;
- if (len < SMUX_HEAD_LENGTH) return -2;
- smux_head_t* head = &(frame->head);
- unsigned char* p = (unsigned char*)buf;
- head->version = *p++;
- head->cmd = *p++;
- #if SMUX_USE_LITTLE_ENDIAN
- head->length = *p++;
- head->length |= ((uint16_t)*p++) << 8;
- #else
- // ntoh length
- head->length = ((uint16_t)*p++) << 8;
- head->length |= *p++;
- #endif
- #if SMUX_USE_LITTLE_ENDIAN
- head->sid = *p++;
- head->sid |= ((uint32_t)*p++) << 8;
- head->sid |= ((uint32_t)*p++) << 16;
- head->sid |= ((uint32_t)*p++) << 24;
- #else
- // ntoh sid
- head->sid = ((uint32_t)*p++) << 24;
- head->sid |= ((uint32_t)*p++) << 16;
- head->sid |= ((uint32_t)*p++) << 8;
- head->sid |= *p++;
- #endif
- // NOTE: just shadow copy
- if (len > SMUX_HEAD_LENGTH) {
- frame->data = (const char*)buf + SMUX_HEAD_LENGTH;
- }
- unsigned int packlen = smux_package_length(head);
- return MIN(len, packlen);
- }
|