mirror of
				https://github.com/brmlab/osmo-tetra.git
				synced 2025-10-30 23:14:00 +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; | 	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) | 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->main_carrier      = bits_to_uint(cur, 12); cur += 12; | ||||||
| 	sid->freq_band = bits_to_uint(cur, 4); cur += 4; | 	sid->freq_band         = bits_to_uint(cur,  4); cur +=  4; | ||||||
| 	sid->freq_offset = bits_to_uint(cur, 2); cur += 2; | 	sid->freq_offset       = bits_to_uint(cur,  2); cur +=  2; | ||||||
| 	sid->duplex_spacing = bits_to_uint(cur, 3); cur += 3; | 	sid->duplex_spacing    = bits_to_uint(cur,  3); cur +=  3; | ||||||
| 	sid->reverse_operation = *cur++; | 	sid->reverse_operation = *cur++; | ||||||
| 	sid->num_of_csch = bits_to_uint(cur, 2); cur +=2; | 	sid->num_of_csch       = bits_to_uint(cur,  2); cur +=  2; | ||||||
| 	sid->ms_txpwr_max_cell = bits_to_uint(cur, 3); cur += 3; | 	sid->ms_txpwr_max_cell = bits_to_uint(cur,  3); cur +=  3; | ||||||
| 	sid->rxlev_access_min = bits_to_uint(cur, 4); cur += 4; | 	sid->rxlev_access_min  = bits_to_uint(cur,  4); cur +=  4; | ||||||
| 	sid->access_parameter = 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->radio_dl_timeout  = bits_to_uint(cur,  4); cur +=  4; | ||||||
| 	sid->cck_valid_no_hf = *cur++; | 	sid->cck_valid_no_hf   = *cur++; | ||||||
| 	if (sid->cck_valid_no_hf) | 	if (sid->cck_valid_no_hf) | ||||||
| 		sid->cck_id = bits_to_uint(cur, 16); | 		sid->cck_id = bits_to_uint(cur, 16); | ||||||
| 	else | 	else | ||||||
| 		sid->hyperframe_number = bits_to_uint(cur, 16); | 		sid->hyperframe_number = bits_to_uint(cur, 16); | ||||||
| 	cur += 16; | 	 | ||||||
| 	/* FIXME: more */ | 	sid->option_field      = bits_to_uint(cur,  2); cur +=  2; | ||||||
| 	decode_d_mle_sysinfo(&sid->mle_si, si_bits + 124-42); | 	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[] = { | static const uint8_t addr_len_by_type[] = { | ||||||
|  |  | ||||||
|  | @ -36,6 +36,13 @@ enum tetra_bs_serv_details { | ||||||
| 	BS_SERVDET_ADV_LINK	= (1 << 0), | 	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); | const char *tetra_get_bs_serv_det_name(uint32_t pdu_type); | ||||||
| 
 | 
 | ||||||
| struct tetra_mle_si_decoded { | struct tetra_mle_si_decoded { | ||||||
|  | @ -60,6 +67,12 @@ struct tetra_si_decoded { | ||||||
| 		uint16_t cck_id; | 		uint16_t cck_id; | ||||||
| 		uint16_t hyperframe_number; | 		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; | 	struct tetra_mle_si_decoded mle_si; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ | ||||||
| 
 | 
 | ||||||
| enum tetra_saps { | enum tetra_saps { | ||||||
| 	TETRA_SAP_TP,	/* between PHY and lower MAC */ | 	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_TMA, | ||||||
| 	TETRA_SAP_TMB, | 	TETRA_SAP_TMB, | ||||||
| 	TETRA_SAP_TMD, | 	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) | uint32_t tetra_tdma_time2fn(struct tetra_tdma_time *tm) | ||||||
| { | { | ||||||
| 	/* FIXME: add hyperframe number !! */ | 	return (((tm->hn * 60) + tm->mn) * 18) + tm->fn; | ||||||
| 	return (tm->mn *18) + tm->fn; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| 
 | 
 | ||||||
| struct tetra_tdma_time { | struct tetra_tdma_time { | ||||||
|  | 	uint16_t hn;    /* hyperframe number (1 ... 65535) */ | ||||||
| 	uint32_t sn;	/* symbol number (1 ... 255) */ | 	uint32_t sn;	/* symbol number (1 ... 255) */ | ||||||
| 	uint32_t tn;	/* timeslot number (1 .. 4) */ | 	uint32_t tn;	/* timeslot number (1 .. 4) */ | ||||||
| 	uint32_t fn;	/* frame number (1 .. 18) */ | 	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)); | 	memset(&sid, 0, sizeof(sid)); | ||||||
| 	macpdu_decode_sysinfo(&sid, msg->l1h); | 	macpdu_decode_sysinfo(&sid, msg->l1h); | ||||||
|  | 	tmvp->u.unitdata.tdma_time.hn = sid.hyperframe_number; | ||||||
| 
 | 
 | ||||||
| 	dl_freq = tetra_dl_carrier_hz(sid.freq_band, | 	dl_freq = tetra_dl_carrier_hz(sid.freq_band, | ||||||
| 				      sid.main_carrier, | 				      sid.main_carrier, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 luckyhacky
						luckyhacky