mirror of
				https://github.com/brmlab/osmo-tetra.git
				synced 2025-10-31 15:33:59 +01:00 
			
		
		
		
	Merge remote-tracking branch 'testing/master'
Merge new features with community release
This commit is contained in:
		
						commit
						0be1bc99c1
					
				
					 6 changed files with 48 additions and 17 deletions
				
			
		|  | @ -39,28 +39,45 @@ static void decode_d_mle_sysinfo(struct tetra_mle_si_decoded *msid, const uint8_ | |||
| 	msid->bs_service_details = bits_to_uint(cur, 12); cur += 12; | ||||
| } | ||||
| 
 | ||||
| /* see 21.4.4.1 */ | ||||
| void macpdu_decode_sysinfo(struct tetra_si_decoded *sid, const uint8_t *si_bits) | ||||
| { | ||||
| 	const uint8_t *cur = si_bits + 4; | ||||
| 	const uint8_t *cur     = si_bits; | ||||
| 	cur += 2; // skip Broadcast PDU header
 | ||||
| 	cur += 2; // skip Sysinfo PDU header
 | ||||
| 
 | ||||
| 	sid->main_carrier = bits_to_uint(cur, 12); cur += 12; | ||||
| 	sid->freq_band = bits_to_uint(cur, 4); cur += 4; | ||||
| 	sid->freq_offset = bits_to_uint(cur, 2); cur += 2; | ||||
| 	sid->duplex_spacing = bits_to_uint(cur, 3); cur += 3; | ||||
| 	sid->main_carrier      = bits_to_uint(cur, 12); cur += 12; | ||||
| 	sid->freq_band         = bits_to_uint(cur,  4); cur +=  4; | ||||
| 	sid->freq_offset       = bits_to_uint(cur,  2); cur +=  2; | ||||
| 	sid->duplex_spacing    = bits_to_uint(cur,  3); cur +=  3; | ||||
| 	sid->reverse_operation = *cur++; | ||||
| 	sid->num_of_csch = bits_to_uint(cur, 2); cur +=2; | ||||
| 	sid->ms_txpwr_max_cell = bits_to_uint(cur, 3); cur += 3; | ||||
| 	sid->rxlev_access_min = bits_to_uint(cur, 4); cur += 4; | ||||
| 	sid->access_parameter = bits_to_uint(cur, 4); cur += 4; | ||||
| 	sid->radio_dl_timeout = bits_to_uint(cur, 4); cur += 4; | ||||
| 	sid->cck_valid_no_hf = *cur++; | ||||
| 	sid->num_of_csch       = bits_to_uint(cur,  2); cur +=  2; | ||||
| 	sid->ms_txpwr_max_cell = bits_to_uint(cur,  3); cur +=  3; | ||||
| 	sid->rxlev_access_min  = bits_to_uint(cur,  4); cur +=  4; | ||||
| 	sid->access_parameter  = bits_to_uint(cur,  4); cur +=  4; | ||||
| 	sid->radio_dl_timeout  = bits_to_uint(cur,  4); cur +=  4; | ||||
| 	sid->cck_valid_no_hf   = *cur++; | ||||
| 	if (sid->cck_valid_no_hf) | ||||
| 		sid->cck_id = bits_to_uint(cur, 16); | ||||
| 	else | ||||
| 		sid->hyperframe_number = bits_to_uint(cur, 16); | ||||
| 	cur += 16; | ||||
| 	/* FIXME: more */ | ||||
| 	decode_d_mle_sysinfo(&sid->mle_si, si_bits + 124-42); | ||||
| 	 | ||||
| 	sid->option_field      = bits_to_uint(cur,  2); cur +=  2; | ||||
| 	switch(sid->option_field) | ||||
| 	{ | ||||
| 	  case TETRA_MAC_OPT_FIELD_EVEN_MULTIFRAME:     // Even multiframe definition for TS mode
 | ||||
| 	  case TETRA_MAC_OPT_FIELD_ODD_MULTIFRAME:      // Odd multiframe definition for TS mode
 | ||||
| 	    sid->frame_bitmap = bits_to_uint(cur, 20); cur += 20; | ||||
| 	    break; | ||||
| 	  case TETRA_MAC_OPT_FIELD_ACCESS_CODE:         // Default definition for access code A
 | ||||
| 	    sid->access_code = bits_to_uint(cur, 20); cur += 20; | ||||
| 	    break; | ||||
| 	  case TETRA_MAC_OPT_FIELD_EXT_SERVICES:        // Extended services broadcast
 | ||||
| 	    sid->ext_service = bits_to_uint(cur, 20); cur += 20; | ||||
| 	    break; | ||||
| 	} | ||||
| 
 | ||||
| 	decode_d_mle_sysinfo(&sid->mle_si, si_bits + 124-42);  // could be also cur due to previous fixes
 | ||||
| } | ||||
| 
 | ||||
| static const uint8_t addr_len_by_type[] = { | ||||
|  |  | |||
|  | @ -36,6 +36,13 @@ enum tetra_bs_serv_details { | |||
| 	BS_SERVDET_ADV_LINK	= (1 << 0), | ||||
| }; | ||||
| 
 | ||||
| enum tetra_mac_optional_field_flags { | ||||
| 	TETRA_MAC_OPT_FIELD_EVEN_MULTIFRAME = 0, | ||||
| 	TETRA_MAC_OPT_FIELD_ODD_MULTIFRAME  = 1, | ||||
| 	TETRA_MAC_OPT_FIELD_ACCESS_CODE     = 2, | ||||
| 	TETRA_MAC_OPT_FIELD_EXT_SERVICES    = 3 | ||||
| }; | ||||
| 
 | ||||
| const char *tetra_get_bs_serv_det_name(uint32_t pdu_type); | ||||
| 
 | ||||
| struct tetra_mle_si_decoded { | ||||
|  | @ -60,6 +67,12 @@ struct tetra_si_decoded { | |||
| 		uint16_t cck_id; | ||||
| 		uint16_t hyperframe_number; | ||||
| 	}; | ||||
| 	uint8_t option_field; | ||||
| 	union { | ||||
| 		uint32_t frame_bitmap; | ||||
| 		uint32_t access_code; | ||||
| 		uint32_t ext_service; | ||||
| 	}; | ||||
| 	struct tetra_mle_si_decoded mle_si; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ | |||
| 
 | ||||
| enum tetra_saps { | ||||
| 	TETRA_SAP_TP,	/* between PHY and lower MAC */ | ||||
| 	TETRA_SAP_TMV,	/* beetween lower and upper MAC */ | ||||
| 	TETRA_SAP_TMV,	/* between lower and upper MAC */ | ||||
| 	TETRA_SAP_TMA, | ||||
| 	TETRA_SAP_TMB, | ||||
| 	TETRA_SAP_TMD, | ||||
|  |  | |||
|  | @ -95,6 +95,5 @@ char *tetra_tdma_time_dump(const struct tetra_tdma_time *tm) | |||
| 
 | ||||
| uint32_t tetra_tdma_time2fn(struct tetra_tdma_time *tm) | ||||
| { | ||||
| 	/* FIXME: add hyperframe number !! */ | ||||
| 	return (tm->mn *18) + tm->fn; | ||||
| 	return (((tm->hn * 60) + tm->mn) * 18) + tm->fn; | ||||
| } | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
| #include <stdint.h> | ||||
| 
 | ||||
| struct tetra_tdma_time { | ||||
| 	uint16_t hn;    /* hyperframe number (1 ... 65535) */ | ||||
| 	uint32_t sn;	/* symbol number (1 ... 255) */ | ||||
| 	uint32_t tn;	/* timeslot number (1 .. 4) */ | ||||
| 	uint32_t fn;	/* frame number (1 .. 18) */ | ||||
|  |  | |||
|  | @ -49,6 +49,7 @@ static void rx_bcast(struct tetra_tmvsap_prim *tmvp, struct tetra_mac_state *tms | |||
| 
 | ||||
| 	memset(&sid, 0, sizeof(sid)); | ||||
| 	macpdu_decode_sysinfo(&sid, msg->l1h); | ||||
| 	tmvp->u.unitdata.tdma_time.hn = sid.hyperframe_number; | ||||
| 
 | ||||
| 	dl_freq = tetra_dl_carrier_hz(sid.freq_band, | ||||
| 				      sid.main_carrier, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 luckyhacky
						luckyhacky