示例#1
0
//----------------------------------------------------------------------------------------------------------------------------------
// 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);
}
示例#2
0
/**
 * @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);
}