IsoSessionIndication IsoSession_parseMessage(IsoSession* session, ByteBuffer* message) { uint8_t* buffer = message->buffer; uint8_t id; uint8_t length; if (message->size > 1) { id = buffer[0]; length = buffer[1]; } else return SESSION_ERROR; switch (id) { case 13: /* CONNECT(CN) SPDU */ if (length != (message->size - 2)) return SESSION_ERROR; if (parseSessionHeaderParameters(session, message, length) == SESSION_OK) return SESSION_CONNECT; else { printf("iso_session.c: error parsing connect spdu\n"); return SESSION_ERROR; } break; case 14: /* ACCEPT SPDU */ if (length != (message->size - 2)) return SESSION_ERROR; if (parseSessionHeaderParameters(session, message, length) == SESSION_OK) return SESSION_CONNECT; else { printf("iso_session.c: error parsing accept spdu\n"); return SESSION_ERROR; } break; case 1: /* Give token / data SPDU */ if (message->size < 4) return SESSION_ERROR; if ((length == 0) && (buffer[2] == 1) && (buffer[3] == 0)) { ByteBuffer_wrap(&session->userData, message->buffer + 4, message->size - 4, message->maxSize - 4); return SESSION_DATA; } return SESSION_ERROR; } return SESSION_ERROR; }
IsoSessionIndication IsoSession_parseMessage(IsoSession* session, ByteBuffer* message) { uint8_t* buffer = message->buffer; uint8_t id; uint8_t length; if (message->size > 1) { id = buffer[0]; length = buffer[1]; } else return SESSION_ERROR; switch (id) { case 13: /* CONNECT(CN) SPDU */ if (length != (message->size - 2)) return SESSION_ERROR; if (parseSessionHeaderParameters(session, message, length) == SESSION_OK) return SESSION_CONNECT; else { if (DEBUG_SESSION) printf("SESSION: error parsing connect spdu\n"); return SESSION_ERROR; } break; case 14: /* ACCEPT SPDU */ if (length != (message->size - 2)) return SESSION_ERROR; if (parseSessionHeaderParameters(session, message, length) == SESSION_OK) return SESSION_CONNECT; else { if (DEBUG_SESSION) printf("SESSION: error parsing accept spdu\n"); return SESSION_ERROR; } break; case 1: /* Give token / data SPDU */ if (message->size < 4) return SESSION_ERROR; if ((length == 0) && (buffer[2] == 1) && (buffer[3] == 0)) { ByteBuffer_wrap(&session->userData, message->buffer + 4, message->size - 4, message->maxSize - 4); return SESSION_DATA; } return SESSION_ERROR; case 8: /* NOT-FINISHED SPDU */ return SESSION_NOT_FINISHED; case 9: /* FINISH SPDU */ if (DEBUG_SESSION) printf("SESSION: recvd FINISH SPDU\n"); if (length != (message->size - 2)) return SESSION_ERROR; if (parseSessionHeaderParameters(session, message, length) == SESSION_OK) return SESSION_FINISH; else return SESSION_ERROR; break; case 10: /* DISCONNECT SPDU */ if (DEBUG_SESSION) printf("SESSION: recvd DISCONNECT SPDU\n"); if (length != (message->size - 2)) return SESSION_ERROR; if (parseSessionHeaderParameters(session, message, length) == SESSION_OK) return SESSION_DISCONNECT; else return SESSION_ERROR; break; case 25: /* ABORT SPDU */ return SESSION_ABORT; default: break; } return SESSION_ERROR; }