diff options
| author | Roman Yeryomin <roman@advem.lv> | 2014-02-26 00:12:36 +0200 | 
|---|---|---|
| committer | Roman Yeryomin <roman@advem.lv> | 2014-02-26 00:12:36 +0200 | 
| commit | 5dd1e3def4328394a9ee50080702d731277bc9ac (patch) | |
| tree | 3f778b07c10963de595d45c880f0699e7b4895c4 | |
| parent | 1780036b1f8aaa2788c08eea09e06570191f33ad (diff) | |
Compression appeared to be LZSS.
Decompression now seems to be working but decompressed data looks like mixed with some other information.
Could be MIB tables. See mib_tlv_init(), mib_get_table(), apmib_hwconf() from apmib.c and mibtbl.c files from SDK.
Signed-off-by: Roman Yeryomin <roman@advem.lv>
| -rw-r--r-- | rtkmib.c | 82 | 
1 files changed, 51 insertions, 31 deletions
| @@ -74,7 +74,7 @@ inline uint32_t swap32( uint32_t x )  		(x << 24);  } -#define RING_SIZE       4096    /* size of ring buffer */ +#define RING_SIZE       4096    /* size of ring buffer, must be power of 2 */  #define UL_MATCH        18      /* upper limit for match_length */  #define THRESHOLD       2       /* encode string into position and length                                   * if match_length is greater than this */ @@ -101,52 +101,49 @@ static int mib_decode( unsigned char *in, uint32_t len, unsigned char **out )  		return -1;  	} -	memset( text_buf, 0, RING_SIZE + UL_MATCH - 1 ); +	/* original code initializes text_buf with spaces */ +	memset( text_buf, ' ', r );  	memset( *out, 0, len );  	while (1) { -		if ( ((flags >>= 1) & 256) == 0 ) { -			pos++; -			if ( pos > len ) +		if ( ((flags >>= 1) & 0x100) == 0 ) { +			if ( pos++ > len )  				break; -			c = in[ pos ];		/* get flags for frame */ +			c = *in++;		/* get flags for frame */  			flags = c | 0xff00;	/* uses higher byte cleverly */  		}				/* to count eight */  		/* test next flag bit */  		if ( flags & 1 ) {  			/* flag bit of 1 means unencoded byte */ -			pos++; -			if ( pos > len ) +			if ( pos++ > len )  				break; -			c = in[ pos ]; -			explen++; -			if ( explen > len ) +			c = *in++; +			if ( explen + 1 > len )  				*out = (unsigned char *)realloc( *out, explen + 1 ); -			(*out)[ explen ] = c;		/* copy to output */ -			printf("%i: %x\n", explen - 1, c); fflush(stdout); -			text_buf[ r++ ] = c;		/* and to text_buf */ +			(*out)[ explen ] = c;	/* copy to output */ +			//printf("%i: %x\n", explen, c); fflush(stdout); +			explen++; +			text_buf[ r++ ] = c;	/* and to text_buf */  			r &= (RING_SIZE - 1);  		} else {  			/* 0 means encoded info */ -			pos++; -			if ( pos > len ) +			if ( pos++ > len )  				break; -			i = in[ pos ];		/* get position */ -			pos++; // ??? -			if ( pos > len ) +			i = *in++;		/* get position */ +			if ( pos++ > len )  				break; -			j = in[ pos ];		/* get length of run */ +			j = *in++;		/* get length of run */  			i |= ((j & 0xf0) << 4);	    /* i is now offset of run */  			j = (j & 0x0f) + THRESHOLD; /* j is the length */  			for ( k = 0; k <= j; k++ ) {  				c = text_buf[ (i + k) & (RING_SIZE - 1) ]; -				explen++; -				if ( explen > len ) +				if ( explen + 1 > len )  					*out = (unsigned char *)realloc( (void *)*out, explen + 1 );  				(*out)[ explen ] = c; -				printf("c%i: %x\n", explen - 1, c); fflush(stdout); +				//printf("c%i: %x\n", explen, c); fflush(stdout); +				explen++;  				text_buf[ r++ ] = c;  				r &= (RING_SIZE - 1);  			} @@ -463,6 +460,7 @@ int main( int argc, char **argv )  	unsigned char *buf = NULL;  	unsigned char *mib = NULL; +	unsigned char *tmp = NULL;  	int mib_len = 0;  	uint32_t compr_size = 0;  	mib_wlan_t *mib_wlan; @@ -479,24 +477,28 @@ int main( int argc, char **argv )  	if ( mib_len == MIB_ERR_COMPRESSED ) {  		printf("Compressed size: %i\n", compr_size); -		mib_len = mib_decode( buf, compr_size, &mib ); +		mib_len = mib_decode( buf, compr_size, &tmp ); + +		mib_hdr_t *header = (mib_hdr_t *)tmp; +		printf("Header signature: '%s' (%x)\n", header->sig, ((char *)header)[0]); +		printf("Length from header: 0x%x\n", swap16(header->len)); +		printf("Decoded length: 0x%x\n", mib_len); + +		mib = tmp + sizeof(mib_hdr_t);  	} else {  		mib = buf;  	} -	printf( "MIB len: %i\n", mib_len ); -	printf( "Expected mininum len: %i\n", (int)sizeof(mib_t) ); +	//printf( "MIB len: %i\n", mib_len ); +	printf( "Expected mininum len: 0x%x\n", (int)sizeof(mib_t) );  	if ( mib_len < (int)sizeof(mib_t) ) {  		syslog( LOG_ERR, "MIB length invalid!\n" );  		goto exit;  	} -//	mib_hdr_t *header = (mib_hdr_t *)mib; -//	printf("%s\n", header->sig); -//	printf("%i\n", header->len); -	printf("board version: %02x\n", mib[0]); +	printf("board version: 0x%02x\n", mib[0]);  	printf("nic0: %02x:%02x:%02x:%02x:%02x:%02x\n",  				mib[1], mib[2], mib[3],  				mib[4], mib[5], mib[6] ); @@ -509,6 +511,24 @@ int main( int argc, char **argv )  	printf("wlan1: %02x:%02x:%02x:%02x:%02x:%02x\n",  				mib[19], mib[20], mib[21],  				mib[22], mib[23], mib[24] ); +	printf("wlan2: %02x:%02x:%02x:%02x:%02x:%02x\n", +				mib[25], mib[26], mib[27], +				mib[28], mib[29], mib[30] ); +	printf("wlan3: %02x:%02x:%02x:%02x:%02x:%02x\n", +				mib[31], mib[32], mib[33], +				mib[34], mib[35], mib[36] ); +	printf("wlan4: %02x:%02x:%02x:%02x:%02x:%02x\n", +				mib[37], mib[38], mib[39], +				mib[40], mib[41], mib[42] ); +	printf("wlan5: %02x:%02x:%02x:%02x:%02x:%02x\n", +				mib[43], mib[44], mib[45], +				mib[46], mib[47], mib[48] ); +	printf("wlan6: %02x:%02x:%02x:%02x:%02x:%02x\n", +				mib[49], mib[50], mib[51], +				mib[52], mib[53], mib[54] ); +	printf("wlan7: %02x:%02x:%02x:%02x:%02x:%02x\n", +				mib[55], mib[56], mib[57], +				mib[58], mib[59], mib[60] );  	mib_wlan = (mib_wlan_t *)( mib + MIB_WLAN_OFFSET );  	set_tx_calibration( mib_wlan, "wlan0" ); @@ -520,7 +540,7 @@ int main( int argc, char **argv )  exit:  	free(buf);  	if ( mib != buf ) -		free(mib); +		free(tmp);  	exit(EXIT_SUCCESS);  } | 
