//---------------------------------------------------------------------------------------------------------------------------------- // Main function for decompressing a ROHC-packet // Param state: pointer to decompressor // Param ibuf: pointer to incoming packet // Param isize: size of incoming packet // Param obuf: pointer to output buffer // Param osize: size of output buffer // Return: size of decompressed packet //TODO: kolla upp s�ingen annan anropar d_decode_header DIREKT, anropen m�te ske till denna funktion, annars funkar inte statistik och feedback!! //---------------------------------------------------------------------------------------------------------------------------------- int rohc_decompress(struct sd_rohc * state, unsigned char * ibuf, int isize, unsigned char * obuf, int osize) { int ret; struct sd_decode_data ddata = { -1, 0, 0, NULL }; // { cid, addcidUsed, largecidUsed, sd_context * active } state->statistics.packets_received++; ret = d_decode_header(state, ibuf, isize, obuf, osize, &ddata); if(ddata.active == NULL && (ret == ROHC_ERROR_PACKAGE_FAILED || ret == ROHC_ERROR || ret == ROHC_ERROR_CRC)) ret = ROHC_ERROR_NO_CONTEXT; if (ddata.active) { ddata.active->num_recv_packets ++; rohc_debugf(2,"State in decomp %d\n",ddata.active->state ); } if (ret >= 0) { if (!ddata.active) { rohc_debugf(1, "decompress: ddata.active == null when ret >=0!\n"); } else { struct sd_context *c = ddata.active; c->total_uncompressed_size += ret; c->total_compressed_size += isize; if (state->compressor) { state->compressor->num_packets ++; state->compressor->total_uncompressed_size += ret; state->compressor->total_compressed_size += isize; } c_add_wlsb(c->total_16_uncompressed, 0, 0, ret); c_add_wlsb(c->total_16_compressed, 0,0, isize); } } else if (ddata.active) { ddata.active->num_decomp_failures ++; } //return ret; switch(ret) { case ROHC_ERROR_PACKAGE_FAILED: case ROHC_ERROR: state->statistics.packets_failed_package++; ddata.active->curval += state->errval; if(ddata.active->curval >= state->maxval) { ddata.active->curval = 0; d_operation_mode_feedback(state, ROHC_ERROR_PACKAGE_FAILED, ddata.cid, ddata.addcidUsed, ddata.largecidUsed, ddata.active->mode, ddata.active); } break; case ROHC_ERROR_NO_CONTEXT: state->statistics.packets_failed_no_context++; state->curval += state->errval; if(state->curval >= state->maxval) { state->curval = 0; d_operation_mode_feedback(state, ROHC_ERROR_NO_CONTEXT, ddata.cid, ddata.addcidUsed, ddata.largecidUsed, ROHC_O_MODE, NULL); } break; case ROHC_FEEDBACK_ONLY: state->statistics.packets_feedback++; break; case ROHC_ERROR_CRC: state->statistics.packets_failed_crc++; ddata.active->curval += state->errval; rohc_debugf(2,"feedback curr %d\n", ddata.active->curval); rohc_debugf(2,"feedback max %d\n", state->maxval); if(ddata.active->curval >= state->maxval) { ddata.active->curval = 0; d_operation_mode_feedback(state, ROHC_ERROR_CRC, ddata.cid, ddata.addcidUsed, ddata.largecidUsed, ddata.active->mode, ddata.active); } break; default: // ROHC_OK_NO_DATA, ROHC_OK state->curval -= state->okval; // framework (S-NACK) ddata.active->curval -= state->okval; // context (NACK) rohc_debugf(2,"feedback curr %d\n", ddata.active->curval); if(state->curval < 0) state->curval = 0; if(ddata.active->curval < 0) ddata.active->curval = 0; rohc_debugf(2,"feedback curr %d\n", ddata.active->curval); if(ddata.active->mode == ROHC_U_MODE) { ddata.active->mode = ROHC_O_MODE; // switch active context to o-mode d_operation_mode_feedback(state, ROHC_OK, ddata.cid, ddata.addcidUsed, ddata.largecidUsed, ddata.active->mode, ddata.active); } break; } return(ret); }
/** * @brief Add a new TS_SCALED value to the ts_sc_comp object * * @param ts_sc The ts_sc_comp object * @param sn The Sequence Number */ void add_scaled(const struct ts_sc_comp *const ts_sc, const uint16_t sn) { assert(ts_sc != NULL); c_add_wlsb(ts_sc->ts_scaled_wlsb, sn, ts_sc->ts_scaled); }