static void closeAllOpenClientConnections(IsoServer self) { #if (CONFIG_MAXIMUM_TCP_CLIENT_CONNECTIONS == -1) LinkedList openConnection = LinkedList_getNext(self->openClientConnections); while (openConnection != NULL) { IsoConnection isoConnection = (IsoConnection) openConnection->data; IsoConnection_close(isoConnection); openConnection = LinkedList_getNext(openConnection); } #else int i; for (i = 0; i < CONFIG_MAXIMUM_TCP_CLIENT_CONNECTIONS; i++) { if (self->openClientConnections[i] != NULL) { IsoConnection_close(self->openClientConnections[i]); #if (CONFIG_MMS_SINGLE_THREADED == 1) /* if CONFIG_MMS_SINGLE_THREADED == 0 connection instance will be destroyed by connection thread. */ IsoConnection_destroy(self->openClientConnections[i]); #endif } } #endif }
static inline MmsIndication parseMmsPdu(MmsServerConnection* self, ByteBuffer* message, ByteBuffer* response) { MmsIndication retVal; uint8_t* buffer = message->buffer; if (message->size < 2) return MMS_ERROR; int bufPos = 0; uint8_t pduType = buffer[bufPos++]; int pduLength; bufPos = BerDecoder_decodeLength(buffer, &pduLength, bufPos, message->size); if (bufPos < 0) return MMS_ERROR; if (DEBUG) printf("mms_server: recvd MMS-PDU type: %02x size: %u\n", pduType, pduLength); switch (pduType) { case 0xa8: /* Initiate request PDU */ handleInitiateRequestPdu(self, buffer, bufPos, bufPos + pduLength, response); retVal = MMS_INITIATE; break; case 0xa0: /* Confirmed request PDU */ handleConfirmedRequestPdu(self, buffer, bufPos, bufPos + pduLength, response); retVal = MMS_CONFIRMED_REQUEST; break; case 0x8b: /* Conclude request PDU */ mmsServer_writeConcludeResponsePdu(response); IsoConnection_close(self->isoConnection); retVal = MMS_CONCLUDE; break; case 0xa4: /* Reject PDU */ //TODO evaluate reject PDU printf("received reject PDU!\n"); /* silently ignore */ retVal = MMS_OK; break; default: mmsServer_writeMmsRejectPdu(NULL, MMS_REJECT_UNKNOWN_PDU_TYPE, response); retVal = MMS_ERROR; break; } parseMmsPdu_exit: return retVal; }
static inline MmsIndication parseMmsPdu(MmsServerConnection* self, ByteBuffer* message, ByteBuffer* response) { MmsPdu_t* mmsPdu = 0; /* allow asn1c to allocate structure */ MmsIndication retVal; asn_dec_rval_t rval; /* Decoder return value */ rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, (void*) message->buffer, message->size); if (DEBUG) xer_fprint(stdout, &asn_DEF_MmsPdu, mmsPdu); if (rval.code != RC_OK) { retVal = MMS_ERROR; goto parseMmsPdu_exit; } switch (mmsPdu->present) { case MmsPdu_PR_initiateRequestPdu: handleInitiateRequestPdu(self, &(mmsPdu->choice.initiateRequestPdu), response); retVal = MMS_INITIATE; break; case MmsPdu_PR_confirmedRequestPdu: handleConfirmedRequestPdu(self, &(mmsPdu->choice.confirmedRequestPdu), response); retVal = MMS_CONFIRMED_REQUEST; break; case MmsPdu_PR_concludeRequestPDU: mmsServer_writeConcludeResponsePdu(response); IsoConnection_close(self->isoConnection); retVal = MMS_CONCLUDE; break; default: writeMmsRejectPdu(NULL, REJECT_UNKNOWN_PDU_TYPE, response); retVal = MMS_ERROR; break; } parseMmsPdu_exit: asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); return retVal; }